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