defmodule Braintree.SettlementBatchSummary do
@moduledoc """
The settlement batch summary displays the total sales and credits for each
batch for a particular date. The transactions can be grouped by a single
custom field's values.
https://developers.braintreepayments.com/reference/request/settlement-batch-summary/generate/ruby
"""
use Braintree.Construction
import Braintree.Util, only: [atomize: 1]
alias Braintree.HTTP
defmodule Record do
@moduledoc """
A record contains details for a transaction in a summary.
"""
@type t :: %__MODULE__{
card_type: String.t(),
count: String.t(),
merchant_account_id: String.t(),
kind: String.t(),
amount_settled: String.t()
}
defstruct card_type: nil,
count: "0",
merchant_account_id: nil,
kind: nil,
amount_settled: nil
@doc """
Convert a list of records into structs, including any custom fields that
were used as the grouping value.
"""
def new(params) when is_map(params) do
atomized = atomize(params)
summary = Construction.new(__MODULE__, params)
case Map.keys(atomized) -- Map.keys(summary) do
[custom_key] -> Map.put(summary, custom_key, atomized[custom_key])
_ -> summary
end
end
def new(params) when is_list(params) do
Enum.map(params, &new/1)
end
end
@type t :: %__MODULE__{records: [Record.t()]}
defstruct records: []
@doc """
Generate a report of all settlements for a particular date. The
field used for custom grouping will always be set as
`custom_field`, regardless of its name.
## Example
Braintree.SettlementBatchSummary("2016-9-5", "custom_field_1")
"""
@spec generate(binary, binary | nil, Keyword.t()) :: {:ok, [t]} | HTTP.error()
def generate(settlement_date, custom_field \\ nil, opts \\ []) do
criteria = build_criteria(settlement_date, custom_field)
params = %{settlement_batch_summary: criteria}
with {:ok, payload} <- HTTP.post("settlement_batch_summary", params, opts) do
%{"settlement_batch_summary" => summary} = payload
{:ok, new(summary)}
end
end
@spec build_criteria(binary, binary | nil) :: map
defp build_criteria(settlement_date, nil) do
%{settlement_date: settlement_date}
end
defp build_criteria(settlement_date, custom_field) do
%{settlement_date: settlement_date, group_by_custom_field: custom_field}
end
@doc """
Convert a map including records into a summary struct with a list
of record structs.
"""
def new(%{"records" => records}) do
struct(__MODULE__, records: Record.new(records))
end
end