brcobranca_sicredi_400 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +91 -0
  5. data/Rakefile +8 -0
  6. data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
  7. data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
  8. data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  9. data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
  13. data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  14. data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
  15. data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  16. data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
  17. data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  18. data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
  19. data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  20. data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
  21. data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  22. data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
  23. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
  24. data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
  25. data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
  26. data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
  27. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
  28. data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
  29. data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  30. data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
  31. data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
  32. data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
  33. data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
  34. data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
  35. data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
  36. data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
  37. data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  38. data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
  39. data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  40. data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
  41. data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
  42. data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  43. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  44. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  45. data/lib/brcobranca/boleto/ailos.rb +89 -0
  46. data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
  47. data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
  48. data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
  49. data/lib/brcobranca/boleto/banestes.rb +86 -0
  50. data/lib/brcobranca/boleto/banrisul.rb +95 -0
  51. data/lib/brcobranca/boleto/base.rb +256 -0
  52. data/lib/brcobranca/boleto/bradesco.rb +100 -0
  53. data/lib/brcobranca/boleto/caixa.rb +123 -0
  54. data/lib/brcobranca/boleto/citibank.rb +97 -0
  55. data/lib/brcobranca/boleto/credisis.rb +118 -0
  56. data/lib/brcobranca/boleto/hsbc.rb +96 -0
  57. data/lib/brcobranca/boleto/itau.rb +138 -0
  58. data/lib/brcobranca/boleto/safra.rb +152 -0
  59. data/lib/brcobranca/boleto/santander.rb +86 -0
  60. data/lib/brcobranca/boleto/sicoob.rb +120 -0
  61. data/lib/brcobranca/boleto/sicredi.rb +145 -0
  62. data/lib/brcobranca/boleto/template/base.rb +28 -0
  63. data/lib/brcobranca/boleto/template/rghost.rb +308 -0
  64. data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
  65. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
  66. data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
  67. data/lib/brcobranca/boleto/unicred.rb +99 -0
  68. data/lib/brcobranca/calculo.rb +120 -0
  69. data/lib/brcobranca/calculo_data.rb +63 -0
  70. data/lib/brcobranca/currency.rb +69 -0
  71. data/lib/brcobranca/formatacao.rb +104 -0
  72. data/lib/brcobranca/formatacao_string.rb +37 -0
  73. data/lib/brcobranca/limpeza.rb +20 -0
  74. data/lib/brcobranca/remessa/base.rb +72 -0
  75. data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
  76. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
  77. data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
  78. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
  79. data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
  80. data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
  81. data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
  82. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
  83. data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
  84. data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
  85. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  86. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
  87. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
  88. data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
  89. data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
  90. data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
  91. data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
  92. data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
  93. data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
  94. data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
  95. data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
  96. data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
  97. data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
  98. data/lib/brcobranca/remessa/pagamento.rb +320 -0
  99. data/lib/brcobranca/retorno/base.rb +11 -0
  100. data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
  101. data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
  102. data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
  103. data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
  104. data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
  105. data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
  106. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
  107. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
  108. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
  109. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  110. data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
  111. data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
  112. data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
  113. data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
  114. data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
  115. data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
  116. data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
  117. data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
  118. data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
  119. data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
  120. data/lib/brcobranca/util/date.rb +21 -0
  121. data/lib/brcobranca/util/empresa.rb +29 -0
  122. data/lib/brcobranca/util/errors.rb +76 -0
  123. data/lib/brcobranca/validations.rb +208 -0
  124. data/lib/brcobranca/version.rb +5 -0
  125. data/lib/brcobranca.rb +200 -0
  126. metadata +225 -0
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab240
8
+ class Base < Brcobranca::Retorno::Base
9
+ # Load lines
10
+ def self.load_lines(file, options = {})
11
+ return nil unless file
12
+
13
+ codigo_banco = codigo_banco_do_arquivo(file)
14
+
15
+ case codigo_banco
16
+ when '033'
17
+ Brcobranca::Retorno::Cnab240::Santander.load_lines(file, options)
18
+ when '085'
19
+ Brcobranca::Retorno::Cnab240::Ailos.load_lines(file, options)
20
+ when '748'
21
+ Brcobranca::Retorno::Cnab240::Sicredi.load_lines(file, options)
22
+ when '756'
23
+ Brcobranca::Retorno::Cnab240::Sicoob.load_lines(file, options)
24
+ else
25
+ Brcobranca::Retorno::RetornoCnab240.load_lines(file, options)
26
+ end
27
+ end
28
+
29
+ # Codigo do banco lido do arquivo.
30
+ # Registro Header [0..2]
31
+ def self.codigo_banco_do_arquivo(file)
32
+ arquivo = File.open(file)
33
+ header = arquivo.gets
34
+ codigo_banco = header.blank? ? nil : header[0..2]
35
+ arquivo.close
36
+ codigo_banco
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Retorno
5
+ module Cnab240
6
+ # Formato de Retorno CNAB 240
7
+ # Baseado em: http://www.caixa.gov.br/downloads/cobranca-caixa-manuais/LEIAUTE_CNAB_240_SIGCB_COBRANCA_CAIXA.pdf
8
+ class Caixa < Brcobranca::Retorno::RetornoCnab240
9
+ class Line < Brcobranca::Retorno::RetornoCnab240::Line
10
+ # Fixed width layout for Caixa
11
+ fixed_width_layout do |parse|
12
+ # REGISTRO_T_FIELDS
13
+ # Not applicable
14
+ # :cedente_com_dv
15
+
16
+ # Same inherited from parent
17
+ # parse.field :data_vencimento, 73..80
18
+ # parse.field :valor_titulo, 81..95
19
+ # parse.field :banco_recebedor, 96..98
20
+ # parse.field :sequencial, 8..12
21
+ # parse.field :valor_tarifa, 198..212
22
+ # parse.field :agencia_com_dv, 17..22
23
+
24
+ parse.field :codigo_ocorrencia, 15..16
25
+ parse.field :nosso_numero, 39..55
26
+ parse.field :agencia_recebedora_com_dv, 99..103
27
+ parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
28
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
29
+ }
30
+
31
+ # REGISTRO_U_FIELDS
32
+
33
+ # Same inherited from parent
34
+ # parse.field :desconto_concedito, 32..46
35
+ # parse.field :valor_abatimento, 47..61
36
+ # parse.field :iof_desconto, 62..76
37
+ # parse.field :juros_mora, 17..31
38
+ # parse.field :valor_recebido, 77..91
39
+ # parse.field :outras_despesas, 107..121
40
+ # parse.field :outros_recebimento, 122..136
41
+ # parse.field :data_credito, 145..152
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Retorno
5
+ module Cnab240
6
+ class Santander < Brcobranca::Retorno::Cnab240::Base
7
+ # Regex para remoção de headers e trailers além de registros diferentes de T ou U
8
+ REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
9
+
10
+ def self.load_lines(file, options = {})
11
+ default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
12
+ options = default_options.merge!(options)
13
+
14
+ Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
15
+ retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
16
+ end
17
+ end
18
+
19
+ def self.generate_retorno_based_on_cnab_lines(cnab_lines)
20
+ retorno = new
21
+ cnab_lines.each do |line|
22
+ if line.tipo_registro == 'T'
23
+ Line::REGISTRO_T_FIELDS.each do |attr|
24
+ retorno.send(:"#{attr}=", line.send(attr))
25
+ end
26
+ else
27
+ Line::REGISTRO_U_FIELDS.each do |attr|
28
+ retorno.send(:"#{attr}=", line.send(attr))
29
+ end
30
+ end
31
+ end
32
+ retorno
33
+ end
34
+
35
+ # Linha de mapeamento do retorno do arquivo CNAB 240
36
+ # O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
37
+ # O primeiro é do tipo T que retorna dados gerais sobre a transação
38
+ # O segundo é do tipo U que retorna os valores da transação
39
+ class Line < Base
40
+ extend ParseLine::FixedWidth # Extendendo parseline
41
+
42
+ REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
43
+ data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
44
+ REGISTRO_U_FIELDS = %w[desconto_concedito data_ocorrencia valor_abatimento iof_desconto juros_mora
45
+ valor_recebido outras_despesas outros_recebimento data_credito].freeze
46
+
47
+ attr_accessor :tipo_registro
48
+
49
+ fixed_width_layout do |parse|
50
+ parse.field :codigo_registro, 7..7
51
+ parse.field :sequencial, 8..12
52
+ parse.field :tipo_registro, 13..13
53
+ parse.field :codigo_ocorrencia, 15..16
54
+ parse.field :agencia_com_dv, 17..21
55
+ parse.field :cedente_com_dv, 22..31
56
+ parse.field :nosso_numero, 40..52
57
+ parse.field :carteira, 53..53
58
+ parse.field :data_vencimento, 69..76
59
+ parse.field :valor_titulo, 77..91
60
+ parse.field :banco_recebedor, 92..94
61
+ parse.field :agencia_recebedora_com_dv, 95..99
62
+ parse.field :data_ocorrencia, 137..144
63
+ parse.field :data_credito, 145..152
64
+ parse.field :outras_despesas, 107..121
65
+ parse.field :iof_desconto, 62..76
66
+ parse.field :valor_abatimento, 47..61
67
+ parse.field :desconto_concedito, 32..46
68
+ parse.field :valor_recebido, 77..91
69
+ parse.field :juros_mora, 17..31
70
+ parse.field :outros_recebimento, 122..136
71
+ parse.field :valor_tarifa, 193..207
72
+ parse.field :motivo_ocorrencia, 208..117, lambda { |motivos|
73
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
74
+ }
75
+
76
+ # Dados que não consegui extrair dos registros T e U
77
+ # parse.field :convenio,31..37
78
+ # parse.field :tipo_cobranca,80..80
79
+ # parse.field :tipo_cobranca_anterior,81..81
80
+ # parse.field :natureza_recebimento,86..87
81
+ # parse.field :carteira_variacao,91..93
82
+ # parse.field :desconto,95..99
83
+ # parse.field :iof,100..104
84
+ # parse.field :comando,108..109
85
+ # parse.field :data_liquidacao,110..115
86
+ # parse.field :especie_documento,173..174
87
+ # parse.field :valor_tarifa,181..187
88
+ # parse.field :juros_desconto,201..213
89
+ # parse.field :abatimento_nao_aproveitado,292..304
90
+ # parse.field :valor_lancamento,305..317
91
+ # parse.field :indicativo_lancamento,318..318
92
+ # parse.field :indicador_valor,319..319
93
+ # parse.field :valor_ajuste,320..331
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab240
8
+ class Sicoob < Brcobranca::Retorno::Cnab240::Base
9
+ # Regex para remoção de headers e trailers além de registros diferentes de T ou U
10
+ REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
11
+
12
+ def self.load_lines(file, options = {})
13
+ default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
14
+ options = default_options.merge!(options)
15
+
16
+ Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
17
+ retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
18
+ end
19
+ end
20
+
21
+ def self.generate_retorno_based_on_cnab_lines(cnab_lines)
22
+ retorno = new
23
+ cnab_lines.each do |line|
24
+ if line.tipo_registro == 'T'
25
+ Line::REGISTRO_T_FIELDS.each do |attr|
26
+ retorno.send(:"#{attr}=", line.send(attr))
27
+ end
28
+ else
29
+ Line::REGISTRO_U_FIELDS.each do |attr|
30
+ retorno.send(:"#{attr}=", line.send(attr))
31
+ end
32
+ end
33
+ end
34
+ retorno
35
+ end
36
+
37
+ # Linha de mapeamento do retorno do arquivo CNAB 240
38
+ # O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
39
+ # O primeiro é do tipo T que retorna dados gerais sobre a transação
40
+ # O segundo é do tipo U que retorna os valores da transação
41
+ class Line < Base
42
+ extend ParseLine::FixedWidth # Extendendo parseline
43
+
44
+ REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
45
+ data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
46
+ REGISTRO_U_FIELDS = %w[desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido
47
+ outras_despesas outros_recebimento data_credito data_ocorrencia].freeze
48
+
49
+ attr_accessor :tipo_registro
50
+
51
+ fixed_width_layout do |parse|
52
+ parse.field :codigo_registro, 7..7
53
+ parse.field :tipo_registro, 13..13
54
+ parse.field :sequencial, 8..12
55
+ parse.field :codigo_ocorrencia, 15..16
56
+ parse.field :agencia_com_dv, 17..22
57
+ parse.field :cedente_com_dv, 23..35
58
+ parse.field :nosso_numero, 37..46
59
+ parse.field :carteira, 57..57
60
+ parse.field :data_vencimento, 73..80
61
+ parse.field :valor_titulo, 81..95
62
+ parse.field :banco_recebedor, 96..98
63
+ parse.field :agencia_recebedora_com_dv, 99..104
64
+ parse.field :data_ocorrencia, 137..144
65
+ parse.field :data_credito, 145..152
66
+ parse.field :outras_despesas, 107..121
67
+ parse.field :iof_desconto, 62..76
68
+ parse.field :valor_abatimento, 47..61
69
+ parse.field :desconto_concedito, 32..46
70
+ parse.field :valor_recebido, 77..91
71
+ parse.field :juros_mora, 17..31
72
+ parse.field :outros_recebimento, 122..136
73
+ parse.field :valor_tarifa, 198..212
74
+ parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
75
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
76
+ }
77
+
78
+ # Dados que não consegui extrair dos registros T e U
79
+ # parse.field :convenio,31..37
80
+ # parse.field :tipo_cobranca,80..80
81
+ # parse.field :tipo_cobranca_anterior,81..81
82
+ # parse.field :natureza_recebimento,86..87
83
+ # parse.field :carteira_variacao,91..93
84
+ # parse.field :desconto,95..99
85
+ # parse.field :iof,100..104
86
+ # parse.field :comando,108..109
87
+ # parse.field :data_liquidacao,110..115
88
+ # parse.field :especie_documento,173..174
89
+ # parse.field :valor_tarifa,181..187
90
+ # parse.field :juros_desconto,201..213
91
+ # parse.field :abatimento_nao_aproveitado,292..304
92
+ # parse.field :valor_lancamento,305..317
93
+ # parse.field :indicativo_lancamento,318..318
94
+ # parse.field :indicador_valor,319..319
95
+ # parse.field :valor_ajuste,320..331
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab240
8
+ class Sicredi < Brcobranca::Retorno::Cnab240::Base
9
+ # Regex para remoção de headers e trailers além de registros diferentes de T ou U
10
+ REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
11
+
12
+ def self.load_lines(file, options = {})
13
+ default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
14
+ options = default_options.merge!(options)
15
+
16
+ Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
17
+ retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
18
+ end
19
+ end
20
+
21
+ def self.generate_retorno_based_on_cnab_lines(cnab_lines)
22
+ retorno = new
23
+ cnab_lines.each do |line|
24
+ if line.tipo_registro == 'T'
25
+ Line::REGISTRO_T_FIELDS.each do |attr|
26
+ retorno.send(:"#{attr}=", line.send(attr))
27
+ end
28
+ else
29
+ Line::REGISTRO_U_FIELDS.each do |attr|
30
+ retorno.send(:"#{attr}=", line.send(attr))
31
+ end
32
+ end
33
+ end
34
+ retorno
35
+ end
36
+
37
+ # Linha de mapeamento do retorno do arquivo CNAB 240
38
+ # O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
39
+ # O primeiro é do tipo T que retorna dados gerais sobre a transação
40
+ # O segundo é do tipo U que retorna os valores da transação
41
+ class Line < Base
42
+ extend ParseLine::FixedWidth # Extendendo parseline
43
+
44
+ REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
45
+ data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
46
+ REGISTRO_U_FIELDS = %w[desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido
47
+ outras_despesas outros_recebimento data_ocorrencia data_credito].freeze
48
+
49
+ attr_accessor :tipo_registro
50
+
51
+ fixed_width_layout do |parse|
52
+ parse.field :codigo_registro, 7..7
53
+ parse.field :tipo_registro, 13..13
54
+ parse.field :sequencial, 8..12
55
+ parse.field :codigo_ocorrencia, 15..16
56
+ parse.field :agencia_com_dv, 17..22
57
+ parse.field :cedente_com_dv, 23..35
58
+ parse.field :nosso_numero, 37..56
59
+ parse.field :carteira, 57..57
60
+ parse.field :data_vencimento, 73..80
61
+ parse.field :valor_titulo, 81..95
62
+ parse.field :banco_recebedor, 96..98
63
+ parse.field :agencia_recebedora_com_dv, 99..104
64
+ parse.field :data_ocorrencia, 137..144
65
+ parse.field :data_credito, 145..152
66
+ parse.field :outras_despesas, 107..121
67
+ parse.field :iof_desconto, 62..76
68
+ parse.field :valor_abatimento, 47..61
69
+ parse.field :desconto_concedito, 32..46
70
+ parse.field :valor_recebido, 77..91
71
+ parse.field :juros_mora, 17..31
72
+ parse.field :outros_recebimento, 122..136
73
+ parse.field :valor_tarifa, 198..212
74
+ parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
75
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
76
+ }
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab400
8
+ # Formato de Retorno CNAB 400
9
+ # Baseado em: http://www.bb.com.br/docs/pub/emp/empl/dwn/Doc2628CBR643Pos7.pdf
10
+ class BancoBrasil < Brcobranca::Retorno::Cnab400::Base
11
+ extend ParseLine::FixedWidth # Extendendo parseline
12
+
13
+ # Load lines
14
+ def self.load_lines(file, options = {})
15
+ default_options = { except: [1] } # por padrao ignora a primeira linha que é header
16
+ options = default_options.merge!(options)
17
+ super(file, options)
18
+ end
19
+
20
+ fixed_width_layout do |parse|
21
+ # Todos os campos descritos no documento em ordem
22
+ # :tipo_de_registro, 0..0 # identificacao do registro transacao
23
+ # :zeros, 1..2 # zeros
24
+ # :zeros, 3..16 #zeros
25
+
26
+ # :codigo_registro, 0..0 #identificação do registro
27
+ parse.field :codigo_registro, 0..0
28
+
29
+ # :agencia, 17..21 #agencia mantenedora da conta com digito
30
+ parse.field :agencia_com_dv, 17..21
31
+
32
+ # :conta, 22..30 #numero da conta corrente da empresa com digito
33
+ parse.field :cedente_com_dv, 22..30
34
+
35
+ # :convenio, 31..37 #convenio da empresa
36
+ # :uso_da_empresa, 38..62 #identificacao do titulo na empresa
37
+
38
+ # :nosso_numero,63..79 # identificacao do titulo no banco
39
+ parse.field :nosso_numero, 63..79
40
+
41
+ # :tipo_cobranca, 80..80 #tipo de cobranca
42
+ # :tipo_cobranca_anterior, 81..81 #tipo de cobranca
43
+
44
+ # :dias, 82..85 #dias para calculo
45
+
46
+ # :natureza_recebimento, 86..87 #natureza do recebimento
47
+ parse.field :motivo_ocorrencia, 86..87, ->(motivos) { motivos.scan(/../).reject { |n| n.to_i.zero? } }
48
+
49
+ # :prefixo_titulo, 88..90 #prefixo do titulo
50
+ parse.field :carteira_variacao, 91..93
51
+
52
+ # :conta_caucao, 94..94 #conta caução
53
+ # :taxa_desconto, 95..99 #taxa para desconto
54
+ # :taxa_iof, 100..104 #taxa para iof
55
+
56
+ # :brancos, 105..105 #brancos
57
+ parse.field :carteira, 106..107
58
+
59
+ # :cod_de_ocorrencia, 108..109 # cod de ocorrencia no banco
60
+ parse.field :codigo_ocorrencia, 108..109
61
+
62
+ # :data_de_ocorrencia, 110..115 # data de ocorrencia no banco (ddmmaa)
63
+ parse.field :data_ocorrencia, 110..115
64
+
65
+ # :n_do_documento, 116..125 # n umero do documento de cobranca (dupl, np etc)
66
+ # :brancos, 126..145 #complemento de registro
67
+
68
+ # :vencimento, 146..151 #data de vencimento do titulo (ddmmaa)
69
+ parse.field :data_vencimento, 146..151
70
+
71
+ # :valor_do_titulo, 152..164 #valor nominal do titulo (ultimos 2 digitos, virgula decimal assumida)
72
+ parse.field :valor_titulo, 152..164
73
+
74
+ # :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
75
+ parse.field :banco_recebedor, 165..167
76
+
77
+ # :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
78
+ # :dac_ag_cobradora, 172..172 # dac da agencia cobradora
79
+ parse.field :agencia_recebedora_com_dv, 168..172
80
+
81
+ # :especie, 173..174 # especie do titulo
82
+ parse.field :especie_documento, 173..174
83
+
84
+ # :data_credito, 295..300 #data de credito desta liquidacao
85
+ parse.field :data_credito, 175..180
86
+
87
+ # :tarifa_de_cobranca, 175..187 #valor da despesa de cobranca (ultimos 2 digitos, virgula decimal assumida)
88
+ parse.field :valor_tarifa, 181..187
89
+
90
+ # parse.field :outras_despesas, 188..200
91
+ # parse.field :juros_desconto, 201..213
92
+ # parse.field :iof_desconto, 214..226
93
+
94
+ # :valor_do_iof, 214..226 #valor do iof a ser recolhido (ultimos 2 digitos, virgula decimal assumida)
95
+ parse.field :iof, 214..226
96
+
97
+ # :valor_abatimento, 227..239 #valor do abatimento concedido (ultimos 2 digitos, virgula decimal assumida)
98
+ parse.field :valor_abatimento, 227..239
99
+
100
+ # :descontos, 240..252 #valor do desconto concedido (ultimos 2 digitos, virgula decimal assumida)
101
+ parse.field :desconto, 240..252
102
+
103
+ # :valor_principal, 253..265 #valor lancado em conta corrente (ultimos 2 digitos, virgula decimal assumida)
104
+
105
+ parse.field :valor_recebido, 253..265
106
+
107
+ # :juros_mora_multa, 266..278 #valor de mora e multa pagos pelo sacado (ultimos 2 digitos, virgula decimal assumida)
108
+ parse.field :juros_mora, 266..278
109
+
110
+ # :outros_creditos, 279..291 #valor de outros creditos (ultimos 2 digitos, virgula decimal assumida)
111
+ parse.field :outros_recebimento, 279..291
112
+
113
+ # parse.field :abatimento_nao_aproveitado, 292..304
114
+ # parse.field :valor_lancamento, 305..317
115
+ # parse.field :indicativo_lancamento, 318..318
116
+ # parse.field :indicador_valor, 319..319
117
+ # parse.field :valor_ajuste, 320..331
118
+ # :brancos, 332..341 #complemento de registro
119
+ # :zeros, 342..389 #complemento de registro
120
+ # :indicativo_liquidacao_parcial, 390..390 #Indicativo de Autorização de Liquidação Parcial
121
+ # :brancos, 391..391 #complemento de registro
122
+ # :cod_de_liquidacao, 392..393 #meio pelo qual o título foi liquidado
123
+
124
+ # :numero_sequencial, 394..399 #numero sequencial no arquivo
125
+ parse.field :sequencial, 394..399
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab400
8
+ # Formato de Retorno CNAB 400
9
+ class BancoBrasilia < Brcobranca::Retorno::Base
10
+ extend ParseLine::FixedWidth
11
+
12
+ def self.load_lines(file, options = {})
13
+ default_options = { except: [1] } # por padrao ignora a primeira linha que é header
14
+ options = default_options.merge!(options)
15
+
16
+ super(file, options)
17
+ end
18
+
19
+ fixed_width_layout do |parse|
20
+ # Todos os campos descritos no documento em ordem
21
+ # :tipo_de_registro, 0..0 # identificacao do registro transacao
22
+ parse.field :codigo_registro, 0..0
23
+
24
+ # :codigo_de_inscricao, 1..2 # identificacao do tipo de inscricao/empresa
25
+ # :numero_de_inscricao, 3..16 # numero de inscricao da empresa (cpf/cnpj)
26
+ # :zeros, 17..19
27
+
28
+ # Identificacao da empresa no banco
29
+ # :zeros, 20..20
30
+ parse.field :cedente_com_dv, 20..36
31
+
32
+ # :numero_controle_empresa, 37..61, # numero de controle da empresa
33
+ # :zeros, 62..69
34
+
35
+ # :nosso_numero, 62..69 # identificacao do titulo no banco
36
+ parse.field :nosso_numero, 70..81
37
+
38
+ # :zeros, 82..91 # uso do banco
39
+ # :zeros, 92..103 # uso do banco
40
+ # :indicador_de_rateio, 104..104 # indicador de rateio de credito
41
+ # :zeros, 105..106
42
+ # :carteira, 107..107 # de novo?
43
+ parse.field :codigo_ocorrencia, 108..109
44
+ parse.field :data_ocorrencia, 110..117
45
+ # :nosso_numero, 128..133 # confirmacao do numero do titulo no banco
46
+ # :brancos, 134..145 # complemento de registro
47
+
48
+ parse.field :data_vencimento, 148..155
49
+ parse.field :valor_titulo, 156..168
50
+ parse.field :banco_recebedor, 169..171
51
+
52
+ # :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
53
+ # :dac_ag_cobradora, 172..172 # dac da agencia cobradora
54
+ # :agencia_recebedora_com_dv, 168..172
55
+
56
+ parse.field :especie_documento, 177..178
57
+ parse.field :valor_tarifa, 179..191
58
+
59
+ # :outras_despesas 188..200, # valor de outras despesas ou custos do protesto
60
+ # :juros_operacao_em_atraso, 201..213 # zeros?
61
+
62
+ parse.field :iof, 218..230
63
+ parse.field :valor_abatimento, 231..243
64
+ parse.field :desconto, 244..256
65
+ parse.field :valor_recebido, 257..269
66
+ parse.field :outros_recebimento, 283..295
67
+
68
+ # :brancos, 292..293
69
+ # :motivo_do_codigo_de_ocorrencia, 294..294
70
+
71
+ # :data_credito, 295..300 # data de credito desta liquidacao
72
+ parse.field :data_credito, 299..306
73
+
74
+ # :origem_pagamento, 301..303
75
+ # :brancos, 304..313
76
+ # :cheque_bradesco, 314..317
77
+ # :motivo_rejeicao, 318..327
78
+ # :brancos, 328..367
79
+ # :numero_do_cartorio, 368..369
80
+ # :numero_do_protocolo, 370..379
81
+ # :brancos, 380..393
82
+
83
+ parse.field :motivo_ocorrencia, 364..393
84
+
85
+ parse.field :sequencial, 394..399
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end