Packages

HBCI/FinTS client library for Elixir.

Current section

Files

Jump to
fintex lib segment hkccs.ex
Raw

lib/segment/hkccs.ex

defmodule FinTex.Segment.HKCCS do
@moduledoc false
alias FinTex.Command.AbstractCommand
alias FinTex.Model.Account
alias FinTex.Model.Dialog
alias FinTex.Model.Payment
alias FinTex.Parser.Lexer
use AbstractCommand
@supported_sepa_descriptor_urns [
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03.xsd",
"urn:iso:std:iso:20022:tech:xsd:pain.001.002.03.xsd"
]
defstruct [:payment, segment: nil]
def new(
%__MODULE__{
payment: %Payment{
sender_account: %Account{
iban: sender_iban,
bic: sender_bic
}
} = payment
},
%Dialog{bpd: bpd}) do
ktv = [sender_iban, sender_bic]
available_sepa_descriptor_urns = bpd
|> Map.get("HKSPA" |> control_structure_to_bpd)
|> Enum.at(0)
|> Enum.at(-1)
|> Enum.at(-1)
|> Enum.map(fn urn -> urn |> String.split(":") |> Enum.at(-1) end)
sepa_descriptor_urn = @supported_sepa_descriptor_urns
|> Enum.find(fn urn -> available_sepa_descriptor_urns |> Enum.any?(fn s -> String.contains?(urn, s) end) end)
unless sepa_descriptor_urn do
raise FinTex.Error, reason:
"could not find any supported descriptor URN: #{inspect available_sepa_descriptor_urns}"
end
sepa_descriptor = ~r/\.xsd$/
|> Regex.replace(sepa_descriptor_urn, "")
sepa_pain_message = payment
|> Payment.to_sepa_pain_message(sepa_descriptor)
|> Lexer.encode_binary
%__MODULE__{
segment:
[
["HKCCS", "?", 1],
ktv,
sepa_descriptor,
sepa_pain_message
]
}
end
end
defimpl Inspect, for: FinTex.Segment.HKCCS do
use FinTex.Helper.Inspect
end