br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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