defmodule ExCnab.Cnab240.Templates.Details.ModelJ52 do @moduledoc """ Template to generate an cnab 240 object from file, following the J 52 -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) │ ├── Cod Reg. Opcional (18..19) │ ├── Dados sacador/pagador │ ├── Inscrição │ │ ├── Tipo (20..20) │ │ └── Número (21..35) │ │ │ └── Nome (36..75) │ ├── Dados beneficiario │ ├── Inscrição │ │ ├── Tipo (76..76) │ │ └── Número (77..91) │ │ │ └── Nome (92..131) │ ├── Dados sacador avalista │ ├── Inscrição │ │ ├── Tipo (132..132) │ │ └── Número (133..147) │ │ │ └── Nome (148..187) │ └── CNAB (188..240) """ alias ExCnab.Cnab240.Validator.Details.ModelJ52, as: ModelJ52Validator @spec generate(String.t()) :: {:ok, Map.t()} def generate(raw_string) do control_field = control_field(raw_string) service_field = service_field(raw_string) drawer_field = drawer_field(raw_string) beneficiary_field = beneficiary_field(raw_string) drawer_voucher_field = drawer_voucher_field(raw_string) %{ controle: control_field, servico: service_field, dados_sacador: drawer_field, dados_beneficiario: beneficiary_field, dados_sacador_avalista: drawer_voucher_field, cod_reg: convert_position(raw_string, 18, 19), cnab: convert_position(raw_string, 188, 240) } |> ModelJ52Validator.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), cnab: convert_position(raw_string, 15), cod_mov: convert_position(raw_string, 16, 17) } end defp drawer_field(raw_string) do %{ inscricao: %{ tipo: convert_position(raw_string, 20), number: convert_position(raw_string, 21, 35) }, nome: convert_position(raw_string, 36, 75) } end defp beneficiary_field(raw_string) do %{ inscricao: %{ tipo: convert_position(raw_string, 76), number: convert_position(raw_string, 77, 91) }, nome: convert_position(raw_string, 92, 131) } end defp drawer_voucher_field(raw_string) do %{ inscricao: %{ tipo: convert_position(raw_string, 132), number: convert_position(raw_string, 133, 147) }, nome: convert_position(raw_string, 148, 187) } end def encode(detail) do %{ controle: %{ banco: banco, lote: lote, registro: registro }, servico: %{ n_registro: n_registro, segmento: segmento, cnab: cnab_01, cod_mov: cod_mov }, dados_sacador: %{ inscricao: %{ tipo: tipo_sacador, number: numero_sacador }, nome: nome_sacador }, dados_beneficiario: %{ inscricao: %{ tipo: tipo_beneficiario, number: numero_beneficiario }, nome: nome_beneficiario }, dados_sacador_avalista: %{ inscricao: %{ tipo: tipo_sacador_avalista, number: numero_sacador_avalista }, nome: nome_sacador_avalista }, cod_reg: cod_reg, cnab: cnab } = detail [ banco, lote, registro, n_registro, segmento, cnab_01, cod_mov, cod_reg, tipo_sacador, numero_sacador, nome_sacador, tipo_beneficiario, numero_beneficiario, nome_beneficiario, tipo_sacador_avalista, numero_sacador_avalista, nome_sacador_avalista, cnab ] |> Enum.join() end end