br_boleto 2.1.0 → 2.2.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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +157 -8
  5. data/br_boleto.gemspec +1 -1
  6. data/lib/br_boleto.rb +12 -1
  7. data/lib/br_boleto/association/have_conta.rb +31 -27
  8. data/lib/br_boleto/boleto/banco_brasil.rb +130 -0
  9. data/lib/br_boleto/boleto/santander.rb +77 -0
  10. data/lib/br_boleto/conta/banco_brasil.rb +156 -0
  11. data/lib/br_boleto/conta/itau.rb +8 -3
  12. data/lib/br_boleto/conta/santander.rb +208 -0
  13. data/lib/br_boleto/remessa/cnab240/banco_brasil.rb +132 -0
  14. data/lib/br_boleto/remessa/cnab240/bradesco.rb +1 -3
  15. data/lib/br_boleto/remessa/cnab240/itau.rb +0 -6
  16. data/lib/br_boleto/remessa/cnab240/santander.rb +266 -0
  17. data/lib/br_boleto/remessa/cnab400/banco_brasil.rb +264 -0
  18. data/lib/br_boleto/remessa/cnab400/bradesco.rb +1 -1
  19. data/lib/br_boleto/remessa/cnab400/santander.rb +215 -0
  20. data/lib/br_boleto/retorno/cnab240/banco_brasil.rb +10 -0
  21. data/lib/br_boleto/retorno/cnab240/base.rb +3 -2
  22. data/lib/br_boleto/retorno/cnab240/caixa.rb +3 -2
  23. data/lib/br_boleto/retorno/cnab240/itau.rb +1 -2
  24. data/lib/br_boleto/retorno/cnab240/santander.rb +38 -0
  25. data/lib/br_boleto/retorno/cnab240/sicoob.rb +3 -2
  26. data/lib/br_boleto/retorno/cnab400/banco_brasil.rb +46 -0
  27. data/lib/br_boleto/retorno/cnab400/bradesco.rb +4 -3
  28. data/lib/br_boleto/retorno/cnab400/itau.rb +2 -2
  29. data/lib/br_boleto/retorno/cnab400/santander.rb +44 -0
  30. data/lib/br_boleto/retorno/cnab400/sicoob.rb +3 -2
  31. data/lib/br_boleto/retorno/cnab400/sicredi.rb +20 -6
  32. data/lib/br_boleto/retorno/pagamento.rb +28 -7
  33. data/lib/br_boleto/version.rb +1 -1
  34. data/test/br_boleto/boleto/banco_brasil_test.rb +183 -0
  35. data/test/br_boleto/boleto/santander_test.rb +122 -0
  36. data/test/br_boleto/conta/banco_brasil_test.rb +209 -0
  37. data/test/br_boleto/conta/santantader_test.rb +222 -0
  38. data/test/br_boleto/remessa/cnab240/banco_brasil_test.rb +187 -0
  39. data/test/br_boleto/remessa/cnab240/itau_test.rb +4 -0
  40. data/test/br_boleto/remessa/cnab240/santander_test.rb +144 -0
  41. data/test/br_boleto/remessa/cnab400/banco_brasil_test.rb +285 -0
  42. data/test/br_boleto/remessa/cnab400/bradesco_test.rb +7 -0
  43. data/test/br_boleto/remessa/cnab400/santander_test.rb +174 -0
  44. data/test/br_boleto/retorno/cnab240/banco_brasil_test.rb +271 -0
  45. data/test/br_boleto/retorno/cnab240/base_test.rb +20 -10
  46. data/test/br_boleto/retorno/cnab240/bradesco_test.rb +15 -15
  47. data/test/br_boleto/retorno/cnab240/caixa_test.rb +10 -10
  48. data/test/br_boleto/retorno/cnab240/cecred_test.rb +55 -138
  49. data/test/br_boleto/retorno/cnab240/itau_test.rb +15 -15
  50. data/test/br_boleto/retorno/cnab240/santander_test.rb +282 -0
  51. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +25 -15
  52. data/test/br_boleto/retorno/cnab240/sicredi_test.rb +15 -15
  53. data/test/br_boleto/retorno/cnab240/unicred_test.rb +15 -15
  54. data/test/br_boleto/retorno/cnab400/banco_brasil_test.rb +7 -0
  55. data/test/br_boleto/retorno/cnab400/bradesco_test.rb +24 -12
  56. data/test/br_boleto/retorno/cnab400/itau_test.rb +6 -4
  57. data/test/br_boleto/retorno/cnab400/santander_test.rb +7 -0
  58. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +20 -10
  59. data/test/br_boleto/retorno/cnab400/sicredi_test.rb +97 -1
  60. data/test/br_boleto/retorno/cnab400/unicred.rb +18 -18
  61. data/test/br_boleto/retorno/pagamento_test.rb +2 -2
  62. data/test/factories/boleto/boleto_banco_brasil.rb +18 -0
  63. data/test/factories/boleto/boleto_santander.rb +18 -0
  64. data/test/factories/conta/banco_brasil.rb +16 -0
  65. data/test/factories/conta/santander.rb +15 -0
  66. data/test/factories/remessa/cnab240/banco_brasil.rb +9 -0
  67. data/test/factories/remessa/cnab240/santander.rb +9 -0
  68. data/test/factories/remessa/cnab400/banco_brasil.rb +8 -0
  69. data/test/factories/remessa/cnab400/santander.rb +8 -0
  70. data/test/fixtures/retorno/cnab240/banco_brasil.ret +74 -0
  71. data/test/fixtures/retorno/cnab240/cecred.ret +10 -0
  72. data/test/fixtures/retorno/cnab240/santander.ret +16 -0
  73. data/test/fixtures/retorno/cnab400/sicredi.ret +4 -0
  74. metadata +64 -7
@@ -8,9 +8,10 @@ module BrBoleto
8
8
  { # ATRIBUTO POSIÇÃO DA LINHA
9
9
  agencia_sem_dv: 18..21,
10
10
  agencia_com_dv: 18..22,
11
+ numero_conta_sem_dv: 23..30,
11
12
  numero_conta_dv: 31,
12
- numero_conta: 23..30,
13
- nosso_numero: 63..74,
13
+ nosso_numero_sem_dv: 63..73,
14
+ nosso_numero_dv: 74,
14
15
  parcela: 75..76,
15
16
  modalidade: 107..108,
16
17
  carteira: 108,
@@ -4,14 +4,30 @@ module BrBoleto
4
4
  module Cnab400
5
5
  class Sicredi < BrBoleto::Retorno::Cnab400::Base
6
6
  private
7
+ # O valor da posição que representa o nosso_numero está
8
+ # subdividido em várias partes para o sicredi.
9
+ #
10
+ # Nosso Numero (Posição 048 a 062) conforme exemplo informações abaixo:
11
+ # - Ano - 02 posições (48 a 49) - Ano Atual
12
+ # - Byte Idt. - 01 posições (50 a 50) - Byte de identificação
13
+ # - Número Seq. - 05 posições (51 a 55) - Número sequencial
14
+ # - DV nosso num. - 01 posição (56 a 56) - Dígito verificador nosso número
15
+ # - Em branco - 06 posições (57 a 62)
16
+ #
17
+ # 13 - ano atual
18
+ # 2 - byte
19
+ # xxxxx - número sequencial
20
+ # D - dígito verificador calculado
21
+ # Ex: 132xxxxxD
22
+ #
7
23
  def detalhe_fields #:doc:
8
24
  { # ATRIBUTO POSIÇÃO DA LINHA
9
25
 
10
-
11
26
  carteira: 14..14,
12
- numero_conta_dv: '',
13
- numero_conta: 15..19,
14
- nosso_numero: 48..62,
27
+ codigo_pagador_cooperativa: 15..19,
28
+ codigo_pagador_associado: 20..24,
29
+ nosso_numero_sem_dv: 48..55,
30
+ nosso_numero_dv: 56,
15
31
  data_ocorrencia: 111..116,
16
32
  data_ocorrencia_sacado: 111..116,
17
33
  numero_documento: 117..126,
@@ -28,13 +44,11 @@ module BrBoleto
28
44
  valor_juros_multa: 267..279,
29
45
  valor_outros_creditos: 280..292,
30
46
 
31
-
32
47
  # sacado_documento: 4..17,
33
48
  # agencia_sem_dv: 25..29,
34
49
  # agencia_recebedora_com_dv: 169..173,
35
50
  # banco_recebedor: 166..168,
36
51
  # data_credito: 296..301,
37
-
38
52
  }
39
53
  end
40
54
  end
@@ -11,11 +11,11 @@ module BrBoleto
11
11
  attr_accessor :agencia_sem_dv # tamanho = 5
12
12
 
13
13
  # NÚMERO DA CONTA CORRENTE/CEDENTE
14
- attr_accessor :numero_conta # tamanho = 12
14
+ attr_accessor :numero_conta_sem_dv # tamanho = 12
15
15
  attr_accessor :numero_conta_dv # tamanho = 1
16
16
  alias_attribute :codigo_cedente, :numero_conta
17
- def numero_conta_com_dv
18
- "#{numero_conta}#{numero_conta_dv}" # tamanho = 13
17
+ def numero_conta
18
+ "#{numero_conta_sem_dv}#{numero_conta_dv}" # tamanho = 13
19
19
  end
20
20
 
21
21
 
@@ -32,16 +32,26 @@ module BrBoleto
32
32
  # IDENTIFICAÇÃO DO TÍTULO
33
33
  # Tamanho Posição
34
34
  # 20 38-57
35
- attr_accessor :nosso_numero
35
+ attr_accessor :nosso_numero_sem_dv
36
36
 
37
37
  # DÍGITO VERIFICADOR NOSSO NÚMERO
38
38
  attr_accessor :nosso_numero_dv
39
+
40
+ # IDENTIFICAÇÃO DO TÍTULO (NOSSO NÚMERO)
41
+ def nosso_numero
42
+ "#{nosso_numero_sem_dv}#{nosso_numero_dv}"
43
+ end
39
44
 
40
- # CÓDIGO DA CARTEIRA
41
- # Tamanho Posição
42
- # 1 58-58
45
+ # CARTEIRA DE COBRANÇA
43
46
  attr_accessor :carteira
47
+
48
+ # CÓDIGO DA CARTEIRA (TIPO DE COBRANÇA)
44
49
  attr_accessor :cod_carteira
50
+ alias_attribute :tipo_cobranca, :cod_carteira
51
+
52
+ # VARIAÇÃO DA CARTEIRA
53
+ attr_accessor :variacao_carteira
54
+
45
55
 
46
56
  # NÚMERO DO DOCUMENTO
47
57
  # Tamanho Posição
@@ -113,6 +123,17 @@ module BrBoleto
113
123
  # 10 214-223
114
124
  attr_accessor :motivo_ocorrencia
115
125
 
126
+ # BANCO SICREDI (PAG. 44)
127
+ # Código do pagador na cooperativa do beneficiário
128
+ # Tamanho Posição
129
+ # 05 015-019
130
+ attr_accessor :codigo_pagador_cooperativa
131
+
132
+ # Código do pagador junto ao associado
133
+ # Tamanho Posição
134
+ # 05 020-024
135
+ attr_accessor :codigo_pagador_associado
136
+
116
137
  #############################################################################################
117
138
  ############################# VALORES ENCONTRADOS NO SEGMENTO U #############################
118
139
  #############################################################################################
@@ -1,7 +1,7 @@
1
1
  module BrBoleto
2
2
  module Version
3
3
  MAJOR = 2 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
4
- MINOR = 1 #inclui novas funcionalidades, sem quebrar APIs existentes
4
+ MINOR = 2 #inclui novas funcionalidades, sem quebrar APIs existentes
5
5
  PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
6
6
  CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
@@ -0,0 +1,183 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ describe BrBoleto::Boleto::BancoBrasil do
5
+ subject { FactoryGirl.build(:boleto_banco_brasil, conta: conta) }
6
+ let(:conta) { FactoryGirl.build(:conta_banco_brasil) }
7
+
8
+ context "on validations" do
9
+ # it { must validate_length_of(:numero_documento).is_at_most(11).with_message(:custom_length_maximum) }
10
+
11
+ context '#valid_numero_documento_maximum' do
12
+ it "deve setar o tamanho do numero_documento dependendo do tipo de convênio" do
13
+ subject.conta.convenio = '1234'
14
+ must validate_length_of(:numero_documento).is_at_most(7).with_message(:custom_length_maximum)
15
+
16
+ subject.conta.convenio = '123456'
17
+ must validate_length_of(:numero_documento).is_at_most(5).with_message(:custom_length_maximum)
18
+
19
+ subject.conta.convenio = '1234567'
20
+ must validate_length_of(:numero_documento).is_at_most(10).with_message(:custom_length_maximum)
21
+
22
+ subject.conta.convenio = '12345678'
23
+ must validate_length_of(:numero_documento).is_at_most(9).with_message(:custom_length_maximum)
24
+ end
25
+ end
26
+
27
+ context '#conta.carteira' do
28
+ it { subject.valid_carteira_inclusion.must_equal ['11','12','15','16','17', '18', '31', '51'] }
29
+ it "validação da carteira da conta" do
30
+ subject.conta.carteira = '4'
31
+ conta_must_be_msg_error(:carteira, :custom_inclusion, {list: '11, 12, 15, 16, 17, 18, 31, 51'})
32
+ subject.conta.carteira = '12'
33
+ conta_wont_be_msg_error(:carteira, :custom_inclusion, {list: '11, 12, 15, 16, 17, 18, 31, 51'})
34
+ end
35
+ end
36
+
37
+ # describe '#conta.convenio / codigo_cedente' do
38
+ # it { subject.valid_convenio_maximum.must_equal 7 }
39
+ # it { subject.valid_convenio_required.must_equal true }
40
+
41
+ # it "validação obrigatoriedade do codigo_cedente da conta" do
42
+ # subject.conta.codigo_cedente = ''
43
+ # conta_must_be_msg_error(:convenio, :blank)
44
+ # subject.conta.codigo_cedente = '123456'
45
+ # conta_wont_be_msg_error(:convenio, :blank)
46
+ # end
47
+ # end
48
+
49
+ private
50
+
51
+ def conta_must_be_msg_error(attr_validation, msg_key, options_msg={})
52
+ must_be_message_error(:base, "#{BrBoleto::Conta::BancoBrasil.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
53
+ end
54
+ def conta_wont_be_msg_error(attr_validation, msg_key, options_msg={})
55
+ wont_be_message_error(:base, "#{BrBoleto::Conta::BancoBrasil.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
56
+ end
57
+ end
58
+
59
+ describe "#default_values" do
60
+ it "local_pagamento deve ter o valor padrão conforme a documentação" do
61
+ BrBoleto::Boleto::BancoBrasil.new.local_pagamento.must_equal 'Pagável em qualquer banco até o vencimento. Após, atualize o boleto no site bb.com.br'
62
+ end
63
+ end
64
+
65
+ describe "#digito_verificador_nosso_numero" do
66
+ it "deve calcular pelo Modulo11FatorDe9a2RestoX" do
67
+ subject.conta.convenio = 1234
68
+ subject.numero_documento = 111
69
+ BrBoleto::Calculos::Modulo11FatorDe9a2RestoX.expects(:new).with("12340000111").returns("meu_resultado")
70
+ subject.digito_verificador_nosso_numero.must_equal "meu_resultado"
71
+ end
72
+ end
73
+
74
+ describe "#nosso_numero" do
75
+ subject { FactoryGirl.build(:boleto_banco_brasil, numero_documento: '68315') }
76
+
77
+ it "deve retornar o numero do documento com o digito_verificador_nosso_numero com convenio de 4 ou 6 digitos" do
78
+ subject.stubs(:digito_verificador_nosso_numero).returns('9')
79
+ subject.conta.convenio = 1234
80
+ subject.numero_documento = '3646'
81
+ subject.nosso_numero.must_equal "12340003646-9"
82
+
83
+ subject.conta.convenio = 123456
84
+ subject.nosso_numero.must_equal "12345603646-9"
85
+ end
86
+
87
+ it "deve retornar o numero do documento sem o digito_verificador_nosso_numero com convenio de 7 ou 8 digitos" do
88
+ subject.conta.convenio = 1234567
89
+ subject.numero_documento = '3646'
90
+ subject.nosso_numero.must_equal "12345670000003646"
91
+
92
+ subject.conta.convenio = 12345678
93
+ subject.nosso_numero.must_equal "12345678000003646"
94
+ end
95
+ end
96
+
97
+ describe "#codigo_de_barras_do_banco" do
98
+ subject do
99
+ FactoryGirl.build(:boleto_banco_brasil, conta: {
100
+ carteira: '16',
101
+ agencia: '78',
102
+ conta_corrente: '6685',
103
+ },
104
+ numero_documento: '395'
105
+ )
106
+ end
107
+ it "deve montar o codigo corretamente com as informações (convenio 4 digitos)" do
108
+ subject.conta.convenio = 1234
109
+ subject.stubs(:nosso_numero).returns('12340000395-9')
110
+
111
+ result = subject.codigo_de_barras_do_banco
112
+ result.size.must_equal 25
113
+
114
+ result[0..3].must_equal '1234' # Convênio
115
+ result[4..10].must_equal '0000395' # Numero documento
116
+ result[11..14].must_equal '0078' # Agencia
117
+ result[15..22].must_equal '00006685' # Conta Corrente
118
+ result[23..24].must_equal '16' # Carteira
119
+
120
+ subject.codigo_de_barras_do_banco.must_equal '1234000039500780000668516'
121
+ end
122
+
123
+ it "deve montar o codigo corretamente com as informações (convenio 6 digitos)" do
124
+ subject.conta.convenio = 123456
125
+ subject.stubs(:nosso_numero).returns('12345600395-9')
126
+
127
+ result = subject.codigo_de_barras_do_banco
128
+ result.size.must_equal 25
129
+
130
+ result[0..5].must_equal '123456' # Convênio
131
+ result[6..10].must_equal '00395' # Numero documento
132
+ result[11..14].must_equal '0078' # Agencia
133
+ result[15..22].must_equal '00006685' # Conta Corrente
134
+ result[23..24].must_equal '16' # Carteira
135
+
136
+ subject.codigo_de_barras_do_banco.must_equal '1234560039500780000668516'
137
+ end
138
+ it "deve montar o codigo corretamente com as informações (convenio 7 digitos)" do
139
+ subject.conta.convenio = 1234567
140
+ subject.stubs(:nosso_numero).returns('12345670000000395')
141
+
142
+ result = subject.codigo_de_barras_do_banco
143
+ result.size.must_equal 25
144
+
145
+ result[0..5].must_equal '000000' # Zeros
146
+ result[6..12].must_equal '1234567' # Convênio
147
+ result[13..22].must_equal '0000000395' # Numero documento
148
+ result[23..24].must_equal '16' # Carteira
149
+
150
+ subject.codigo_de_barras_do_banco.must_equal '0000001234567000000039516'
151
+ end
152
+ end
153
+
154
+ describe "#codigo_de_barras" do
155
+ subject do
156
+ FactoryGirl.build(:boleto_banco_brasil) do |banco_brasil|
157
+ banco_brasil.conta.agencia = 3069
158
+ banco_brasil.conta.codigo_cedente = 1234 # Para o banco do Brasil é o código do cliente
159
+ banco_brasil.conta.codigo_cedente_dv = '0' # Para o banco do Brasil é o código do cliente
160
+ banco_brasil.conta.carteira = '12'
161
+ banco_brasil.numero_documento = 100_10
162
+ banco_brasil.valor_documento = 93015.78
163
+ banco_brasil.data_vencimento = Date.parse('2020-02-17')
164
+ end
165
+ end
166
+
167
+ it { subject.codigo_de_barras.must_equal '00193816800093015781234001001030690008975512' }
168
+ it { subject.linha_digitavel.must_equal '00191.23405 01001.030699 00089.755128 3 81680009301578' }
169
+
170
+ it "codigo de barras de um boleto de exemplo" do
171
+ subject.conta.agencia = 3069
172
+ subject.conta.codigo_cedente = 5828196 # Para o banco do Brasil é o código do cliente
173
+ subject.conta.codigo_cedente_dv = 0 # Para o banco do Brasil é o código do cliente
174
+ subject.conta.carteira = '12'
175
+ subject.numero_documento = 15_679
176
+ subject.valor_documento = 408.50
177
+ subject.data_vencimento = Date.parse('2016-09-01')
178
+
179
+ subject.linha_digitavel.must_equal '00190.00009 05828.196005 00015.679129 7 69040000040850'
180
+ subject.codigo_de_barras.must_equal '00197690400000408500000005828196000001567912'
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ describe BrBoleto::Boleto::Santander do
5
+ subject { FactoryGirl.build(:boleto_santander, conta: conta) }
6
+ let(:conta) { FactoryGirl.build(:conta_santander) }
7
+
8
+ context "on validations" do
9
+ it { must validate_length_of(:numero_documento).is_at_most(12).with_message(:custom_length_maximum) }
10
+
11
+ context '#conta.carteira' do
12
+ it { subject.valid_carteira_inclusion.must_equal ['101','102','121'] }
13
+ it "validação da carteira da conta" do
14
+ subject.conta.carteira = '4'
15
+ conta_must_be_msg_error(:carteira, :custom_inclusion, {list: '101, 102, 121'})
16
+ subject.conta.carteira = '102'
17
+ conta_wont_be_msg_error(:carteira, :custom_inclusion, {list: '101, 102, 121'})
18
+ end
19
+ end
20
+
21
+ describe '#conta.convenio / codigo_cedente' do
22
+ it { subject.valid_convenio_maximum.must_equal 7 }
23
+ it { subject.valid_convenio_required.must_equal true }
24
+
25
+ it "validação obrigatoriedade do codigo_cedente da conta" do
26
+ subject.conta.codigo_cedente = ''
27
+ conta_must_be_msg_error(:convenio, :blank)
28
+ subject.conta.codigo_cedente = '123456'
29
+ conta_wont_be_msg_error(:convenio, :blank)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def conta_must_be_msg_error(attr_validation, msg_key, options_msg={})
36
+ must_be_message_error(:base, "#{BrBoleto::Conta::Santander.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
37
+ end
38
+ def conta_wont_be_msg_error(attr_validation, msg_key, options_msg={})
39
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Santander.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
40
+ end
41
+ end
42
+
43
+ describe "#default_values" do
44
+ it "local_pagamento deve ter o valor padrão conforme a documentação" do
45
+ BrBoleto::Boleto::Santander.new.local_pagamento.must_equal 'PAGÁVEL PREFERENCIALMENTE NAS AGÊNCIAS DO BANCO SANTANDER'
46
+ end
47
+ end
48
+
49
+ describe "#digito_verificador_nosso_numero" do
50
+ it "deve calcular pelo Modulo11FatorDe2a9RestoZero" do
51
+ subject.numero_documento = 111
52
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with("000000000111").returns("meu_resultado")
53
+ subject.digito_verificador_nosso_numero.must_equal "meu_resultado"
54
+ end
55
+ end
56
+
57
+ describe "#nosso_numero" do
58
+ subject { FactoryGirl.build(:boleto_santander, numero_documento: '68315') }
59
+
60
+ it "deve retornar o numero do documento com o digito_verificador_nosso_numero" do
61
+ subject.stubs(:digito_verificador_nosso_numero).returns('9')
62
+ subject.numero_documento = '3646'
63
+ subject.nosso_numero.must_equal "000000003646-9"
64
+ end
65
+ end
66
+
67
+ describe "#codigo_de_barras_do_banco" do
68
+ subject do
69
+ FactoryGirl.build(:boleto_santander, conta: {
70
+ carteira: '121',
71
+ agencia: '78',
72
+ convenio: '668',
73
+ },
74
+ numero_documento: '3646'
75
+ )
76
+ end
77
+ it "deve montar o codigo corretamente com as informações" do
78
+ subject.stubs(:nosso_numero).returns('000000003646-3')
79
+
80
+ result = subject.codigo_de_barras_do_banco
81
+ result.size.must_equal 25
82
+
83
+ result[0].must_equal '9'
84
+ result[1..7].must_equal '0000668' # Convênio
85
+ result[8..20].must_equal '0000000036463' # Numero documento
86
+ result[21].must_equal '0' # IOF
87
+ result[22..24].must_equal '121' # Carteira
88
+
89
+ subject.codigo_de_barras_do_banco.must_equal '9000066800000000364630121'
90
+ end
91
+ end
92
+
93
+ describe "#codigo_de_barras" do
94
+ subject do
95
+ FactoryGirl.build(:boleto_santander) do |santander|
96
+ santander.conta.agencia = 3069
97
+ santander.conta.codigo_cedente = 828_19 # Para o santander é o código do cliente
98
+ santander.conta.codigo_cedente_dv = '0' # Para o santander é o código do cliente
99
+ santander.conta.carteira = '121'
100
+ santander.numero_documento = 100_10
101
+ santander.valor_documento = 93015.78
102
+ santander.data_vencimento = Date.parse('2020-02-17')
103
+ end
104
+ end
105
+
106
+ it { subject.codigo_de_barras.must_equal '03394816800093015789008281900000001001020121' }
107
+ it { subject.linha_digitavel.must_equal '03399.00821 81900.000001 10010.201217 4 81680009301578' }
108
+
109
+ it "codigo de barras de um boleto de exemplo" do
110
+ subject.conta.agencia = 3069
111
+ subject.conta.codigo_cedente = 82819 # Para o santander é o código do cliente
112
+ subject.conta.codigo_cedente_dv = 0 # Para o santander é o código do cliente
113
+ subject.conta.carteira = '121'
114
+ subject.numero_documento = 15_679
115
+ subject.valor_documento = 408.50
116
+ subject.data_vencimento = Date.parse('2016-09-01')
117
+
118
+ subject.linha_digitavel.must_equal '03399.00821 81900.000001 15679.501211 4 69040000040850'
119
+ subject.codigo_de_barras.must_equal '03394690400000408509008281900000001567950121'
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,209 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Conta::BancoBrasil do
4
+ subject { FactoryGirl.build(:conta_banco_brasil) }
5
+
6
+ it "deve herdar de Conta::Base" do
7
+ subject.class.superclass.must_equal BrBoleto::Conta::Base
8
+ end
9
+ context "valores padrões" do
10
+ it "deve setar a carteira com '18' " do
11
+ subject.class.new.carteira.must_equal '18'
12
+ end
13
+ it "deve setar a valid_agencia_length com 4 " do
14
+ subject.class.new.valid_agencia_length.must_equal 4
15
+ end
16
+ it "deve setar a valid_carteira_required com true " do
17
+ subject.class.new.valid_carteira_required.must_equal true
18
+ end
19
+ it "deve setar a valid_carteira_length com 2 " do
20
+ subject.class.new.valid_carteira_length.must_equal 2
21
+ end
22
+ it "deve setar a valid_conta_corrente_required com true " do
23
+ subject.class.new.valid_conta_corrente_required.must_equal true
24
+ end
25
+ it "deve setar a valid_conta_corrente_maximum com 8 " do
26
+ subject.class.new.valid_conta_corrente_maximum.must_equal 8
27
+ end
28
+ # it "deve setar a valid_codigo_cedente_maximum com 8 " do
29
+ # subject.class.new.valid_codigo_cedente_maximum.must_equal 8
30
+ # end
31
+ it "deve setar a variacao_carteira com '019'" do
32
+ subject.class.new.variacao_carteira.must_equal '019'
33
+ end
34
+ end
35
+ describe "Validations" do
36
+ it { must validate_presence_of(:agencia) }
37
+ it { must validate_presence_of(:razao_social) }
38
+ it { must validate_presence_of(:cpf_cnpj) }
39
+ it do
40
+ subject.agencia_dv = 21
41
+ must_be_message_error(:agencia_dv, :custom_length_is, {count: 1})
42
+ end
43
+ context 'Validações padrões da carteira' do
44
+ subject { BrBoleto::Conta::BancoBrasil.new }
45
+ it { must validate_presence_of(:carteira) }
46
+ it 'Tamanho deve ser de 2' do
47
+ subject.carteira = '132'
48
+ must_be_message_error(:carteira, :custom_length_is, {count: 2})
49
+ end
50
+ it "valores aceitos" do
51
+ subject.carteira = '04'
52
+ must_be_message_error(:carteira, :custom_inclusion, {list: '11, 12, 15, 16, 17, 18, 31, 51'})
53
+ end
54
+ end
55
+ context 'Validações padrões da conta_corrente' do
56
+ subject { BrBoleto::Conta::BancoBrasil.new }
57
+ it { must validate_presence_of(:conta_corrente) }
58
+ it 'Tamanho deve ter o tamanho maximo de 8' do
59
+ subject.conta_corrente = '123456789'
60
+ must_be_message_error(:conta_corrente, :custom_length_maximum, {count: 8})
61
+ end
62
+ end
63
+ # context 'Validações padrões da codigo_cedente' do
64
+ # subject { BrBoleto::Conta::BancoBrasil.new }
65
+ # it 'Tamanho deve ter o tamanho maximo de 8' do
66
+ # subject.codigo_cedente = '12345678'
67
+ # must_be_message_error(:convenio, :custom_length_maximum, {count: 8})
68
+ # end
69
+ # end
70
+ it 'variacao_carteira deve ter no maximo 3 digitos' do
71
+ subject.variacao_carteira = '12345'
72
+ must_be_message_error(:variacao_carteira, :custom_length_maximum, {count: 3})
73
+ subject.variacao_carteira = '123'
74
+ wont_be_message_error(:variacao_carteira, :custom_length_maximum, {count: 34})
75
+ end
76
+ end
77
+
78
+ it "codigo do banco" do
79
+ subject.codigo_banco.must_equal '001'
80
+ end
81
+ it '#codigo_banco_dv' do
82
+ subject.codigo_banco_dv.must_equal '9'
83
+ end
84
+
85
+ describe "#nome_banco" do
86
+ it "valor padrão para o nome_banco" do
87
+ subject.nome_banco.must_equal 'BANCO DO BRASIL S.A.'
88
+ end
89
+ it "deve ser possível mudar o valor do nome do banco" do
90
+ subject.nome_banco = 'MEU'
91
+ subject.nome_banco.must_equal 'MEU'
92
+ end
93
+ end
94
+
95
+ it "#versao_layout_arquivo_cnab_240" do
96
+ subject.versao_layout_arquivo_cnab_240.must_equal '083'
97
+ end
98
+ it "#versao_layout_lote_cnab_240" do
99
+ subject.versao_layout_lote_cnab_240.must_equal '042'
100
+ end
101
+
102
+ describe '#agencia_dv' do
103
+ it "deve ser personalizavel pelo usuario" do
104
+ subject.agencia_dv = 88
105
+ subject.agencia_dv.must_equal 88
106
+ end
107
+ it "se não passar valor deve calcular automatico" do
108
+ subject.agencia = '1234'
109
+ BrBoleto::Calculos::Modulo11FatorDe9a2RestoX.expects(:new).with('1234').returns(stub(to_s: 5))
110
+
111
+ subject.agencia_dv.must_equal 5
112
+ end
113
+ end
114
+
115
+ describe '#conta_corrente_dv' do
116
+ it "deve ser personalizavel pelo usuario" do
117
+ subject.conta_corrente_dv = 88
118
+ subject.conta_corrente_dv.must_equal 88
119
+ end
120
+ it "se não passar valor deve calcular automatico" do
121
+ subject.conta_corrente_dv = nil
122
+ subject.conta_corrente = '6688'
123
+ BrBoleto::Calculos::Modulo11FatorDe9a2RestoX.expects(:new).with('00006688').returns(stub(to_s: 5))
124
+
125
+ subject.conta_corrente_dv.must_equal 5
126
+ end
127
+ end
128
+
129
+ describe "agencia_codigo_cedente" do
130
+ it "deve retornar agencia e convenio formatados" do
131
+ subject.agencia = 1234
132
+ subject.agencia_dv = 5
133
+ subject.conta_corrente = '12345678'
134
+ subject.conta_corrente_dv = '9'
135
+
136
+ subject.agencia_codigo_cedente.must_equal "1234-5 / 12345678-9"
137
+ end
138
+ end
139
+
140
+ describe '#variacao_carteira' do
141
+ it "deve ajustar valor para 3 digitos" do
142
+ subject.variacao_carteira = 14
143
+ subject.variacao_carteira.must_equal '014'
144
+ end
145
+ end
146
+
147
+ describe "#get_tipo_cobranca" do
148
+ context "CÓDIGOS para o cnab 400 do Banco do Brasil" do
149
+ # it { subject.get_tipo_cobranca('11', 240).must_equal '1' } # Cobrança Simples
150
+ # it { subject.get_tipo_cobranca('12', 240).must_equal '1' } # Cobrança Simples
151
+ # it { subject.get_tipo_cobranca('15', 240).must_equal '1' } # Cobrança Simples
152
+ # it { subject.get_tipo_cobranca('16', 240).must_equal '1' } # Cobrança Simples
153
+ # it { subject.get_tipo_cobranca('18', 240).must_equal '1' } # Cobrança Simples
154
+ # it { subject.get_tipo_cobranca('31', 240).must_equal '3' } # Cobrança Caucionada
155
+ # it { subject.get_tipo_cobranca('51', 240).must_equal '4' } # Cobrança Descontada
156
+ # it { subject.get_tipo_cobranca('17', 240).must_equal '7' } # Cobrança Direta Especial
157
+ it { subject.get_tipo_cobranca('7', 400).must_equal '7' } # Cobrança Direta Especial
158
+ it { subject.get_tipo_cobranca('5', 400).must_equal '8' } # Cobrança BBVendor
159
+ end
160
+ end
161
+
162
+ describe "#get_codigo_movimento_remessa" do
163
+ context "CÓDIGOS para o cnab 400 do Banco do Brasil" do
164
+ it { subject.get_codigo_movimento_remessa('01', 400).must_equal '01' } # Registro de títulos
165
+ it { subject.get_codigo_movimento_remessa('02', 400).must_equal '02' } # Solicitação de baixa
166
+ it { subject.get_codigo_movimento_remessa('03', 400).must_equal '03' } # Pedido de débito em conta
167
+ it { subject.get_codigo_movimento_remessa('04', 400).must_equal '04' } # Concessão de abatimento
168
+ it { subject.get_codigo_movimento_remessa('05', 400).must_equal '05' } # Cancelamento de abatimento
169
+ it { subject.get_codigo_movimento_remessa('06', 400).must_equal '06' } # Alteração de vencimento de título
170
+ it { subject.get_codigo_movimento_remessa('22', 400).must_equal '07' } # Alteração do número de controle do participante
171
+ it { subject.get_codigo_movimento_remessa('21', 400).must_equal '08' } # Alteração do número do titulo dado pelo cedente
172
+ it { subject.get_codigo_movimento_remessa('09', 400).must_equal '09' } # Instrução para protestar
173
+ it { subject.get_codigo_movimento_remessa('10', 400).must_equal '10' } # Instrução para sustar protesto
174
+ it { subject.get_codigo_movimento_remessa('11', 400).must_equal '11' } # Instrução para dispensar juros
175
+ it { subject.get_codigo_movimento_remessa('24', 400).must_equal '12' } # Alteração de nome e endereço do Sacado
176
+ it { subject.get_codigo_movimento_remessa('12', 400).must_equal '16' } # Alterar Juros de Mora
177
+ it { subject.get_codigo_movimento_remessa('31', 400).must_equal '31' } # Conceder desconto
178
+ it { subject.get_codigo_movimento_remessa('32', 400).must_equal '32' } # Não conceder desconto
179
+ it { subject.get_codigo_movimento_remessa('33', 400).must_equal '33' } # Retificar dados da concessão de desconto
180
+ it { subject.get_codigo_movimento_remessa('34', 400).must_equal '34' } # Alterar data para concessão de desconto
181
+ it { subject.get_codigo_movimento_remessa('35', 400).must_equal '35' } # Cobrar multa
182
+ it { subject.get_codigo_movimento_remessa('36', 400).must_equal '36' } # Dispensar multa
183
+ it { subject.get_codigo_movimento_remessa('37', 400).must_equal '37' } # Dispensar indexador
184
+ it { subject.get_codigo_movimento_remessa('38', 400).must_equal '38' } # Dispensar prazo limite de recebimento
185
+ it { subject.get_codigo_movimento_remessa('39', 400).must_equal '39' } # Alterar prazo limite de recebimento
186
+ it { subject.get_codigo_movimento_remessa('40', 400).must_equal '40' } # Alterar carteira/modalidade
187
+ end
188
+ end
189
+
190
+ describe "#get_especie_titulo" do
191
+ context "CÓDIGOS para o cnab 400 do Banco do Brasil" do
192
+ it { subject.get_especie_titulo('01', 400).must_equal '10' } # Cheque
193
+ it { subject.get_especie_titulo('02', 400).must_equal '01' } # Duplicata Mercantil
194
+ it { subject.get_especie_titulo('04', 400).must_equal '12' } # Duplicata de Serviço
195
+ it { subject.get_especie_titulo('07', 400).must_equal '08' } # Letra de Câmbio
196
+ it { subject.get_especie_titulo('12', 400).must_equal '02' } # Nota Promissória
197
+ it { subject.get_especie_titulo('16', 400).must_equal '03' } # Nota de Seguro
198
+ it { subject.get_especie_titulo('17', 400).must_equal '05' } # Recibo
199
+ it { subject.get_especie_titulo('19', 400).must_equal '13' } # Nota de Débito
200
+ it { subject.get_especie_titulo('20', 400).must_equal '15' } # Apólice de Seguro
201
+ it { subject.get_especie_titulo('26', 400).must_equal '09' } # Warrant
202
+ it { subject.get_especie_titulo('27', 400).must_equal '26' } # Dívida Ativa de Estado
203
+ it { subject.get_especie_titulo('28', 400).must_equal '27' } # Dívida Ativa de Município
204
+ it { subject.get_especie_titulo('29', 400).must_equal '25' } # Dívida Ativa da União
205
+ it { subject.get_especie_titulo('99', 400).must_equal '99' } # Outros
206
+ end
207
+ end
208
+
209
+ end