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
@@ -26,6 +26,30 @@ module BrBoleto
26
26
 
27
27
  private
28
28
 
29
+ def conta_pagamento_class
30
+ case codigo_banco.to_i.to_s.rjust(3, '0')
31
+ when '001'
32
+ BrBoleto::Conta::BancoBrasil
33
+ when '033'
34
+ BrBoleto::Conta::Santander
35
+ when '085'
36
+ BrBoleto::Conta::Cecred
37
+ when '104'
38
+ BrBoleto::Conta::Caixa
39
+ when '237'
40
+ BrBoleto::Conta::Bradesco
41
+ when '341'
42
+ BrBoleto::Conta::Itau
43
+ when '748'
44
+ BrBoleto::Conta::Sicredi
45
+ when '756'
46
+ BrBoleto::Conta::Sicoob
47
+ else
48
+ BrBoleto::Conta::Base
49
+ end
50
+
51
+ end
52
+
29
53
  def read_file!
30
54
  raise NotImplementedError.new('Sobreescreva este método na classe referente ao CNAB 240 ou 400')
31
55
  end
@@ -25,7 +25,7 @@ module BrBoleto
25
25
  # Segmentos T e U do arquivo de retorno
26
26
  #
27
27
  def instnce_payment(lines) #:doc:
28
- payment = BrBoleto::Retorno::Pagamento.new
28
+ payment = BrBoleto::Retorno::Pagamento.new(conta_class: conta_pagamento_class, cnab: 240)
29
29
  lines.each do |line|
30
30
  self.codigo_banco ||= line[0..2]
31
31
  if line[13] == 'T'
@@ -72,7 +72,11 @@ module BrBoleto
72
72
  sacado_nome: 149..188,
73
73
  numero_contrato: 189..198,
74
74
  valor_tarifa: 199..213,
75
- motivo_ocorrencia: 214..223
75
+ motivo_ocorrencia_original_1: 214..215,
76
+ motivo_ocorrencia_original_2: 216..217,
77
+ motivo_ocorrencia_original_3: 218..219,
78
+ motivo_ocorrencia_original_4: 220..221,
79
+ motivo_ocorrencia_original_5: 222..223,
76
80
  }
77
81
  end
78
82
 
@@ -26,7 +26,11 @@ module BrBoleto
26
26
  sacado_documento: 129..143,
27
27
  sacado_nome: 144..183,
28
28
  valor_tarifa: 194..208,
29
- motivo_ocorrencia: 209..218
29
+ motivo_ocorrencia_original_1: 209..210,
30
+ motivo_ocorrencia_original_2: 211..212,
31
+ motivo_ocorrencia_original_3: 213..214,
32
+ motivo_ocorrencia_original_4: 215..216,
33
+ motivo_ocorrencia_original_5: 217..218,
30
34
 
31
35
  # conta_cobranca: 184..193
32
36
  # numero_contrato: 189..198,
@@ -18,6 +18,7 @@ module BrBoleto
18
18
  tipo_cobranca: 81..81,
19
19
  variacao_carteira: 92..94,
20
20
  carteira: 107..108,
21
+ codigo_ocorrencia_retorno: 109..110,
21
22
  data_ocorrencia: 111..116,
22
23
  data_ocorrencia_sacado: 111..116,
23
24
  numero_documento: 117..126,
@@ -37,7 +38,8 @@ module BrBoleto
37
38
  valor_liquido: 254..266,
38
39
  valor_juros_multa: 267..279,
39
40
  valor_outros_creditos: 280..292,
40
- # sacado_documento: xxx..xxx,
41
+
42
+ motivo_ocorrencia_original_1: 87..88,
41
43
  }
42
44
  end
43
45
  end
@@ -25,7 +25,7 @@ module BrBoleto
25
25
  # e adiciona o mesmo no Array de pagamentos
26
26
  #
27
27
  def instnce_payment(detalhe) #:doc:
28
- payment = BrBoleto::Retorno::Pagamento.new
28
+ payment = BrBoleto::Retorno::Pagamento.new(conta_class: conta_pagamento_class, cnab: 400)
29
29
  detalhe_fields.each do |column, position |
30
30
  payment.send("#{column}=", "_#{detalhe}"[position].try(:strip))
31
31
  end
@@ -42,6 +42,7 @@ module BrBoleto
42
42
  return if lines.blank?
43
43
  self.codigo_banco = "_#{lines[0]}"[77..79]
44
44
  end
45
+
45
46
  end
46
47
  end
47
48
  end
@@ -15,6 +15,7 @@ module BrBoleto
15
15
  numero_conta_dv: 36,
16
16
  nosso_numero_sem_dv: 71..81,
17
17
  nosso_numero_dv: 82,
18
+ codigo_ocorrencia_retorno: 109..110,
18
19
  data_ocorrencia: 111..116,
19
20
  data_ocorrencia_sacado: 111..116,
20
21
  numero_documento: 117..126,
@@ -35,6 +36,11 @@ module BrBoleto
35
36
  valor_outros_creditos: 280..292,
36
37
  data_credito: 296..301,
37
38
 
39
+ motivo_ocorrencia_original_1: 319..320,
40
+ motivo_ocorrencia_original_2: 321..322,
41
+ motivo_ocorrencia_original_3: 323..324,
42
+ motivo_ocorrencia_original_4: 325..326,
43
+ motivo_ocorrencia_original_5: 327..328,
38
44
  }
39
45
  end
40
46
  end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module BrBoleto
3
+ module Retorno
4
+ module Cnab400
5
+ class Caixa < BrBoleto::Retorno::Cnab400::Base
6
+ private
7
+ def detalhe_fields #:doc:
8
+ { # ATRIBUTO POSIÇÃO DA LINHA
9
+
10
+ sacado_documento: 4..17,
11
+ agencia_sem_dv: 18..21,
12
+ codigo_cedente: 22..27,
13
+ carteira: 57..58,
14
+ nosso_numero_sem_dv: 57..73,
15
+ cod_carteira: 107..108,
16
+ codigo_ocorrencia_retorno: 109..110,
17
+ data_ocorrencia: 111..116,
18
+ data_ocorrencia_sacado: 111..116,
19
+ numero_documento: 117..126,
20
+ data_vencimento: 147..152,
21
+ valor_titulo: 153..165,
22
+ banco_recebedor: 166..168,
23
+ agencia_recebedora_com_dv: 169..173,
24
+ especie_titulo: 174..175,
25
+ valor_tarifa: 176..188,
26
+ valor_iof: 215..227,
27
+ valor_abatimento: 228..240,
28
+ valor_desconto: 241..253,
29
+ valor_pago: 254..266,
30
+ valor_ocorrencia_sacado: 254..266,
31
+ valor_liquido: 254..266,
32
+ valor_juros_multa: 267..279,
33
+ valor_multa: 280..292,
34
+ codigo_moeda: 293..293,
35
+ data_credito: 294..299,
36
+ # valor_outras_despesas: 189..201,
37
+ # valor_outros_creditos: 280..292,
38
+
39
+ motivo_ocorrencia_original_1: 80..82,
40
+ # motivo_ocorrencia_original_2: 321..322,
41
+ # motivo_ocorrencia_original_3: 323..324,
42
+ # motivo_ocorrencia_original_4: 325..326,
43
+ # motivo_ocorrencia_original_5: 327..328,
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -16,7 +16,7 @@ module BrBoleto
16
16
  nosso_numero_sem_dv: 86..93,
17
17
  nosso_numero_dv: 94,
18
18
  cod_carteira: 108,
19
- codigo_ocorrencia_banco_correspondente: 109..110,
19
+ codigo_ocorrencia_retorno: 109..110,
20
20
  data_ocorrencia: 111..116,
21
21
  data_ocorrencia_sacado: 111..116,
22
22
  data_vencimento: 147..152,
@@ -35,6 +35,10 @@ module BrBoleto
35
35
  valor_outros_creditos: 280..292,
36
36
  data_credito: 296..301,
37
37
  sacado_nome: 325..354,
38
+
39
+ motivo_ocorrencia_original_1: 393..394, # Meio pelo qual o título foi liquidado
40
+ motivo_ocorrencia_original_2: 302..305, # Código da instrução cancelada
41
+ motivo_ocorrencia_original_3: 378..385, # Registros rejeitados ou alegação do sacado ou registro de mensagem informativa
38
42
  }
39
43
  end
40
44
  end
@@ -14,7 +14,7 @@ module BrBoleto
14
14
  nosso_numero_sem_dv: 63..69,
15
15
  nosso_numero_dv: 70,
16
16
  cod_carteira: 108,
17
- codigo_ocorrencia_banco_correspondente: 109..110,
17
+ codigo_ocorrencia_retorno: 109..110,
18
18
  data_ocorrencia: 111..116,
19
19
  data_ocorrencia_sacado: 111..116,
20
20
  numero_documento: 117..126,
@@ -36,6 +36,10 @@ module BrBoleto
36
36
  valor_outros_creditos: 280..292,
37
37
  data_credito: 296..301,
38
38
  sacado_nome: 302..337,
39
+
40
+ motivo_ocorrencia_original_1: 137..139,
41
+ motivo_ocorrencia_original_2: 140..142,
42
+ motivo_ocorrencia_original_3: 143..145,
39
43
  }
40
44
  end
41
45
  end
@@ -15,6 +15,7 @@ module BrBoleto
15
15
  parcela: 75..76,
16
16
  modalidade: 107..108,
17
17
  carteira: 108,
18
+ codigo_ocorrencia_retorno: 109..110,
18
19
  data_ocorrencia: 111..116,
19
20
  data_ocorrencia_sacado: 111..116,
20
21
  numero_documento: 117..131,
@@ -44,6 +44,12 @@ module BrBoleto
44
44
  valor_juros_multa: 267..279,
45
45
  valor_outros_creditos: 280..292,
46
46
 
47
+ motivo_ocorrencia_original_1: 319..320,
48
+ motivo_ocorrencia_original_2: 321..322,
49
+ motivo_ocorrencia_original_3: 323..324,
50
+ motivo_ocorrencia_original_4: 325..326,
51
+ motivo_ocorrencia_original_5: 327..328,
52
+
47
53
  # sacado_documento: 4..17,
48
54
  # agencia_sem_dv: 25..29,
49
55
  # agencia_recebedora_com_dv: 169..173,
@@ -2,6 +2,7 @@
2
2
  module BrBoleto
3
3
  module Retorno
4
4
  class Pagamento < BrBoleto::ActiveModelBase
5
+ include BrBoleto::HaveConta
5
6
 
6
7
  #############################################################################################
7
8
  ############################# VALORES ENCONTRADOS NO SEGMENTO T #############################
@@ -18,11 +19,17 @@ module BrBoleto
18
19
  "#{numero_conta_sem_dv}#{numero_conta_dv}" # tamanho = 13
19
20
  end
20
21
 
21
-
22
+ # Codigo identificação CNAB
23
+ attr_accessor :cnab
24
+
22
25
  # CÓDIGO DE MOVIMENTO RETORNO
23
26
  # Tamanho Posição
24
27
  # 2 16-17
25
28
  attr_accessor :codigo_movimento_retorno
29
+ alias_attribute :codigo_ocorrencia_retorno, :codigo_movimento_retorno
30
+ def codigo_movimento_retorno
31
+ conta.get_codigo_movimento_retorno(@codigo_movimento_retorno, cnab)
32
+ end
26
33
 
27
34
  # IDENTIFICAÇÃO DO TÍTULO
28
35
  # Tamanho Posição
@@ -52,7 +59,6 @@ module BrBoleto
52
59
  # VARIAÇÃO DA CARTEIRA
53
60
  attr_accessor :variacao_carteira
54
61
 
55
-
56
62
  # NÚMERO DO DOCUMENTO
57
63
  # Tamanho Posição
58
64
  # 15 59-73
@@ -118,10 +124,44 @@ module BrBoleto
118
124
  # 15 199-213
119
125
  attr_accessor :valor_tarifa
120
126
 
127
+ # VALOR DA MULTA PAGA PELO PAGADOR
128
+ # Tamanho Posição
129
+ # 13 280-92
130
+ attr_accessor :valor_multa
131
+
132
+
121
133
  # IDENTIFICAÇÃO PARA REJEIÇÕES, TARIFAS, CUSTOS, LIQUIDAÇÃO E BAIXAS
122
134
  # Tamanho Posição
123
135
  # 10 214-223
124
- attr_accessor :motivo_ocorrencia
136
+ attr_accessor :motivo_ocorrencia_original_1
137
+ def motivo_ocorrencia_1
138
+ conta.get_codigo_motivo_ocorrencia motivo_ocorrencia_original_1, codigo_movimento_retorno, cnab
139
+ end
140
+
141
+ attr_accessor :motivo_ocorrencia_original_2
142
+ def motivo_ocorrencia_2
143
+ conta.get_codigo_motivo_ocorrencia motivo_ocorrencia_original_2, codigo_movimento_retorno, cnab
144
+ end
145
+
146
+ attr_accessor :motivo_ocorrencia_original_3
147
+ def motivo_ocorrencia_3
148
+ conta.get_codigo_motivo_ocorrencia motivo_ocorrencia_original_3, codigo_movimento_retorno, cnab
149
+ end
150
+
151
+ attr_accessor :motivo_ocorrencia_original_4
152
+ def motivo_ocorrencia_4
153
+ conta.get_codigo_motivo_ocorrencia motivo_ocorrencia_original_4, codigo_movimento_retorno, cnab
154
+ end
155
+
156
+ attr_accessor :motivo_ocorrencia_original_5
157
+ def motivo_ocorrencia_5
158
+ conta.get_codigo_motivo_ocorrencia motivo_ocorrencia_original_5, codigo_movimento_retorno, cnab
159
+ end
160
+
161
+ def motivo_ocorrencia
162
+ "#{motivo_ocorrencia_1}#{motivo_ocorrencia_2}#{motivo_ocorrencia_3}#{motivo_ocorrencia_4}#{motivo_ocorrencia_5}"
163
+ end
164
+
125
165
 
126
166
  # BANCO SICREDI (PAG. 44)
127
167
  # Código do pagador na cooperativa do beneficiário
@@ -223,7 +263,6 @@ module BrBoleto
223
263
  # É implementado apenas para os bancos que não conseguem seguir um padrão estabelecido
224
264
  attr_accessor :modalidade
225
265
 
226
-
227
266
  attr_accessor :parcela
228
267
 
229
268
  # Prefixo do Título: Informa Espécie do Título
@@ -277,6 +316,13 @@ module BrBoleto
277
316
  end
278
317
  end
279
318
 
319
+ def conta_class= value
320
+ @conta_class = value
321
+ end
322
+ def conta_class
323
+ @conta_class
324
+ end
325
+
280
326
 
281
327
  end
282
328
  end
@@ -2,7 +2,7 @@ module BrBoleto
2
2
  module Version
3
3
  MAJOR = 2 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
4
4
  MINOR = 2 #inclui novas funcionalidades, sem quebrar APIs existentes
5
- PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
5
+ PATCH = 1 #corrige bugs ou traz melhorias em implementações já existentes
6
6
  CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
@@ -82,7 +82,7 @@ describe BrBoleto::Boleto::Santander do
82
82
 
83
83
  result[0].must_equal '9'
84
84
  result[1..7].must_equal '0000668' # Convênio
85
- result[8..20].must_equal '0000000036463' # Numero documento
85
+ result[8..20].must_equal '0000000036463' # Nosso Número
86
86
  result[21].must_equal '0' # IOF
87
87
  result[22..24].must_equal '121' # Carteira
88
88
 
@@ -112,6 +112,7 @@ describe BrBoleto::Boleto::Sicredi do
112
112
  sicredi.numero_documento = 100_10
113
113
  sicredi.valor_documento = 93015.78
114
114
  sicredi.data_vencimento = Date.parse('2020-02-17')
115
+ sicredi.data_documento = Date.parse('2016-02-17')
115
116
  end
116
117
  end
117
118
 
@@ -206,4 +206,161 @@ describe BrBoleto::Conta::BancoBrasil do
206
206
  end
207
207
  end
208
208
 
209
+ describe "#get_codigo_motivo_ocorrencia" do
210
+ context "CÓDIGOS motivo ocorrencia do Banco do Brasil para CNAB 240" do
211
+ it { subject.get_codigo_motivo_ocorrencia('52', '02', 240).must_equal 'A104' } # Registro Rejeitado – Título já Liquidado
212
+ end
213
+
214
+ context "CÓDIGOS motivo ocorrencia do Banco do Brasil para CNAB 400 com Código de Movimento 02" do
215
+ it { subject.get_codigo_motivo_ocorrencia('00', '02', 400).must_equal 'A207' } # Entrada Por meio magnético
216
+ it { subject.get_codigo_motivo_ocorrencia('11', '02', 400).must_equal 'A151' } # Entrada Por via convencional
217
+ it { subject.get_codigo_motivo_ocorrencia('16', '02', 400).must_equal 'A152' } # Entrada Por alteração do código do cedente
218
+ it { subject.get_codigo_motivo_ocorrencia('17', '02', 400).must_equal 'A153' } # Entrada Por alteração da variação
219
+ it { subject.get_codigo_motivo_ocorrencia('18', '02', 400).must_equal 'A154' } # Entrada Por alteração da carteira
220
+ end
221
+
222
+ context "CÓDIGOS motivo ocorrencia do Banco do Brasil para CNAB 400 com Código de Movimento 03" do
223
+ it { subject.get_codigo_motivo_ocorrencia('03', '03', 400).must_equal 'A27' } # valor dos juros por um dia inválido
224
+ it { subject.get_codigo_motivo_ocorrencia('04', '03', 400).must_equal 'A29' } # valor do desconto inválido
225
+ it { subject.get_codigo_motivo_ocorrencia('05', '03', 400).must_equal 'A22' } # espécie de título inválida para carteira/variação
226
+ it { subject.get_codigo_motivo_ocorrencia('07', '03', 400).must_equal 'A07' } # Prefixo da agência usuária inválido
227
+ it { subject.get_codigo_motivo_ocorrencia('08', '03', 400).must_equal 'A20' } # valor do título/apólice inválido
228
+ it { subject.get_codigo_motivo_ocorrencia('09', '03', 400).must_equal 'A16' } # data de vencimento inválida
229
+ it { subject.get_codigo_motivo_ocorrencia('16', '03', 400).must_equal 'A11' } # Título preenchido de forma irregular
230
+ it { subject.get_codigo_motivo_ocorrencia('19', '03', 400).must_equal 'A105' } # Código do cedente inválido
231
+ it { subject.get_codigo_motivo_ocorrencia('20', '03', 400).must_equal 'A45' } # Nome/endereço do cliente não informado (ECT)
232
+ it { subject.get_codigo_motivo_ocorrencia('21', '03', 400).must_equal 'A10' } # Carteira inválida
233
+ it { subject.get_codigo_motivo_ocorrencia('24', '03', 400).must_equal 'A33' } # Valor do abatimento inválido
234
+ it { subject.get_codigo_motivo_ocorrencia('25', '03', 400).must_equal 'A86' } # Novo número do título dado pelo cedente inválido (Seu número)
235
+ it { subject.get_codigo_motivo_ocorrencia('26', '03', 400).must_equal 'A32' } # Valor do IOF de seguro inválido
236
+ it { subject.get_codigo_motivo_ocorrencia('29', '03', 400).must_equal 'A47' } # Endereço não informado
237
+ it { subject.get_codigo_motivo_ocorrencia('30', '03', 400).must_equal 'A104' } # Registro de título já liquidado (carteira 17-tipo 4)
238
+ it { subject.get_codigo_motivo_ocorrencia('33', '03', 400).must_equal 'A09' } # Nosso número já existente
239
+ it { subject.get_codigo_motivo_ocorrencia('37', '03', 400).must_equal 'A24' } # Data de emissão do título inválida
240
+ it { subject.get_codigo_motivo_ocorrencia('38', '03', 400).must_equal 'A25' } # Data do vencimento anterior à data da emissão do título
241
+ it { subject.get_codigo_motivo_ocorrencia('39', '03', 400).must_equal 'A04' } # Comando de alteração indevido para a carteira
242
+ it { subject.get_codigo_motivo_ocorrencia('41', '03', 400).must_equal 'A36' } # Abatimento não permitido
243
+ it { subject.get_codigo_motivo_ocorrencia('42', '03', 400).must_equal 'A51' } # CEP/UF inválido/não compatíveis (ECT)
244
+ it { subject.get_codigo_motivo_ocorrencia('46', '03', 400).must_equal 'A105' } # Convenio encerrado
245
+ it { subject.get_codigo_motivo_ocorrencia('49', '03', 400).must_equal 'A107' } # Abatimento a cancelar não consta do título
246
+ it { subject.get_codigo_motivo_ocorrencia('52', '03', 400).must_equal 'A34' } # Abatimento igual ou maior que o valor do Título
247
+ it { subject.get_codigo_motivo_ocorrencia('66', '03', 400).must_equal 'A53' } # Número do documento do sacado (CNPJ/CPF) inválido
248
+ it { subject.get_codigo_motivo_ocorrencia('69', '03', 400).must_equal 'A59' } # Valor/Percentual de Juros Inválido
249
+ it { subject.get_codigo_motivo_ocorrencia('75', '03', 400).must_equal 'A97' } # Qtde. de dias do prazo limite p/ recebimento de título vencido inválido
250
+ it { subject.get_codigo_motivo_ocorrencia('80', '03', 400).must_equal 'A08' } # Nosso numero inválido
251
+ it { subject.get_codigo_motivo_ocorrencia('81', '03', 400).must_equal 'A80' } # Data para concessão do desconto inválida.
252
+ it { subject.get_codigo_motivo_ocorrencia('82', '03', 400).must_equal 'A48' } # CEP do sacado inválido
253
+ it { subject.get_codigo_motivo_ocorrencia('01', '03', 400).must_equal 'A155' } # identificação inválida
254
+ it { subject.get_codigo_motivo_ocorrencia('02', '03', 400).must_equal 'A156' } # variação da carteira inválida
255
+ it { subject.get_codigo_motivo_ocorrencia('06', '03', 400).must_equal 'A157' } # espécie de valor invariável inválido
256
+ it { subject.get_codigo_motivo_ocorrencia('10', '03', 400).must_equal 'A158' } # fora do prazo/só admissível na carteira
257
+ it { subject.get_codigo_motivo_ocorrencia('11', '03', 400).must_equal 'A159' } # inexistência de margem para desconto
258
+ it { subject.get_codigo_motivo_ocorrencia('12', '03', 400).must_equal 'A160' } # o banco não tem agência na praça do sacado
259
+ it { subject.get_codigo_motivo_ocorrencia('13', '03', 400).must_equal 'A161' } # razões cadastrais
260
+ it { subject.get_codigo_motivo_ocorrencia('14', '03', 400).must_equal 'A162' } # sacado interligado com o sacador (só admissível em cobrança simples- cart. 11 e 17)
261
+ it { subject.get_codigo_motivo_ocorrencia('15', '03', 400).must_equal 'A163' } # Título sacado contra órgão do Poder Público (só admissível na carteira 11 e sem ordem de protesto)
262
+ it { subject.get_codigo_motivo_ocorrencia('17', '03', 400).must_equal 'A164' } # Título rasurado
263
+ it { subject.get_codigo_motivo_ocorrencia('18', '03', 400).must_equal 'A165' } # Endereço do sacado não localizado ou incompleto
264
+ it { subject.get_codigo_motivo_ocorrencia('22', '03', 400).must_equal 'A166' } # Quantidade de valor variável inválida
265
+ it { subject.get_codigo_motivo_ocorrencia('23', '03', 400).must_equal 'A167' } # Faixa nosso-numero excedida
266
+ it { subject.get_codigo_motivo_ocorrencia('27', '03', 400).must_equal 'A168' } # Nome do sacado/cedente inválido
267
+ it { subject.get_codigo_motivo_ocorrencia('28', '03', 400).must_equal 'A169' } # Data do novo vencimento inválida
268
+ it { subject.get_codigo_motivo_ocorrencia('31', '03', 400).must_equal 'A170' } # Numero do borderô inválido
269
+ it { subject.get_codigo_motivo_ocorrencia('32', '03', 400).must_equal 'A171' } # Nome da pessoa autorizada inválido
270
+ it { subject.get_codigo_motivo_ocorrencia('34', '03', 400).must_equal 'A172' } # Numero da prestação do contrato inválido
271
+ it { subject.get_codigo_motivo_ocorrencia('35', '03', 400).must_equal 'A173' } # percentual de desconto inválido
272
+ it { subject.get_codigo_motivo_ocorrencia('36', '03', 400).must_equal 'A174' } # Dias para fichamento de protesto inválido
273
+ it { subject.get_codigo_motivo_ocorrencia('40', '03', 400).must_equal 'A175' } # Tipo de moeda inválido
274
+ it { subject.get_codigo_motivo_ocorrencia('43', '03', 400).must_equal 'A176' } # Código de unidade variável incompatível com a data de emissão do título
275
+ it { subject.get_codigo_motivo_ocorrencia('44', '03', 400).must_equal 'A177' } # Dados para débito ao sacado inválidos
276
+ it { subject.get_codigo_motivo_ocorrencia('45', '03', 400).must_equal 'A178' } # Carteira/variação encerrada
277
+ it { subject.get_codigo_motivo_ocorrencia('47', '03', 400).must_equal 'A179' } # Título tem valor diverso do informado
278
+ it { subject.get_codigo_motivo_ocorrencia('48', '03', 400).must_equal 'A180' } # Motivo de baixa invalido para a carteira
279
+ it { subject.get_codigo_motivo_ocorrencia('50', '03', 400).must_equal 'A181' } # Comando incompatível com a carteira
280
+ it { subject.get_codigo_motivo_ocorrencia('51', '03', 400).must_equal 'A182' } # Código do convenente invalido
281
+ it { subject.get_codigo_motivo_ocorrencia('53', '03', 400).must_equal 'A183' } # Título já se encontra na situação pretendida
282
+ it { subject.get_codigo_motivo_ocorrencia('54', '03', 400).must_equal 'A184' } # Título fora do prazo admitido para a conta 1
283
+ it { subject.get_codigo_motivo_ocorrencia('55', '03', 400).must_equal 'A185' } # Novo vencimento fora dos limites da carteira
284
+ it { subject.get_codigo_motivo_ocorrencia('56', '03', 400).must_equal 'A186' } # Título não pertence ao convenente
285
+ it { subject.get_codigo_motivo_ocorrencia('57', '03', 400).must_equal 'A187' } # Variação incompatível com a carteira
286
+ it { subject.get_codigo_motivo_ocorrencia('58', '03', 400).must_equal 'A188' } # Impossível a variação única para a carteira indicada
287
+ it { subject.get_codigo_motivo_ocorrencia('59', '03', 400).must_equal 'A189' } # Título vencido em transferência para a carteira 51
288
+ it { subject.get_codigo_motivo_ocorrencia('60', '03', 400).must_equal 'A190' } # Título com prazo superior a 179 dias em variação única para carteira 51
289
+ it { subject.get_codigo_motivo_ocorrencia('61', '03', 400).must_equal 'A191' } # Título já foi fichado para protesto
290
+ it { subject.get_codigo_motivo_ocorrencia('62', '03', 400).must_equal 'A192' } # Alteração da situação de débito inválida para o código de responsabilidade
291
+ it { subject.get_codigo_motivo_ocorrencia('63', '03', 400).must_equal 'A193' } # DV do nosso número inválido
292
+ it { subject.get_codigo_motivo_ocorrencia('64', '03', 400).must_equal 'A194' } # Título não passível de débito/baixa – situação anormal
293
+ it { subject.get_codigo_motivo_ocorrencia('65', '03', 400).must_equal 'A195' } # Título com ordem de não protestar – não pode ser encaminhado a cartório
294
+ it { subject.get_codigo_motivo_ocorrencia('67', '03', 400).must_equal 'A196' } # Título/carne rejeitado
295
+ it { subject.get_codigo_motivo_ocorrencia('70', '03', 400).must_equal 'A197' } # Título já se encontra isento de juros
296
+ it { subject.get_codigo_motivo_ocorrencia('71', '03', 400).must_equal 'A198' } # Código de Juros Inválido
297
+ it { subject.get_codigo_motivo_ocorrencia('72', '03', 400).must_equal 'A199' } # Prefixo da Ag. cobradora inválido
298
+ it { subject.get_codigo_motivo_ocorrencia('73', '03', 400).must_equal 'A200' } # Numero do controle do participante inválido
299
+ it { subject.get_codigo_motivo_ocorrencia('74', '03', 400).must_equal 'A201' } # Cliente não cadastrado no CIOPE (Desconto/Vendor)
300
+ it { subject.get_codigo_motivo_ocorrencia('76', '03', 400).must_equal 'A202' } # Título excluído automaticamente por decurso de prazo CIOPE (Desconto/Vendor)
301
+ it { subject.get_codigo_motivo_ocorrencia('77', '03', 400).must_equal 'A203' } # Título vencido transferido para a conta 1 – Carteira vinculada
302
+ it { subject.get_codigo_motivo_ocorrencia('83', '03', 400).must_equal 'A204' } # Carteira/variação não localizada no cedente
303
+ it { subject.get_codigo_motivo_ocorrencia('84', '03', 400).must_equal 'A205' } # Título não localizado na existência/Baixado por protesto
304
+ it { subject.get_codigo_motivo_ocorrencia('85', '03', 400).must_equal 'A206' } # Recusa do Comando “41” – Parâmetro de Liquidação Parcial.
305
+ it { subject.get_codigo_motivo_ocorrencia('99', '03', 400).must_equal 'A999' } # Outros motivos
306
+ end
307
+
308
+ context "CÓDIGOS motivo ocorrencia C do Banco do Brasil para CNAB 400" do
309
+ it { subject.get_codigo_motivo_ocorrencia('01', '06', 400).must_equal 'C103' } # Liquidação normal
310
+ it { subject.get_codigo_motivo_ocorrencia('02', '09', 400).must_equal 'C104' } # Liquidação parcial
311
+ it { subject.get_codigo_motivo_ocorrencia('03', '10', 400).must_equal 'C01' } # Liquidação por saldo
312
+ it { subject.get_codigo_motivo_ocorrencia('04', '17', 400).must_equal 'C105' } # Liquidação com cheque a compensar
313
+ it { subject.get_codigo_motivo_ocorrencia('05', '45', 400).must_equal 'C106' } # Liquidação de título sem registro (carteira 7 tipo 4)
314
+ it { subject.get_codigo_motivo_ocorrencia('07', '102', 400).must_equal 'C107' } # Liquidação na apresentação
315
+ it { subject.get_codigo_motivo_ocorrencia('09', '103', 400).must_equal 'C08' } # Liquidação em cartório
316
+ it { subject.get_codigo_motivo_ocorrencia('10', '101', 400).must_equal 'C110' } # Liquidação Parcial com Cheque a Compensar
317
+ it { subject.get_codigo_motivo_ocorrencia('11', '120', 400).must_equal 'C111' } # Liquidação por Saldo com Cheque a Compensar
318
+ it { subject.get_codigo_motivo_ocorrencia('00', '06', 400).must_equal 'C10' } # Solicitada pelo cliente
319
+ it { subject.get_codigo_motivo_ocorrencia('15', '09', 400).must_equal 'C14' } # Protestado
320
+ it { subject.get_codigo_motivo_ocorrencia('18', '10', 400).must_equal 'C118' } # Por alteração da carteira
321
+ it { subject.get_codigo_motivo_ocorrencia('19', '17', 400).must_equal 'C119' } # Débito automático
322
+ it { subject.get_codigo_motivo_ocorrencia('31', '101', 400).must_equal 'C131' } # Liquidado anteriormente
323
+ it { subject.get_codigo_motivo_ocorrencia('32', '102', 400).must_equal 'C132' } # Habilitado em processo
324
+ it { subject.get_codigo_motivo_ocorrencia('33', '103', 400).must_equal 'C133' } # Incobrável por nosso intermédio
325
+ it { subject.get_codigo_motivo_ocorrencia('34', '45', 400).must_equal 'C134' } # Transferido para créditos em liquidação
326
+ it { subject.get_codigo_motivo_ocorrencia('46', '17', 400).must_equal 'C46' } # Por alteração da variação
327
+ it { subject.get_codigo_motivo_ocorrencia('47', '09', 400).must_equal 'C47' } # Por alteração da variação
328
+ it { subject.get_codigo_motivo_ocorrencia('51', '06', 400).must_equal 'C51' } # Acerto
329
+ it { subject.get_codigo_motivo_ocorrencia('90', '10', 400).must_equal 'C90' } # Baixa automática
330
+
331
+ end
332
+ end
333
+
334
+ describe "#get_codigo_movimento_retorno" do
335
+ context "CÓDIGOS para o cnab 400 do Banco do Brasil" do
336
+ it { subject.get_codigo_movimento_retorno('05', 400).must_equal '17' } # Liquidado sem registro (carteira 17=tipo4)
337
+ it { subject.get_codigo_movimento_retorno('07', 400).must_equal '102' } # Liquidação por Conta/Parcial
338
+ it { subject.get_codigo_movimento_retorno('08', 400).must_equal '103' } # Liquidação por Saldo
339
+ it { subject.get_codigo_movimento_retorno('15', 400).must_equal '101' } # Liquidação em Cartório
340
+ it { subject.get_codigo_movimento_retorno('16', 400).must_equal '57' } # Confirmação de alteração de juros de mora
341
+ it { subject.get_codigo_movimento_retorno('20', 400).must_equal '120' } # Débito em Conta
342
+ it { subject.get_codigo_movimento_retorno('21', 400).must_equal '43' } # Alteração do Nome do Sacado
343
+ it { subject.get_codigo_movimento_retorno('22', 400).must_equal '43' } # Alteração do Endereço do Sacado
344
+ it { subject.get_codigo_movimento_retorno('24', 400).must_equal '20' } # Sustar Protesto
345
+ it { subject.get_codigo_movimento_retorno('25', 400).must_equal '60' } # Dispensar Juros de mora
346
+ it { subject.get_codigo_movimento_retorno('26', 400).must_equal '40' } # Alteração do número do título dado pelo Cedente (Seu número) – 10 e 15posições
347
+ it { subject.get_codigo_movimento_retorno('28', 400).must_equal '108' } # Manutenção de titulo vencido
348
+ it { subject.get_codigo_movimento_retorno('31', 400).must_equal '07' } # Conceder desconto
349
+ it { subject.get_codigo_movimento_retorno('32', 400).must_equal '08' } # Não conceder desconto
350
+ it { subject.get_codigo_movimento_retorno('33', 400).must_equal '58' } # Retificar desconto
351
+ it { subject.get_codigo_movimento_retorno('34', 400).must_equal '58' } # Alterar data para desconto
352
+ it { subject.get_codigo_movimento_retorno('35', 400).must_equal '56' } # Cobrar Multa
353
+ it { subject.get_codigo_movimento_retorno('36', 400).must_equal '55' } # Dispensar Multa
354
+ it { subject.get_codigo_movimento_retorno('37', 400).must_equal '121' } # Dispensar Indexador
355
+ it { subject.get_codigo_movimento_retorno('38', 400).must_equal '39' } # Dispensar prazo limite para recebimento
356
+ it { subject.get_codigo_movimento_retorno('39', 400).must_equal '38' } # Alterar prazo limite para recebimento
357
+ it { subject.get_codigo_movimento_retorno('46', 400).must_equal '45' } # Título pago com cheque, aguardando compensação
358
+ it { subject.get_codigo_movimento_retorno('73', 400).must_equal '123' } # Confirmação de Instrução de Parâmetro de Pagamento Parcial
359
+ end
360
+ end
361
+
362
+ context "CÓDIGOS motivo ocorrencia do Banco do Brasil para CNAB 400 com Código de Movimento 72" do
363
+ it { subject.get_codigo_motivo_ocorrencia('00', '72', 400).must_equal 'D00' } # Transferência de título de cobrança simples para descontada ou vice-versa
364
+ it { subject.get_codigo_motivo_ocorrencia('52', '72', 400).must_equal 'D52' } # Reembolso de título vendor ou descontado, quando ocorrerem reembolsos de títulos por falta de liquidação. Não há migração de carteira descontada para simples.
365
+ end
209
366
  end