defmodule Plaid.Income do @moduledoc """ Functions for Plaid `income` endpoint. """ alias Plaid.Client.Request alias Plaid.Client @derive Jason.Encoder defstruct item: nil, income: nil, request_id: nil @type t :: %__MODULE__{ item: Plaid.Item.t(), income: Plaid.Income.Income.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 Income do @moduledoc """ Plaid.Income Income data structure. """ @derive Jason.Encoder defstruct income_streams: [], last_year_income: nil, last_year_income_before_tax: nil, projected_yearly_income: nil, projected_yearly_income_before_tax: nil, max_number_of_overlapping_income_streams: nil, number_of_income_streams: nil @type t :: %__MODULE__{ income_streams: [Plaid.Income.Income.IncomeStream.t()], last_year_income: float(), last_year_income_before_tax: float(), projected_yearly_income: float(), projected_yearly_income_before_tax: float(), max_number_of_overlapping_income_streams: float(), number_of_income_streams: float() } defmodule IncomeStream do @moduledoc """ Plaid.Income.Income IncomeStream data structure. """ @derive Jason.Encoder defstruct confidence: nil, days: nil, monthly_income: nil, name: nil @type t :: %__MODULE__{ confidence: float(), days: integer(), monthly_income: float(), name: String.t() } end end @doc """ Gets Income data associated with an Access Token. Parameters ``` %{ access_token: "access-env-identifier" } ``` """ @spec get(params, config) :: {:ok, Plaid.Income.t()} | error def get(params, config \\ %{}) do c = config[:client] || Plaid Request |> struct(method: :post, endpoint: "income/get", body: params) |> Request.add_metadata(config) |> c.send_request(Client.new(config)) |> c.handle_response(&map_income(&1)) end defp map_income(body) do Poison.Decode.transform( body, %{ as: %Plaid.Income{ item: %Plaid.Item{}, income: %Plaid.Income.Income{ income_streams: [ %Plaid.Income.Income.IncomeStream{} ] } } } ) end end