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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +13 -0
  5. data/LICENSE +1 -1
  6. data/README.markdown +22 -7
  7. data/br_boleto.gemspec +9 -7
  8. data/lib/br_boleto/active_model_base.rb +28 -0
  9. data/lib/br_boleto/boleto/base.rb +666 -633
  10. data/lib/br_boleto/boleto/caixa.rb +257 -0
  11. data/lib/br_boleto/boleto/sicoob.rb +6 -18
  12. data/lib/br_boleto/helper/format_value.rb +18 -0
  13. data/lib/br_boleto/remessa/base.rb +1 -22
  14. data/lib/br_boleto/remessa/cnab240/base.rb +12 -9
  15. data/lib/br_boleto/remessa/cnab240/caixa.rb +201 -0
  16. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +2 -2
  17. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +10 -1
  18. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +2 -2
  19. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +2 -2
  20. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +7 -0
  21. data/lib/br_boleto/remessa/cnab240/sicoob.rb +6 -6
  22. data/lib/br_boleto/remessa/lote.rb +1 -21
  23. data/lib/br_boleto/remessa/pagamento.rb +22 -36
  24. data/lib/br_boleto/retorno/base.rb +31 -0
  25. data/lib/br_boleto/retorno/cnab240/base.rb +101 -0
  26. data/lib/br_boleto/retorno/cnab240/caixa.rb +30 -0
  27. data/lib/br_boleto/retorno/cnab240/sicoob.rb +35 -0
  28. data/lib/br_boleto/retorno/pagamento.rb +242 -0
  29. data/lib/br_boleto/version.rb +2 -2
  30. data/lib/br_boleto.rb +23 -11
  31. data/test/br_boleto/boleto/base_test.rb +6 -6
  32. data/test/br_boleto/boleto/caixa_test.rb +191 -0
  33. data/test/br_boleto/boleto/sicoob_test.rb +18 -11
  34. data/test/br_boleto/remessa/cnab240/base_test.rb +5 -5
  35. data/test/br_boleto/remessa/cnab240/caixa_test.rb +271 -0
  36. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +2 -2
  37. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +1 -1
  38. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +27 -27
  39. data/test/br_boleto/remessa/pagamento_test.rb +12 -2
  40. data/test/br_boleto/retorno/cnab240/base_test.rb +217 -0
  41. data/test/br_boleto/retorno/cnab240/caixa_test.rb +217 -0
  42. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +217 -0
  43. data/test/br_boleto/retorno/pagamento_test.rb +179 -0
  44. data/test/factories/boleto/boleto_caixa.rb +25 -0
  45. data/test/factories/remessa/cnab240/caixa.rb +14 -0
  46. data/test/factories/remessa/pagamento.rb +1 -0
  47. data/test/factories/retorno/pagamento.rb +6 -0
  48. data/test/files/retorno/cnab240/caixa.ret +14 -0
  49. data/test/files/retorno/cnab240/padrao240.ret +14 -0
  50. 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
- # Modulo responsável por guardar todas as regras dos campos de
46
- # todos os Boletos Bancários. <b>Contribuicões com novas documentações dos
47
- # bancos e homologação dos boletos são extremamente bem vindas!</b>
48
- #
49
- # Esse módulo também é responsável por guardar todas as regras de validação dos boletos e
50
- # contém a forma de chamar os objetos necessários para renderização
51
- # dos formatos (pdf, html, etc) e internacionalização dos boletos (caso
52
- # você precise mudar os nomes dos campos nos boletos)
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 "#tipo_cobranca" do
32
+ describe "#tipo_cobranca_formatada" do
33
33
  it "default é nil" do
34
- subject.tipo_cobranca.must_be_nil
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: '191075',
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: '0098',
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 '191075' }
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 '90182' }
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 "#tipo_cobranca" do
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.tipo_cobranca.must_equal :com_registro
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.tipo_cobranca.must_equal :com_registro
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.tipo_cobranca.must_equal :sem_registro
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.tipo_cobranca.must_equal :sem_registro
184
+ subject.tipo_cobranca_formatada.must_equal :sem_registro
178
185
  end
179
- it "deve ser :garantia_caucionada se modalidade_cobranca for 03" do
186
+ it "deve ser :caucionada se modalidade_cobranca for 03" do
180
187
  subject.modalidade_cobranca = '03'
181
- subject.tipo_cobranca.must_equal :garantia_caucionada
188
+ subject.tipo_cobranca_formatada.must_equal :caucionada
182
189
  end
183
- it "deve ser :garantia_caucionada se modalidade_cobranca for 3" do
190
+ it "deve ser :caucionada se modalidade_cobranca for 3" do
184
191
  subject.modalidade_cobranca = 3
185
- subject.tipo_cobranca.must_equal :garantia_caucionada
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.tipo_cobranca.must_be_nil
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.tipo_cobranca.must_equal :com_registro
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 nosso_numero do pagamento do parametro e ajustar para 15 caracateres" do
83
- pagamento.nosso_numero = '123456'
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 "#complemento_header" do
89
+ it "#complemento_header_arquivo" do
90
90
  assert_raises NotImplementedError do
91
- subject.complemento_header
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(:complemento_header).returns( ''.rjust(29, ' '))
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 "complemento_header"
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(:complemento_header).returns("123456")
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