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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +157 -8
- data/br_boleto.gemspec +1 -1
- data/lib/br_boleto.rb +12 -1
- data/lib/br_boleto/association/have_conta.rb +31 -27
- data/lib/br_boleto/boleto/banco_brasil.rb +130 -0
- data/lib/br_boleto/boleto/santander.rb +77 -0
- data/lib/br_boleto/conta/banco_brasil.rb +156 -0
- data/lib/br_boleto/conta/itau.rb +8 -3
- data/lib/br_boleto/conta/santander.rb +208 -0
- data/lib/br_boleto/remessa/cnab240/banco_brasil.rb +132 -0
- data/lib/br_boleto/remessa/cnab240/bradesco.rb +1 -3
- data/lib/br_boleto/remessa/cnab240/itau.rb +0 -6
- data/lib/br_boleto/remessa/cnab240/santander.rb +266 -0
- data/lib/br_boleto/remessa/cnab400/banco_brasil.rb +264 -0
- data/lib/br_boleto/remessa/cnab400/bradesco.rb +1 -1
- data/lib/br_boleto/remessa/cnab400/santander.rb +215 -0
- data/lib/br_boleto/retorno/cnab240/banco_brasil.rb +10 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +3 -2
- data/lib/br_boleto/retorno/cnab240/caixa.rb +3 -2
- data/lib/br_boleto/retorno/cnab240/itau.rb +1 -2
- data/lib/br_boleto/retorno/cnab240/santander.rb +38 -0
- data/lib/br_boleto/retorno/cnab240/sicoob.rb +3 -2
- data/lib/br_boleto/retorno/cnab400/banco_brasil.rb +46 -0
- data/lib/br_boleto/retorno/cnab400/bradesco.rb +4 -3
- data/lib/br_boleto/retorno/cnab400/itau.rb +2 -2
- data/lib/br_boleto/retorno/cnab400/santander.rb +44 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +3 -2
- data/lib/br_boleto/retorno/cnab400/sicredi.rb +20 -6
- data/lib/br_boleto/retorno/pagamento.rb +28 -7
- data/lib/br_boleto/version.rb +1 -1
- data/test/br_boleto/boleto/banco_brasil_test.rb +183 -0
- data/test/br_boleto/boleto/santander_test.rb +122 -0
- data/test/br_boleto/conta/banco_brasil_test.rb +209 -0
- data/test/br_boleto/conta/santantader_test.rb +222 -0
- data/test/br_boleto/remessa/cnab240/banco_brasil_test.rb +187 -0
- data/test/br_boleto/remessa/cnab240/itau_test.rb +4 -0
- data/test/br_boleto/remessa/cnab240/santander_test.rb +144 -0
- data/test/br_boleto/remessa/cnab400/banco_brasil_test.rb +285 -0
- data/test/br_boleto/remessa/cnab400/bradesco_test.rb +7 -0
- data/test/br_boleto/remessa/cnab400/santander_test.rb +174 -0
- data/test/br_boleto/retorno/cnab240/banco_brasil_test.rb +271 -0
- data/test/br_boleto/retorno/cnab240/base_test.rb +20 -10
- data/test/br_boleto/retorno/cnab240/bradesco_test.rb +15 -15
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +10 -10
- data/test/br_boleto/retorno/cnab240/cecred_test.rb +55 -138
- data/test/br_boleto/retorno/cnab240/itau_test.rb +15 -15
- data/test/br_boleto/retorno/cnab240/santander_test.rb +282 -0
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +25 -15
- data/test/br_boleto/retorno/cnab240/sicredi_test.rb +15 -15
- data/test/br_boleto/retorno/cnab240/unicred_test.rb +15 -15
- data/test/br_boleto/retorno/cnab400/banco_brasil_test.rb +7 -0
- data/test/br_boleto/retorno/cnab400/bradesco_test.rb +24 -12
- data/test/br_boleto/retorno/cnab400/itau_test.rb +6 -4
- data/test/br_boleto/retorno/cnab400/santander_test.rb +7 -0
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +20 -10
- data/test/br_boleto/retorno/cnab400/sicredi_test.rb +97 -1
- data/test/br_boleto/retorno/cnab400/unicred.rb +18 -18
- data/test/br_boleto/retorno/pagamento_test.rb +2 -2
- data/test/factories/boleto/boleto_banco_brasil.rb +18 -0
- data/test/factories/boleto/boleto_santander.rb +18 -0
- data/test/factories/conta/banco_brasil.rb +16 -0
- data/test/factories/conta/santander.rb +15 -0
- data/test/factories/remessa/cnab240/banco_brasil.rb +9 -0
- data/test/factories/remessa/cnab240/santander.rb +9 -0
- data/test/factories/remessa/cnab400/banco_brasil.rb +8 -0
- data/test/factories/remessa/cnab400/santander.rb +8 -0
- data/test/fixtures/retorno/cnab240/banco_brasil.ret +74 -0
- data/test/fixtures/retorno/cnab240/cecred.ret +10 -0
- data/test/fixtures/retorno/cnab240/santander.ret +16 -0
- data/test/fixtures/retorno/cnab400/sicredi.ret +4 -0
- 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
|
-
|
13
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
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 :
|
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
|
18
|
-
"#{
|
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 :
|
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
|
-
#
|
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
|
#############################################################################################
|
data/lib/br_boleto/version.rb
CHANGED
@@ -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 =
|
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
|