lib/yousign/signature_request.ex

defmodule Yousign.SignatureRequest do
  @moduledoc """
  Models a Yousign request signature.
  See: https://developers.yousign.com/reference/get-signature_requests-signaturerequestid
  """
  use TypedStruct

  alias Yousign.Document

  @type signature_request_status ::
          :draft | :ongoing | :done | :deleted | :expired | :canceled | :approval | :rejected
  @type delivery_mode :: :email | :none
  @type source ::
          :public_api
          | :connector_hubspot_api
          | :connector_salesforce_api
          | :connector_google_api
          | :connector_zapier_api
  @type reminder_settings :: %{
          interval_in_days: non_neg_integer(),
          max_occurrences: non_neg_integer()
        }
  @type signer_status ::
          :initiated
          | :notified
          | :identified
          | :verifying
          | :consent_given
          | :verified
          | :verification_failed
          | :processing
          | :signed
  @type approver_status :: :initiated | :notified | :approved | :rejected

  typedstruct do
    field :id, String.t(), enforce: true
    field :status, signature_request_status(), enforce: true
    field :name, String.t(), enforce: true
    field :delivery_mode, delivery_mode(), enforce: true
    field :created_at, DateTime.t(), enforce: true
    field :ordered_signers, boolean() | nil, default: nil
    field :reminder_settings, reminder_settings(), enforce: true
    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 :source, source(), enforce: true
    field :signers, list(%{id: String.t(), status: signer_status()}), enforce: true
    field :approvers, list(%{id: String.t(), status: approver_status()}), enforce: true
    field :documents, list(%{id: String.t(), nature: Document.document_nature()}), enforce: true
    field :sender, %{id: String.t(), email: String.t()}, enforce: true
    field :external_id, String.t(), enforce: true
    field :branding_id, String.t(), enforce: true
  end
end