defmodule ExCnab.Cnab240.Services.CalcAmount do
@spec run(Map.t()) :: Integer.t()
def run(details) do
details
|> hd()
|> Map.get(:servico)
|> Map.get(:segmento)
|> calc_model(details)
end
defp calc_model("A", details) do
Enum.reduce(details, 0, fn detail, acc ->
case detail.servico.segmento == "A" do
true ->
acc + String.to_integer(detail.credito.valor_pagamento)
false ->
acc
end
end)
end
defp calc_model("J", details) do
Enum.reduce(details, 0, fn detail, acc ->
case detail.servico.segmento == "J" and !Map.has_key?(detail, :cod_reg) do
true ->
acc + String.to_integer(detail.pagamento.valor_pagamento)
false ->
acc
end
end)
end
defp calc_model("N", details) do
Enum.reduce(details, 0, fn detail, acc ->
case detail.servico.segmento == "J" do
true ->
acc + String.to_integer(detail.pagamento.valor_pagamento)
false ->
acc
end
end)
end
defp calc_model("O", details) do
Enum.reduce(details, 0, fn detail, acc ->
case detail.servico.segmento == "O" do
true ->
acc + String.to_integer(detail.pagamento.valor_pagamento)
false ->
acc
end
end)
end
end