defmodule ExCnab.Cnab240.Templates.Details.ModelW do
@moduledoc """
Template to generate an cnab 240 object from file, following the W-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 O-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)
│ └── Movimento
│ ├── Tipo (15..15)
│ └── Código (16..17)
│
├── Pagamento
│ ├── Código Barras (18..61)
│ │
│ ├── Nome da Concessionária (62..91)
│ │
│ ├── Data vencimento (92..99)
│ │
│ ├── Data Pagamento (100..107)
│ │
│ ├── Valor pagamento (108..122)
│ │
│ ├── Seu número (123..142)
│ │
│ └── Nosso número (143..162)
│
├── CNAB (163..230)
│
└── Ocorrências (231..240)
"""
alias ExCnab.Cnab240.Validator.Details.ModelW, as: ModelWValidator
@spec generate(String.t()) :: {:ok, Map.t()}
def generate(raw_string) do
control_field = control_field(raw_string)
service_field = service_field(raw_string)
info_field = build_infos_field(raw_string)
%{
controle: control_field,
servico: service_field,
complemento_registro: convert_position(raw_string, 15),
identifica_uso_infomacoes_1_e_2: convert_position(raw_string, 16),
informacao_complementar_1: convert_position(raw_string, 17, 96),
informacao_complementar_2: convert_position(raw_string, 87, 176),
informacao_complementar_3: %{
identificador_tributo: convert_position(raw_string, 177, 178),
informacao_complementar_tributo: info_field
},
reservado: convert_position(raw_string, 229, 230),
ocorrencias: convert_position(raw_string, 231, 240)
}
|> ModelWValidator.call(raw_string)
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)
}
end
defp build_infos_field(raw_string) do
%{
receita: convert_position(raw_string, 179, 184),
tipo_id_contribuinte: convert_position(raw_string, 185, 186),
id_contribuinte: convert_position(raw_string, 187, 200),
identificador: convert_position(raw_string, 201, 216),
lacre: convert_position(raw_string, 217, 225),
digito_lacre: convert_position(raw_string, 226, 227),
reservado: convert_position(raw_string, 228)
}
end
def encode(detail) do
%{
controle: %{
banco: banco,
lote: lote,
registro: registro
},
servico: %{
n_registro: n_registro,
segmento: segmento
},
complemento_registro: complemento_registro,
identifica_uso_infomacoes_1_e_2: identifica_uso_infomacoes_1_e_2,
informacao_complementar_1: informacao_complementar_1,
informacao_complementar_2: informacao_complementar_2,
informacao_complementar_3: %{
identificador_tributo: identificador_tributo,
informacao_complementar_tributo: %{
receita: receita,
tipo_id_contribuinte: tipo_id_contribuinte,
id_contribuinte: id_contribuinte,
identificador: identificador,
lacre: lacre,
digito_lacre: digito_lacre,
reservado: reservado_01
}
},
reservado: reservado_02,
ocorrencias: ocorrencias
} = detail
[
banco,
lote,
registro,
n_registro,
segmento,
complemento_registro,
identifica_uso_infomacoes_1_e_2,
informacao_complementar_1,
informacao_complementar_2,
identificador,
receita,
tipo_id_contribuinte,
id_contribuinte,
identificador_tributo,
lacre,
digito_lacre,
reservado_01,
reservado_02,
ocorrencias
]
|> Enum.join()
end
end