br_boleto 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +13 -0
- data/LICENSE +1 -1
- data/README.markdown +22 -7
- data/br_boleto.gemspec +9 -7
- data/lib/br_boleto/active_model_base.rb +28 -0
- data/lib/br_boleto/boleto/base.rb +666 -633
- data/lib/br_boleto/boleto/caixa.rb +257 -0
- data/lib/br_boleto/boleto/sicoob.rb +6 -18
- data/lib/br_boleto/helper/format_value.rb +18 -0
- data/lib/br_boleto/remessa/base.rb +1 -22
- data/lib/br_boleto/remessa/cnab240/base.rb +12 -9
- data/lib/br_boleto/remessa/cnab240/caixa.rb +201 -0
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +10 -1
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +7 -0
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +6 -6
- data/lib/br_boleto/remessa/lote.rb +1 -21
- data/lib/br_boleto/remessa/pagamento.rb +22 -36
- data/lib/br_boleto/retorno/base.rb +31 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +101 -0
- data/lib/br_boleto/retorno/cnab240/caixa.rb +30 -0
- data/lib/br_boleto/retorno/cnab240/sicoob.rb +35 -0
- data/lib/br_boleto/retorno/pagamento.rb +242 -0
- data/lib/br_boleto/version.rb +2 -2
- data/lib/br_boleto.rb +23 -11
- data/test/br_boleto/boleto/base_test.rb +6 -6
- data/test/br_boleto/boleto/caixa_test.rb +191 -0
- data/test/br_boleto/boleto/sicoob_test.rb +18 -11
- data/test/br_boleto/remessa/cnab240/base_test.rb +5 -5
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +271 -0
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +27 -27
- data/test/br_boleto/remessa/pagamento_test.rb +12 -2
- data/test/br_boleto/retorno/cnab240/base_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +217 -0
- data/test/br_boleto/retorno/pagamento_test.rb +179 -0
- data/test/factories/boleto/boleto_caixa.rb +25 -0
- data/test/factories/remessa/cnab240/caixa.rb +14 -0
- data/test/factories/remessa/pagamento.rb +1 -0
- data/test/factories/retorno/pagamento.rb +6 -0
- data/test/files/retorno/cnab240/caixa.ret +14 -0
- data/test/files/retorno/cnab240/padrao240.ret +14 -0
- metadata +51 -6
data/lib/br_boleto.rb
CHANGED
@@ -8,8 +8,6 @@ require 'active_support/core_ext/string'
|
|
8
8
|
|
9
9
|
require 'br_boleto/string_methods'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
11
|
# Copyright (C) 2015 Bruno M. Mergen <http://duobr.com.br>
|
14
12
|
#
|
15
13
|
# @author Bruno Mucelini Mergen <brunomergen@gmail.com>
|
@@ -42,20 +40,20 @@ require 'br_boleto/string_methods'
|
|
42
40
|
# bundle install
|
43
41
|
#
|
44
42
|
module BrBoleto
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
#
|
43
|
+
|
44
|
+
def self.root
|
45
|
+
File.expand_path '../..', __FILE__
|
46
|
+
end
|
47
|
+
|
48
|
+
extend ActiveSupport::Autoload
|
49
|
+
autoload :ActiveModelBase
|
50
|
+
|
54
51
|
module Boleto
|
55
52
|
extend ActiveSupport::Autoload
|
56
53
|
|
57
54
|
autoload :Base
|
58
55
|
autoload :Sicoob
|
56
|
+
autoload :Caixa
|
59
57
|
end
|
60
58
|
|
61
59
|
|
@@ -69,6 +67,19 @@ module BrBoleto
|
|
69
67
|
extend ActiveSupport::Autoload
|
70
68
|
autoload :Base
|
71
69
|
autoload :Sicoob
|
70
|
+
autoload :Caixa
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
module Retorno
|
75
|
+
extend ActiveSupport::Autoload
|
76
|
+
autoload :Base
|
77
|
+
autoload :Pagamento
|
78
|
+
module Cnab240
|
79
|
+
extend ActiveSupport::Autoload
|
80
|
+
autoload :Base
|
81
|
+
autoload :Sicoob
|
82
|
+
autoload :Caixa
|
72
83
|
end
|
73
84
|
end
|
74
85
|
|
@@ -77,6 +88,7 @@ module BrBoleto
|
|
77
88
|
|
78
89
|
autoload :CpfCnpj
|
79
90
|
autoload :Number
|
91
|
+
autoload :FormatValue
|
80
92
|
end
|
81
93
|
|
82
94
|
# Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
|
@@ -29,9 +29,9 @@ describe BrBoleto::Boleto::Base do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe "#
|
32
|
+
describe "#tipo_cobranca_formatada" do
|
33
33
|
it "default é nil" do
|
34
|
-
subject.
|
34
|
+
subject.tipo_cobranca_formatada.must_be_nil
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -39,11 +39,11 @@ describe BrBoleto::Boleto::Base do
|
|
39
39
|
context "when passing a Hash" do
|
40
40
|
before do
|
41
41
|
@object = subject.class.new({
|
42
|
-
numero_documento: '
|
42
|
+
numero_documento: '123',
|
43
43
|
valor_documento: 101.99,
|
44
44
|
data_vencimento: Date.new(2015, 07, 10),
|
45
45
|
carteira: '175',
|
46
|
-
agencia: '
|
46
|
+
agencia: '98',
|
47
47
|
conta_corrente: '98701',
|
48
48
|
cedente: 'Nome da razao social',
|
49
49
|
sacado: 'Teste',
|
@@ -57,7 +57,7 @@ describe BrBoleto::Boleto::Base do
|
|
57
57
|
instrucoes6: 'Lembrar de algo 6',
|
58
58
|
})
|
59
59
|
end
|
60
|
-
it{ @object.numero_documento.must_equal '
|
60
|
+
it{ @object.numero_documento.must_equal '000123' }
|
61
61
|
it{ @object.valor_documento.must_equal 101.99 }
|
62
62
|
it{ @object.data_vencimento.must_equal Date.new(2015, 07, 10) }
|
63
63
|
it{ @object.carteira.must_equal '175' }
|
@@ -109,7 +109,7 @@ describe BrBoleto::Boleto::Base do
|
|
109
109
|
it {@object.agencia.must_equal '0914' }
|
110
110
|
it {@object.conta_corrente.must_equal '82369' }
|
111
111
|
it {@object.codigo_moeda.must_equal '9' }
|
112
|
-
it {@object.codigo_cedente.must_equal '
|
112
|
+
it {@object.codigo_cedente.must_equal '090182' }
|
113
113
|
it {@object.endereco_cedente.must_equal 'Rua Itapaiuna, 2434' }
|
114
114
|
it {@object.cedente.must_equal 'Nome da razao social' }
|
115
115
|
it {@object.documento_cedente.must_equal '62526713000140' }
|
@@ -0,0 +1,191 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe BrBoleto::Boleto::Caixa do
|
5
|
+
subject { FactoryGirl.build(:boleto_caixa) }
|
6
|
+
|
7
|
+
describe "#default_values" do
|
8
|
+
it "deve setar um valor padrão de local_pagamento com o valor descrito na documentação" do
|
9
|
+
BrBoleto::Boleto::Caixa.new.local_pagamento.must_equal 'PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "validations" do
|
14
|
+
it { must validate_presence_of(:agencia) }
|
15
|
+
it { must validate_presence_of(:codigo_cedente) }
|
16
|
+
|
17
|
+
it { must validate_length_of(:agencia ).is_at_most(4) }
|
18
|
+
it { must validate_length_of(:codigo_cedente ).is_at_most(6) }
|
19
|
+
it { must validate_length_of(:numero_documento).is_at_most(15) }
|
20
|
+
|
21
|
+
it { must validate_inclusion_of(:carteira).in_array(%w(14 24)) }
|
22
|
+
|
23
|
+
it { must validate_numericality_of(:valor_documento).is_less_than_or_equal_to(99999999.99) }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#codigo_banco - banco da caixa deve ser 104" do
|
27
|
+
it{ subject.codigo_banco.must_equal '104' }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#digito_codigo_banco - deve ser zero" do
|
31
|
+
it { subject.digito_codigo_banco.must_equal '0' }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#agencia_codigo_cedente" do
|
35
|
+
it "deve retornar no formato: agencia / codigo_cedente-dv_codigo_cedente" do
|
36
|
+
subject.assign_attributes(agencia: '557', codigo_cedente: '35412')
|
37
|
+
subject.expects(:digito_verificador_codigo_cedente).returns('7')
|
38
|
+
subject.agencia_codigo_cedente.must_equal "0557 / 035412-7"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#digito_verificador_codigo_cedente" do
|
43
|
+
it "deve utilizar o calculo de Modulo11FatorDe2a9RestoZero para calcular o DV" do
|
44
|
+
subject.codigo_cedente = '999999'
|
45
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('999999').returns('5')
|
46
|
+
|
47
|
+
subject.digito_verificador_codigo_cedente.must_equal '5'
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#digito_verificador_codigo_beneficiario" do
|
51
|
+
it "deve retornar o mesmo valor de #digito_verificador_codigo_cedente" do
|
52
|
+
subject.expects(:digito_verificador_codigo_cedente).returns('valor')
|
53
|
+
subject.digito_verificador_codigo_beneficiario.must_equal 'valor'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#digito_verificador_nosso_numero " do
|
59
|
+
it "deve utilizar o Modulo11FatorDe2a9RestoZero para calcular o digito passando a carteira e numero_documento" do
|
60
|
+
subject.assign_attributes(carteira: '14', numero_documento: '77445')
|
61
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with("14000000000077445").returns('8')
|
62
|
+
|
63
|
+
subject.digito_verificador_nosso_numero.must_equal '8'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#nosso_numero " do
|
68
|
+
it "deve utilizar a carteira, numero_documento e o DV do nosso_numero" do
|
69
|
+
subject.expects(:digito_verificador_nosso_numero).returns('7')
|
70
|
+
subject.assign_attributes(carteira: '24', numero_documento: '789')
|
71
|
+
subject.nosso_numero.must_equal('24000000000000789-7')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#nosso_numero_de_3_a_5" do
|
76
|
+
it "deve pegar o valor das posições 2 até 4 da string do nosso_numero" do
|
77
|
+
subject.expects(:nosso_numero).returns('1234567890ABCDEFG-H')
|
78
|
+
subject.nosso_numero_de_3_a_5.must_equal '345'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#nosso_numero_de_6_a_8" do
|
83
|
+
it "deve pegar o valor das posições 5 até 7 da string do nosso_numero" do
|
84
|
+
subject.expects(:nosso_numero).returns('1234567890ABCDEFG-H')
|
85
|
+
subject.nosso_numero_de_6_a_8.must_equal '678'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#nosso_numero_de_9_a_17" do
|
90
|
+
it "deve pegar o valor das posições 8 até 16 da string do nosso_numero" do
|
91
|
+
subject.expects(:nosso_numero).returns('1234567890ABCDEFG-H')
|
92
|
+
subject.nosso_numero_de_9_a_17.must_equal '90ABCDEFG'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#tipo_cobranca" do
|
97
|
+
it "deve pegar o primeiro caracter da carteira se houver valor na carteira" do
|
98
|
+
subject.carteira = 'X7'
|
99
|
+
subject.tipo_cobranca.must_equal 'X'
|
100
|
+
subject.carteira = 'A7'
|
101
|
+
subject.tipo_cobranca.must_equal 'A'
|
102
|
+
end
|
103
|
+
it "se carteira for nil não deve dar erro" do
|
104
|
+
subject.carteira = nil
|
105
|
+
subject.tipo_cobranca.must_be_nil
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "#modalidade_cobranca" do
|
109
|
+
it "deve simplemente pegar o valor do tipo_cobranca" do
|
110
|
+
subject.expects(:tipo_cobranca).returns(:valor)
|
111
|
+
subject.modalidade_cobranca.must_equal :valor
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#identificador_de_emissao" do
|
117
|
+
it "deve retornar o ultimo caractere da carteira" do
|
118
|
+
subject.carteira = 'X71'
|
119
|
+
subject.identificador_de_emissao.must_equal '1'
|
120
|
+
subject.carteira = 'A2'
|
121
|
+
subject.identificador_de_emissao.must_equal '2'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#carteira_formatada - Conforme o manual da caixa deve retornar RG para carteira com registro e SR para carteira sem registro" do
|
126
|
+
it "para a carteira 14 deve retornar RG" do
|
127
|
+
subject.carteira = '14'
|
128
|
+
subject.carteira_formatada.must_equal 'RG'
|
129
|
+
end
|
130
|
+
it "para a carteira 24 deve retornar SR" do
|
131
|
+
subject.carteira = '24'
|
132
|
+
subject.carteira_formatada.must_equal 'SR'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
describe "#composicao_codigo_barras" do
|
138
|
+
before do
|
139
|
+
subject.codigo_beneficiario = '123456'
|
140
|
+
subject.agencia = '2391'
|
141
|
+
subject.carteira = '14'
|
142
|
+
subject.numero_documento = 'ABCDEFGHIJKLMNO'
|
143
|
+
end
|
144
|
+
|
145
|
+
it "codigo completo conforme a documentação" do
|
146
|
+
subject.composicao_codigo_barras.must_equal '1234560ABC1DEF4GHIJKLMNO'
|
147
|
+
end
|
148
|
+
|
149
|
+
it "da posição 0 até 5 deve ter o valor de codigo_beneficiario " do
|
150
|
+
subject.composicao_codigo_barras[0..5].must_equal '123456'
|
151
|
+
end
|
152
|
+
|
153
|
+
it "da posição 6 até 6 deve ter o valor de digito_verificador_codigo_beneficiario " do
|
154
|
+
subject.composicao_codigo_barras[6].must_equal '0'
|
155
|
+
end
|
156
|
+
|
157
|
+
it "da posição 7 até 9 deve ter o valor de nosso_numero_de_3_a_5 " do
|
158
|
+
subject.composicao_codigo_barras[7..9].must_equal 'ABC'
|
159
|
+
end
|
160
|
+
|
161
|
+
it "da posição 10 até 10 deve ter o valor de tipo_cobranca " do
|
162
|
+
subject.composicao_codigo_barras[10].must_equal '1'
|
163
|
+
end
|
164
|
+
|
165
|
+
it "da posição 11 até 13 deve ter o valor de nosso_numero_de_6_a_8 " do
|
166
|
+
subject.composicao_codigo_barras[11..13].must_equal 'DEF'
|
167
|
+
end
|
168
|
+
|
169
|
+
it "da posição 14 até 14 deve ter o valor de identificador_de_emissao " do
|
170
|
+
subject.composicao_codigo_barras[14].must_equal '4'
|
171
|
+
end
|
172
|
+
|
173
|
+
it "da posição 15 até 23 deve ter o valor de nosso_numero_de_9_a_17 " do
|
174
|
+
subject.composicao_codigo_barras[15..23].must_equal 'GHIJKLMNO'
|
175
|
+
end
|
176
|
+
|
177
|
+
it "a posição 24 deve ser nil " do
|
178
|
+
subject.composicao_codigo_barras[24].must_be_nil
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "#codigo_de_barras_do_banco" do
|
183
|
+
it "deve retornar a composicao_codigo_barras e concatenar o DV do mesmo com o calculo de Modulo11FatorDe2a9RestoZero" do
|
184
|
+
subject.instance_variable_set(:@composicao_codigo_barras, 'valor')
|
185
|
+
subject.expects(:composicao_codigo_barras).returns('123456').twice
|
186
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('123456').returns('*')
|
187
|
+
|
188
|
+
subject.codigo_de_barras_do_banco.must_equal '123456*'
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -21,6 +21,13 @@ describe BrBoleto::Boleto::Sicoob do
|
|
21
21
|
it { must validate_numericality_of(:valor_documento).is_less_than_or_equal_to(99999999.99) }
|
22
22
|
|
23
23
|
end
|
24
|
+
|
25
|
+
describe "#default_values" do
|
26
|
+
it "local_pagamento deve ter o valor padrão conforme a documentação" do
|
27
|
+
BrBoleto::Boleto::Sicoob.new.local_pagamento.must_equal 'PREFERENCIALMENTE COOPERATIVAS DA REDE SICOOB'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
24
31
|
context "#agencia" do
|
25
32
|
it "get value when have a value" do
|
26
33
|
subject.agencia = '215'
|
@@ -159,38 +166,38 @@ describe BrBoleto::Boleto::Sicoob do
|
|
159
166
|
it { subject.class.carteiras_suportadas.must_equal ["1","3"] }
|
160
167
|
end
|
161
168
|
|
162
|
-
describe "#
|
169
|
+
describe "#tipo_cobranca_formatada" do
|
163
170
|
it "deve ser :com_registro se modalidade_cobranca for 01" do
|
164
171
|
subject.modalidade_cobranca = '01'
|
165
|
-
subject.
|
172
|
+
subject.tipo_cobranca_formatada.must_equal :com_registro
|
166
173
|
end
|
167
174
|
it "deve ser :com_registro se modalidade_cobranca for 1" do
|
168
175
|
subject.modalidade_cobranca = 1
|
169
|
-
subject.
|
176
|
+
subject.tipo_cobranca_formatada.must_equal :com_registro
|
170
177
|
end
|
171
178
|
it "deve ser :sem_registro se modalidade_cobranca for 02" do
|
172
179
|
subject.modalidade_cobranca = '02'
|
173
|
-
subject.
|
180
|
+
subject.tipo_cobranca_formatada.must_equal :sem_registro
|
174
181
|
end
|
175
182
|
it "deve ser :sem_registro se modalidade_cobranca for 2" do
|
176
183
|
subject.modalidade_cobranca = 2
|
177
|
-
subject.
|
184
|
+
subject.tipo_cobranca_formatada.must_equal :sem_registro
|
178
185
|
end
|
179
|
-
it "deve ser :
|
186
|
+
it "deve ser :caucionada se modalidade_cobranca for 03" do
|
180
187
|
subject.modalidade_cobranca = '03'
|
181
|
-
subject.
|
188
|
+
subject.tipo_cobranca_formatada.must_equal :caucionada
|
182
189
|
end
|
183
|
-
it "deve ser :
|
190
|
+
it "deve ser :caucionada se modalidade_cobranca for 3" do
|
184
191
|
subject.modalidade_cobranca = 3
|
185
|
-
subject.
|
192
|
+
subject.tipo_cobranca_formatada.must_equal :caucionada
|
186
193
|
end
|
187
194
|
it "deve ser nil se modalidade_cobranca for outro numero" do
|
188
195
|
subject.modalidade_cobranca = 4
|
189
|
-
subject.
|
196
|
+
subject.tipo_cobranca_formatada.must_be_nil
|
190
197
|
end
|
191
198
|
it "deve ser com_registro se modalidade_cobranca for nil, pois o defaul de modalidade_cobranca é 01" do
|
192
199
|
subject.modalidade_cobranca = nil
|
193
|
-
subject.
|
200
|
+
subject.tipo_cobranca_formatada.must_equal :com_registro
|
194
201
|
end
|
195
202
|
end
|
196
203
|
end
|
@@ -79,16 +79,16 @@ describe BrBoleto::Remessa::Cnab240::Base do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
describe "#segmento_p_numero_do_documento" do
|
82
|
-
it "deve pegar o
|
83
|
-
pagamento.
|
82
|
+
it "deve pegar o numero_documento do pagamento do parametro e ajustar para 15 caracateres" do
|
83
|
+
pagamento.numero_documento = '123456'
|
84
84
|
subject.segmento_p_numero_do_documento(pagamento).must_equal '123456'.rjust(15, '0')
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
context "metodos que devem ser sobrescritos para cada banco" do
|
89
|
-
it "#
|
89
|
+
it "#complemento_header_arquivo" do
|
90
90
|
assert_raises NotImplementedError do
|
91
|
-
subject.
|
91
|
+
subject.complemento_header_arquivo
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
@@ -163,7 +163,7 @@ describe BrBoleto::Remessa::Cnab240::Base do
|
|
163
163
|
|
164
164
|
before do
|
165
165
|
# Stub nos metodos que devem ser sobrescritos nos bancos
|
166
|
-
subject.stubs(:
|
166
|
+
subject.stubs(:complemento_header_arquivo).returns( ''.rjust(29, ' '))
|
167
167
|
subject.stubs(:versao_layout_arquivo).returns( '081')
|
168
168
|
subject.stubs(:versao_layout_lote).returns( '040')
|
169
169
|
subject.stubs(:convenio_lote).returns( ''.rjust(20, ' '))
|
@@ -0,0 +1,271 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe BrBoleto::Remessa::Cnab240::Caixa do
|
4
|
+
subject { FactoryGirl.build(:remessa_cnab240_caixa, lotes: lote) }
|
5
|
+
let(:pagamento) { FactoryGirl.build(:remessa_pagamento, valor_documento: 879.66) }
|
6
|
+
let(:lote) { FactoryGirl.build(:remessa_lote, pagamentos: pagamento) }
|
7
|
+
|
8
|
+
it "deve herdar da class Base" do
|
9
|
+
subject.class.superclass.must_equal BrBoleto::Remessa::Cnab240::Base
|
10
|
+
end
|
11
|
+
|
12
|
+
context "validations" do
|
13
|
+
it { must validate_presence_of(:modalidade_carteira) }
|
14
|
+
it { must validate_presence_of(:agencia) }
|
15
|
+
it { must validate_presence_of(:versao_aplicativo) }
|
16
|
+
it { must validate_presence_of(:convenio) }
|
17
|
+
|
18
|
+
it { must validate_length_of(:convenio ).is_at_most(6).with_message("deve ter no máximo 6 dígitos.") }
|
19
|
+
it { must validate_length_of(:versao_aplicativo).is_at_most(4).with_message("deve ter no máximo 4 dígitos.") }
|
20
|
+
it { must validate_length_of(:agencia ).is_at_most(5).with_message("deve ter no máximo 5 dígitos.") }
|
21
|
+
it { must validate_length_of(:modalidade_carteira).is_equal_to(2).with_message("deve ter 2 dígitos.") }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#default_values" do
|
25
|
+
it "for emissao_boleto" do
|
26
|
+
object = subject.class.new()
|
27
|
+
object.emissao_boleto.must_equal '2'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "for distribuicao_boleto" do
|
31
|
+
object = subject.class.new()
|
32
|
+
object.distribuicao_boleto.must_equal '2'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "for especie_titulo" do
|
36
|
+
object = subject.class.new()
|
37
|
+
object.especie_titulo.must_equal '02'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "for modalidade_carteira" do
|
41
|
+
object = subject.class.new()
|
42
|
+
object.modalidade_carteira.must_equal '14'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "for forma_cadastramento" do
|
46
|
+
object = subject.class.new()
|
47
|
+
object.forma_cadastramento.must_equal '0'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "for versao_aplicativo" do
|
51
|
+
object = subject.class.new()
|
52
|
+
object.instance_variable_get(:@versao_aplicativo).must_equal '0'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "for codigo_carteira" do
|
56
|
+
object = subject.class.new()
|
57
|
+
object.codigo_carteira.must_equal '1'
|
58
|
+
end
|
59
|
+
|
60
|
+
context "deve manter os defaults da classe Base" do
|
61
|
+
it "deve continuar com o default da superclass" do
|
62
|
+
object = subject.class.new()
|
63
|
+
object.aceite.must_equal 'N'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "codigo_banco deve ser 104" do
|
69
|
+
subject.codigo_banco.must_equal '104'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "metodo nome_banco deve retornar CAIXA ECONOMICA FEDERAL com 30 posições" do
|
73
|
+
subject.nome_banco.must_equal 'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
|
74
|
+
end
|
75
|
+
|
76
|
+
it "metodo versao_layout_arquivo deve retornar 050" do
|
77
|
+
subject.versao_layout_arquivo.must_equal '050'
|
78
|
+
end
|
79
|
+
|
80
|
+
it "metodo versao_layout_lote deve retornar 030" do
|
81
|
+
subject.versao_layout_lote.must_equal '030'
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#versao_aplicativo" do
|
85
|
+
it "se contém algum valor na variavel @versao_aplicativo deve ajustála para 4 posições adicionado zeros a esquerda" do
|
86
|
+
subject.instance_variable_set(:@versao_aplicativo, '88')
|
87
|
+
subject.versao_aplicativo.must_equal '0088'
|
88
|
+
|
89
|
+
subject.versao_aplicativo = '777'
|
90
|
+
subject.versao_aplicativo.must_equal '0777'
|
91
|
+
end
|
92
|
+
|
93
|
+
it "se não contém valor na variavel @versao_aplicativo deve retornar nil" do
|
94
|
+
subject.instance_variable_set(:@versao_aplicativo, '')
|
95
|
+
subject.versao_aplicativo.must_be_nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "o digito_agencia deve calcular o modulo11 de 2 a 9 com resto zero " do
|
100
|
+
subject.agencia = '33'
|
101
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('33').returns(1)
|
102
|
+
subject.digito_agencia.must_equal '1'
|
103
|
+
end
|
104
|
+
|
105
|
+
it "o codigo_convenio deve ter 20 posições com Zeros" do
|
106
|
+
subject.codigo_convenio.must_equal '0' * 20
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#convenio_lote" do
|
110
|
+
it "as 6 primeiras posições deve ser o valor do convenio ajustado com zeros a esquerda" do
|
111
|
+
subject.convenio = '88'
|
112
|
+
subject.convenio_lote(lote)[0..5].must_equal '000088'
|
113
|
+
|
114
|
+
subject.convenio = '2878'
|
115
|
+
subject.convenio_lote(lote)[0..5].must_equal '002878'
|
116
|
+
end
|
117
|
+
it "as 14 ultimas posições deve ser tudo Zeros" do
|
118
|
+
subject.convenio_lote(lote)[6..19].must_equal '00000000000000'
|
119
|
+
end
|
120
|
+
it "deve ter 20 caracteres" do
|
121
|
+
subject.convenio_lote(lote).size.must_equal 20
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
describe "#informacoes_da_conta" do
|
127
|
+
it "deve ter 20 posições" do
|
128
|
+
subject.informacoes_da_conta.size.must_equal 20
|
129
|
+
end
|
130
|
+
|
131
|
+
it "1 - Primeira parte = agencia 5 posicoes - ajustados com zeros a esquerda" do
|
132
|
+
subject.agencia = '123'
|
133
|
+
subject.informacoes_da_conta[0..4].must_equal '00123'
|
134
|
+
|
135
|
+
subject.agencia = '1234'
|
136
|
+
subject.informacoes_da_conta[0..4].must_equal '01234'
|
137
|
+
end
|
138
|
+
|
139
|
+
it "2 - Segunda parte = digito_agencia" do
|
140
|
+
subject.expects(:digito_agencia).returns("&")
|
141
|
+
subject.informacoes_da_conta[5].must_equal "&"
|
142
|
+
end
|
143
|
+
|
144
|
+
it "3 - Terceira parte = convenio 6 posicoes - ajustados com zeros a esquerda" do
|
145
|
+
subject.convenio = '123'
|
146
|
+
subject.informacoes_da_conta[6..11].must_equal '000123'
|
147
|
+
|
148
|
+
subject.convenio = '1234'
|
149
|
+
subject.informacoes_da_conta[6..11].must_equal '001234'
|
150
|
+
end
|
151
|
+
|
152
|
+
it "4 - Quarta parte = Modelo personalizado - Deve ter 7 zeros" do
|
153
|
+
subject.informacoes_da_conta[12..18].must_equal('0000000')
|
154
|
+
end
|
155
|
+
|
156
|
+
it "5 - Quinta parte = Exclusivo caixa - Deve ter 1 zero" do
|
157
|
+
subject.informacoes_da_conta[19].must_equal('0')
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe "#complemento_header_arquivo" do
|
162
|
+
it "deve ter 29 posições" do
|
163
|
+
subject.complemento_header_arquivo.size.must_equal 29
|
164
|
+
end
|
165
|
+
|
166
|
+
it "1 - Primeira parte = versao_aplicativo 4 posicoes - ajustados com zeros a esquerda" do
|
167
|
+
subject.versao_aplicativo = '12'
|
168
|
+
subject.complemento_header_arquivo[0..3].must_equal '0012'
|
169
|
+
|
170
|
+
subject.versao_aplicativo = '123'
|
171
|
+
subject.complemento_header_arquivo[0..3].must_equal '0123'
|
172
|
+
end
|
173
|
+
|
174
|
+
it "2 - Segunda parte = USO FEBRABAN com 25 posições em branco" do
|
175
|
+
subject.complemento_header_arquivo[4..28].must_equal ' ' * 25
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "#complemento_p" do
|
180
|
+
|
181
|
+
it "deve ter 34 posições" do
|
182
|
+
subject.complemento_p(pagamento).size.must_equal 34
|
183
|
+
end
|
184
|
+
|
185
|
+
it "1 - Primeira parte = convenio com 6 posicoes - ajustados com zeros a esquerda" do
|
186
|
+
subject.convenio = '12'
|
187
|
+
subject.complemento_p(pagamento)[0..5].must_equal '000012'
|
188
|
+
|
189
|
+
subject.convenio = '123'
|
190
|
+
subject.complemento_p(pagamento)[0..5].must_equal '000123'
|
191
|
+
end
|
192
|
+
|
193
|
+
it "2 - Seguna parte = Uso Caixa com 11 posicoes com zeros" do
|
194
|
+
subject.complemento_p(pagamento)[6..16].must_equal '0' * 11
|
195
|
+
end
|
196
|
+
|
197
|
+
it "3 - Terceira parte = Modalidade carteira com 2 posicoes" do
|
198
|
+
subject.modalidade_carteira = '14'
|
199
|
+
subject.complemento_p(pagamento)[17..18].must_equal '14'
|
200
|
+
subject.modalidade_carteira = 'XX'
|
201
|
+
subject.complemento_p(pagamento)[17..18].must_equal 'XX'
|
202
|
+
end
|
203
|
+
|
204
|
+
it "4 - Quarta parte = nosso_numero com 15 posicoes ajustados com zeros a esquerda" do
|
205
|
+
pagamento.nosso_numero = '1234567890'
|
206
|
+
subject.complemento_p(pagamento)[19..34].must_equal '000001234567890'
|
207
|
+
pagamento.nosso_numero = '1234567890123'
|
208
|
+
subject.complemento_p(pagamento)[19..34].must_equal '001234567890123'
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "#segmento_p_numero_do_documento" do
|
213
|
+
it "deve ter 15 posições" do
|
214
|
+
subject.segmento_p_numero_do_documento(pagamento).size.must_equal 15
|
215
|
+
end
|
216
|
+
|
217
|
+
it "1 - Primeira parte = Nr Doc. cobrança com 11 posicoes - ajustados com zeros a esquerda" do
|
218
|
+
pagamento.numero_documento = '123456789'
|
219
|
+
subject.segmento_p_numero_do_documento(pagamento)[0..10].must_equal '00123456789'
|
220
|
+
|
221
|
+
pagamento.numero_documento = '1234567890'
|
222
|
+
subject.segmento_p_numero_do_documento(pagamento)[0..10].must_equal '01234567890'
|
223
|
+
end
|
224
|
+
|
225
|
+
it "2 - Segunda parte = Uso da CAIXA com 4 posicoes em branco" do
|
226
|
+
subject.segmento_p_numero_do_documento(pagamento)[11..14].must_equal ' ' * 4
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
describe "#segmento_p_posicao_106_a_106" do
|
232
|
+
it "deve ser '0' - diferente do padrão que é um espaço em branco" do
|
233
|
+
subject.segmento_p_posicao_106_a_106.must_equal '0'
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#segmento_p_posicao_196_a_220" do
|
238
|
+
it "deve ter o numero do documento do pagamento com 25 posições ajustados com zero a esquerda" do
|
239
|
+
pagamento.numero_documento = '789798'
|
240
|
+
subject.segmento_p_posicao_196_a_220(pagamento).must_equal '789798'.rjust(25, '0')
|
241
|
+
|
242
|
+
pagamento.numero_documento = '99'
|
243
|
+
subject.segmento_p_posicao_196_a_220(pagamento).must_equal '99'.rjust(25, '0')
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
describe "#segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2" do
|
248
|
+
it "deve conter o valor '00' conforme a docuemntação" do
|
249
|
+
subject.segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2(pagamento).must_equal '00'
|
250
|
+
end
|
251
|
+
end
|
252
|
+
describe "#segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2" do
|
253
|
+
it "deve conter o valor '00' conforme a docuemntação" do
|
254
|
+
subject.segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2(pagamento).must_equal '00'
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe "#complemento_trailer_lote" do
|
259
|
+
it "deve ter 217 posições" do
|
260
|
+
subject.complemento_trailer_lote(lote, 5).size.must_equal 217
|
261
|
+
end
|
262
|
+
|
263
|
+
it "1 - Primeira parte = 69 posições todas preenchidas com zeros" do
|
264
|
+
subject.complemento_trailer_lote(lote, 5)[0..68].must_equal '0' * 69
|
265
|
+
end
|
266
|
+
|
267
|
+
it "2 - Segunda parte = EXCLUSIVO FEBRABAN com 148 posicoes em branco" do
|
268
|
+
subject.complemento_trailer_lote(lote, 5)[69..216].must_equal (' ' * 148)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
@@ -198,10 +198,10 @@ module Helper
|
|
198
198
|
|
199
199
|
# Para Uso Exclusivo FEBRABAN / CNAB
|
200
200
|
# 29 posições
|
201
|
-
# Padrão pega o valor do metodo "
|
201
|
+
# Padrão pega o valor do metodo "complemento_header_arquivo"
|
202
202
|
#
|
203
203
|
def test_HeaderArquivoTest_metodo_header_arquivo_posicao_212_a_240
|
204
|
-
subject.expects(:
|
204
|
+
subject.expects(:complemento_header_arquivo).returns("123456")
|
205
205
|
subject.header_arquivo_posicao_212_a_240.must_equal("123456")
|
206
206
|
end
|
207
207
|
end
|
@@ -328,7 +328,7 @@ module Helper
|
|
328
328
|
# Deve retornar 25 posições em branco
|
329
329
|
#
|
330
330
|
def test_SegmentoPTest_metodo_segmento_p_posicao_196_a_220
|
331
|
-
subject.segmento_p_posicao_196_a_220.must_equal ''.rjust(25, ' ')
|
331
|
+
subject.segmento_p_posicao_196_a_220(pagamento).must_equal ''.rjust(25, ' ')
|
332
332
|
end
|
333
333
|
|
334
334
|
# Código para Protesto
|