Current section
Files
Jump to
Current section
Files
lib/command/get_accounts_info.ex
defmodule FinTex.Command.GetAccountsInfo do
@moduledoc false
alias FinTex.Command.AbstractCommand
alias FinTex.Command.GetAccountBalance
alias FinTex.Command.Sequencer
alias FinTex.Command.Synchronization
alias FinTex.Model.Account
alias FinTex.Segment.HNHBK
alias FinTex.Segment.HNSHK
alias FinTex.Segment.HNSHA
alias FinTex.Segment.HKSPA
alias FinTex.Segment.HNHBS
use AbstractCommand
def get_account_info(bank, login, client_id, pin, options)
when is_binary(login) and is_binary(client_id) and is_binary(pin) do
{seq, accounts} = Synchronization.initialize_dialog(bank, login, client_id, pin)
request_segments = [
%HNHBK{},
%HNSHK{},
%HKSPA{},
%HNSHA{},
%HNHBS{}
]
{:ok, response} = seq |> Sequencer.call_http(request_segments)
accounts = add_sepa_data(accounts, response)
seq = seq |> Sequencer.inc
{acc, seq} = accounts
|> Dict.to_list
|> Stream.filter(fn {_, %Account{:supported_transactions => supported_transactions}} ->
supported_transactions |> Enum.member?("HKSAL")
end)
|> Enum.map_reduce(seq, fn({key, acc}, seq) ->
account = seq |> GetAccountBalance.get_account_balance(acc)
{{key, account}, seq |> Sequencer.inc}
end)
%{} = Task.async(fn -> seq |> Synchronization.terminate_dialog end)
accounts |> Dict.merge(acc) |> Dict.values
end
defp add_sepa_data(accounts, response) do
response[:HISPA]
|> Enum.at(0)
|> Stream.drop(1)
|> Stream.filter(fn info -> Enum.at(info, 0) === "J" end)
|> Stream.map(fn info ->
account = accounts |> Dict.get(Enum.at(info, 3))
account = %Account{account |
iban: Enum.at(info, 1),
bic: Enum.at(info, 2)
}
%{account_number: account_number} = account
{account_number, account}
end)
|> Enum.into(accounts)
end
end