defmodule ExCnab.Cnab240.Templates.Details.ModelJ do
@moduledoc """
Template to generate an cnab 240 object from file, following the J-segment pattern;
"""
import Helpers.ConvertPosition
@doc """
This function generate a Header Chunk Map from a Cnab240 file, using the **FEBRABAN** convention. The fields follows the J-segment hierarchy,
and the returns is in PT BR.
You can see all hierarchy in the FEBRABAN documentation.
```md
CNAB
├── Controle
│ ├── Banco (1..3)
│ ├── Lote (4..7)
│ └── Registro (8..8)
│
├── Serviço
│ ├── N do registro (9..13)
│ ├── Segmento (14..14)
│ ├── CNAB (15..15)
│ └── Cod. Mov (16..17)
│
├── Pagamento
│ ├── Código de barras (18..61)
│ ├── Nome do beneficiário (62..91)
│ ├── Data de vencimento (92..99)
│ ├── Valor do título (100..114)
│ ├── Desconto (115..129)
│ ├── Acréscimos (130..144)
│ ├── Data de pagamento (145..152)
│ ├── Valor do pagamento (153..167)
│ ├── Quantidade da moeda (168..182)
│ └── Referência sacado (183..202)
│
├── Nosso número (203..222)
│
├── Código da moeda (223..224)
│
├── CNAB (225..230)
│
└── Ocorrências (231..240)
```
"""
alias ExCnab.Cnab240.Validator.Details.ModelJ, as: ModelJValidator
alias ExCnab.Cnab240.Templates.Details.ModelJ52, as: ModelJ52
@spec generate(String.t()) :: {:ok, Map.t()}
def generate(raw_string) do
case convert_position(raw_string, 18, 19) do
"52" ->
ModelJ52.generate(raw_string)
_ ->
control_field = control_field(raw_string)
service_field = service_field(raw_string)
payment_field = payment_field(raw_string)
%{
controle: control_field,
servico: service_field,
pagamento: payment_field,
nosso_numero: convert_position(raw_string, 203, 222),
codigo_moeda: convert_position(raw_string, 223, 224),
cnab: convert_position(raw_string, 225, 230),
ocorrencias: convert_position(raw_string, 231, 240)
}
|> ModelJValidator.call(raw_string)
end
end
defp control_field(raw_string) do
%{
banco: convert_position(raw_string, 1, 3),
lote: convert_position(raw_string, 4, 7),
registro: convert_position(raw_string, 8)
}
end
defp service_field(raw_string) do
%{
n_registro: convert_position(raw_string, 9, 13),
segmento: convert_position(raw_string, 14),
movimento: %{
tipo: convert_position(raw_string, 15),
codigo: convert_position(raw_string, 16, 17)
}
}
end
defp payment_field(raw_string) do
%{
codigo_de_barras: convert_position(raw_string, 18, 61),
nome_beneficiario: convert_position(raw_string, 62, 91),
data_vencimento: convert_position(raw_string, 92, 99),
valor_do_titulo: convert_position(raw_string, 100, 114),
desconto: convert_position(raw_string, 115, 129),
acrescimos: convert_position(raw_string, 130, 144),
data_pagamento: convert_position(raw_string, 145, 152),
valor_pagamento: convert_position(raw_string, 153, 167),
quantidade_da_moeda: convert_position(raw_string, 168, 182),
referencia_sacado: convert_position(raw_string, 183, 202)
}
end
@spec encode(detail :: Map.t()) :: String.t()
def encode(%{cod_reg: "52"} = detail), do: ModelJ52.encode(detail)
def encode(detail) do
%{
controle: %{
banco: banco,
lote: lote,
registro: registro
},
servico: %{
n_registro: n_registro,
segmento: segmento,
movimento: %{
tipo: tipo_movimento,
codigo: codigo_movimento
}
},
pagamento: %{
codigo_de_barras: codigo_de_barras,
nome_beneficiario: nome_beneficiario,
data_vencimento: data_vencimento,
valor_do_titulo: valor_do_titulo,
desconto: desconto,
acrescimos: acrescimos,
data_pagamento: data_pagamento,
valor_pagamento: valor_pagamento,
quantidade_da_moeda: quantidade_da_moeda,
referencia_sacado: referencia_sacado
},
nosso_numero: nosso_numero,
codigo_moeda: codigo_moeda,
cnab: cnab,
ocorrencias: ocorrencias
} = detail
[
banco,
lote,
registro,
n_registro,
segmento,
tipo_movimento,
codigo_movimento,
codigo_de_barras,
nome_beneficiario,
data_vencimento,
valor_do_titulo,
desconto,
acrescimos,
data_pagamento,
valor_pagamento,
quantidade_da_moeda,
referencia_sacado,
nosso_numero,
codigo_moeda,
cnab,
ocorrencias
]
|> Enum.join()
end
end