app/excnab/cnab240/services/calc_amout.ex

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