br_boleto 1.0.1 → 1.1.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 +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
|