br_boleto 2.2.0 → 2.2.1

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.markdown +23 -17
  4. data/lib/br_boleto.rb +2 -0
  5. data/lib/br_boleto/boleto/banco_brasil.rb +24 -15
  6. data/lib/br_boleto/boleto/santander.rb +8 -2
  7. data/lib/br_boleto/conta/banco_brasil.rb +254 -56
  8. data/lib/br_boleto/conta/bradesco.rb +229 -27
  9. data/lib/br_boleto/conta/caixa.rb +208 -4
  10. data/lib/br_boleto/conta/cecred.rb +29 -0
  11. data/lib/br_boleto/conta/itau.rb +482 -87
  12. data/lib/br_boleto/conta/santander.rb +224 -97
  13. data/lib/br_boleto/conta/sicoob.rb +39 -24
  14. data/lib/br_boleto/conta/sicredi.rb +169 -64
  15. data/lib/br_boleto/conta/unicred.rb +16 -13
  16. data/lib/br_boleto/helper/default_codes.rb +2123 -54
  17. data/lib/br_boleto/remessa/cnab240/banco_brasil.rb +12 -6
  18. data/lib/br_boleto/remessa/cnab240/bradesco.rb +1 -1
  19. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +1 -1
  20. data/lib/br_boleto/remessa/cnab240/itau.rb +20 -3
  21. data/lib/br_boleto/remessa/cnab240/santander.rb +25 -24
  22. data/lib/br_boleto/remessa/cnab400/caixa.rb +197 -0
  23. data/lib/br_boleto/remessa/cnab400/santander.rb +32 -27
  24. data/lib/br_boleto/retorno/base.rb +24 -0
  25. data/lib/br_boleto/retorno/cnab240/base.rb +6 -2
  26. data/lib/br_boleto/retorno/cnab240/santander.rb +5 -1
  27. data/lib/br_boleto/retorno/cnab400/banco_brasil.rb +3 -1
  28. data/lib/br_boleto/retorno/cnab400/base.rb +2 -1
  29. data/lib/br_boleto/retorno/cnab400/bradesco.rb +6 -0
  30. data/lib/br_boleto/retorno/cnab400/caixa.rb +49 -0
  31. data/lib/br_boleto/retorno/cnab400/itau.rb +5 -1
  32. data/lib/br_boleto/retorno/cnab400/santander.rb +5 -1
  33. data/lib/br_boleto/retorno/cnab400/sicoob.rb +1 -0
  34. data/lib/br_boleto/retorno/cnab400/sicredi.rb +6 -0
  35. data/lib/br_boleto/retorno/pagamento.rb +50 -4
  36. data/lib/br_boleto/version.rb +1 -1
  37. data/test/br_boleto/boleto/santander_test.rb +1 -1
  38. data/test/br_boleto/boleto/sicredi_test.rb +1 -0
  39. data/test/br_boleto/conta/banco_brasil_test.rb +157 -0
  40. data/test/br_boleto/conta/base_test.rb +8 -8
  41. data/test/br_boleto/conta/bradesco_test.rb +165 -0
  42. data/test/br_boleto/conta/caixa_test.rb +159 -1
  43. data/test/br_boleto/conta/cecred_test.rb +22 -0
  44. data/test/br_boleto/conta/itau_test.rb +346 -3
  45. data/test/br_boleto/conta/santantader_test.rb +123 -10
  46. data/test/br_boleto/conta/sicoob_test.rb +8 -0
  47. data/test/br_boleto/conta/sicredi_test.rb +79 -0
  48. data/test/br_boleto/conta/unicred_test.rb +7 -7
  49. data/test/br_boleto/remessa/cnab240/itau_test.rb +1 -1
  50. data/test/br_boleto/remessa/cnab400/caixa_test.rb +184 -0
  51. data/test/br_boleto/remessa/cnab400/santander_test.rb +30 -17
  52. data/test/br_boleto/retorno/cnab240/banco_brasil_test.rb +30 -6
  53. data/test/br_boleto/retorno/cnab240/base_test.rb +25 -5
  54. data/test/br_boleto/retorno/cnab240/bradesco_test.rb +25 -5
  55. data/test/br_boleto/retorno/cnab240/caixa_test.rb +25 -5
  56. data/test/br_boleto/retorno/cnab240/cecred_test.rb +15 -3
  57. data/test/br_boleto/retorno/cnab240/itau_test.rb +25 -5
  58. data/test/br_boleto/retorno/cnab240/santander_test.rb +30 -6
  59. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +25 -5
  60. data/test/br_boleto/retorno/cnab240/sicredi_test.rb +25 -5
  61. data/test/br_boleto/retorno/cnab240/unicred_test.rb +25 -5
  62. data/test/br_boleto/retorno/cnab400/bradesco_test.rb +30 -6
  63. data/test/br_boleto/retorno/cnab400/caixa_test.rb +7 -0
  64. data/test/br_boleto/retorno/cnab400/itau_test.rb +14 -4
  65. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +25 -5
  66. data/test/br_boleto/retorno/cnab400/sicredi_test.rb +10 -2
  67. data/test/br_boleto/retorno/cnab400/unicred.rb +30 -6
  68. data/test/br_boleto/retorno/pagamento_test.rb +49 -1
  69. data/test/factories/remessa/cnab400/caixa.rb +8 -0
  70. data/test/fixtures/retorno/cnab240/santander.ret +1 -1
  71. metadata +10 -2
@@ -193,23 +193,24 @@ describe BrBoleto::Conta::Santander do
193
193
  end
194
194
 
195
195
  describe "#get_tipo_cobranca" do
196
- context "CÓDIGOS para o cnab 400 do Santander" do
197
- it { subject.get_tipo_cobranca('1', 400).must_equal '5' } # RÁPIDA COM REGISTRO
198
- it { subject.get_tipo_cobranca('2', 400).must_equal '2' } # ELETRÔNICA COM REGISTRO
199
- it { subject.get_tipo_cobranca('3', 400).must_equal '3' } # CAUCIONADA ELETRÔNICA
200
- it { subject.get_tipo_cobranca('4', 400).must_equal '7' } # DESCONTADA ELETRÔNICA
201
- it { subject.get_tipo_cobranca('5', 400).must_equal '4' } # COBRANÇA SEM REGISTRO
202
- it { subject.get_tipo_cobranca('6', 400).must_equal '6' } # CAUCIONADA RAPIDA
196
+ context "CÓDIGOS para o cnab 240 do Santander" do
197
+ it { subject.get_tipo_cobranca('1', 240).must_equal '5' } # Cobrança Simples (Rápida com Registro)
198
+ it { subject.get_tipo_cobranca('3', 240).must_equal '3' } # Cobrança Caucionada (Eletrônica com Registro e Convencional com Registro)
199
+ it { subject.get_tipo_cobranca('4', 240).must_equal '4' } # Cobrança Descontada (Eletrônica com Registro)
200
+ it { subject.get_tipo_cobranca('6', 240).must_equal '6' } # Cobrança Caucionada (Rápida com Registro)
201
+ it { subject.get_tipo_cobranca('7', 240).must_equal '1' } # Cobrança Simples (Sem Registro / Eletrônica com Registro)
203
202
  end
204
203
 
205
- context "CÓDIGOS para o cnab 240 do Santander" do
206
- it { subject.get_tipo_cobranca('06', 240).must_equal '06' } # Cobrança Caucionada (Rápida com Registro)
204
+ context "CÓDIGOS para o cnab 400 do Santander" do
205
+ it { subject.get_tipo_cobranca('7', 400).must_equal '4' } # Cobrança Sem Registro
206
+ it { subject.get_tipo_cobranca('4', 400).must_equal '7' } # Cobrança Descontada
207
207
  end
208
208
  end
209
209
 
210
210
  describe "#get_codigo_protesto" do
211
211
  context "CÓDIGOS para o Santander" do
212
- it { subject.get_codigo_protesto('0').must_equal '0' } # Não Protestar
212
+ it { subject.get_codigo_protesto('3', 240).must_equal '0' } # Não Protestar
213
+ it { subject.get_codigo_protesto('99', 240).must_equal '3' } # Utilizar perfil cedente
213
214
  end
214
215
  end
215
216
 
@@ -219,4 +220,116 @@ describe BrBoleto::Conta::Santander do
219
220
  end
220
221
  end
221
222
 
223
+ describe "#get_codigo_movimento_retorno" do
224
+ context "CÓDIGOS para o Santander CNAB 400" do
225
+ it { subject.get_codigo_movimento_retorno('01', 400).must_equal '104' } # título não existe
226
+ it { subject.get_codigo_movimento_retorno('07', 400).must_equal '102' } # liquidação por conta
227
+ it { subject.get_codigo_movimento_retorno('08', 400).must_equal '103' } # liquidação por saldo
228
+ it { subject.get_codigo_movimento_retorno('15', 400).must_equal '23' } # Enviado para Cartório
229
+ it { subject.get_codigo_movimento_retorno('16', 400).must_equal '25' } # tít. já baixado/liquidado
230
+ it { subject.get_codigo_movimento_retorno('17', 400).must_equal '101' } # liquidado em cartório
231
+ it { subject.get_codigo_movimento_retorno('21', 400).must_equal '23' } # Entrada em Cartório
232
+ it { subject.get_codigo_movimento_retorno('22', 400).must_equal '24' } # Retirado de cartório
233
+ it { subject.get_codigo_movimento_retorno('24', 400).must_equal '235' } # Custas de Cartório
234
+ it { subject.get_codigo_movimento_retorno('25', 400).must_equal '19' } # Protestar Título
235
+ it { subject.get_codigo_movimento_retorno('26', 400).must_equal '20' } # Sustar Protestonhado a Protesto: Identifica o recebimento da instrução de protesto
236
+ end
237
+ end
238
+ describe "#get_codigo_motivo_ocorrencia" do
239
+ context "CÓDIGOS motivo ocorrência A para o Santander CNAB 400" do
240
+ it { subject.get_codigo_motivo_ocorrencia('01', '02', 400).must_equal 'A01' } # Código do banco inválido
241
+
242
+ it { subject.get_codigo_motivo_ocorrencia('001', '02', 400).must_equal 'A08' } # NOSSO NUMERO NAO NUMERICO
243
+ it { subject.get_codigo_motivo_ocorrencia('002', '03', 400).must_equal 'A33' } # VALOR DO ABATIMENTO NAO NUMERICO
244
+ it { subject.get_codigo_motivo_ocorrencia('003', '26', 400).must_equal 'A16' } # DATA VENCIMENTO NAO NUMERICA
245
+ it { subject.get_codigo_motivo_ocorrencia('005', '30', 400).must_equal 'A10' } # CODIGO DA CARTEIRA NAO NUMERICO
246
+ it { subject.get_codigo_motivo_ocorrencia('006', '02', 400).must_equal 'A10' } # CODIGO DA CARTEIRA INVALIDO
247
+ it { subject.get_codigo_motivo_ocorrencia('007', '03', 400).must_equal 'A21' } # ESPECIE DO DOCUMENTO INVALIDA
248
+ it { subject.get_codigo_motivo_ocorrencia('010', '26', 400).must_equal 'A278' } # CODIGO PRIMEIRA INSTRUCAO NAO NUMERICA
249
+ it { subject.get_codigo_motivo_ocorrencia('011', '30', 400).must_equal 'A280' } # CODIGO SEGUNDA INSTRUCAO NAO NUMERICA
250
+ it { subject.get_codigo_motivo_ocorrencia('013', '02', 400).must_equal 'A20' } # VALOR DO TITULO NAO NUMERICO
251
+ it { subject.get_codigo_motivo_ocorrencia('014', '03', 400).must_equal 'A27' } # VALOR DE MORA NAO NUMERICO
252
+ it { subject.get_codigo_motivo_ocorrencia('015', '26', 400).must_equal 'A24' } # DATA EMISSAO NAO NUMERICA
253
+ it { subject.get_codigo_motivo_ocorrencia('016', '30', 400).must_equal 'A16' } # DATA DE VENCIMENTO INVALIDA
254
+ it { subject.get_codigo_motivo_ocorrencia('017', '02', 400).must_equal 'A61' } # CODIGO DA AGENCIA COBRADORA NAO NUMERICA
255
+ it { subject.get_codigo_motivo_ocorrencia('019', '03', 400).must_equal 'A48' } # NUMERO DO CEP NAO NUMERICO
256
+ it { subject.get_codigo_motivo_ocorrencia('020', '26', 400).must_equal 'A46' } # TIPO INSCRICAO NAO NUMERICO
257
+ it { subject.get_codigo_motivo_ocorrencia('021', '30', 400).must_equal 'A46' } # NUMERO DO CGC OU CPF NAO NUMERICO
258
+ it { subject.get_codigo_motivo_ocorrencia('022', '02', 400).must_equal 'A244' } # CODIGO OCORRENCIA INVALIDO
259
+ it { subject.get_codigo_motivo_ocorrencia('023', '03', 400).must_equal 'A08' } # NOSSO NUMERO INV.P/MODALIDADE
260
+ it { subject.get_codigo_motivo_ocorrencia('025', '26', 400).must_equal 'A28' } # VALOR DESCONTO NAO NUMERICO
261
+ it { subject.get_codigo_motivo_ocorrencia('029', '30', 400).must_equal 'A27' } # VALOR DE MORA INVALIDO
262
+ it { subject.get_codigo_motivo_ocorrencia('030', '02', 400).must_equal 'A256' } # DT VENC MENOR DE 15 DIAS DA DT PROCES
263
+ it { subject.get_codigo_motivo_ocorrencia('039', '03', 400).must_equal 'A254' } # PERFIL NAO ACEITA TITULO EM BCO CORRESP
264
+ it { subject.get_codigo_motivo_ocorrencia('040', '26', 400).must_equal 'A255' } # COBR RAPIDA NAO ACEITA-SE BCO CORRESP
265
+ it { subject.get_codigo_motivo_ocorrencia('042', '30', 400).must_equal 'A07' } # CONTA COBRANCA INVALIDA
266
+ it { subject.get_codigo_motivo_ocorrencia('049', '02', 400).must_equal 'A86' } # SEU NUMERO NAO CONFERE COM O CARNE
267
+ it { subject.get_codigo_motivo_ocorrencia('052', '03', 400).must_equal 'A227' } # OCOR. NAO ACATADA,TITULO LIOUIDADO
268
+ it { subject.get_codigo_motivo_ocorrencia('053', '26', 400).must_equal 'A227' } # OCOR. NAO ACATADA, TITULO BAIXADO
269
+ it { subject.get_codigo_motivo_ocorrencia('057', '30', 400).must_equal 'A322' } # CEP DO SACADO INCORRETO
270
+ it { subject.get_codigo_motivo_ocorrencia('058', '02', 400).must_equal 'A06' } # CGC/CPF INCORRETO
271
+ it { subject.get_codigo_motivo_ocorrencia('063', '03', 400).must_equal 'A49' } # CEP NAO ENCONTRADO NA TABELA DE PRACAS
272
+ it { subject.get_codigo_motivo_ocorrencia('073', '26', 400).must_equal 'A34' } # ABATIMENTO MAIOR/IGUAL AO VALOR TITULO
273
+ it { subject.get_codigo_motivo_ocorrencia('074', '30', 400).must_equal 'A29' } # PRIM. DESCONTO MAIOR/IGUAL VALOR TITULO
274
+ it { subject.get_codigo_motivo_ocorrencia('075', '02', 400).must_equal 'A29' } # SEG. DESCONTO MAIOR/IGUAL VALOR TITULO
275
+ it { subject.get_codigo_motivo_ocorrencia('076', '03', 400).must_equal 'A29' } # TERC. DESCONTO MAIOR/IGUAL VALOR TITULO
276
+ it { subject.get_codigo_motivo_ocorrencia('086', '26', 400).must_equal 'A80' } # DATA SEGUNDO DESCONTO INVALIDA
277
+ it { subject.get_codigo_motivo_ocorrencia('087', '30', 400).must_equal 'A80' } # DATA TERCEIRO DESCONTO INVALIDA
278
+ it { subject.get_codigo_motivo_ocorrencia('091', '02', 400).must_equal 'A31' } # JA EXISTE CONCESSAO DE DESCONTO
279
+ it { subject.get_codigo_motivo_ocorrencia('092', '03', 400).must_equal 'A09' } # NOSSO NUMERO JA CADASTRADO
280
+ it { subject.get_codigo_motivo_ocorrencia('093', '26', 400).must_equal 'A20' } # VALOR DO TITULO NAO INFORMADO
281
+ it { subject.get_codigo_motivo_ocorrencia('098', '30', 400).must_equal 'A24' } # DATA EMISSAO INVALIDA
282
+ it { subject.get_codigo_motivo_ocorrencia('100', '02', 400).must_equal 'A17' } # DATA EMISSAO MAIOR OUE A DATA VENCIMENTO
283
+ it { subject.get_codigo_motivo_ocorrencia('104', '03', 400).must_equal 'A52' } # UNIDADE DA FEDERACAO NAO INFORMADA
284
+ it { subject.get_codigo_motivo_ocorrencia('106', '26', 400).must_equal 'A06' } # CGCICPF NAO INFORMADO
285
+ it { subject.get_codigo_motivo_ocorrencia('107', '30', 400).must_equal 'A52' } # UNIDADE DA FEDERACAO INCORRETA 00108 DIGITO CGC/CPF INCORRETO
286
+ it { subject.get_codigo_motivo_ocorrencia('110', '02', 400).must_equal 'A80' } # DATA PRIMEIRO DESCONTO INVALIDA
287
+ it { subject.get_codigo_motivo_ocorrencia('111', '02', 400).must_equal 'A80' } # DATA DESCONTO NAO NUMERICA
288
+ it { subject.get_codigo_motivo_ocorrencia('112', '03', 400).must_equal 'A28' } # VALOR DESCONTO NAO INFORMADO
289
+ it { subject.get_codigo_motivo_ocorrencia('113', '26', 400).must_equal 'A28' } # VALOR DESCONTO INVALIDO
290
+ it { subject.get_codigo_motivo_ocorrencia('114', '30', 400).must_equal 'A33' } # VALOR ABATIMENTO NAO INFORMADO
291
+ it { subject.get_codigo_motivo_ocorrencia('115', '02', 400).must_equal 'A34' } # VALOR ABATIMENTO MAIOR VALOR TITULO
292
+ it { subject.get_codigo_motivo_ocorrencia('116', '03', 400).must_equal 'A58' } # DATA MULTA NAO NUMERICA
293
+ it { subject.get_codigo_motivo_ocorrencia('117', '26', 400).must_equal 'A29' } # VALOR DESCONTO MAIOR VALOR TITULO
294
+ it { subject.get_codigo_motivo_ocorrencia('118', '30', 400).must_equal 'A58' } # DATA MULTA NAO INFORMADA
295
+ it { subject.get_codigo_motivo_ocorrencia('120', '02', 400).must_equal 'A59' } # PERCENTUAL MULTA NAO NUMERICO
296
+ it { subject.get_codigo_motivo_ocorrencia('121', '03', 400).must_equal 'A59' } # PERCENTUAL MULTA NAO INFORMADO
297
+ it { subject.get_codigo_motivo_ocorrencia('122', '26', 400).must_equal 'A32' } # VALOR IOF MAIOR OUE VALOR TITULO
298
+ it { subject.get_codigo_motivo_ocorrencia('123', '30', 400).must_equal 'A322' } # CEP DO SACADO NAO NUMERICO
299
+ it { subject.get_codigo_motivo_ocorrencia('124', '02', 400).must_equal 'A48' } # CEP SACADO NAO ENCONTRADO
300
+ it { subject.get_codigo_motivo_ocorrencia('129', '03', 400).must_equal 'A21' } # ESPEC DE DOCUMENTO NAO NUMERICA
301
+ it { subject.get_codigo_motivo_ocorrencia('130', '26', 400).must_equal 'A11' } # FORMA DE CADASTRAMENTO NAO NUMERICA
302
+ it { subject.get_codigo_motivo_ocorrencia('131', '30', 400).must_equal 'A11' } # FORMA DE CADASTRAMENTO INVALIDA
303
+ it { subject.get_codigo_motivo_ocorrencia('132', '02', 400).must_equal 'A11' } # FORMA CADAST. 2 INVALIDA PARA CARTEIRA 3
304
+ it { subject.get_codigo_motivo_ocorrencia('133', '03', 400).must_equal 'A11' } # FORMA CADAST. 2 INVALIDA PARA CARTEIRA 4
305
+ it { subject.get_codigo_motivo_ocorrencia('134', '26', 400).must_equal 'A05' } # CODIGO DO MOV. REMESSA NAO NUMERICO
306
+ it { subject.get_codigo_motivo_ocorrencia('135', '30', 400).must_equal 'A05' } # CODIGO DO MOV. REMESSA INVALIDO
307
+ it { subject.get_codigo_motivo_ocorrencia('139', '02', 400).must_equal 'A02' } # TIPO DE REGISTRO INVALIDO
308
+ it { subject.get_codigo_motivo_ocorrencia('140', '03', 400).must_equal 'A03' } # COD. SEOUEC.DO REG. DETALHE INVALIDO
309
+ it { subject.get_codigo_motivo_ocorrencia('142', '26', 400).must_equal 'A07' } # NUM.AG.CEDENTE/DIG.NAO NUMERICO
310
+ it { subject.get_codigo_motivo_ocorrencia('143', '30', 400).must_equal 'A07' } # NUM. CONTA CEDENTE/DIG. NAO NUMERICO
311
+ it { subject.get_codigo_motivo_ocorrencia('144', '02', 400).must_equal 'A12' } # TIPO DE DOCUMENTO NAO NUMERICO
312
+ it { subject.get_codigo_motivo_ocorrencia('145', '03', 400).must_equal 'A12' } # TIPO DE DOCUMENTO INVALIDO
313
+ it { subject.get_codigo_motivo_ocorrencia('149', '26', 400).must_equal 'A26' } # CODIGO DE MORA INVALIDO
314
+ it { subject.get_codigo_motivo_ocorrencia('150', '30', 400).must_equal 'A26' } # CODIGO DE MORA NAO NUMERICO
315
+ it { subject.get_codigo_motivo_ocorrencia('151', '02', 400).must_equal 'A27' } # VL.MORA IGUAL A ZEROS P. COD.MORA 1
316
+ it { subject.get_codigo_motivo_ocorrencia('152', '03', 400).must_equal 'A27' } # VL. TAXA MORA IGUAL A ZEROS P.COD MORA 2
317
+ it { subject.get_codigo_motivo_ocorrencia('153', '26', 400).must_equal 'A27' } # VL. MORA DIFERENTE DE ZEROS P.COD.MORA 3
318
+ it { subject.get_codigo_motivo_ocorrencia('154', '30', 400).must_equal 'A27' } # VL. MORA NAO NUMERICO P. COD MORA 2
319
+ it { subject.get_codigo_motivo_ocorrencia('155', '02', 400).must_equal 'A27' } # VL. MORA INVALIDO P. COD.MORA 4
320
+ it { subject.get_codigo_motivo_ocorrencia('160', '03', 400).must_equal 'A319' } # BAIRRO DO SACADO NAO INFORMADO
321
+ it { subject.get_codigo_motivo_ocorrencia('161', '26', 400).must_equal 'A53' } # TIPO INSC.CPF/CGC SACADOR/AVAL.NAO NUM.
322
+ it { subject.get_codigo_motivo_ocorrencia('170', '30', 400).must_equal 'A11' } # FORMA DE CADASTRAMENTO 2 INV.P.CART.5
323
+ it { subject.get_codigo_motivo_ocorrencia('199', '02', 400).must_equal 'A53' } # TIPO INSC.CGC/CPF SACADOR.AVAL.INVAL.
324
+ it { subject.get_codigo_motivo_ocorrencia('200', '03', 400).must_equal 'A53' } # NUM.INSC.(CGC)SACADOR/AVAL.NAO NUMERICO
325
+ it { subject.get_codigo_motivo_ocorrencia('212', '26', 400).must_equal 'A79' } # DATA DO JUROS DE MORA NAO NUMERICO (D3P)
326
+ it { subject.get_codigo_motivo_ocorrencia('242', '30', 400).must_equal 'A57' } # COD. DA MULTA NAO NUMERICO (D3R)
327
+ it { subject.get_codigo_motivo_ocorrencia('243', '02', 400).must_equal 'A57' } # COD. MULTA INVALIDO (D3R)
328
+ it { subject.get_codigo_motivo_ocorrencia('244', '03', 400).must_equal 'A59' } # VALOR DA MULTA NAO NUMERICO (D3R)
329
+ it { subject.get_codigo_motivo_ocorrencia('245', '26', 400).must_equal 'A58' } # DATA DA MULTA NAO NUMERICO (D3R)
330
+ it { subject.get_codigo_motivo_ocorrencia('258', '30', 400).must_equal 'A27' } # VL.MORA NAO NUMERICO P.COD=4(D3P)
331
+ it { subject.get_codigo_motivo_ocorrencia('263', '02', 400).must_equal 'A278' } # INSTRUCAO PARA TITULO NAO REGISTRADO
332
+ it { subject.get_codigo_motivo_ocorrencia('264', '03', 400).must_equal 'A23' } # CODIGO DE ACEITE (A/N) INVALIDO.
333
+ end
334
+ end
222
335
  end
@@ -171,4 +171,12 @@ describe BrBoleto::Conta::Sicoob do
171
171
  subject.default_codigo_multa.must_equal '0'
172
172
  end
173
173
  end
174
+
175
+ describe "#get_codigo_movimento_retorno" do
176
+ context "CÓDIGOS para o cnab 400 do SICOOB" do
177
+ it { subject.get_codigo_movimento_retorno('05', 400).must_equal '17' } # Liquidação Sem Registro: Identifica a liquidação de título da modalidade "SEM REGISTRO";
178
+ it { subject.get_codigo_movimento_retorno('15', 400).must_equal '101' } # Liquidação em Cartório: Identifica as liquidações dos títulos ocorridas em cartórios de protesto;
179
+ it { subject.get_codigo_movimento_retorno('23', 400).must_equal '19' } # Encaminhado a Protesto: Identifica o recebimento da instrução de protesto
180
+ end
181
+ end
174
182
  end
@@ -177,4 +177,83 @@ describe BrBoleto::Conta::Sicredi do
177
177
  it { subject.get_codigo_desconto('7').must_equal '7' } # Cancelamento de Desconto
178
178
  end
179
179
 
180
+ describe "#get_codigo_movimento_retorno" do
181
+ context "CÓDIGOS para o Sicredi" do
182
+ it { subject.get_codigo_movimento_retorno('36', 240).must_equal '100' } # Baixa Rejeitada
183
+ end
184
+ end
185
+
186
+ describe "#get_codigo_motivo_ocorrencia" do
187
+ context "CÓDIGOS motivo ocorrência D para o Sicredi CNAB 240" do
188
+ it { subject.get_codigo_motivo_ocorrencia('01', '27', 240).must_equal 'D01' } # Alteração de carteira
189
+ end
190
+ context "CÓDIGOS motivo ocorrência A para o Sicredi CNAB 400" do
191
+ it { subject.get_codigo_motivo_ocorrencia('01', '02', 400).must_equal 'A01' } # Código do banco inválido
192
+ it { subject.get_codigo_motivo_ocorrencia('02', '03', 400).must_equal 'A02' } # Código do registro detalhe inválido
193
+ it { subject.get_codigo_motivo_ocorrencia('03', '26', 400).must_equal 'A05' } # Código da ocorrência inválido
194
+ it { subject.get_codigo_motivo_ocorrencia('04', '30', 400).must_equal 'A04' } # Código de ocorrência não permitida para a carteira
195
+ it { subject.get_codigo_motivo_ocorrencia('05', '02', 400).must_equal 'A05' } # Código de ocorrência não numérico
196
+ it { subject.get_codigo_motivo_ocorrencia('07', '03', 400).must_equal 'A07' } # Cooperativa/agência/conta/dígito inválidos
197
+ it { subject.get_codigo_motivo_ocorrencia('08', '26', 400).must_equal 'A08' } # Nosso número inválido
198
+ it { subject.get_codigo_motivo_ocorrencia('09', '30', 400).must_equal 'A09' } # Nosso número duplicado
199
+ it { subject.get_codigo_motivo_ocorrencia('10', '02', 400).must_equal 'A10' } # Carteira inválida
200
+ it { subject.get_codigo_motivo_ocorrencia('15', '03', 400).must_equal 'A07' } # Cooperativa/carteira/agência/conta/nosso número inválidos
201
+ it { subject.get_codigo_motivo_ocorrencia('16', '26', 400).must_equal 'A16' } # Data de vencimento inválida
202
+ it { subject.get_codigo_motivo_ocorrencia('17', '30', 400).must_equal 'A17' } # Data de vencimento anterior à data de emissão
203
+ it { subject.get_codigo_motivo_ocorrencia('18', '02', 400).must_equal 'A18' } # Vencimento fora do prazo de operação
204
+ it { subject.get_codigo_motivo_ocorrencia('20', '03', 400).must_equal 'A20' } # Valor do título inválido
205
+ it { subject.get_codigo_motivo_ocorrencia('21', '26', 400).must_equal 'A21' } # Espécie do título inválida
206
+ it { subject.get_codigo_motivo_ocorrencia('22', '30', 400).must_equal 'A22' } # Espécie não permitida para a carteira
207
+ it { subject.get_codigo_motivo_ocorrencia('24', '02', 400).must_equal 'A24' } # Data de emissão inválida
208
+ it { subject.get_codigo_motivo_ocorrencia('29', '03', 400).must_equal 'A29' } # Valor do desconto maior/igual ao valor do título
209
+ it { subject.get_codigo_motivo_ocorrencia('31', '26', 400).must_equal 'A31' } # Concessão de desconto - existe desconto anterior
210
+ it { subject.get_codigo_motivo_ocorrencia('33', '30', 400).must_equal 'A33' } # Valor do abatimento inválido
211
+ it { subject.get_codigo_motivo_ocorrencia('34', '02', 400).must_equal 'A34' } # Valor do abatimento maior/igual ao valor do título
212
+ it { subject.get_codigo_motivo_ocorrencia('36', '03', 400).must_equal 'A36' } # Concessão de abatimento - existe abatimento anterior
213
+ it { subject.get_codigo_motivo_ocorrencia('38', '26', 400).must_equal 'A38' } # Prazo para protesto inválido
214
+ it { subject.get_codigo_motivo_ocorrencia('39', '30', 400).must_equal 'A39' } # Pedido para protesto não permitido para o título
215
+ it { subject.get_codigo_motivo_ocorrencia('40', '02', 400).must_equal 'A40' } # Título com ordem de protesto emitida
216
+ it { subject.get_codigo_motivo_ocorrencia('41', '03', 400).must_equal 'A41' } # Pedido cancelamento/sustação sem instrução de protesto
217
+ it { subject.get_codigo_motivo_ocorrencia('44', '26', 400).must_equal 'A209' } # Cooperativa de crédito/agência beneficiária não prevista
218
+ it { subject.get_codigo_motivo_ocorrencia('45', '30', 400).must_equal 'A45' } # Nome do pagador inválido
219
+ it { subject.get_codigo_motivo_ocorrencia('46', '02', 400).must_equal 'A46' } # Tipo/número de inscrição do pagador inválidos
220
+ it { subject.get_codigo_motivo_ocorrencia('47', '03', 400).must_equal 'A47' } # Endereço do pagador não informado
221
+ it { subject.get_codigo_motivo_ocorrencia('48', '26', 400).must_equal 'A48' } # CEP irregular
222
+ it { subject.get_codigo_motivo_ocorrencia('49', '30', 400).must_equal 'A46' } # Número de Inscrição do pagador/avalista inválido
223
+ it { subject.get_codigo_motivo_ocorrencia('50', '02', 400).must_equal 'A54' } # Pagador/avalista não informado
224
+ it { subject.get_codigo_motivo_ocorrencia('60', '03', 400).must_equal 'A60' } # Movimento para título não cadastrado
225
+ it { subject.get_codigo_motivo_ocorrencia('63', '26', 400).must_equal 'A63' } # Entrada para título já cadastrado
226
+ it { subject.get_codigo_motivo_ocorrencia('A6', '30', 400).must_equal 'A244' } # Data da instrução/ocorrência inválida
227
+ it { subject.get_codigo_motivo_ocorrencia('B4', '02', 400).must_equal 'A44' } # Tipo de moeda inválido
228
+ it { subject.get_codigo_motivo_ocorrencia('B5', '03', 400).must_equal 'A28' } # Tipo de desconto/juros inválido
229
+ it { subject.get_codigo_motivo_ocorrencia('B7', '26', 400).must_equal 'A86' } # Seu número inválido
230
+ it { subject.get_codigo_motivo_ocorrencia('B8', '30', 400).must_equal 'A59' } # Percentual de multa inválido
231
+ it { subject.get_codigo_motivo_ocorrencia('B9', '02', 400).must_equal 'A27' } # Valor ou percentual de juros inválido
232
+ it { subject.get_codigo_motivo_ocorrencia('C2', '03', 400).must_equal 'A23' } # Aceite do título inválido
233
+ it { subject.get_codigo_motivo_ocorrencia('C6', '26', 400).must_equal 'A325' } # Título já liquidado
234
+ it { subject.get_codigo_motivo_ocorrencia('C7', '30', 400).must_equal 'A325' } # Título já baixado
235
+ it { subject.get_codigo_motivo_ocorrencia('H4', '02', 400).must_equal 'D01' } # Alteração de carteira
236
+ end
237
+ context "CÓDIGOS motivo ocorrência B para o Sicredi CNAB 400" do
238
+ it { subject.get_codigo_motivo_ocorrencia('03', '28', 400).must_equal 'B03'} # Tarifa de sustação
239
+ it { subject.get_codigo_motivo_ocorrencia('04', '28', 400).must_equal 'B04'} # Tarifa de protesto
240
+ it { subject.get_codigo_motivo_ocorrencia('08', '28', 400).must_equal 'B08'} # Tarifa de custas de protesto
241
+ it { subject.get_codigo_motivo_ocorrencia('A9', '28', 400).must_equal 'B02'} # Tarifa de manutenção de título vencido
242
+ it { subject.get_codigo_motivo_ocorrencia('B1', '28', 400).must_equal 'B122'} # Tarifa de baixa da carteira
243
+ it { subject.get_codigo_motivo_ocorrencia('B3', '28', 400).must_equal 'B123'} # Tarifa de registro de entrada do título
244
+ it { subject.get_codigo_motivo_ocorrencia('F5', '28', 400).must_equal 'B124'} # Tarifa de entrada na rede Sicredi
245
+ end
246
+ end
247
+
248
+ describe "#get_codigo_movimento_retorno" do
249
+ context "CÓDIGOS para o cnab 400 do Sicredi" do
250
+ it { subject.get_codigo_movimento_retorno('15', 400).must_equal '101' } # Liquidação em cartório
251
+ it { subject.get_codigo_movimento_retorno('24', 400).must_equal '106' } # Entrada rejeitada por CEP irregular
252
+ it { subject.get_codigo_movimento_retorno('27', 400).must_equal '100' } # Baixa rejeitada
253
+ it { subject.get_codigo_movimento_retorno('32', 400).must_equal '26' } # Instrução rejeitada
254
+ it { subject.get_codigo_movimento_retorno('33', 400).must_equal '27' } # Confirmação de pedido de alteração de outros dados
255
+ it { subject.get_codigo_movimento_retorno('34', 400).must_equal '24' } # Retirado de cartório e manutenção em carteira
256
+ it { subject.get_codigo_movimento_retorno('35', 400).must_equal '105' } # Aceite do pagador
257
+ end
258
+ end
180
259
  end
@@ -142,13 +142,13 @@ describe BrBoleto::Conta::Unicred do
142
142
 
143
143
  describe "#get_codigo_protesto" do
144
144
  context "CÓDIGOS para o cnab 240 do Unicred" do
145
- it { subject.get_codigo_protesto('1').must_equal '1' } # Protestar Dias Corridos
146
- it { subject.get_codigo_protesto('2').must_equal '1' } # Protestar Dias Úteis
147
- it { subject.get_codigo_protesto('3').must_equal '3' } # Não Protesta
148
- it { subject.get_codigo_protesto('4').must_equal '1' } # Protestar Fim Falimentar - Dias Úteis
149
- it { subject.get_codigo_protesto('5').must_equal '1' } # Protestar Fim Falimentar - Dias Corridos
150
- it { subject.get_codigo_protesto('8').must_equal '3' } # Negativação sem Protesto
151
- it { subject.get_codigo_protesto('9').must_equal '3' } # Cancelamento Protesto Automático
145
+ it { subject.get_codigo_protesto('1', 240).must_equal '1' } # Protestar Dias Corridos
146
+ it { subject.get_codigo_protesto('2', 240).must_equal '1' } # Protestar Dias Úteis
147
+ it { subject.get_codigo_protesto('3', 240).must_equal '3' } # Não Protesta
148
+ it { subject.get_codigo_protesto('4', 240).must_equal '1' } # Protestar Fim Falimentar - Dias Úteis
149
+ it { subject.get_codigo_protesto('5', 240).must_equal '1' } # Protestar Fim Falimentar - Dias Corridos
150
+ it { subject.get_codigo_protesto('8', 240).must_equal '3' } # Negativação sem Protesto
151
+ it { subject.get_codigo_protesto('9', 240).must_equal '3' } # Cancelamento Protesto Automático
152
152
  end
153
153
  end
154
154
  end
@@ -191,7 +191,7 @@ describe BrBoleto::Remessa::Cnab240::Itau do
191
191
  end
192
192
 
193
193
  it "2 - Segunda parte = 8 posições todas preenchidas com zeros (Nr. do aviso de lançamento do crédito referente aos títulos de cobrança)" do
194
- subject.complemento_trailer_lote(lote, 5)[92..99].must_equal ('0' * 8)
194
+ subject.complemento_trailer_lote(lote, 5)[92..99].must_equal (' ' * 8)
195
195
  end
196
196
 
197
197
  it "3 - Terceira parte = EXCLUSIVO FEBRABAN com 117 posicoes em branco" do
@@ -0,0 +1,184 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Caixa do
4
+ subject { FactoryGirl.build(:remessa_cnab400_caixa, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_caixa) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do Caixa" do
10
+ BrBoleto::Remessa::Cnab400::Caixa.new.conta_class.must_equal BrBoleto::Conta::Caixa
11
+ end
12
+
13
+ it "deve herdar de Cnab400::Base" do
14
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
15
+ end
16
+
17
+ describe '#informacoes_da_conta' do
18
+ it "deve retornar com 20 caracteres" do
19
+ subject.informacoes_da_conta(:header).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
22
+ conta.agencia = 1234
23
+ conta.convenio = 89755
24
+ conta.carteira = 21
25
+ result = subject.informacoes_da_conta(:header)
26
+
27
+ result[0..3].must_equal '1234' # Agência
28
+ result[4..9].must_equal '089755' # Convênio
29
+ result[10..19].must_equal (' ' * 10) # Brancos
30
+ end
31
+ end
32
+
33
+ describe '#complemento_registro' do
34
+ it "deve retornar o sequencial da remessa com 5 posições e mais 389 brancos" do
35
+ subject.sequencial_remessa = 4758
36
+
37
+ subject.complemento_registro[0..288].must_equal ''.rjust(289)
38
+ subject.complemento_registro[289..393].must_equal '04758'
39
+
40
+ subject.complemento_registro.size.must_equal 294
41
+ end
42
+ end
43
+
44
+ describe "#detalhe_posicao_028_058" do
45
+ it "deve retornar com 31 caracteres" do
46
+ subject.detalhe_posicao_028_058(pagamento).size.must_equal 31
47
+ end
48
+ it "deve trazer as informações em suas posições corretas" do
49
+ pagamento.assign_attributes(emissao_boleto: 1)
50
+ pagamento.assign_attributes(distribuicao_boleto: 2)
51
+ pagamento.numero_documento = '255'
52
+ conta.carteira = '99'
53
+
54
+ result = subject.detalhe_posicao_028_058(pagamento)
55
+
56
+ result[0].must_equal '1' # Identificação da Emissão do Boleto
57
+ result[1].must_equal '2' # ID Entrega/Distribuição do Boleto
58
+ result[2..3].must_equal '00' # Comissão de Permanência (Informar '00')
59
+ result[4..28].must_equal '255'.rjust(25, '0') # Número do Documento
60
+ result[29..30].must_equal '99' # Carteira
61
+ end
62
+ end
63
+
64
+ describe "#dados_do_pagamento" do
65
+ it "deve retornar com 18 caracteres" do
66
+ subject.dados_do_pagamento(pagamento).size.must_equal 18
67
+ end
68
+ it "deve trazer as informações em suas posições corretas" do
69
+ pagamento.numero_documento = '255'
70
+
71
+ result = subject.dados_do_pagamento(pagamento)
72
+
73
+ result[0..14].must_equal '255'.rjust(15, '0') # Número do Documento
74
+ result[15..17].must_equal (' ' * 3) # Brancos
75
+ end
76
+ end
77
+
78
+ describe '#detalhe_posicao_077_108' do
79
+ it "deve ter o tamanho de 32 digitos" do
80
+ subject.detalhe_posicao_077_108(pagamento, '1').size.must_equal 32
81
+ end
82
+ it "deve conter as informações nas posições corretas" do
83
+ conta.codigo_carteira = '5'
84
+ result = subject.detalhe_posicao_077_108(pagamento, '1')
85
+
86
+ result[0..29].must_equal (' ' * 30) # Brancos
87
+ result[30..31].must_equal '05' # Código da Carteira
88
+
89
+ result.size.must_equal 32
90
+ end
91
+ end
92
+
93
+ describe '#informacoes_do_pagamento' do
94
+ it "deve ter o tamanho de 40 digitos" do
95
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
96
+ end
97
+ it "deve conter as informações nas posições corretas" do
98
+ conta.agencia = 4587
99
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
100
+ pagamento.assign_attributes(codigo_protesto: 2)
101
+ pagamento.data_vencimento = Date.parse('05/08/2029')
102
+ pagamento.valor_documento = 47.56
103
+ pagamento.especie_titulo = "12"
104
+ pagamento.aceite = true
105
+ pagamento.data_emissao = Date.parse('15/09/2017')
106
+ result = subject.informacoes_do_pagamento(pagamento, 4)
107
+ result.size.must_equal 40
108
+
109
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
110
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
111
+ result[19..21].must_equal '104' # Número Banco
112
+ result[22..26].must_equal "00000" # 000000 ou Agencia
113
+ result[27..28].must_equal "02" # Espécie do Título
114
+ result[ 29 ].must_equal "N" # dentificação (Sempre 'N')
115
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
116
+ result[36..37].must_equal '02' # Primeira instrução codificada
117
+ result[38..39].must_equal '00' # Segunda instrução
118
+ end
119
+ end
120
+
121
+ describe '#detalhe_multas_e_juros_do_pagamento' do
122
+ it "deve ter o tamanho de 58 digitos" do
123
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
124
+ end
125
+ it "deve conter as informações nas posições corretas" do
126
+ pagamento.valor_mora = '0.39'
127
+ pagamento.valor_iof = '2.7'
128
+ pagamento.data_desconto = Date.parse('21/03/2018')
129
+ pagamento.valor_desconto = 4.3
130
+ pagamento.valor_abatimento = 56.47
131
+
132
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
133
+ result.size.must_equal 58
134
+
135
+ result[00..12].must_equal '0000000000039'
136
+ result[13..18].must_equal "210318"
137
+ result[19..31].must_equal '0000000000430'
138
+ result[32..44].must_equal '0000000000270'
139
+ result[45..57].must_equal '0000000005647'
140
+ end
141
+ end
142
+
143
+ describe '#informacoes_do_sacado' do
144
+ it "deve ter o tamanho de 176 digitos" do
145
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
146
+ end
147
+ it "deve conter as informações nas posições corretas" do
148
+ pagador.cpf_cnpj = '12345678901'
149
+ pagador.nome = 'nome pagador'
150
+ pagador.endereco = 'rua do pagador'
151
+ pagador.bairro = 'bairro do pagador'
152
+ pagador.cidade = 'Chapecó'
153
+ pagador.uf = 'SC'
154
+ pagador.cep = '89885-001'
155
+ pagador.nome_avalista = 'Avalista'
156
+
157
+ pagamento.data_multa = Date.parse('28/12/2020')
158
+ pagamento.valor_multa = 150.3
159
+ pagamento.codigo_moeda = '0'
160
+ pagamento.assign_attributes(dias_protesto: 30)
161
+
162
+ result = subject.informacoes_do_sacado(pagamento, 2)
163
+ result.size.must_equal 176
164
+
165
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
166
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
167
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
168
+
169
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
170
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
171
+ result[108..115].must_equal '89885001' # CEP do Pagador
172
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
173
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
174
+
175
+ result[133..138].must_equal '281220'.adjust_size_to(6) # Data Multa
176
+ result[139..148].must_equal '15030'.rjust(10, '0') # Valor Multa
177
+ result[149..170].must_equal 'Avalista'.adjust_size_to(22) # Nome Sacador/Avalista
178
+
179
+ result[171..172].must_equal '00' # 3a instrução
180
+ result[173..174].must_equal '30' # Dias para protesto
181
+ result[175].must_equal '0' # Código da Moeda
182
+ end
183
+ end
184
+ end