defmodule Circlex.Emulator.Logic.PaymentLogic do import Circlex.Emulator.Logic.LogicUtil require Logger alias Circlex.Struct.{Amount, Payment} alias Circlex.Emulator.Logic.WalletLogic def get_payment(payments, payment_id) do find(payments, fn %Payment{id: id} -> id == payment_id end) end def add_payment(payments, payment) do {:ok, [payment | payments]} end def update_payment(payments, payment_id, f) do update(payments, fn %Payment{id: id} -> id == payment_id end, f) end def process_payment(st = %{payments: payments, wallets: wallets}, payment_id) do {:ok, payment} = get_payment(payments, payment_id) case payment.source.type do :wire -> {:ok, master_wallet} = WalletLogic.master_wallet(wallets) {:ok, wallets} = WalletLogic.update_balance(wallets, master_wallet.wallet_id, payment.amount) {:ok, payments} = update_payment(payments, payment.id, fn p -> %{p | status: "paid"} end) Logger.warn("[NOTICE] Just received wire for #{Amount.display(payment.amount)}") {:ok, st |> Map.put(:wallets, wallets) |> Map.put(:payments, payments)} _ -> {:ok, st} end end end