br_boleto 1.2.2 → 2.0.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -9,109 +9,56 @@ describe BrBoleto::Remessa::Cnab240::Sicoob do
9
9
  subject.class.superclass.must_equal BrBoleto::Remessa::Cnab240::Base
10
10
  end
11
11
 
12
- context "validations" do
13
- it { must validate_presence_of(:modalidade_carteira) }
14
- it { must validate_presence_of(:tipo_formulario) }
15
- it { must validate_presence_of(:parcela) }
16
- it { must validate_presence_of(:conta_corrente) }
17
- # Segundo a documentação do Sicoob o convênio deve ter 20 caracteres em branco
18
- # Então ele não pode ser obrigatorio
19
- it { wont validate_presence_of(:convenio) }
20
-
21
- it { must validate_length_of(:conta_corrente ).is_at_most(12).with_message("deve ter no máximo 12 dígitos.") }
22
- it { must validate_length_of(:agencia ).is_equal_to(4).with_message("deve ter 4 dígitos.") }
23
- it { must validate_length_of(:modalidade_carteira).is_equal_to(2).with_message("deve ter 2 dígitos.") }
12
+ it "A conta deve ser da class Sicoob" do
13
+ subject.conta.must_be_kind_of BrBoleto::Conta::Sicoob
24
14
  end
25
15
 
26
- describe "conveio" do
27
- it "por padrão tem 20 caracteres em branco" do
28
- subject.convenio = nil
29
- subject.convenio.must_equal "".rjust(20, ' ')
30
- end
16
+ context "validations" do
17
+ describe 'Validações personalizadas da conta' do
18
+ it 'valid_modalidade_required' do
19
+ subject.send(:valid_modalidade_required).must_equal true
20
+ subject.conta.modalidade = ''
21
+ conta_must_be_msg_error(:modalidade, :blank)
22
+ end
23
+
24
+ it 'valid_conta_corrente_required' do
25
+ subject.send(:valid_conta_corrente_required).must_equal true
26
+ subject.conta.conta_corrente = ''
27
+ conta_must_be_msg_error(:conta_corrente, :blank)
28
+ end
29
+ it 'valid_codigo_cedente_required' do
30
+ subject.send(:valid_codigo_cedente_required).must_equal true
31
+ subject.conta.codigo_cedente = ''
32
+ conta_must_be_msg_error(:convenio, :blank)
33
+ end
34
+ it 'valid_conta_corrente_maximum' do
35
+ subject.send(:valid_conta_corrente_maximum).must_equal 12
36
+ subject.conta.conta_corrente = '1234567890123456'
37
+ conta_must_be_msg_error(:conta_corrente, :custom_length_maximum, {count: 12})
38
+ end
39
+ it 'valid_modalidade_length' do
40
+ subject.send(:valid_modalidade_length).must_equal 2
41
+ subject.conta.modalidade = '1234567890123456'
42
+ conta_must_be_msg_error(:modalidade, :custom_length_is, {count: 2})
43
+ end
31
44
 
32
- it "deve ser possivel setar um valor" do
33
- subject.convenio = "123"
34
- subject.convenio.must_equal "123".ljust(20, " ")
45
+ private
46
+
47
+ def conta_must_be_msg_error(attr_validation, msg_key, options_msg={})
48
+ must_be_message_error(:base, "#{BrBoleto::Conta::Sicoob.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
49
+ end
35
50
  end
51
+ it { must validate_presence_of(:tipo_formulario) }
36
52
  end
37
53
 
38
54
  describe "#default_values" do
39
- it "for emissao_boleto" do
40
- object = subject.class.new()
41
- object.emissao_boleto.must_equal '2'
42
- end
43
-
44
- it "for distribuicao_boleto" do
45
- object = subject.class.new()
46
- object.distribuicao_boleto.must_equal '2'
47
- end
48
-
49
- it "for especie_titulo" do
50
- object = subject.class.new()
51
- object.especie_titulo.must_equal '02'
52
- end
53
-
54
55
  it "for tipo_formulario" do
55
56
  object = subject.class.new()
56
57
  object.tipo_formulario.must_equal '4'
57
58
  end
58
-
59
- it "for parcela" do
60
- object = subject.class.new()
61
- object.parcela.must_equal '01'
62
- end
63
-
64
- it "for modalidade_carteira" do
65
- object = subject.class.new()
66
- object.modalidade_carteira.must_equal '01'
67
- end
68
-
69
- context "Deve sobrescrever os campos default se houver algum igual" do
70
- it "forma_cadastramento deve ser sobrescrita" do
71
- object = subject.class.new()
72
- object.forma_cadastramento.must_equal '0' # Na classe base é '1'
73
- end
74
- end
75
- context "deve manter os defaults da classe Base" do
76
- it "for codigo_carteira" do
77
- object = subject.class.new()
78
- object.codigo_carteira.must_equal '1'
79
- end
80
- it "deve continuar com o default da superclass" do
81
- object = subject.class.new()
82
- object.aceite.must_equal 'N'
83
- end
84
- end
85
- end
86
-
87
- it "codigo_banco deve ser 756" do
88
- subject.codigo_banco.must_equal '756'
89
59
  end
90
60
 
91
- it "metodo nome_banco deve retornar SICOOB com 30 posições" do
92
- subject.nome_banco.must_equal 'SICOOB'.ljust(30, ' ')
93
- end
94
-
95
- it "metodo versao_layout_arquivo deve retornar 081" do
96
- subject.versao_layout_arquivo.must_equal '081'
97
- end
98
-
99
- it "metodo versao_layout_lote deve retornar 040" do
100
- subject.versao_layout_lote.must_equal '040'
101
- end
102
-
103
- it "o digito_agencia deve calcular o modulo11 de 2 a 9 com resto zero " do
104
- subject.agencia = '33'
105
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('33').returns(1)
106
- subject.digito_agencia.must_equal '1'
107
- end
108
61
 
109
- it "o digito_conta deve calcular o modulo11 de 2 a 9 com resto zero " do
110
- subject.conta_corrente = '34'
111
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('34').returns(1)
112
- subject.digito_conta.must_equal '1'
113
- end
114
-
115
62
  it "o codigo_convenio deve ter 20 posições em branco" do
116
63
  subject.codigo_convenio.must_equal ''.rjust(20, ' ')
117
64
  end
@@ -127,38 +74,38 @@ describe BrBoleto::Remessa::Cnab240::Sicoob do
127
74
  end
128
75
  context "1 Primeira parte = agencia 5 posicoes" do
129
76
  it "se for menor que 5 deve preencher com zero" do
130
- subject.agencia = '123'
77
+ subject.conta.agencia = '123'
131
78
  subject.informacoes_da_conta[0..4].must_equal '00123'
132
79
  end
133
80
  it "quando agencia tiver as 5 posições" do
134
- subject.agencia = '12345'
81
+ subject.conta.agencia = '12345'
135
82
  subject.informacoes_da_conta[0..4].must_equal '12345'
136
83
  end
137
84
  end
138
85
 
139
- context "2 - Segunda parte = digito_agencia" do
86
+ context "2 - Segunda parte = agencia_dv" do
140
87
  it "deve pegar o digito da agencia" do
141
- subject.expects(:digito_agencia).returns("&")
88
+ subject.conta.expects(:agencia_dv).returns("&")
142
89
  subject.informacoes_da_conta[5].must_equal "&"
143
90
  end
144
91
  end
145
92
 
146
93
  context "3 - Terceira parte = conta_corrente com 12 posições" do
147
94
  it "se tiver menos que 12 caracteres deve preencher com zero" do
148
- subject.stubs(:digito_conta)
149
- subject.expects(:conta_corrente).returns("123456")
95
+ subject.conta.stubs(:conta_corrente_dv)
96
+ subject.conta.expects(:conta_corrente).returns("123456")
150
97
  subject.informacoes_da_conta[6..17].must_equal "123456".rjust(12, '0')
151
98
  end
152
99
  it "se tiver 12 caracteres deve manter" do
153
- subject.stubs(:digito_conta)
154
- subject.expects(:conta_corrente).returns("".rjust(12, '1'))
100
+ subject.conta.stubs(:conta_corrente_dv)
101
+ subject.conta.expects(:conta_corrente).returns("".rjust(12, '1'))
155
102
  subject.informacoes_da_conta[6..17].must_equal "1".rjust(12, '1')
156
103
  end
157
104
  end
158
105
 
159
- context "4 - Quarta parte = digito_conta" do
160
- it "deve buscar o valor do metodo digito_conta" do
161
- subject.expects(:digito_conta).returns('*')
106
+ context "4 - Quarta parte = conta_corrente_dv" do
107
+ it "deve buscar o valor do metodo conta_corrente_dv" do
108
+ subject.conta.expects(:conta_corrente_dv).returns('*')
162
109
  subject.informacoes_da_conta[18].must_equal('*')
163
110
  end
164
111
  end
@@ -262,44 +209,49 @@ describe BrBoleto::Remessa::Cnab240::Sicoob do
262
209
 
263
210
  describe "#formata_nosso_numero" do
264
211
  it "posicao 0 até 9 deve pegar o nosso_numero passado por parametro e ajustar para 10 posições" do
265
- subject.formata_nosso_numero(123)[0..9].must_equal "123".rjust(10, '0')
212
+ pagamento.nosso_numero = 123
213
+ subject.formata_nosso_numero(pagamento)[0..9].must_equal "123".rjust(10, '0')
266
214
  end
267
215
  it "posicao 10 até 11 deve ter o numero da parcela" do
268
- subject.expects(:parcela).returns("99")
269
- subject.formata_nosso_numero(1)[10..11].must_equal "99"
216
+ pagamento.expects(:parcela).returns("99")
217
+ pagamento.nosso_numero = 1
218
+ subject.formata_nosso_numero(pagamento)[10..11].must_equal "99"
270
219
  end
271
- it "posicao 12 até 13 deve ter a modalidade_carteira" do
272
- subject.expects(:modalidade_carteira).returns("23")
273
- subject.formata_nosso_numero(1)[12..13].must_equal "23"
220
+ it "posicao 12 até 13 deve ter a conta.modalidade" do
221
+ subject.conta.expects(:modalidade).returns("23")
222
+ pagamento.nosso_numero = 1
223
+ subject.formata_nosso_numero(pagamento)[12..13].must_equal "23"
274
224
  end
275
225
  it "posicao 14 deve ter o tipo_formulario" do
276
226
  subject.expects(:tipo_formulario).returns("4")
277
- subject.formata_nosso_numero(1)[14].must_equal "4"
227
+ subject.formata_nosso_numero(pagamento)[14].must_equal "4"
278
228
  end
279
229
  it "posição 15 até 19 deve ser valor em branco" do
280
- subject.formata_nosso_numero(123)[15..19].must_equal "".rjust(5, ' ')
230
+ pagamento.nosso_numero = 123
231
+ subject.formata_nosso_numero(pagamento)[15..19].must_equal "".rjust(5, ' ')
281
232
  end
282
233
  it "deve ajustar a string para no maximo 20 posições" do
283
- subject.expects(:modalidade_carteira).returns("".rjust(20, "1"))
284
- subject.formata_nosso_numero(123456).size.must_equal 20
234
+ subject.conta.expects(:modalidade).returns("".rjust(20, "1"))
235
+ pagamento.nosso_numero = 123456
236
+ subject.formata_nosso_numero(pagamento).size.must_equal 20
285
237
  end
286
238
  end
287
239
 
288
240
  describe "#complemento_p" do
289
241
  it "posicao 0 até 11 deve ter a conta_corrente" do
290
- subject.stubs(:digito_conta)
291
- subject.expects(:conta_corrente).returns(123456789)
242
+ subject.conta.stubs(:conta_corrente_dv)
243
+ subject.conta.expects(:conta_corrente).returns(123456789)
292
244
  subject.complemento_p(pagamento)[0..11].must_equal "000123456789"
293
245
  end
294
- it "posicao 12 deve te o digito_conta" do
295
- subject.expects(:digito_conta).returns("%")
246
+ it "posicao 12 deve te o conta_corrente_dv" do
247
+ subject.conta.expects(:conta_corrente_dv).returns("%")
296
248
  subject.complemento_p(pagamento)[12].must_equal "%"
297
249
  end
298
250
  it "posição 13 deve ser um caracter em branco" do
299
251
  subject.complemento_p(pagamento)[13].must_equal " "
300
252
  end
301
253
  it "posição 14 até 33 deve ter o valor do metodo formata_nosso_numero passando o nosso_numero do pagamento" do
302
- subject.expects(:formata_nosso_numero).with(pagamento.nosso_numero).returns("12345678901234567890")
254
+ subject.expects(:formata_nosso_numero).with(pagamento).returns("12345678901234567890")
303
255
  subject.complemento_p(pagamento)[14..33].must_equal '12345678901234567890'
304
256
  end
305
257
  end
@@ -311,36 +263,36 @@ describe BrBoleto::Remessa::Cnab240::Sicoob do
311
263
  end
312
264
 
313
265
  describe "#tipo_cobranca_formatada" do
314
- it "deve ser :simples se modalidade_carteira for 01" do
315
- subject.modalidade_carteira = '01'
266
+ it "deve ser :simples se conta.modalidade for 01" do
267
+ subject.conta.modalidade = '01'
316
268
  subject.tipo_cobranca_formatada.must_equal :simples
317
269
  end
318
- it "deve ser :simples se modalidade_carteira for 1" do
319
- subject.modalidade_carteira = 1
270
+ it "deve ser :simples se conta.modalidade for 1" do
271
+ subject.conta.modalidade = 1
320
272
  subject.tipo_cobranca_formatada.must_equal :simples
321
273
  end
322
- it "deve ser :simples se modalidade_carteira for 02" do
323
- subject.modalidade_carteira = '02'
274
+ it "deve ser :simples se conta.modalidade for 02" do
275
+ subject.conta.modalidade = '02'
324
276
  subject.tipo_cobranca_formatada.must_equal :simples
325
277
  end
326
- it "deve ser :simples se modalidade_carteira for 2" do
327
- subject.modalidade_carteira = 2
278
+ it "deve ser :simples se conta.modalidade for 2" do
279
+ subject.conta.modalidade = 2
328
280
  subject.tipo_cobranca_formatada.must_equal :simples
329
281
  end
330
- it "deve ser :caucionada se modalidade_carteira for 03" do
331
- subject.modalidade_carteira = '03'
282
+ it "deve ser :caucionada se conta.modalidade for 03" do
283
+ subject.conta.modalidade = '03'
332
284
  subject.tipo_cobranca_formatada.must_equal :caucionada
333
285
  end
334
- it "deve ser :caucionada se modalidade_carteira for 3" do
335
- subject.modalidade_carteira = 3
286
+ it "deve ser :caucionada se conta.modalidade for 3" do
287
+ subject.conta.modalidade = 3
336
288
  subject.tipo_cobranca_formatada.must_equal :caucionada
337
289
  end
338
- it "deve ser nil se modalidade_carteira for outro numero" do
339
- subject.modalidade_carteira = 4
290
+ it "deve ser nil se conta.modalidade for outro numero" do
291
+ subject.conta.modalidade = 4
340
292
  subject.tipo_cobranca_formatada.must_be_nil
341
293
  end
342
- it "deve ser nil se modalidade_carteira for nil" do
343
- subject.modalidade_carteira = nil
294
+ it "deve ser nil se conta.modalidade for nil" do
295
+ subject.conta.modalidade = nil
344
296
  subject.tipo_cobranca_formatada.must_be_nil
345
297
  end
346
298
  end
@@ -404,4 +356,57 @@ describe BrBoleto::Remessa::Cnab240::Sicoob do
404
356
  end
405
357
  end
406
358
  end
359
+
360
+ describe 'Geração do arquivo' do
361
+ let(:conta) do
362
+ {
363
+ razao_social: 'EMPRESA EMITENTE',
364
+ cpf_cnpj: '33.486.451/0001-30',
365
+ carteira: '1',
366
+ modalidade: '01',
367
+ agencia: '3040',
368
+ codigo_cedente: '82819',
369
+ conta_corrente: '54843'
370
+
371
+ }
372
+ end
373
+ let(:pagador) {
374
+ {
375
+ nome: 'Benjamin Francisco Marcos Vinicius Fernandes',
376
+ cpf_cnpj: '787.933.211-12',
377
+ endereco: 'Rua Principal s/n 881',
378
+ bairro: 'Centro',
379
+ cep: '79210-972',
380
+ cidade: 'Anastácio',
381
+ uf: 'MS',
382
+ }
383
+ }
384
+ let(:pagamento) {
385
+ BrBoleto::Remessa::Pagamento.new({
386
+ nosso_numero: '00157804',
387
+ numero_documento: '00157804',
388
+ data_vencimento: Date.parse('06/09/2016'),
389
+ valor_documento: 147.89,
390
+ pagador: pagador,
391
+ especie_titulo: '02',
392
+ codigo_juros: '1',
393
+ data_juros: Date.parse('07/09/2016'),
394
+ valor_juros: 0.25,
395
+ codigo_multa: '2',
396
+ data_multa: Date.parse('07/09/2016'),
397
+ valor_multa: 2.00,
398
+ data_emissao: Date.parse('06/09/2016'),
399
+ })
400
+ }
401
+ let(:lote) { BrBoleto::Remessa::Lote.new(pagamentos: pagamento) }
402
+ it "deve gerar o arquivo de remessa corretamente com as informações passadas" do
403
+ remessa = BrBoleto::Remessa::Cnab240::Sicoob.new({
404
+ data_hora_arquivo: Time.parse('06/09/2016 09:43:52'),
405
+ sequencial_remessa: 11,
406
+ conta: conta,
407
+ lotes: [lote],
408
+ })
409
+ remessa.dados_do_arquivo.must_equal read_fixture('remessa/cnab240/sicoob.rem')
410
+ end
411
+ end
407
412
  end
@@ -0,0 +1,263 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Base do
4
+ subject { FactoryGirl.build(:remessa_cnab400_base, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento) }
6
+ let(:conta) { FactoryGirl.build(:conta_sicoob) }
7
+ let(:sequence_1) { sequence('sequence_1') }
8
+
9
+ before do
10
+ BrBoleto::Remessa::Cnab400::Base.any_instance.stubs(:conta_class).returns(conta.class)
11
+ end
12
+
13
+ it "deve ter incluso o module de pagamentos" do
14
+ subject.class.must_include BrBoleto::HavePagamentos
15
+ end
16
+
17
+ context "métodos que devem ser implementados nas subclasses" do
18
+ it '#informacoes_da_conta' do # (local)
19
+ assert_raises NotImplementedError do
20
+ subject.informacoes_da_conta(:any)
21
+ end
22
+ end
23
+
24
+ it '#complemento_registro' do
25
+ assert_raises NotImplementedError do
26
+ subject.complemento_registro
27
+ end
28
+ end
29
+
30
+ it '#dados_do_pagamento' do
31
+ assert_raises NotImplementedError do
32
+ subject.dados_do_pagamento(pagamento)
33
+ end
34
+ end
35
+
36
+ it '#informacoes_do_pagamento' do # (pagamento, sequencial)
37
+ assert_raises NotImplementedError do
38
+ subject.informacoes_do_pagamento(pagamento, 3)
39
+ end
40
+ end
41
+
42
+ it '#detalhe_multas_e_juros_do_pagamento' do # (pagamento, sequencial)
43
+ assert_raises NotImplementedError do
44
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
45
+ end
46
+ end
47
+
48
+ it '#informacoes_do_sacado' do # (pagamento, sequencial)
49
+ assert_raises NotImplementedError do
50
+ subject.informacoes_do_sacado(pagamento, 5)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#informacoes_do_banco' do
56
+ it "deve trazer o código e nome do banco - não deixando passar de 18 caracteres" do
57
+ conta.expects(:codigo_banco).returns('789')
58
+ conta.expects(:nome_banco).returns('NOME DO BANCO COM 31 CARACTERES')
59
+ subject.informacoes_do_banco.must_equal '789NOME DO BANCO C'
60
+ end
61
+ it "deve trazer o código e nome do banco - sempre retornando com 18 caracteres" do
62
+ conta.expects(:codigo_banco).returns('789')
63
+ conta.expects(:nome_banco).returns('NOMEBANCO')
64
+ subject.informacoes_do_banco.must_equal '789NOMEBANCO '
65
+ end
66
+ end
67
+
68
+
69
+ describe '#Header' do
70
+ it '#monta_header deve chamar os metodos para montar o header' do
71
+ subject.expects(:header_posicao_001_a_001).in_sequence(sequence_1).returns('001_a_001-')
72
+ subject.expects(:header_posicao_002_a_002).in_sequence(sequence_1).returns('002_b_002-')
73
+ subject.expects(:header_posicao_003_a_009).in_sequence(sequence_1).returns('003_c_009-')
74
+ subject.expects(:header_posicao_010_a_011).in_sequence(sequence_1).returns('010_d_011-')
75
+ subject.expects(:header_posicao_012_a_026).in_sequence(sequence_1).returns('012_e_026-')
76
+ subject.expects(:header_posicao_027_a_046).in_sequence(sequence_1).returns('027_f_046-')
77
+ subject.expects(:header_posicao_047_a_076).in_sequence(sequence_1).returns('047_g_076-')
78
+ subject.expects(:header_posicao_077_a_094).in_sequence(sequence_1).returns('077_h_094-')
79
+ subject.expects(:header_posicao_095_a_100).in_sequence(sequence_1).returns('095_i_100-')
80
+ subject.expects(:header_posicao_101_a_394).in_sequence(sequence_1).returns('101_j_394-')
81
+ subject.expects(:header_posicao_395_a_400).in_sequence(sequence_1).returns('395_k_400-')
82
+
83
+ subject.monta_header.must_equal '001_A_001-002_B_002-003_C_009-010_D_011-012_E_026-027_F_046-047_G_076-077_H_094-095_I_100-101_J_394-395_K_400-'
84
+ end
85
+ it "#header_posicao_001_a_001 - deve retornar o valor '0'" do
86
+ subject.header_posicao_001_a_001.must_equal '0'
87
+ end
88
+
89
+ it "#header_posicao_002_a_002 - deve retornar o valor '0'" do
90
+ subject.header_posicao_002_a_002.must_equal '0'
91
+ end
92
+
93
+ it "#header_posicao_003_a_009 - deve retornar o valor 'REMESSA'" do
94
+ subject.header_posicao_003_a_009.must_equal 'REMESSA'
95
+ end
96
+
97
+ it "#header_posicao_010_a_011 - deve retornar o valor '01'" do
98
+ subject.header_posicao_010_a_011.must_equal '01'
99
+ end
100
+
101
+ it "#header_posicao_012_a_026 - deve retornar o valor 'COBRANÇA' ajustado com 15 posições" do
102
+ subject.header_posicao_012_a_026.must_equal 'COBRANÇA'.ljust(15, ' ')
103
+ end
104
+
105
+ it "#header_posicao_027_a_046 - deve retornar o valor informacoes_da_conta com :header por parametro" do
106
+ subject.expects(:informacoes_da_conta).with(:header).returns('informacoes_da_conta')
107
+ subject.header_posicao_027_a_046.must_equal 'informacoes_da_conta'
108
+ end
109
+
110
+ it "#header_posicao_047_a_076 - deve retornar o valor a razao_social da conta ajustado apra 30 posições" do
111
+ conta.expects(:razao_social).returns('tem razão')
112
+ subject.header_posicao_047_a_076.must_equal "tem razão".ljust(30, ' ')
113
+ end
114
+
115
+ it "#header_posicao_077_a_094 - deve retornar o valor informacoes_do_banco" do
116
+ subject.expects(:informacoes_do_banco).returns('informacoes_do_banco')
117
+ subject.header_posicao_077_a_094.must_equal 'informacoes_do_banco'
118
+ end
119
+
120
+ it "#header_posicao_095_a_100 - deve retornar o valor data_geracao('%d%m%y')" do
121
+ subject.expects(:data_geracao).with('%d%m%y').returns('010916')
122
+ subject.header_posicao_095_a_100.must_equal ('010916')
123
+ end
124
+
125
+ it "#header_posicao_101_a_394 - deve retornar o valor complemento_registro" do
126
+ subject.expects(:complemento_registro).returns('complemento_registro')
127
+ subject.header_posicao_101_a_394.must_equal 'complemento_registro'
128
+ end
129
+
130
+ it "#header_posicao_395_a_400 - deve retornar o valor '000001'" do
131
+ subject.header_posicao_395_a_400.must_equal '000001'
132
+ end
133
+ end
134
+
135
+ describe '#Detalhe' do
136
+ it "#monta_detalhe - deve montar as 400 posições do com as informações do pagamento" do
137
+ subject.expects(:detalhe_posicao_001_001).returns('001_001 a-').in_sequence(sequence_1)
138
+ subject.expects(:detalhe_posicao_002_003).returns('002_003 b-').in_sequence(sequence_1)
139
+ subject.expects(:detalhe_posicao_004_017).returns('004_017 c-').in_sequence(sequence_1)
140
+ subject.expects(:detalhe_posicao_018_037).returns('018_037 d-').in_sequence(sequence_1)
141
+ subject.expects(:detalhe_posicao_038_062).returns('038_062 e-').in_sequence(sequence_1)
142
+ subject.expects(:detalhe_posicao_063_076).returns('063_076 f-').in_sequence(sequence_1).with(pagamento, 4)
143
+ subject.expects(:detalhe_posicao_077_108).returns('077_108 g-').in_sequence(sequence_1).with(pagamento, 4)
144
+ subject.expects(:detalhe_posicao_109_110).returns('109_110 h-').in_sequence(sequence_1).with(pagamento, 4)
145
+ subject.expects(:detalhe_posicao_111_120).returns('111_120 i-').in_sequence(sequence_1).with(pagamento, 4)
146
+ subject.expects(:detalhe_posicao_121_160).returns('121_160 j-').in_sequence(sequence_1).with(pagamento, 4)
147
+ subject.expects(:detalhe_posicao_161_218).returns('161_218 k-').in_sequence(sequence_1).with(pagamento, 4)
148
+ subject.expects(:detalhe_posicao_219_394).returns('219_394 l-').in_sequence(sequence_1).with(pagamento, 4)
149
+ subject.expects(:detalhe_posicao_395_400).returns('395_400 m' ).in_sequence(sequence_1).with(pagamento, 4)
150
+ subject.monta_detalhe(pagamento, 4).must_equal('001_001 A-002_003 B-004_017 C-018_037 D-038_062 E-063_076 F-077_108 G-109_110 H-111_120 I-121_160 J-161_218 K-219_394 L-395_400 M')
151
+ end
152
+ it '#detalhe_posicao_001_001 - deve retornar 1' do
153
+ # '1'
154
+ subject.detalhe_posicao_001_001.must_equal '1'
155
+ end
156
+
157
+ it '#detalhe_posicao_002_003 - deve retornar o tipo do cnpj da conta' do
158
+ conta.expects(:tipo_cpf_cnpj).returns('5')
159
+ subject.detalhe_posicao_002_003.must_equal '5'
160
+ end
161
+
162
+ it '#detalhe_posicao_004_017 - deve retornar o cnpj da conta ajustado para 14 digitos' do
163
+ conta.expects(:cpf_cnpj).returns('1234567890')
164
+ subject.detalhe_posicao_004_017.must_equal '00001234567890'
165
+ end
166
+
167
+ it '#detalhe_posicao_018_037 - deve retornar as informações da conta' do
168
+ subject.expects(:informacoes_da_conta).with(:detalhe).returns('informacoes_da_conta')
169
+ subject.detalhe_posicao_018_037.must_equal 'informacoes_da_conta'
170
+
171
+ end
172
+
173
+ it '#detalhe_posicao_038_062 - deve retornar 25 caracteres vazios' do
174
+ subject.detalhe_posicao_038_062.must_equal ''.rjust(25, ' ')
175
+
176
+ end
177
+
178
+ it '#detalhe_posicao_063_076 - devre retornar os dados do pagamento' do
179
+ subject.expects(:dados_do_pagamento).with(pagamento).returns('dados_do_pagamento')
180
+ subject.detalhe_posicao_063_076(pagamento, 1).must_equal 'dados_do_pagamento'
181
+
182
+ end
183
+
184
+ it '#detalhe_posicao_077_108 - deve retornar um erro para sobrescrever o metodo' do # (pagamento, sequencial)
185
+ assert_raises NotImplementedError do
186
+ subject.detalhe_posicao_077_108(pagamento, 1)
187
+ end
188
+ end
189
+
190
+ it '#detalhe_posicao_109_110 - deve retornar a identificacao da ocorrencia ajustando o tamanho para 2' do # (pagamento, sequencial)
191
+ pagamento.expects(:identificacao_ocorrencia).returns('7')
192
+ subject.detalhe_posicao_109_110(pagamento, 1).must_equal '07'
193
+ end
194
+
195
+ it '#detalhe_posicao_111_120 - deve retornar o numero do documento do pagamento' do # (pagamento, sequencial)
196
+ pagamento.expects(:numero_documento).returns('15554')
197
+ subject.detalhe_posicao_111_120(pagamento, 1).must_equal '0000015554'
198
+ end
199
+
200
+ it '#detalhe_posicao_121_160 - deve retornar as informações do pagamento' do # (pagamento, sequencial)
201
+ subject.expects(:informacoes_do_pagamento).with(pagamento, 78).returns('informacoes_do_pagamento')
202
+ subject.detalhe_posicao_121_160(pagamento, 78).must_equal 'informacoes_do_pagamento'
203
+ end
204
+
205
+ it '#detalhe_posicao_161_218 - deve retornar os detalhes de juros e multa do pagamento' do # (pagamento, sequencial)
206
+ subject.expects(:detalhe_multas_e_juros_do_pagamento).with(pagamento, 78).returns('detalhe_multas_e_juros_do_pagamento')
207
+ subject.detalhe_posicao_161_218(pagamento, 78).must_equal 'detalhe_multas_e_juros_do_pagamento'
208
+ end
209
+
210
+ it '#detalhe_posicao_219_394 - deve retornar as informações do sacado' do # (pagamento, sequencial)
211
+ subject.expects(:informacoes_do_sacado).with(pagamento, 78).returns('informacoes_do_sacado')
212
+ subject.detalhe_posicao_219_394(pagamento, 78).must_equal 'informacoes_do_sacado'
213
+ end
214
+
215
+ it '#detalhe_posicao_395_400 - deve retornar o sequencial do arquivo com 6 posições' do # (pagamento, sequencial)
216
+ subject.detalhe_posicao_395_400(pagamento, 78).must_equal '000078'
217
+ end
218
+ end
219
+
220
+ describe '#Trailer' do
221
+ it '#monta_trailer deve chamar os metodos para montar o header' do
222
+ subject.expects(:trailer_arquivo_posicao_001_a_001).in_sequence(sequence_1).returns('001_a_001-')
223
+ subject.expects(:trailer_arquivo_posicao_002_a_394).in_sequence(sequence_1).returns('002_b_394-').with(5)
224
+ subject.expects(:trailer_arquivo_posicao_394_a_400).in_sequence(sequence_1).returns('394_c_400-').with(5)
225
+
226
+ subject.monta_trailer(5).must_equal '001_A_001-002_B_394-394_C_400-'
227
+ end
228
+ it '#trailer_arquivo_posicao_001_a_001 - deve retornar o valor 9' do
229
+ subject.trailer_arquivo_posicao_001_a_001.must_equal '9'
230
+ end
231
+
232
+ it '#trailer_arquivo_posicao_002_a_394 - deve retornar 393 posições em branco' do
233
+ subject.trailer_arquivo_posicao_002_a_394(4).must_equal ''.rjust(393, ' ')
234
+ end
235
+
236
+ it '#trailer_arquivo_posicao_394_a_400 - deve retornar o seuqnecial do item com 6 posições' do
237
+ subject.trailer_arquivo_posicao_394_a_400(8).must_equal '000008'
238
+ end
239
+ end
240
+
241
+ describe '#dados_do_arquivo' do
242
+
243
+ it "deve montar os dados do arquivo setando o sequencial e os pagamentos corretamente - com 1 pagamento" do
244
+ subject.expects(:monta_header).returns('montã_header')
245
+ subject.expects(:monta_detalhe).with(pagamento, 2).returns('mônta_detalhe')
246
+ subject.expects(:monta_trailer).with(3).returns('monta_tráiler')
247
+
248
+ subject.dados_do_arquivo.must_equal "MONTA_HEADER\nMONTA_DETALHE\nMONTA_TRAILER"
249
+ end
250
+ it "deve montar os dados do arquivo setando o sequencial e os pagamentos corretamente - com 2 pagamentos" do
251
+ pagamento2 = FactoryGirl.build(:remessa_pagamento)
252
+ subject.pagamentos << pagamento2
253
+
254
+ subject.expects(:monta_header).returns('montã_header').in_sequence(sequence_1)
255
+ subject.expects(:monta_detalhe).with(pagamento, 2).returns('mônta_detalhe_pgto1').in_sequence(sequence_1)
256
+ subject.expects(:monta_detalhe).with(pagamento2, 3).returns('mônta_détalhe_pgto2').in_sequence(sequence_1)
257
+ subject.expects(:monta_trailer).with(4).returns('monta_tráiler').in_sequence(sequence_1)
258
+
259
+ subject.dados_do_arquivo.must_equal "MONTA_HEADER\nMONTA_DETALHE_PGTO1\nMONTA_DETALHE_PGTO2\nMONTA_TRAILER"
260
+ end
261
+ end
262
+
263
+ end