defmodule Plaid.AssetReport do
@moduledoc """
Functions for Plaid `asset report` endpoint.
"""
alias Plaid.Client.Request
alias Plaid.Client
@derive Jason.Encoder
defstruct asset_report_id: nil,
client_report_id: nil,
date_generated: nil,
days_requested: nil,
items: [],
user: nil,
warnings: []
@type t :: %__MODULE__{
asset_report_id: String.t(),
client_report_id: String.t(),
date_generated: String.t(),
days_requested: integer(),
items: [Plaid.AssetReport.Item.t()],
user: Plaid.AssetReport.User.t(),
warnings: [Plaid.AssetReport.Warning.t()]
}
@type params :: %{required(atom) => term}
@type config :: %{required(atom) => String.t() | keyword}
@type error :: {:error, Plaid.Error.t() | any()} | no_return
defmodule Item do
@moduledoc """
Plaid.AssetReport Item data structure.
"""
@derive Jason.Encoder
defstruct item_id: nil,
institution_name: nil,
institution_id: nil,
date_last_updated: nil,
accounts: []
@type t :: %__MODULE__{
item_id: String.t(),
institution_name: String.t(),
institution_id: String.t(),
date_last_updated: String.t(),
accounts: [Plaid.Accounts.Account.t()]
}
end
defmodule User do
@moduledoc """
Plaid.AssetReport User data structure.
"""
@derive Jason.Encoder
defstruct client_user_id: nil,
first_name: nil,
middle_name: nil,
last_name: nil,
ssn: nil,
phone_number: nil,
email: nil
@type t :: %__MODULE__{
client_user_id: String.t(),
first_name: String.t(),
middle_name: String.t(),
last_name: String.t(),
ssn: String.t(),
phone_number: String.t(),
email: String.t()
}
end
defmodule Warning do
@moduledoc """
Plaid.AssetReport Warning data structure.
"""
@derive Jason.Encoder
defstruct warning_type: nil, warning_code: nil, cause: nil
@type t :: %__MODULE__{warning_type: String.t(), warning_code: String.t(), cause: Plaid.AssetReport.Warning.Cause.t()}
defmodule Cause do
@moduledoc """
Plaid.AssetReport.Warning Cause data structure.
"""
@derive Jason.Encoder
defstruct error_type: nil,
error_code: nil,
error_message: nil,
display_message: nil,
request_id: nil,
status: nil,
documentation_url: nil,
suggested_action: nil,
item_id: nil
@type t :: %__MODULE__{
error_type: String.t(),
error_code: String.t(),
error_message: String.t(),
display_message: String.t(),
request_id: String.t(),
status: integer,
documentation_url: String.t(),
suggested_action: String.t(),
item_id: String.t()
}
end
end
@doc """
Creates an asset report.
Parameters
```
%{
access_tokens: ["access-env-identifier"],
days_requested: 356
}
```
Response
```
{:ok,
%{asset_report_token: "assets-sandbox-6f12f5bb-22dd-4855-b918-f47ec439198a",
asset_report_id: "1f414183-220c-44f5-b0c8-bc0e6d4053bb"",
request_id: "Iam3b"
}
}
```
"""
@spec create_asset_report(params, config) :: {:ok, map} | error
def create_asset_report(params, config \\ %{}) do
mapper = fn %{"asset_report_token" => t, "asset_report_id" => id, "request_id" => r} ->
%{asset_report_token: t, asset_report_id: id, request_id: r}
end
request_operation("asset_report/create", params, config, mapper)
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
@doc """
Gets the Asset Report from Plaid.
Parameters
```
%{
asset_report_token: "assets-sandbox-6f12f5bb-22dd-4855-b918-f47ec439198a"
}
```
"""
@spec get(params(), config()) :: {:ok, t()} | error()
def get(params, config \\ %{}) do
request_operation("asset_report/get", params, config, &map_asset_report/1)
end
defp map_asset_report(%{"report" => report, "warnings" => warnings}) do
Poison.Decode.transform(Map.put_new(report, "warnings", warnings), %{
as: %Plaid.AssetReport{
items: [
%Plaid.AssetReport.Item{
accounts: [
%Plaid.Accounts.Account{
balances: %Plaid.Accounts.Account.Balance{},
owners: [
%Plaid.Accounts.Account.Owner{
addresses: [%Plaid.Accounts.Account.Owner.Address{}],
emails: [%Plaid.Accounts.Account.Owner.Email{}],
phone_numbers: [%Plaid.Accounts.Account.Owner.PhoneNumber{}]
}
]
}
]
}
],
user: %Plaid.AssetReport.User{},
warnings: [
%Plaid.AssetReport.Warning{
cause: %Plaid.AssetReport.Warning.Cause{}
}
]
}
})
end
end