br_boleto 1.2.2 → 2.0.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/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- metadata +63 -6
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
describe BrBoleto::Remessa::Cnab400::Sicoob do
|
|
4
|
+
subject { FactoryGirl.build(:remessa_cnab400_sicoob, pagamentos: pagamento, conta: conta) }
|
|
5
|
+
let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
|
|
6
|
+
let(:conta) { FactoryGirl.build(:conta_sicoob) }
|
|
7
|
+
let(:pagador) { FactoryGirl.build(:pagador) }
|
|
8
|
+
|
|
9
|
+
it "deve ter a class para a conta do sicoob" do
|
|
10
|
+
BrBoleto::Remessa::Cnab400::Sicoob.new.conta_class.must_equal BrBoleto::Conta::Sicoob
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "deve herdar de Cnab400::Base" do
|
|
14
|
+
subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#informacoes_da_conta' do
|
|
18
|
+
it "deve retornar com 20 caracteres" do
|
|
19
|
+
subject.informacoes_da_conta(:detalhe).size.must_equal 20
|
|
20
|
+
end
|
|
21
|
+
it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
|
|
22
|
+
conta.agencia = 1234
|
|
23
|
+
conta.agencia_dv = 1
|
|
24
|
+
conta.codigo_cedente = 123456
|
|
25
|
+
conta.codigo_cedente_dv = 2
|
|
26
|
+
result = subject.informacoes_da_conta(:detalhe)
|
|
27
|
+
|
|
28
|
+
result[0..3].must_equal '1234' # Agencia
|
|
29
|
+
result[4].must_equal '1' # DV Agencia
|
|
30
|
+
result[5..12].must_equal '00123456'# DV Agencia
|
|
31
|
+
result[13].must_equal '2' # DV Agencia
|
|
32
|
+
result[14..19].must_equal '000000'
|
|
33
|
+
end
|
|
34
|
+
it "deve trazer as informações em suas posições quando o parametro for :header" do
|
|
35
|
+
conta.agencia = 3321
|
|
36
|
+
conta.agencia_dv = 3
|
|
37
|
+
conta.codigo_cedente = 1234567890123
|
|
38
|
+
conta.codigo_cedente_dv = 2
|
|
39
|
+
result = subject.informacoes_da_conta(:header)
|
|
40
|
+
|
|
41
|
+
result[0..3].must_equal '3321' # Agencia
|
|
42
|
+
result[4].must_equal '3' # DV Agencia
|
|
43
|
+
result[5..12].must_equal '12345678'# DV Agencia
|
|
44
|
+
result[13].must_equal '2' # DV Agencia
|
|
45
|
+
result[14..19].must_equal ' '
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe '#complemento_registro' do
|
|
50
|
+
it "deve retornar o sequencial da remessa com 7 posições e mais 287 brancos" do
|
|
51
|
+
subject.sequencial_remessa = 4758
|
|
52
|
+
subject.complemento_registro.size.must_equal 294
|
|
53
|
+
subject.complemento_registro.must_equal '0004758'.ljust(294, ' ')
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '#dados_do_pagamento' do
|
|
58
|
+
it "deve ter o tamanho de 14 digitos" do
|
|
59
|
+
subject.dados_do_pagamento(pagamento).size.must_equal 14
|
|
60
|
+
end
|
|
61
|
+
it "deve retornar os nosso numero e a parcela" do
|
|
62
|
+
pagamento.assign_attributes(nosso_numero: 4578, parcela: 3)
|
|
63
|
+
result = subject.dados_do_pagamento(pagamento)
|
|
64
|
+
result[0..11].must_equal '000000004578'
|
|
65
|
+
result[12..13].must_equal '03'
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe '#detalhe_posicao_077_108' do
|
|
70
|
+
it "deve ter o tamanho de 32 digitos" do
|
|
71
|
+
subject.detalhe_posicao_077_108(pagamento, 4).size.must_equal 32
|
|
72
|
+
end
|
|
73
|
+
it "deve conter as informações nas posições corretas" do
|
|
74
|
+
pagamento.assign_attributes(tipo_emissao: 2)
|
|
75
|
+
subject.conta.modalidade = '0333333'
|
|
76
|
+
result = subject.detalhe_posicao_077_108(pagamento, 4)
|
|
77
|
+
result[0..1].must_equal '00' # 077 078 002 9(02) Grupo de V
|
|
78
|
+
result[2..4].must_equal ''.rjust(3, ' ') # 079 081 003 X(03) Complement
|
|
79
|
+
result[5].must_equal ' ' # 082 082 001 X(01) "Indicativ
|
|
80
|
+
result[6..8].must_equal ''.rjust(3, ' ') # 083 085 003 X(03) Prefixo do
|
|
81
|
+
result[9..11].must_equal '000' # 086 088 003 9(03) Variação d
|
|
82
|
+
result[12].must_equal '0' # 089 089 001 9(01) Conta Cauç
|
|
83
|
+
result[13..17].must_equal ''.rjust(5, '0') # 090 094 005 9(05) "Número do
|
|
84
|
+
result[18].must_equal '0' # 095 095 001 X(01) "DV do con
|
|
85
|
+
result[19..24].must_equal ''.rjust(6, '0') # 096 101 006 9(06) Numero do
|
|
86
|
+
result[25..28].must_equal ''.rjust(4, ' ') # 102 105 004 X(04) Complement
|
|
87
|
+
result[29].must_equal "2" # tipo_emissao
|
|
88
|
+
result[30..31].must_equal '03' #modalidade
|
|
89
|
+
result.size.must_equal 32
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe '#informacoes_do_pagamento' do
|
|
94
|
+
it "deve ter o tamanho de 40 digitos" do
|
|
95
|
+
subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
|
|
96
|
+
end
|
|
97
|
+
it "deve conter as informações nas posições corretas" do
|
|
98
|
+
conta.agencia = 4587
|
|
99
|
+
conta.agencia_dv = 45 # Vai retornar apenas o 4
|
|
100
|
+
pagamento.data_vencimento = Date.parse('05/08/2029')
|
|
101
|
+
pagamento.valor_documento = 47.56
|
|
102
|
+
pagamento.especie_titulo = 12
|
|
103
|
+
pagamento.aceite = true
|
|
104
|
+
pagamento.data_emissao = Date.parse('15/09/2017')
|
|
105
|
+
result = subject.informacoes_do_pagamento(pagamento, 4)
|
|
106
|
+
result.size.must_equal 40
|
|
107
|
+
|
|
108
|
+
result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
|
|
109
|
+
result[06..18].must_equal '0000000004756' # Valor do Titulo
|
|
110
|
+
result[19..21].must_equal '756' # Número Banco: "756"
|
|
111
|
+
result[22..25].must_equal "4587" # Prefixo da Cooperativa: vide e-mail enviado com os dados do processo de homologação
|
|
112
|
+
result[ 26 ].must_equal "4" # Dígito Verificador do Prefixo: vide e-mail enviado com os dados do processo de homologação
|
|
113
|
+
result[27..28].must_equal "12" # Espécie do Título
|
|
114
|
+
result[ 29 ].must_equal "1" # "Aceite do Título: "0" = Sem aceite "1" = Com aceite"
|
|
115
|
+
result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
|
|
116
|
+
result[36..37].must_equal '00' # Primeira instrução codificada:
|
|
117
|
+
result[38..39].must_equal '00' # Segunda instrução: vide SEQ 33
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe '#detalhe_multas_e_juros_do_pagamento' do
|
|
122
|
+
it "deve ter o tamanho de 58 digitos" do
|
|
123
|
+
subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
|
|
124
|
+
end
|
|
125
|
+
it "deve conter as informações nas posições corretas" do
|
|
126
|
+
pagamento.expects(:percentual_juros_formatado).with(6).returns('025000')
|
|
127
|
+
pagamento.expects(:percentual_multa_formatado).with(6).returns('045000')
|
|
128
|
+
pagamento.tipo_emissao = '2'
|
|
129
|
+
pagamento.data_desconto = Date.parse('21/03/2018')
|
|
130
|
+
pagamento.valor_desconto = 4.3
|
|
131
|
+
pagamento.codigo_moeda = 9
|
|
132
|
+
pagamento.valor_abatimento = 56.47
|
|
133
|
+
|
|
134
|
+
result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
|
|
135
|
+
result.size.must_equal 58
|
|
136
|
+
|
|
137
|
+
result[00..05].must_equal '025000'
|
|
138
|
+
result[06..11].must_equal '045000'
|
|
139
|
+
result[ 12 ].must_equal "2"
|
|
140
|
+
result[13..18].must_equal "210318"
|
|
141
|
+
result[19..31].must_equal '0000000000430'
|
|
142
|
+
result[ 32 ].must_equal "9"
|
|
143
|
+
result[33..44].must_equal ''.ljust(12 ,'0')
|
|
144
|
+
result[45..57].must_equal '0000000005647'
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe '#informacoes_do_sacado' do
|
|
149
|
+
it "deve ter o tamanho de 176 digitos" do
|
|
150
|
+
subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
|
|
151
|
+
end
|
|
152
|
+
it "deve conter as informações nas posições corretas" do
|
|
153
|
+
# pagador.tipo_cpf_cnpj = '1'
|
|
154
|
+
pagador.cpf_cnpj = '12345678901'
|
|
155
|
+
pagador.nome = 'nome pagador'
|
|
156
|
+
pagador.endereco = 'rua'
|
|
157
|
+
pagador.bairro = 'bairro'
|
|
158
|
+
pagador.cep = '89885-001'
|
|
159
|
+
pagador.cidade = 'São Carlos'
|
|
160
|
+
pagador.uf = 'SC'
|
|
161
|
+
pagador.nome_avalista = 'Avalista'
|
|
162
|
+
|
|
163
|
+
result = subject.informacoes_do_sacado(pagamento, 2)
|
|
164
|
+
result.size.must_equal 176
|
|
165
|
+
|
|
166
|
+
result[00..01].must_equal "01" # "Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
|
|
167
|
+
result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
|
|
168
|
+
result[16..55].must_equal 'nome pagador'.ljust(40, ' ') # Nome do Pagador
|
|
169
|
+
result[56..92].must_equal 'rua'.ljust(37, ' ') # Endereço do Pagador
|
|
170
|
+
result[93..107].must_equal 'bairro'.ljust(15, ' ') # Bairro do Pagador
|
|
171
|
+
result[108..115].must_equal '89885001' # CEP do Pagador
|
|
172
|
+
result[116..130].must_equal 'São Carlos'.ljust(15, ' ') # Cidade do Pagador
|
|
173
|
+
result[131..132].must_equal 'SC' # UF do Pagador
|
|
174
|
+
result[133..172].must_equal 'Avalista'.ljust(40, ' ') # Observações/Mensagem ou Sacador/Avalista
|
|
175
|
+
result[173..174].must_equal "00" # "Número de Dias Para Protesto: Quantidade dias para envio protesto. Se = "0", utilizar dias protesto padrão do cliente cadastrado na cooperativa
|
|
176
|
+
result[ 175 ].must_equal " " # Complemento do Registro: Brancos
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -4,46 +4,7 @@ describe BrBoleto::Remessa::Lote do
|
|
|
4
4
|
subject { FactoryGirl.build(:remessa_lote) }
|
|
5
5
|
let(:pagamento) { FactoryGirl.build(:remessa_pagamento) }
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
wont allow_value([]).for(:pagamentos).with_message("não pode estar vazio.")
|
|
10
|
-
end
|
|
11
|
-
it "deve ser um objeto pagamento" do
|
|
12
|
-
wont allow_value([subject.class.new()]).for(:pagamentos).with_message("cada item deve ser um objeto Pagamento.")
|
|
13
|
-
end
|
|
14
|
-
it "deve ser válido com um pagamento válido" do
|
|
15
|
-
must allow_value([pagamento]).for(:pagamentos)
|
|
16
|
-
end
|
|
17
|
-
it "não deve ser válidose houver algum pagamento inválido" do
|
|
18
|
-
wont allow_value([FactoryGirl.build(:remessa_pagamento, cep_sacado: nil)]).for(:pagamentos)
|
|
19
|
-
end
|
|
20
|
-
it "deve ser válido se passar apenas um pagamento sem Array" do
|
|
21
|
-
must allow_value(pagamento).for(:pagamentos)
|
|
22
|
-
end
|
|
23
|
-
it "se setar apenas 1 pagamento sem array deve retornar um array de 1 posicao" do
|
|
24
|
-
subject.pagamentos = pagamento
|
|
25
|
-
subject.pagamentos.size.must_equal 1
|
|
26
|
-
subject.pagamentos.is_a?(Array).must_equal true
|
|
27
|
-
subject.pagamentos[0].must_equal pagamento
|
|
28
|
-
end
|
|
29
|
-
it "posso setar mais que 1 pagamento" do
|
|
30
|
-
pagamento2 = FactoryGirl.build(:remessa_pagamento)
|
|
31
|
-
subject.pagamentos = [pagamento, pagamento2]
|
|
32
|
-
subject.pagamentos.size.must_equal 2
|
|
33
|
-
subject.pagamentos.is_a?(Array).must_equal true
|
|
34
|
-
subject.pagamentos[0].must_equal pagamento
|
|
35
|
-
subject.pagamentos[1].must_equal pagamento2
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "posso incrementar os pagamentos com <<" do
|
|
39
|
-
pagamento2 = FactoryGirl.build(:remessa_pagamento, valor_documento: 0.50)
|
|
40
|
-
subject.pagamentos = pagamento
|
|
41
|
-
subject.pagamentos.size.must_equal 1
|
|
42
|
-
subject.pagamentos << pagamento2
|
|
43
|
-
subject.pagamentos.size.must_equal 2
|
|
44
|
-
subject.pagamentos.is_a?(Array).must_equal true
|
|
45
|
-
subject.pagamentos[0].must_equal pagamento
|
|
46
|
-
subject.pagamentos[1].must_equal pagamento2
|
|
47
|
-
end
|
|
7
|
+
it "deve ter incluso o module HavePagamentos" do
|
|
8
|
+
subject.class.included_modules.must_include BrBoleto::HavePagamentos
|
|
48
9
|
end
|
|
49
10
|
end
|
|
@@ -2,141 +2,169 @@
|
|
|
2
2
|
require 'test_helper'
|
|
3
3
|
|
|
4
4
|
describe BrBoleto::Remessa::Pagamento do
|
|
5
|
-
|
|
6
|
-
class Shoulda::Matchers::ActiveModel::ValidateLengthOfMatcher
|
|
7
|
-
# Sobrescrevo o método que gera a string para validar o tamanho
|
|
8
|
-
# Pois o CEP só aceita números
|
|
9
|
-
def string_of_length(length)
|
|
10
|
-
'8' * length
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
5
|
subject { FactoryGirl.build(:remessa_pagamento) }
|
|
6
|
+
|
|
7
|
+
it "deve conter o mdule HavePagador" do
|
|
8
|
+
subject.class.included_modules.must_include BrBoleto::HavePagador
|
|
9
|
+
end
|
|
15
10
|
|
|
16
11
|
|
|
17
12
|
describe "validations" do
|
|
18
13
|
it { must validate_presence_of(:nosso_numero) }
|
|
19
14
|
it { must validate_presence_of(:data_vencimento) }
|
|
20
15
|
it { must validate_presence_of(:valor_documento) }
|
|
21
|
-
it { must validate_presence_of(:documento_sacado) }
|
|
22
|
-
it { must validate_presence_of(:nome_sacado) }
|
|
23
|
-
it { must validate_presence_of(:endereco_sacado) }
|
|
24
|
-
it { must validate_presence_of(:cep_sacado) }
|
|
25
|
-
it { must validate_presence_of(:cidade_sacado) }
|
|
26
|
-
it { must validate_presence_of(:uf_sacado) }
|
|
27
|
-
it { must validate_presence_of(:bairro_sacado) }
|
|
28
|
-
it { must validate_presence_of(:tipo_impressao) }
|
|
29
16
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
end
|
|
17
|
+
describe '#tipo_impressao' do
|
|
18
|
+
it { wont validate_presence_of(:tipo_impressao) }
|
|
33
19
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
it "for valor_mora" do
|
|
40
|
-
object = subject.class.new()
|
|
41
|
-
object.valor_mora.must_equal 0.0
|
|
42
|
-
end
|
|
43
|
-
it "for valor_desconto" do
|
|
44
|
-
object = subject.class.new()
|
|
45
|
-
object.valor_desconto.must_equal 0.0
|
|
46
|
-
end
|
|
47
|
-
it "for valor_iof" do
|
|
48
|
-
object = subject.class.new()
|
|
49
|
-
object.valor_iof.must_equal 0.0
|
|
50
|
-
end
|
|
51
|
-
it "for valor_abatimento" do
|
|
52
|
-
object = subject.class.new()
|
|
53
|
-
object.valor_abatimento.must_equal 0.0
|
|
54
|
-
end
|
|
55
|
-
it "for nome_avalista" do
|
|
56
|
-
object = subject.class.new()
|
|
57
|
-
object.nome_avalista.must_equal ''
|
|
58
|
-
end
|
|
59
|
-
it "for cod_desconto" do
|
|
60
|
-
object = subject.class.new()
|
|
61
|
-
object.cod_desconto.must_equal '0'
|
|
62
|
-
end
|
|
63
|
-
it "for tipo_impressao" do
|
|
64
|
-
object = subject.class.new()
|
|
65
|
-
object.tipo_impressao.must_equal '1'
|
|
66
|
-
end
|
|
67
|
-
it "for desconto_2_codigo" do
|
|
68
|
-
object = subject.class.new()
|
|
69
|
-
object.desconto_2_codigo.must_equal '0'
|
|
20
|
+
it "se valid_tipo_impressao_required for true deve validar a obrigatoriedade do tipo de tipo_impressao" do
|
|
21
|
+
subject.valid_tipo_impressao_required = true
|
|
22
|
+
must validate_presence_of(:tipo_impressao)
|
|
23
|
+
end
|
|
24
|
+
|
|
70
25
|
end
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
26
|
+
|
|
27
|
+
describe '#cod_desconto' do
|
|
28
|
+
before { subject.cod_desconto = '555' }
|
|
29
|
+
|
|
30
|
+
it { wont_be_message_error(:cod_desconto) }
|
|
31
|
+
it "se valid_cod_desconto_length tiver valor validar a partir do valor setado" do
|
|
32
|
+
subject.valid_cod_desconto_length = 2
|
|
33
|
+
must_be_message_error(:cod_desconto, :custom_length_is, {count: 2})
|
|
34
|
+
end
|
|
74
35
|
end
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
36
|
+
|
|
37
|
+
describe '#emissao_boleto' do
|
|
38
|
+
before { subject.emissao_boleto = '555' }
|
|
39
|
+
|
|
40
|
+
it { wont_be_message_error(:emissao_boleto) }
|
|
41
|
+
it "se valid_emissao_boleto_length tiver valor validar a partir do valor setado" do
|
|
42
|
+
subject.valid_emissao_boleto_length = 2
|
|
43
|
+
must_be_message_error(:emissao_boleto, :custom_length_is, {count: 2})
|
|
44
|
+
end
|
|
78
45
|
end
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
46
|
+
|
|
47
|
+
describe '#distribuicao_boleto' do
|
|
48
|
+
before { subject.distribuicao_boleto = '555' }
|
|
49
|
+
|
|
50
|
+
it { wont_be_message_error(:distribuicao_boleto) }
|
|
51
|
+
it "se valid_distribuicao_boleto_length tiver valor validar a partir do valor setado" do
|
|
52
|
+
subject.valid_distribuicao_boleto_length = 2
|
|
53
|
+
must_be_message_error(:distribuicao_boleto, :custom_length_is, {count: 2})
|
|
54
|
+
end
|
|
82
55
|
end
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "#percentual_multa" do
|
|
59
|
+
it "deve retornar o percentual representativo do valor_multa para o valor_documento utilizando" do
|
|
60
|
+
subject.assign_attributes(valor_multa: 7.47, valor_documento: 78.98)
|
|
61
|
+
subject.percentual_multa.must_equal 9.458091
|
|
62
|
+
end
|
|
63
|
+
it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
|
|
64
|
+
subject.assign_attributes(valor_multa: 8.47, valor_documento: 100.00)
|
|
65
|
+
numero = BrBoleto::Helper::Number.new(50.0)
|
|
66
|
+
BrBoleto::Helper::Number.expects(:new).returns(numero)
|
|
67
|
+
numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
|
|
68
|
+
|
|
69
|
+
subject.percentual_multa.must_equal 10.47
|
|
86
70
|
end
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "#percentual_juros" do
|
|
74
|
+
it "deve retornar o percentual representativo do valor_juros para o valor_documento utilizando" do
|
|
75
|
+
subject.assign_attributes(valor_juros: 7.47, valor_documento: 78.98)
|
|
76
|
+
subject.percentual_juros.must_equal 9.458091
|
|
77
|
+
end
|
|
78
|
+
it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
|
|
79
|
+
subject.assign_attributes(valor_juros: 8.47, valor_documento: 100.00)
|
|
80
|
+
numero = BrBoleto::Helper::Number.new(50.0)
|
|
81
|
+
BrBoleto::Helper::Number.expects(:new).returns(numero)
|
|
82
|
+
numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
|
|
83
|
+
|
|
84
|
+
subject.percentual_juros.must_equal 10.47
|
|
90
85
|
end
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe '#moeda_real?' do
|
|
89
|
+
it "se a moeda for 9 então deve retornar true" do
|
|
90
|
+
subject.codigo_moeda = 9
|
|
91
|
+
subject.moeda_real?.must_equal true
|
|
94
92
|
end
|
|
95
|
-
it "for
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
it "se a moeda for diferente de 9 então deve retornar false" do
|
|
94
|
+
subject.codigo_moeda = 8
|
|
95
|
+
subject.moeda_real?.must_equal false
|
|
98
96
|
end
|
|
97
|
+
end
|
|
99
98
|
|
|
99
|
+
it "se o codigo_moeda não tiver valor setado deve assumir '9'" do
|
|
100
|
+
subject.codigo_moeda = 10
|
|
101
|
+
subject.codigo_moeda.must_equal 10
|
|
102
|
+
subject.codigo_moeda = nil
|
|
103
|
+
subject.codigo_moeda.must_equal '9'
|
|
100
104
|
end
|
|
101
105
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
subject.uf_sacado.must_equal 'OK'
|
|
108
|
-
end
|
|
109
|
-
it "nao deve sobrescrever os valores já setados com os valores padrões" do
|
|
110
|
-
subject.cod_desconto = '9'
|
|
111
|
-
subject.assign_attributes(valor_desconto: 500.88)
|
|
112
|
-
subject.cod_desconto.must_equal '9'
|
|
113
|
-
subject.valor_desconto.must_equal 500.88
|
|
114
|
-
end
|
|
106
|
+
it "se não for setado uma parcela deve assumir 1" do
|
|
107
|
+
subject.parcela = 10
|
|
108
|
+
subject.parcela.must_equal 10
|
|
109
|
+
subject.parcela = nil
|
|
110
|
+
subject.parcela.must_equal '1'
|
|
115
111
|
end
|
|
116
112
|
|
|
117
|
-
|
|
118
|
-
subject
|
|
119
|
-
|
|
120
|
-
bl.nosso_numero = "999777"
|
|
121
|
-
bl.valor_documento = 789.44
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
it { subject.nosso_numero.must_equal '999777' }
|
|
125
|
-
it { subject.valor_documento.must_equal 789.44 }
|
|
113
|
+
it "nosso_numero deve retornar apenas numeros" do
|
|
114
|
+
subject.nosso_numero = 'A1!@#$%*()-234vc.,;-56789o0'
|
|
115
|
+
subject.nosso_numero.must_equal '1234567890'
|
|
126
116
|
end
|
|
127
117
|
|
|
128
|
-
describe "
|
|
129
|
-
|
|
130
|
-
|
|
118
|
+
describe "default_values" do
|
|
119
|
+
let(:object) { subject.class.new() }
|
|
120
|
+
it "for data_emissao" do object.data_emissao.must_equal Date.today end
|
|
121
|
+
it "for valor_mora" do object.valor_mora.must_equal 0.0 end
|
|
122
|
+
it "for valor_desconto" do object.valor_desconto.must_equal 0.0 end
|
|
123
|
+
it "for valor_iof" do object.valor_iof.must_equal 0.0 end
|
|
124
|
+
it "for valor_abatimento" do object.valor_abatimento.must_equal 0.0 end
|
|
125
|
+
it "for cod_desconto" do object.cod_desconto.must_equal '0' end
|
|
126
|
+
it "for desconto_2_codigo" do object.desconto_2_codigo.must_equal '0' end
|
|
127
|
+
it "for desconto_2_valor" do object.desconto_2_valor.must_equal 0.0 end
|
|
128
|
+
it "for desconto_3_codigo" do object.desconto_3_codigo.must_equal '0' end
|
|
129
|
+
it "for desconto_3_valor" do object.desconto_3_valor.must_equal 0.0 end
|
|
130
|
+
it "for codigo_multa" do object.codigo_multa.must_equal '3' end
|
|
131
|
+
it "for codigo_juros" do object.codigo_juros.must_equal '3' end
|
|
132
|
+
it "for valor_multa" do object.valor_multa.must_equal 0.0 end
|
|
133
|
+
it "for valor_juros" do object.valor_juros.must_equal 0.0 end
|
|
134
|
+
it "for parcela" do object.parcela.must_equal '1' end
|
|
135
|
+
it "for tipo_impressao" do object.tipo_impressao.must_equal '1' end
|
|
136
|
+
it "for tipo_emissao" do object.tipo_emissao.must_equal '2' end
|
|
137
|
+
it "for identificacao_ocorrencia" do object.identificacao_ocorrencia.must_equal '01' end
|
|
138
|
+
it "for especie_titulo" do object.especie_titulo.must_equal '01' end
|
|
139
|
+
it "for codigo_moeda" do object.codigo_moeda.must_equal '9' end
|
|
140
|
+
it "for forma_cadastramento" do object.forma_cadastramento.must_equal '0' end
|
|
141
|
+
it "for emissao_boleto" do object.emissao_boleto.must_equal '2' end
|
|
142
|
+
it "for distribuicao_boleto" do object.distribuicao_boleto.must_equal '2' end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe "#data_vencimento_formatado" do
|
|
146
|
+
it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
|
|
147
|
+
subject.data_vencimento = Date.current
|
|
148
|
+
subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
|
|
149
|
+
subject.data_vencimento_formatado.must_equal '123456'
|
|
131
150
|
end
|
|
132
|
-
it "
|
|
133
|
-
subject.
|
|
151
|
+
it "deve chamar o metodo formata_data com o parametro passado" do
|
|
152
|
+
subject.data_vencimento = Date.current
|
|
153
|
+
subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
|
|
154
|
+
subject.data_vencimento_formatado("%d%m%y").must_equal '123456'
|
|
134
155
|
end
|
|
135
|
-
|
|
136
|
-
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
describe "#data_emissao_formatado" do
|
|
159
|
+
it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
|
|
160
|
+
subject.data_emissao = Date.current
|
|
161
|
+
subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
|
|
162
|
+
subject.data_emissao_formatado.must_equal '123456'
|
|
137
163
|
end
|
|
138
|
-
it "deve
|
|
139
|
-
subject.
|
|
164
|
+
it "deve chamar o metodo formata_data com o parametro passado" do
|
|
165
|
+
subject.data_emissao = Date.current
|
|
166
|
+
subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
|
|
167
|
+
subject.data_emissao_formatado("%d%m%y").must_equal '123456'
|
|
140
168
|
end
|
|
141
169
|
end
|
|
142
170
|
|
|
@@ -233,8 +261,6 @@ describe BrBoleto::Remessa::Pagamento do
|
|
|
233
261
|
end
|
|
234
262
|
end
|
|
235
263
|
|
|
236
|
-
|
|
237
|
-
|
|
238
264
|
describe "#valor_documento_formatado" do
|
|
239
265
|
context "com padrao de tamanho = 13 digitos" do
|
|
240
266
|
it "deve formatar o valor removendo separador de casas decimais e aredondando para 2 casas decimais" do
|
|
@@ -310,89 +336,61 @@ describe BrBoleto::Remessa::Pagamento do
|
|
|
310
336
|
end
|
|
311
337
|
end
|
|
312
338
|
|
|
313
|
-
describe
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
subject.
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
subject.documento_sacado = '12345678901234'
|
|
333
|
-
subject.tipo_documento_sacado.must_equal '02'
|
|
334
|
-
end
|
|
335
|
-
it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
|
|
336
|
-
subject.documento_sacado = '123456789012345'
|
|
337
|
-
subject.tipo_documento_sacado.must_equal '02'
|
|
338
|
-
end
|
|
339
|
+
describe '#percentual_multa_formatado' do
|
|
340
|
+
let(:number) { BrBoleto::Helper::Number.new(5.47) }
|
|
341
|
+
it "deve formatar o valor no formato de valores em percentual" do
|
|
342
|
+
subject.stubs(:percentual_multa).returns(72.50)
|
|
343
|
+
number
|
|
344
|
+
BrBoleto::Helper::Number.expects(:new).with(72.50).returns(number)
|
|
345
|
+
number.expects(:formata_valor_percentual).with(6).returns('123')
|
|
346
|
+
subject.percentual_multa_formatado.must_equal '123000'
|
|
347
|
+
end
|
|
348
|
+
it "deve considerar o tamanho pelo parametro para formatar o valor" do
|
|
349
|
+
subject.stubs(:percentual_multa).returns(4.0)
|
|
350
|
+
number
|
|
351
|
+
BrBoleto::Helper::Number.expects(:new).with(4.0).returns(number)
|
|
352
|
+
number.expects(:formata_valor_percentual).with(3).returns('1234')
|
|
353
|
+
subject.percentual_multa_formatado(3).must_equal '123'
|
|
354
|
+
end
|
|
355
|
+
it "deve gerar o valor corretamente - Teste sem MOCK" do
|
|
356
|
+
subject.stubs(:percentual_multa).returns(2.87)
|
|
357
|
+
subject.percentual_multa_formatado(5).must_equal '02870'
|
|
339
358
|
end
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
359
|
+
end
|
|
360
|
+
describe '#percentual_juros_formatado' do
|
|
361
|
+
let(:number) { BrBoleto::Helper::Number.new(5.47) }
|
|
362
|
+
it "deve formatar o valor no formato de valores em percentual" do
|
|
363
|
+
subject.stubs(:percentual_juros).returns(7.50)
|
|
364
|
+
number
|
|
365
|
+
BrBoleto::Helper::Number.expects(:new).with(7.50).returns(number)
|
|
366
|
+
number.expects(:formata_valor_percentual).with(6).returns('123')
|
|
367
|
+
subject.percentual_juros_formatado.must_equal '123000'
|
|
368
|
+
end
|
|
369
|
+
it "deve considerar o tamanho pelo parametro para formatar o valor" do
|
|
370
|
+
subject.stubs(:percentual_juros).returns(9.87)
|
|
371
|
+
number
|
|
372
|
+
BrBoleto::Helper::Number.expects(:new).with(9.87).returns(number)
|
|
373
|
+
number.expects(:formata_valor_percentual).with(3).returns('1234')
|
|
374
|
+
subject.percentual_juros_formatado(3).must_equal '123'
|
|
375
|
+
end
|
|
376
|
+
it "deve gerar o valor corretamente - Teste sem MOCK" do
|
|
377
|
+
subject.stubs(:percentual_juros).returns(12.438)
|
|
378
|
+
subject.percentual_juros_formatado(7).must_equal '1243800'
|
|
353
379
|
end
|
|
354
380
|
end
|
|
355
381
|
|
|
356
|
-
describe "#
|
|
357
|
-
it "
|
|
358
|
-
subject.
|
|
359
|
-
subject.tipo_documento_avalista.must_equal '0'
|
|
360
|
-
end
|
|
361
|
-
context "com padrao de tamanho = 2" do
|
|
362
|
-
it "deve ser 02 (CNPJ) se for menor que 14 digitos e maior que 11" do
|
|
363
|
-
subject.documento_avalista = '1234567890123'
|
|
364
|
-
subject.tipo_documento_avalista.must_equal '02'
|
|
365
|
-
end
|
|
366
|
-
it "deve ser 01 (CPF) se for igual a 11" do
|
|
367
|
-
subject.documento_avalista = '12345678901'
|
|
368
|
-
subject.tipo_documento_avalista.must_equal '01'
|
|
369
|
-
end
|
|
370
|
-
it "deve ser 01 (CPF) se for menor que 11" do
|
|
371
|
-
subject.documento_avalista = '1234567890'
|
|
372
|
-
subject.tipo_documento_avalista.must_equal '01'
|
|
373
|
-
end
|
|
374
|
-
it "deve ser 02 (CNPJ/CGC) se for igual a 14 digitos" do
|
|
375
|
-
subject.documento_avalista = '12345678901234'
|
|
376
|
-
subject.tipo_documento_avalista.must_equal '02'
|
|
377
|
-
end
|
|
378
|
-
it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
|
|
379
|
-
subject.documento_avalista = '123456789012345'
|
|
380
|
-
subject.tipo_documento_avalista.must_equal '02'
|
|
381
|
-
end
|
|
382
|
+
describe "#formata_data" do
|
|
383
|
+
it "quando passar um valor nil" do
|
|
384
|
+
subject.send(:formata_data, nil).must_equal '00000000'
|
|
382
385
|
end
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
end
|
|
392
|
-
it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos e tamanho = 2" do
|
|
393
|
-
subject.documento_avalista = '123456789012345'
|
|
394
|
-
subject.tipo_documento_avalista(2).must_equal '02'
|
|
395
|
-
end
|
|
386
|
+
it "quando passar um valor nil mas passar outro formato para a data" do
|
|
387
|
+
subject.send(:formata_data, nil, "%d%m%y").must_equal '000000'
|
|
388
|
+
end
|
|
389
|
+
it "deve formatar a data com padrão ddmmyyyy" do
|
|
390
|
+
subject.send(:formata_data, Date.parse('30/12/2017')).must_equal '30122017'
|
|
391
|
+
end
|
|
392
|
+
it "deve formatar a data com formato passado por parametro" do
|
|
393
|
+
subject.send(:formata_data, Date.parse('30/12/2017'), "%d%m%y").must_equal '301217'
|
|
396
394
|
end
|
|
397
395
|
end
|
|
398
396
|
end
|