lib/yousign/signature_request_input.ex

defmodule Yousign.SignatureRequestInput do
  @moduledoc """
  Models a Yousign request signature input.
  See: https://developers.yousign.com/reference/post-signature_requests
  """
  use TypedStruct

  @type delivery_mode :: :email | :none
  @type reminder_settings :: %{
          interval_in_days: non_neg_integer(),
          max_occurrences: non_neg_integer()
        }
  @type signature_level ::
          :electronic_signature
          | :advanced_electronic_signature
          | :electronic_signature_with_qualified_certificate
          | :qualified_electronic_signature_mode_1
  @type signature_authentication_mode :: :otp_sms | :otp_email | :no_otp | nil
  @type redirect_urls :: %{success: String.t() | nil, error: String.t() | nil} | nil
  @type field_input ::
          %{
            type: :signature,
            document_id: String.t(),
            width: non_neg_integer() | nil,
            height: non_neg_integer() | nil,
            page: non_neg_integer(),
            x: non_neg_integer(),
            y: non_neg_integer()
          }
          | %{
              type: :mention,
              document_id: String.t(),
              width: non_neg_integer() | nil,
              page: non_neg_integer(),
              x: non_neg_integer(),
              y: non_neg_integer(),
              mention: String.t()
            }
          | %{
              type: :text,
              document_id: String.t(),
              width: non_neg_integer() | nil,
              height: non_neg_integer() | nil,
              page: non_neg_integer(),
              x: non_neg_integer(),
              y: non_neg_integer(),
              max_length: non_neg_integer(),
              instruction: String.t(),
              optional: boolean()
            }
          | %{
              type: :checkbox,
              document_id: String.t(),
              page: non_neg_integer(),
              x: non_neg_integer(),
              y: non_neg_integer(),
              optional: boolean(),
              name: String.t() | nil,
              checked: boolean()
            }
  @type signer_info :: %{
          first_name: String.t(),
          last_name: String.t(),
          email: String.t(),
          phone_number: String.t() | nil,
          locale: :en | :de | :fr | :it | :es | :pl | :nl
        }
  @type signer_from_info :: %{
          info: signer_info(),
          fields: list(field_input()),
          signature_level: signature_level(),
          signature_authentication_mode: signature_authentication_mode(),
          redirect_urls: redirect_urls()
        }

  @derive Jason.Encoder
  typedstruct do
    field :name, String.t(), enforce: true
    field :delivery_mode, delivery_mode(), enforce: true
    field :ordered_signers, boolean() | nil, default: nil
    field :reminder_settings, reminder_settings() | nil, default: nil
    field :timezone, String.t() | nil, default: nil
    field :email_custom_note, String.t() | nil, default: nil
    field :expiration_date, DateTime.t() | nil, default: nil
    field :template_id, String.t() | nil, default: nil
    field :external_id, String.t() | nil, default: nil
    field :branding_id, String.t() | nil, default: nil
    field :documents, list(String.t()), enforce: true
    field :signers, list(signer_from_info()), enforce: true
  end
end