lib/requests/payments/payment/amount_allocation.ex

defmodule Requests.Payments.Payment.AmountAllocation do
  @moduledoc false
  @type commission :: %{
          amount: integer(),
          percentage: integer()
        }

  @type t() :: %__MODULE__{
          amount: integer(),
          commission: commission(),
          id: String.t(),
          reference: String
        }

  @enforce_keys [:amount, :id]
  defstruct [
    :amount,
    :commission,
    :id,
    :reference
  ]

  def build(amount_allocations, return \\ [])

  def build([], return), do: Enum.filter(return, &(&1 != nil))

  def build([h | t], return) do
    build(t, [build_allocation(h) | return])
  end

  def build(_, _), do: nil

  defp build_allocation(params) when is_map(params) do
    %{
      amount: params[:amount],
      commission: build_commission(params[:commission]),
      id: params[:id],
      reference: params[:reference]
    }
  end

  defp build_allocation(_), do: nil

  defp build_commission(params) when is_map(params) do
    %{
      amount: params[:amount],
      percentage: params[:percentage]
    }
  end

  defp build_commission(_), do: nil
end