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