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.
- 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
|