lib/circlex/struct/payout.ex

defmodule Circlex.Struct.Payout do
  import Circlex.Struct.Util

  alias Circlex.Struct.{Amount, SourceDest}

  defstruct [
    :id,
    :source_wallet_id,
    :destination,
    :amount,
    :fees,
    :status,
    :tracking_ref,
    :risk_evaluation,
    :adjustments,
    :return,
    :create_date,
    :update_date,
    :external_ref
  ]

  def deserialize(payout) do
    %__MODULE__{
      id: fetch(payout, :id),
      source_wallet_id: fetch(payout, :sourceWalletId),
      destination: SourceDest.deserialize(fetch(payout, :destination)),
      amount: Amount.deserialize(fetch(payout, :amount)),
      fees: Amount.deserialize(fetch(payout, :fees)),
      status: fetch(payout, :status),
      tracking_ref: fetch(payout, :trackingRef),
      risk_evaluation: fetch(payout, :riskEvaluation),
      adjustments: fetch(payout, :adjustments),
      return: fetch(payout, :return),
      create_date: fetch(payout, :createDate),
      update_date: fetch(payout, :updateDate),
      external_ref: fetch(payout, :externalRef)
    }
  end

  def serialize(payout, for_api \\ false) do
    Map.merge(
      %{
        id: payout.id,
        sourceWalletId: payout.source_wallet_id,
        destination: SourceDest.serialize(payout.destination),
        amount: Amount.serialize(payout.amount),
        fees: Amount.serialize(payout.fees),
        status: payout.status,
        trackingRef: payout.tracking_ref,
        createDate: payout.create_date,
        updateDate: payout.update_date
      },
      if(for_api,
        do: %{},
        else: %{
          externalRef: payout.external_ref,
          riskEvaluation: payout.risk_evaluation,
          adjustments: payout.adjustments,
          return: payout.return
        }
      )
    )
  end
end