Packages

HBCI/FinTS client library for Elixir.

Current section

Files

Jump to
fintex lib command initialize.ex
Raw

lib/command/initialize.ex

defmodule FinTex.Command.Initialize do
@moduledoc false
alias FinTex.Command.AbstractCommand
alias FinTex.Command.Sequencer
alias FinTex.Model.Dialog
alias FinTex.Segment.HKEND
alias FinTex.Segment.HKIDN
alias FinTex.Segment.HKSYN
alias FinTex.Segment.HKVVB
alias FinTex.Segment.HNHBK
alias FinTex.Segment.HNHBS
alias FinTex.Segment.HNSHA
alias FinTex.Segment.HNSHK
@allowed_methods 3920
use AbstractCommand
def initialize_dialog(bank, credentials, options) when is_list(options) do
seq = Sequencer.new("0", bank, credentials, options)
request_segments = [
%HNHBK{},
%HNSHK{},
%HKIDN{},
%HKVVB{},
%HKSYN{},
%HNSHA{},
%HNHBS{}
]
{:ok, response} = seq |> Sequencer.call_http(request_segments)
client_system_id = response[:HISYN]
|> Enum.at(0)
|> Enum.at(-1)
tan_scheme_sec_func = response[:HIRMS]
|> messages
|> Stream.filter(fn [code | _] -> code === @allowed_methods end)
|> Stream.map(fn [_, _, _ | params] -> params end)
|> Enum.at(0)
|> Enum.sort(&(&1 > &2)) # choose TAN scheme with highest identifier, closest to default TAN scheme "999"
|> Enum.at(0)
seq = seq
|> Sequencer.inc
|> Sequencer.update(client_system_id)
|> Sequencer.reset(tan_scheme_sec_func)
request_segments = [
%HNHBK{},
%HNSHK{},
%HKEND{},
%HNSHA{},
%HNHBS{}
]
{:ok} = seq |> Sequencer.call_http(request_segments, ignore_response: true)
{seq, seq |> Sequencer.dialog}
end
end