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,78 @@
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 Sicredi
9
+ class Sicredi < Brcobranca::Retorno::Cnab400::Base
10
+ extend ParseLine::FixedWidth
11
+
12
+ # Carregar as linhas do arquivo, ignorando o header
13
+ def self.load_lines(file, options = {})
14
+ default_options = { except: [1] } # Ignorar primeira linha (header)
15
+ options = default_options.merge!(options)
16
+
17
+ super(file, options)
18
+ end
19
+
20
+ fixed_width_layout do |parse|
21
+ # Definir layout conforme especificado no manual
22
+ # Código de Registro: 1 - Transação
23
+ parse.field :codigo_registro, 0..0
24
+
25
+ # Agência sem dígito verificador (4 posições)
26
+ parse.field :agencia_sem_dv, 17..20
27
+
28
+ # Código do Cedente com dígito verificador (9 posições)
29
+ parse.field :cedente_com_dv, 22..30
30
+
31
+ # Nosso número (17 posições)
32
+ parse.field :nosso_numero, 45..61
33
+
34
+ # Código da ocorrência (2 posições)
35
+ parse.field :codigo_ocorrencia, 108..109
36
+
37
+ # Data do crédito (6 posições, formato DDMMAA)
38
+ parse.field :data_credito, 110..115
39
+
40
+ # Data de vencimento (6 posições, formato DDMMAA)
41
+ parse.field :data_vencimento, 146..151
42
+
43
+ # Valor nominal do título (13 posições, 2 últimas dígitos decimais)
44
+ parse.field :valor_titulo, 152..164
45
+
46
+ # Banco Recebedor (3 posições)
47
+ parse.field :banco_recebedor, 165..167
48
+
49
+ # Agência Recebedora com dígito verificador (5 posições)
50
+ parse.field :agencia_recebedora_com_dv, 168..172
51
+
52
+ # Valor da tarifa de cobrança (7 posições, 2 últimas dígitos decimais)
53
+ parse.field :valor_tarifa, 181..187
54
+
55
+ # Valor do abatimento concedido (13 posições, 2 últimas dígitos decimais)
56
+ parse.field :valor_abatimento, 227..239
57
+
58
+ # Valor do desconto concedido (13 posições, 2 últimas dígitos decimais)
59
+ parse.field :desconto, 240..252
60
+
61
+ # Valor recebido (13 posições, 2 últimas dígitos decimais)
62
+ parse.field :valor_recebido, 253..265
63
+
64
+ # Juros e mora pagos (13 posições, 2 últimas dígitos decimais)
65
+ parse.field :juros_mora, 266..278
66
+
67
+ # Motivo da ocorrência (8 posições, 4 motivos de 2 posições)
68
+ parse.field :motivo_ocorrencia, 318..325, lambda { |motivos|
69
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
70
+ }
71
+
72
+ # Número sequencial no arquivo (6 posições)
73
+ parse.field :sequencial, 394..399
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,123 @@
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 Unicred < Brcobranca::Retorno::Cnab400::Base
10
+ extend ParseLine::FixedWidth
11
+
12
+ def self.load_lines(file, options = {})
13
+ # por padrao ignora a primeira linha que é header
14
+ default_options = { except: [1] }
15
+ options = default_options.merge!(options)
16
+
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 - Fixo 1
23
+ parse.field :codigo_registro, 0..0
24
+
25
+ # :codigo_de_inscricao, 1..2 # identificacao do tipo de inscricao/empresa
26
+ # :numero_de_inscricao, 3..16 # numero de inscricao da empresa (cpf/cnpj)
27
+
28
+ # Identificacao da empresa no banco
29
+ # :agencia_com_dv, 17..21
30
+ # :digito_agencia, 21..21
31
+ # :cedente_com_dv, 22..29
32
+ parse.field :agencia_sem_dv, 17..20
33
+ parse.field :cedente_com_dv, 22..30
34
+
35
+ # :codigo_beneficiario, 31..44
36
+ # :nosso_numero, 45..61 # identificacao do titulo no banco
37
+ parse.field :nosso_numero, 45..61
38
+
39
+ # :FIXO, 62..72 BRANCOS* Este campo deve ser
40
+ # desconsiderado. Ele esta reservado para melhorias.
41
+ # :zeros, 73..73
42
+ # :FIXO, 74..74 # 1 - SIMPLES
43
+ # :FIXO 75..84 BRANCOS* Este campo deve ser
44
+ # desconsiderado. Ele esta reservado para melhorias.
45
+ # :FIXO 85..87 # 019
46
+ # :zeros 88..105
47
+ # :FIXO 106..107 # 18
48
+
49
+ # :codigo_ocorrencia 108..109
50
+ parse.field :codigo_ocorrencia, 108..109
51
+
52
+ # :data_credito, 110..115 # data de credito desta liquidacao
53
+ parse.field :data_credito, 110..115
54
+
55
+ # :FIXO 116..145 BRANCOS* Este campo deve ser
56
+ # desconsiderado. Ele está reservado para melhorias.
57
+
58
+ # :vencimento, 146..151 # data de vencimento do titulo (ddmmaa)
59
+ parse.field :data_vencimento, 146..151
60
+
61
+ # :valor_do_titulo, 152..164 # valor nominal do titulo
62
+ # (ultimos 2 digitos, virgula decimal assumida)
63
+ parse.field :valor_titulo, 152..164
64
+
65
+ # :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
66
+ parse.field :banco_recebedor, 165..167
67
+
68
+ # :agencia_recebedora, 168..171 # agencia cobradora,
69
+ # ag de liquidacao ou baixa
70
+ # DV-PREFIXO AGENCIA RECEBEDORA, 172..172 #
71
+ parse.field :agencia_recebedora_com_dv, 168..172
72
+
73
+ # :FIXO 173..174 BRANCOS* Este campo deve ser
74
+ # desconsiderado. Ele esta reservado para melhorias.
75
+
76
+ # DATA PROGRAMADA PARA REPASSE
77
+ # :data, 175..180
78
+
79
+ # :tarifa_de_cobranca, 181..187 # valor da despesa de cobranca
80
+ # (ultimos 2 digitos, virgula decimal assumida)
81
+ parse.field :valor_tarifa, 181..187
82
+
83
+ # :FIXO 188..226 BRANCOS* Este campo deve ser
84
+ # desconsiderado. Ele está reservado para melhorias.
85
+
86
+ # :valor_abatimento, 227..239 # valor do abatimento concedido
87
+ # (ultimos 2 digitos, virgula decimal assumida)
88
+ parse.field :valor_abatimento, 227..239
89
+
90
+ # :descontos, 240..252 # valor do desconto concedid
91
+ # o (ultimos 2 digitos, virgula decimal assumida)
92
+ parse.field :desconto, 240..252
93
+
94
+ # :valor_recebido, 253..265 # valor lancado em conta corrente
95
+ # (ultimos 2 digitos, virgula decimal assumida)
96
+ parse.field :valor_recebido, 253..265
97
+
98
+ # :juros_mora, 266..278 # valor de mora e multa pagos pelo sacado
99
+ # (ultimos 2 digitos, virgula decimal assumida)
100
+ parse.field :juros_mora, 266..278
101
+
102
+ # :numero_controle_empresa, 279..304, # numero de controle da empresa
103
+
104
+ # : Valor Liquido, 305..317 Diferença entre: Valor Pago e Valor da
105
+ # Tarifa (Valor Pago – Valor da Tarifa)
106
+
107
+ # :Complemento do Movimento 318..325
108
+ parse.field :motivo_ocorrencia, 318..325, lambda { |motivos|
109
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
110
+ }
111
+
112
+ # :Tipo de Instrucao de Origem 326..327
113
+
114
+ # :FIXO 328..393 BRANCOS* Este campo deve ser
115
+ # desconsiderado. Ele está reservado para melhorias.
116
+
117
+ # :numero_sequencial, 394..399 # numero sequencial no arquivo
118
+ parse.field :sequencial, 394..399
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+ module Brcobranca
5
+ module Retorno
6
+ # Formato de Retorno CNAB 643
7
+ class RetornoCbr643 < Base
8
+ extend ParseLine::FixedWidth # Extendendo parseline
9
+
10
+ fixed_width_layout do |parse|
11
+ parse.field :agencia_com_dv, 17..21
12
+ parse.field :cedente_com_dv, 22..30
13
+ parse.field :convenio, 31..37
14
+ parse.field :nosso_numero, 63..79
15
+ parse.field :tipo_cobranca, 80..80
16
+ parse.field :tipo_cobranca_anterior, 81..81
17
+ parse.field :natureza_recebimento, 86..87
18
+ parse.field :carteira_variacao, 91..93
19
+ parse.field :desconto, 95..99
20
+ parse.field :iof, 100..104
21
+ parse.field :carteira, 106..107
22
+ parse.field :comando, 108..109
23
+ parse.field :data_liquidacao, 110..115
24
+ parse.field :data_vencimento, 146..151
25
+ parse.field :valor_titulo, 152..164
26
+ parse.field :banco_recebedor, 165..167
27
+ parse.field :agencia_recebedora_com_dv, 168..172
28
+ parse.field :especie_documento, 173..174
29
+ parse.field :data_credito, 175..180
30
+ parse.field :valor_tarifa, 181..187
31
+ parse.field :outras_despesas, 188..200
32
+ parse.field :juros_desconto, 201..213
33
+ parse.field :iof_desconto, 214..226
34
+ parse.field :valor_abatimento, 227..239
35
+ parse.field :desconto_concedito, 240..252
36
+ parse.field :valor_recebido, 253..265
37
+ parse.field :juros_mora, 266..278
38
+ parse.field :outros_recebimento, 279..291
39
+ parse.field :abatimento_nao_aproveitado, 292..304
40
+ parse.field :valor_lancamento, 305..317
41
+ parse.field :indicativo_lancamento, 318..318
42
+ parse.field :indicador_valor, 319..319
43
+ parse.field :valor_ajuste, 320..331
44
+ parse.field :sequencial, 394..399
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parseline'
4
+ module Brcobranca
5
+ module Retorno
6
+ # Formato de Retorno CNAB 240
7
+ class RetornoCnab240 < Base
8
+ # Regex para remoção de headers e trailers além de registros diferentes de T ou U
9
+ REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
10
+
11
+ def self.load_lines(file, options = {})
12
+ default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
13
+ options = default_options.merge!(options)
14
+
15
+ Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
16
+ retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
17
+ end
18
+ end
19
+
20
+ def self.generate_retorno_based_on_cnab_lines(cnab_lines)
21
+ retorno = new
22
+ cnab_lines.each do |line|
23
+ if line.tipo_registro == 'T'
24
+ Line::REGISTRO_T_FIELDS.each do |attr|
25
+ retorno.send(:"#{attr}=", line.send(attr))
26
+ end
27
+ else
28
+ Line::REGISTRO_U_FIELDS.each do |attr|
29
+ retorno.send(:"#{attr}=", line.send(attr))
30
+ end
31
+ end
32
+ end
33
+ retorno
34
+ end
35
+
36
+ # Linha de mapeamento do retorno do arquivo CNAB 240
37
+ # O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
38
+ # O primeiro é do tipo T que retorna dados gerais sobre a transação
39
+ # O segundo é do tipo U que retorna os valores da transação
40
+ class Line < Base
41
+ extend ParseLine::FixedWidth # Extendendo parseline
42
+
43
+ REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
44
+ data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
45
+ REGISTRO_U_FIELDS = %w[desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido
46
+ outras_despesas outros_recebimento data_ocorrencia data_credito].freeze
47
+
48
+ attr_accessor :tipo_registro
49
+
50
+ fixed_width_layout do |parse|
51
+ parse.field :codigo_registro, 7..7
52
+ parse.field :tipo_registro, 13..13
53
+ parse.field :sequencial, 8..12
54
+ parse.field :codigo_ocorrencia, 15..16
55
+ parse.field :agencia_com_dv, 17..22
56
+ parse.field :cedente_com_dv, 23..35
57
+ parse.field :nosso_numero, 46..56
58
+ parse.field :carteira, 57..57
59
+ parse.field :data_vencimento, 73..80
60
+ parse.field :valor_titulo, 81..95
61
+ parse.field :banco_recebedor, 96..98
62
+ parse.field :agencia_recebedora_com_dv, 99..104
63
+ parse.field :data_ocorrencia, 137..144
64
+ parse.field :data_credito, 145..152
65
+ parse.field :outras_despesas, 107..121
66
+ parse.field :iof_desconto, 62..76
67
+ parse.field :valor_abatimento, 47..61
68
+ parse.field :desconto_concedito, 32..46
69
+ parse.field :valor_recebido, 77..91
70
+ parse.field :juros_mora, 17..31
71
+ parse.field :outros_recebimento, 122..136
72
+ parse.field :valor_tarifa, 198..212
73
+ parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
74
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
75
+ }
76
+
77
+ # Dados que não consegui extrair dos registros T e U
78
+ # parse.field :convenio,31..37
79
+ # parse.field :tipo_cobranca,80..80
80
+ # parse.field :tipo_cobranca_anterior,81..81
81
+ # parse.field :natureza_recebimento,86..87
82
+ # parse.field :carteira_variacao,91..93
83
+ # parse.field :desconto,95..99
84
+ # parse.field :iof,100..104
85
+ # parse.field :comando,108..109
86
+ # parse.field :data_liquidacao,110..115
87
+ # parse.field :especie_documento,173..174
88
+ # parse.field :valor_tarifa,181..187
89
+ # parse.field :juros_desconto,201..213
90
+ # parse.field :abatimento_nao_aproveitado,292..304
91
+ # parse.field :valor_lancamento,305..317
92
+ # parse.field :indicativo_lancamento,318..318
93
+ # parse.field :indicador_valor,319..319
94
+ # parse.field :valor_ajuste,320..331
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # DEPRECATED
5
+ #
6
+ # Classe original desenvolvida a partir do layout do Itau.
7
+ # Movido para: cnab400/itau.rb
8
+ #
9
+ require 'parseline'
10
+ module Brcobranca
11
+ module Retorno
12
+ # Formato de Retorno CNAB 400
13
+
14
+ # Baseado em: http://download.itau.com.br/bankline/layout_cobranca_400bytes_cnab_itau_mensagem.pdf
15
+ class RetornoCnab400 < Base
16
+ extend ParseLine::FixedWidth # Extendendo parseline
17
+
18
+ def self.load_lines(file, options = {})
19
+ default_options = { except: [1] } # por padrao ignora a primeira linha que é header
20
+ options = default_options.merge!(options)
21
+
22
+ super(file, options)
23
+ end
24
+
25
+ fixed_width_layout do |parse|
26
+ parse.field :codigo_registro, 0..0
27
+ parse.field :agencia_com_dv, 17..20 # FIXME: - SEM DIV
28
+ parse.field :cedente_com_dv, 23..28
29
+ parse.field :nosso_numero, 62..69
30
+ parse.field :carteira_variacao, 82..84
31
+ parse.field :carteira, 107..107
32
+ parse.field :codigo_ocorrencia, 108..109
33
+ parse.field :data_ocorrencia, 110..115
34
+ parse.field :data_vencimento, 146..151
35
+ parse.field :valor_titulo, 152..164
36
+ parse.field :banco_recebedor, 165..167
37
+ parse.field :agencia_recebedora_com_dv, 168..172
38
+ parse.field :especie_documento, 173..174
39
+ parse.field :valor_tarifa, 175..187
40
+ parse.field :iof, 214..226
41
+ parse.field :valor_abatimento, 227..239
42
+ parse.field :desconto, 240..252
43
+ parse.field :valor_recebido, 253..265
44
+ parse.field :juros_mora, 266..278
45
+ parse.field :outros_recebimento, 279..291
46
+ parse.field :data_credito, 295..300
47
+ parse.field :motivo_ocorrencia, 377..384, lambda { |motivos|
48
+ motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
49
+ }
50
+ parse.field :sequencial, 394..399
51
+
52
+ # Campos da classe base que não encontrei a relação com CNAB400
53
+ # parse.field :tipo_cobranca,80..80
54
+ # parse.field :tipo_cobranca_anterior,81..81
55
+ # parse.field :natureza_recebimento,86..87
56
+ # parse.field :convenio,31..37
57
+ # parse.field :comando,108..109
58
+ # parse.field :juros_desconto,201..213
59
+ # parse.field :iof_desconto,214..226
60
+ # parse.field :desconto_concedito,240..252
61
+ # parse.field :outras_despesas,279..291
62
+ # parse.field :abatimento_nao_aproveitado,292..304
63
+ # parse.field :data_liquidacao,295..300
64
+ # parse.field :valor_lancamento,305..317
65
+ # parse.field :indicativo_lancamento,318..318
66
+ # parse.field :indicador_valor,319..319
67
+ # parse.field :valor_ajuste,320..331
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # @author Eduardo Reboucas
5
+ #
6
+ # Para manter compatibilidade com ActiveModel
7
+
8
+ require 'date'
9
+ require 'time'
10
+
11
+ class Date
12
+ def self.current
13
+ Time.respond_to?(:zone) && Time.zone ? Time.zone.today : Date.today
14
+ end
15
+ end
16
+
17
+ class Time
18
+ def self.current
19
+ Time.respond_to?(:zone) && Time.zone ? Time.zone.now : Time.now
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # @author Kivanio Barbosa
5
+ module Brcobranca
6
+ # Métodos auxiliares
7
+ module Util
8
+ class Empresa
9
+ def initialize(documento, zero = true)
10
+ @documento = documento
11
+ @zero = zero
12
+ end
13
+
14
+ # Tipo de empresa (fisica ou juridica)
15
+ # de acordo com o documento (CPF/CNPJ)
16
+ # 1 = CPF
17
+ # 2 = CNPJ
18
+ #
19
+ # @return [String]
20
+ # @param [String] documento Número do documento da empresa
21
+ # @param [Boollean] zero Incluir zero a esquerda
22
+ def tipo
23
+ @tipo = @documento.somente_numeros.size <= 11 ? '1' : '2'
24
+ @tipo = @tipo.rjust(2, '0') if @zero
25
+ @tipo
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Util
5
+ class Errors
6
+ include Enumerable
7
+
8
+ CALLBACKS_OPTIONS = %i[if unless on allow_nil allow_blank strict].freeze
9
+ MESSAGE_OPTIONS = [:message].freeze
10
+
11
+ attr_reader :messages, :details
12
+
13
+ def initialize(base)
14
+ @base = base
15
+ @messages = apply_default_array({})
16
+ @details = apply_default_array({})
17
+ end
18
+
19
+ def add(attribute, message = :invalid, options = {})
20
+ message = message.call if message.respond_to?(:call)
21
+ detail = normalize_detail(message, options)
22
+ message = normalize_message(attribute, message, options)
23
+ details[attribute.to_sym] << detail
24
+ messages[attribute.to_sym] << message
25
+ end
26
+
27
+ def size
28
+ @messages.values.flatten.size
29
+ end
30
+ alias count size
31
+
32
+ def generate_message(attribute, type = :invalid, _options = {})
33
+ :"errors.attributes.#{attribute}.#{type}"
34
+ end
35
+
36
+ def full_messages
37
+ @messages.values.flatten
38
+ end
39
+ alias to_a full_messages
40
+
41
+ private
42
+
43
+ def apply_default_array(hash)
44
+ hash.default_proc = proc { |h, key| h[key] = [] }
45
+ hash
46
+ end
47
+
48
+ def normalize_message(attribute, message, options)
49
+ case message
50
+ when Symbol
51
+ generate_message(attribute, message, except(options, *CALLBACKS_OPTIONS))
52
+ else
53
+ if message.start_with?(variable_name(attribute))
54
+ message
55
+ else
56
+ "#{variable_name(attribute)} #{message}"
57
+ end
58
+ end
59
+ end
60
+
61
+ def normalize_detail(message, options)
62
+ { error: message }.merge(except(options, *CALLBACKS_OPTIONS + MESSAGE_OPTIONS))
63
+ end
64
+
65
+ def except(hash, *keys)
66
+ dup = hash.dup
67
+ keys.each { |key| dup.delete(key) }
68
+ dup
69
+ end
70
+
71
+ def variable_name(symbol)
72
+ symbol.to_s.tr('_', ' ').capitalize
73
+ end
74
+ end
75
+ end
76
+ end