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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- 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
|
-
|
13
|
-
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
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 =
|
86
|
+
context "2 - Segunda parte = agencia_dv" do
|
140
87
|
it "deve pegar o digito da agencia" do
|
141
|
-
subject.expects(:
|
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(:
|
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(:
|
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 =
|
160
|
-
it "deve buscar o valor do metodo
|
161
|
-
subject.expects(:
|
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
|
-
|
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
|
-
|
269
|
-
|
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
|
272
|
-
subject.expects(:
|
273
|
-
|
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(
|
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
|
-
|
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(:
|
284
|
-
|
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(:
|
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
|
295
|
-
subject.expects(:
|
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
|
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
|
315
|
-
subject.
|
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
|
319
|
-
subject.
|
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
|
323
|
-
subject.
|
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
|
327
|
-
subject.
|
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
|
331
|
-
subject.
|
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
|
335
|
-
subject.
|
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
|
339
|
-
subject.
|
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
|
343
|
-
subject.
|
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
|