defmodule Circlex.Emulator.State.PaymentState do
alias Circlex.Emulator.State
alias Circlex.Struct.{Amount, Payment, SourceDest}
alias Circlex.Emulator.Logic.PaymentLogic
import State.Util
def all_payments(filters \\ []) do
get_payments_st(fn payments -> payments end, filters)
end
def get_payment(id, filters \\ []) do
get_payments_st(fn payments -> PaymentLogic.get_payment(payments, id) end, filters)
end
def add_payment(payment) do
update_payments_st(fn payments -> PaymentLogic.add_payment(payments, payment) end)
end
def update_payment(payment_id, f) do
update_payments_st(fn payments -> PaymentLogic.update_payment(payments, payment_id, f) end)
end
def new_payment(wallet_id, bank_account_id, amount, currency) do
{:ok,
%Payment{
id: State.next(:uuid),
type: "payment",
status: "pending",
description: "Merchant Push Payment",
amount: %Amount{
amount: amount,
currency: currency
},
fees: %Amount{
amount: "2.00",
currency: "USD"
},
create_date: State.next(:date),
update_date: State.next(:date),
merchant_id: merchant_id(),
merchant_wallet_id: wallet_id,
source:
SourceDest.deserialize(%{
id: bank_account_id,
type: "wire"
}),
refunds: []
}}
end
def deserialize(st) do
%{st | payments: Enum.map(st.payments, &Payment.deserialize/1)}
end
def serialize(st) do
%{st | payments: Enum.map(st.payments, &Payment.serialize/1)}
end
def initial_state() do
%{payments: []}
end
defp get_payments_st(mfa_or_fn, filters) do
State.get_st(mfa_or_fn, [:payments], &apply_filters(&1, filters))
end
defp update_payments_st(mfa_or_fn, filters \\ []) do
State.update_st(mfa_or_fn, [:payments], &apply_filters(&1, filters))
end
end