defmodule Plaid.PaymentInitiation.Payments do @moduledoc """ Functions for Plaid `payment_initiation/payment` endpoints. """ alias Plaid.Client.Request alias Plaid.Client @derive Jason.Encoder defstruct payments: [], next_cursor: nil, request_id: nil @type t :: %__MODULE__{ payments: [Plaid.PaymentInitiation.Payments.Payment.t()], next_cursor: String.t(), request_id: String.t() } @type params :: %{required(atom) => term} @type config :: %{required(atom) => String.t() | keyword} @type error :: {:error, Plaid.Error.t() | any()} | no_return defmodule Payment do @moduledoc """ Plaid Payment data structure. """ @derive Jason.Encoder defstruct payment_id: nil, payment_token: nil, payment_token_expiration_time: nil, reference: nil, amount: nil, status: nil, last_status_update: nil, recipient_id: nil, schedule: nil, request_id: nil @type t :: %__MODULE__{ payment_id: String.t(), payment_token: String.t(), payment_token_expiration_time: String.t(), reference: String.t(), amount: Plaid.PaymentInitiation.Payments.Payment.Amount.t(), status: String.t(), last_status_update: String.t(), recipient_id: String.t(), schedule: Plaid.PaymentInitiation.Payments.Payment.Schedule.t(), request_id: String.t() } defmodule Amount do @moduledoc """ Plaid Payment Amount data structure. """ @derive Jason.Encoder defstruct currency: nil, amount: 0 @type t :: %__MODULE__{ currency: String.t(), amount: float } end defmodule Schedule do @moduledoc """ Plaid Payment Schedule data structure. """ @derive Jason.Encoder defstruct interval: nil, interval_execution_day: nil, start_date: nil @type t :: %__MODULE__{ interval: String.t(), interval_execution_day: integer(), start_date: String.t() } end end @doc """ Creates payment. Parameters ``` %{ recipient_id: "", reference: "", amount: %{ currency: "", value: 0.00 }, schedule: %{ interval: "", interval_execution_day: 1, start_date: "" }, } ``` """ @spec create(params, config) :: {:ok, Plaid.PaymentInitiation.Payments.Payment.t()} | error def create(params, config \\ %{}) do request_operation("payment_initiation/payment/create", params, config, &map_payment(&1)) end defp request_operation(endpoint, params, config, mapper) do c = config[:client] || Plaid Request |> struct(method: :post, endpoint: endpoint, body: params) |> Request.add_metadata(config) |> c.send_request(Client.new(config)) |> c.handle_response(mapper) end defp map_payments(body) do Poison.Decode.transform(body, %{ as: %Plaid.PaymentInitiation.Payments{payments: [full_struct()]} }) end defp map_payment(body) do Poison.Decode.transform(body, %{as: full_struct()}) end defp full_struct do %Plaid.PaymentInitiation.Payments.Payment{ amount: %Plaid.PaymentInitiation.Payments.Payment.Amount{}, schedule: %Plaid.PaymentInitiation.Payments.Payment.Schedule{} } end @doc """ Gets payment by payment_id. Parameters ``` %{ payment_id: "" } ``` """ @spec get(params, config) :: {:ok, Plaid.PaymentInitiation.Payments.Payment.t()} | error def get(params, config \\ %{}) do request_operation("payment_initiation/payment/get", params, config, &map_payment(&1)) end @doc """ Lists all payments. Parameters ``` %{ options: %{ count: 1, cursor: "" } } ``` """ @spec list(params, config) :: {:ok, Plaid.PaymentInitiation.Payments.t()} | error def list(params, config \\ %{}) do request_operation("payment_initiation/payment/list", params, config, &map_payments(&1)) end end