defmodule ExCnab.Cnab240.Templates.Details.ModelN do @moduledoc """ Template to generate an cnab 240 object from file, following the N-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 │ ├── Seu numero (18..37) │ │ │ ├── Nosso numero (38..57) │ │ │ ├── Contribuinte (58..57) │ │ │ ├── Data pagamento (88..95) │ │ │ └── Valor pagamento (96..110) │ ├── Informacoes complementares (111..230) │ └── Ocorrências (231..240) """ @spec generate(String.t()) :: {:ok, Map.t()} def generate(raw_string) do control_field = control_field(raw_string) service_field = service_field(raw_string) payment_field = payment_field(raw_string) complementary_info = raw_string |> convert_position(133, 134) |> complementary_info_fields(raw_string) {:ok, %{ controle: control_field, servico: service_field, pagamento: payment_field, informacoes_complementares: complementary_info, ocorrencias: convert_position(raw_string, 231, 240) }} 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 %{ seu_numero: convert_position(raw_string, 18, 37), nosso_numero: convert_position(raw_string, 38, 57), contribuinte: convert_position(raw_string, 58, 87), data_pagamento: convert_position(raw_string, 88, 95), valor_pagamento: convert_position(raw_string, 96, 110) } end # DARF defp complementary_info_fields("16", raw_string) do %{ receita: convert_position(raw_string, 111, 116), tipo_id_contribuinte: convert_position(raw_string, 117, 118), id_contribuinte: convert_position(raw_string, 119, 132), id_tributo: convert_position(raw_string, 133, 134), periodo: convert_position(raw_string, 135, 142), referencia: convert_position(raw_string, 143, 159), valor_principal: convert_position(raw_string, 158, 174), valor_multa: convert_position(raw_string, 175, 189), juros_e_encargos: convert_position(raw_string, 190, 204), data_vencimento: convert_position(raw_string, 205, 212), cnab: convert_position(raw_string, 213, 230) } end # GPS defp complementary_info_fields("17", raw_string) do %{ receita: convert_position(raw_string, 111, 116), tipo_id_contribuinte: convert_position(raw_string, 117, 118), id_contribuinte: convert_position(raw_string, 119, 132), id_tributo: convert_position(raw_string, 133, 134), competencia: convert_position(raw_string, 135, 140), valor_tributo: convert_position(raw_string, 141, 155), valor_outras_entidades: convert_position(raw_string, 156, 170), atualizacao_monetaria: convert_position(raw_string, 171, 185), cnab: convert_position(raw_string, 186, 230) } end # DARF SIMPLES defp complementary_info_fields("18", raw_string) do %{ receita: convert_position(raw_string, 111, 116), tipo_id_contribuinte: convert_position(raw_string, 117, 118), id_contribuinte: convert_position(raw_string, 119, 132), id_tributo: convert_position(raw_string, 133, 134), periodo: convert_position(raw_string, 135, 142), receita_bruta: convert_position(raw_string, 143, 157), percentual: convert_position(raw_string, 158, 164), valor_principal: convert_position(raw_string, 165, 179), valor_multa: convert_position(raw_string, 180, 194), juros_e_encargos: convert_position(raw_string, 195, 209), cnab: convert_position(raw_string, 210, 230) } end end