br_boleto 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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