br_boleto 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +157 -8
  5. data/br_boleto.gemspec +1 -1
  6. data/lib/br_boleto.rb +12 -1
  7. data/lib/br_boleto/association/have_conta.rb +31 -27
  8. data/lib/br_boleto/boleto/banco_brasil.rb +130 -0
  9. data/lib/br_boleto/boleto/santander.rb +77 -0
  10. data/lib/br_boleto/conta/banco_brasil.rb +156 -0
  11. data/lib/br_boleto/conta/itau.rb +8 -3
  12. data/lib/br_boleto/conta/santander.rb +208 -0
  13. data/lib/br_boleto/remessa/cnab240/banco_brasil.rb +132 -0
  14. data/lib/br_boleto/remessa/cnab240/bradesco.rb +1 -3
  15. data/lib/br_boleto/remessa/cnab240/itau.rb +0 -6
  16. data/lib/br_boleto/remessa/cnab240/santander.rb +266 -0
  17. data/lib/br_boleto/remessa/cnab400/banco_brasil.rb +264 -0
  18. data/lib/br_boleto/remessa/cnab400/bradesco.rb +1 -1
  19. data/lib/br_boleto/remessa/cnab400/santander.rb +215 -0
  20. data/lib/br_boleto/retorno/cnab240/banco_brasil.rb +10 -0
  21. data/lib/br_boleto/retorno/cnab240/base.rb +3 -2
  22. data/lib/br_boleto/retorno/cnab240/caixa.rb +3 -2
  23. data/lib/br_boleto/retorno/cnab240/itau.rb +1 -2
  24. data/lib/br_boleto/retorno/cnab240/santander.rb +38 -0
  25. data/lib/br_boleto/retorno/cnab240/sicoob.rb +3 -2
  26. data/lib/br_boleto/retorno/cnab400/banco_brasil.rb +46 -0
  27. data/lib/br_boleto/retorno/cnab400/bradesco.rb +4 -3
  28. data/lib/br_boleto/retorno/cnab400/itau.rb +2 -2
  29. data/lib/br_boleto/retorno/cnab400/santander.rb +44 -0
  30. data/lib/br_boleto/retorno/cnab400/sicoob.rb +3 -2
  31. data/lib/br_boleto/retorno/cnab400/sicredi.rb +20 -6
  32. data/lib/br_boleto/retorno/pagamento.rb +28 -7
  33. data/lib/br_boleto/version.rb +1 -1
  34. data/test/br_boleto/boleto/banco_brasil_test.rb +183 -0
  35. data/test/br_boleto/boleto/santander_test.rb +122 -0
  36. data/test/br_boleto/conta/banco_brasil_test.rb +209 -0
  37. data/test/br_boleto/conta/santantader_test.rb +222 -0
  38. data/test/br_boleto/remessa/cnab240/banco_brasil_test.rb +187 -0
  39. data/test/br_boleto/remessa/cnab240/itau_test.rb +4 -0
  40. data/test/br_boleto/remessa/cnab240/santander_test.rb +144 -0
  41. data/test/br_boleto/remessa/cnab400/banco_brasil_test.rb +285 -0
  42. data/test/br_boleto/remessa/cnab400/bradesco_test.rb +7 -0
  43. data/test/br_boleto/remessa/cnab400/santander_test.rb +174 -0
  44. data/test/br_boleto/retorno/cnab240/banco_brasil_test.rb +271 -0
  45. data/test/br_boleto/retorno/cnab240/base_test.rb +20 -10
  46. data/test/br_boleto/retorno/cnab240/bradesco_test.rb +15 -15
  47. data/test/br_boleto/retorno/cnab240/caixa_test.rb +10 -10
  48. data/test/br_boleto/retorno/cnab240/cecred_test.rb +55 -138
  49. data/test/br_boleto/retorno/cnab240/itau_test.rb +15 -15
  50. data/test/br_boleto/retorno/cnab240/santander_test.rb +282 -0
  51. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +25 -15
  52. data/test/br_boleto/retorno/cnab240/sicredi_test.rb +15 -15
  53. data/test/br_boleto/retorno/cnab240/unicred_test.rb +15 -15
  54. data/test/br_boleto/retorno/cnab400/banco_brasil_test.rb +7 -0
  55. data/test/br_boleto/retorno/cnab400/bradesco_test.rb +24 -12
  56. data/test/br_boleto/retorno/cnab400/itau_test.rb +6 -4
  57. data/test/br_boleto/retorno/cnab400/santander_test.rb +7 -0
  58. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +20 -10
  59. data/test/br_boleto/retorno/cnab400/sicredi_test.rb +97 -1
  60. data/test/br_boleto/retorno/cnab400/unicred.rb +18 -18
  61. data/test/br_boleto/retorno/pagamento_test.rb +2 -2
  62. data/test/factories/boleto/boleto_banco_brasil.rb +18 -0
  63. data/test/factories/boleto/boleto_santander.rb +18 -0
  64. data/test/factories/conta/banco_brasil.rb +16 -0
  65. data/test/factories/conta/santander.rb +15 -0
  66. data/test/factories/remessa/cnab240/banco_brasil.rb +9 -0
  67. data/test/factories/remessa/cnab240/santander.rb +9 -0
  68. data/test/factories/remessa/cnab400/banco_brasil.rb +8 -0
  69. data/test/factories/remessa/cnab400/santander.rb +8 -0
  70. data/test/fixtures/retorno/cnab240/banco_brasil.ret +74 -0
  71. data/test/fixtures/retorno/cnab240/cecred.ret +10 -0
  72. data/test/fixtures/retorno/cnab240/santander.ret +16 -0
  73. data/test/fixtures/retorno/cnab400/sicredi.ret +4 -0
  74. metadata +64 -7
@@ -0,0 +1,285 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::BancoBrasil do
4
+ subject { FactoryGirl.build(:remessa_cnab400_banco_brasil, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_banco_brasil) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do Banco do Brasil" do
10
+ BrBoleto::Remessa::Cnab400::BancoBrasil.new.conta_class.must_equal BrBoleto::Conta::BancoBrasil
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 quando o parametro for :header" do
19
+ subject.informacoes_da_conta(:header).size.must_equal 20
20
+ end
21
+ it "deve retornar com 21 caracteres quando o parametro for :detalhe" do
22
+ subject.informacoes_da_conta(:detalhe).size.must_equal 21
23
+ end
24
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
25
+ conta.agencia = 1234
26
+ conta.agencia_dv = 1
27
+ conta.conta_corrente = 89755
28
+ conta.conta_corrente_dv = 7
29
+ result = subject.informacoes_da_conta(:header)
30
+
31
+ result[0..3].must_equal '1234' # Agência
32
+ result[4].must_equal '1' # Agência DV
33
+ result[5..12].must_equal '00089755' # Conta Corrente
34
+ result[13].must_equal '7' # Conta Corrente DV
35
+ result[14..19].must_equal '000000' # Zeros
36
+ end
37
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
38
+ conta.agencia = 1234
39
+ conta.agencia_dv = 1
40
+ conta.conta_corrente = 89755
41
+ conta.conta_corrente_dv = 7
42
+ conta.convenio = 4321
43
+ result = subject.informacoes_da_conta(:detalhe)
44
+
45
+ result[0..3].must_equal '1234' # Agência
46
+ result[4].must_equal '1' # Agência DV
47
+ result[5..12].must_equal '00089755' # Conta Corrente
48
+ result[13].must_equal '7' # Conta Corrente DV
49
+ result[14..20].must_equal '0004321' # Convênio
50
+ end
51
+ end
52
+
53
+ describe '#complemento_registro' do
54
+ it "deve retornar o sequencial da remessa com 7 posições e mais zeros e brancos" do
55
+ subject.sequencial_remessa = 4758
56
+ conta.convenio = 4321
57
+
58
+ subject.complemento_registro[0..6].must_equal '0004758'
59
+ subject.complemento_registro[7..28].must_equal ''.rjust(22)
60
+ subject.complemento_registro[29..35].must_equal '0004321'
61
+ subject.complemento_registro[36..293].must_equal ''.rjust(258)
62
+
63
+ subject.complemento_registro.size.must_equal 294
64
+ end
65
+ end
66
+
67
+
68
+ describe '#detalhe_posicao_039_108' do
69
+ it "deve ter o tamanho de 70 digitos" do
70
+ subject.detalhe_posicao_039_108(pagamento).size.must_equal 70
71
+ end
72
+ it "deve conter as informações nas posições corretas" do
73
+ pagamento.nosso_numero = 12345
74
+ conta.variacao_carteira = 1
75
+ conta.carteira = 33
76
+ pagamento.assign_attributes(tipo_emissao: 2)
77
+ result = subject.detalhe_posicao_039_108(pagamento)
78
+
79
+ result[0..24].must_equal ''.rjust(25)
80
+ result[25..41].must_equal '00000000000012345' # Nosso numero
81
+ result[42..43].must_equal '00'
82
+ result[44..45].must_equal '00'
83
+ result[46..48].must_equal ''.rjust(3)
84
+ result[49].must_equal ' '
85
+ result[50..52].must_equal ''.rjust(3)
86
+ result[53..55].must_equal '001' # Variação da Carteira
87
+ result[56].must_equal '0'
88
+ result[57..62].must_equal '000000'
89
+ result[63..67].must_equal ''.rjust(5) # Tipo de cobrança
90
+ result[68..69].must_equal '33' # Carteira
91
+ end
92
+
93
+ it "deve conter as informações nas posições corretas (carteira 11 e código da carteira 3)" do
94
+ conta.carteira = 11
95
+ conta.codigo_carteira = 3
96
+ result = subject.detalhe_posicao_039_108(pagamento)
97
+
98
+ result[63..67].must_equal '02VIN' # Tipo de cobrança
99
+ result[68..69].must_equal '11' # Carteira
100
+ end
101
+ it "deve conter as informações nas posições corretas (carteira 17 e código da carteira 3)" do
102
+ conta.carteira = 17
103
+ conta.codigo_carteira = 3
104
+ result = subject.detalhe_posicao_039_108(pagamento)
105
+
106
+ result[63..67].must_equal '02VIN' # Tipo de cobrança
107
+ result[68..69].must_equal '17' # Carteira
108
+ end
109
+
110
+
111
+ it "deve conter as informações nas posições corretas (carteira 11 e código da carteira 4)" do
112
+ conta.carteira = 11
113
+ conta.codigo_carteira = 4
114
+ result = subject.detalhe_posicao_039_108(pagamento)
115
+
116
+ result[63..67].must_equal '04DSC' # Tipo de cobrança
117
+ result[68..69].must_equal '11' # Carteira
118
+ end
119
+ it "deve conter as informações nas posições corretas (carteira 17 e código da carteira 4)" do
120
+ conta.carteira = 17
121
+ conta.codigo_carteira = 4
122
+ result = subject.detalhe_posicao_039_108(pagamento)
123
+
124
+ result[63..67].must_equal '04DSC' # Tipo de cobrança
125
+ result[68..69].must_equal '17' # Carteira
126
+ end
127
+
128
+
129
+ it "deve conter as informações nas posições corretas (carteira 11 e código da carteira 7)" do
130
+ conta.carteira = 11
131
+ conta.codigo_carteira = 7
132
+ result = subject.detalhe_posicao_039_108(pagamento)
133
+
134
+ result[63..67].must_equal '08VDR' # Tipo de cobrança
135
+ result[68..69].must_equal '11' # Carteira
136
+ end
137
+ it "deve conter as informações nas posições corretas (carteira 17 e código da carteira 7)" do
138
+ conta.carteira = 17
139
+ conta.codigo_carteira = 7
140
+ result = subject.detalhe_posicao_039_108(pagamento)
141
+
142
+ result[63..67].must_equal '08VDR' # Tipo de cobrança
143
+ result[68..69].must_equal '17' # Carteira
144
+ end
145
+ end
146
+
147
+ describe '#informacoes_do_pagamento' do
148
+ it "deve ter o tamanho de 40 digitos" do
149
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
150
+ end
151
+ it "deve conter as informações nas posições corretas" do
152
+ conta.agencia = 4587
153
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
154
+ pagamento.data_vencimento = Date.parse('05/08/2029')
155
+ pagamento.valor_documento = 47.56
156
+ pagamento.especie_titulo = "12"
157
+ pagamento.aceite = true
158
+ pagamento.data_emissao = Date.parse('15/09/2017')
159
+ result = subject.informacoes_do_pagamento(pagamento, 4)
160
+ result.size.must_equal 40
161
+
162
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
163
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
164
+ result[19..21].must_equal '001' # Número Banco
165
+ result[22..26].must_equal "00000" # 000000 ou Agencia
166
+ result[27..28].must_equal "02" # Espécie do Título
167
+ result[ 29 ].must_equal "N" # dentificação (Sempre 'N')
168
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
169
+ result[36..37].must_equal '00' # Primeira instrução codificada
170
+ result[38..39].must_equal '00' # Segunda instrução
171
+ end
172
+ end
173
+
174
+ describe '#detalhe_multas_e_juros_do_pagamento' do
175
+ it "deve ter o tamanho de 58 digitos" do
176
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
177
+ end
178
+ it "deve conter as informações nas posições corretas" do
179
+ pagamento.valor_mora = '0.39'
180
+ pagamento.valor_iof = '2.7'
181
+ pagamento.data_desconto = Date.parse('21/03/2018')
182
+ pagamento.valor_desconto = 4.3
183
+ pagamento.valor_abatimento = 56.47
184
+
185
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
186
+ result.size.must_equal 58
187
+
188
+ result[00..12].must_equal '0000000000039'
189
+ result[13..18].must_equal "210318"
190
+ result[19..31].must_equal '0000000000430'
191
+ result[32..44].must_equal '0000000000270'
192
+ result[45..57].must_equal '0000000005647'
193
+ end
194
+ end
195
+
196
+ describe '#informacoes_do_sacado' do
197
+ it "deve ter o tamanho de 176 digitos" do
198
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
199
+ end
200
+ it "deve conter as informações nas posições corretas (Sacador/Avalista com CNPJ)" do
201
+ # pagador.tipo_cpf_cnpj = '1'
202
+ pagador.cpf_cnpj = '12345678901'
203
+ pagador.nome = 'nome pagador'
204
+ pagador.endereco = 'rua do pagador'
205
+ pagador.bairro = 'bairro do pagador'
206
+ pagador.cidade = 'Chapecó'
207
+ pagador.uf = 'SC'
208
+ pagador.cep = '89885-001'
209
+ pagador.nome_avalista = 'Avalista'
210
+ # pagador.documento_avalista = '840.106.990-43'
211
+ pagador.documento_avalista = '97.448.536/0001-06'
212
+
213
+ result = subject.informacoes_do_sacado(pagamento, 2)
214
+ result.size.must_equal 176
215
+
216
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
217
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
218
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
219
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
220
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
221
+ result[108..115].must_equal '89885001' # CEP do Pagador
222
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
223
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
224
+ result[133..153].must_equal 'Avalista'.adjust_size_to(21) # Nome Sacador/Avalista
225
+ result[154].must_equal ''.adjust_size_to(1) # Complemento Registro (Branco)
226
+ result[155..158].must_equal 'CNPJ' # CNPJ
227
+ result[159..172].must_equal '97448536000106'.adjust_size_to(14) # Sacador/Avalista (CNPJ)
228
+ result[173..174].must_equal ''.adjust_size_to(2) # Quantidade de dias para Protesto (Branco)
229
+ result[175].must_equal ' ' # Complemento Registro (Branco)
230
+ end
231
+
232
+ it "deve conter as informações nas posições corretas (Sacador/Avalista com CPF)" do
233
+ pagador.cpf_cnpj = '12345678901'
234
+ pagador.nome = 'nome pagador'
235
+ pagador.endereco = 'rua do pagador'
236
+ pagador.bairro = 'bairro do pagador'
237
+ pagador.cidade = 'Chapecó'
238
+ pagador.uf = 'SC'
239
+ pagador.cep = '89885-001'
240
+ pagador.nome_avalista = 'Novo Avalista'
241
+ pagador.documento_avalista = '840.106.990-43'
242
+ result = subject.informacoes_do_sacado(pagamento, 2)
243
+
244
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
245
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
246
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
247
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
248
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
249
+ result[108..115].must_equal '89885001' # CEP do Pagador
250
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
251
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
252
+ result[133..157].must_equal 'Novo Avalista'.adjust_size_to(25) # Nome Sacador/Avalista
253
+ result[158].must_equal ''.adjust_size_to(1) # Complemento Registro (Branco)
254
+ result[159..161].must_equal 'CPF' # CPF
255
+ result[162..172].must_equal '84010699043'.adjust_size_to(11) # Sacador/Avalista (CNPJ)
256
+ result[173..174].must_equal ''.adjust_size_to(2) # Quantidade de dias para Protesto (Branco)
257
+ result[175].must_equal ' ' # Complemento Registro (Branco)
258
+ end
259
+
260
+ it "deve conter as informações nas posições corretas (Sacador/Avalista em branco)" do
261
+ pagador.cpf_cnpj = '12345678901'
262
+ pagador.nome = 'nome pagador'
263
+ pagador.endereco = 'rua do pagador'
264
+ pagador.bairro = 'bairro do pagador'
265
+ pagador.cidade = 'Chapecó'
266
+ pagador.uf = 'SC'
267
+ pagador.cep = '89885-001'
268
+ pagador.nome_avalista = ''
269
+ pagador.documento_avalista = ''
270
+ result = subject.informacoes_do_sacado(pagamento, 2)
271
+
272
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
273
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
274
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
275
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
276
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
277
+ result[108..115].must_equal '89885001' # CEP do Pagador
278
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
279
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
280
+ result[133..172].must_equal ''.adjust_size_to(40) # Observações/Mensagem
281
+ result[173..174].must_equal ''.adjust_size_to(2) # Quantidade de dias para Protesto (Branco)
282
+ result[175].must_equal ' ' # Complemento Registro (Branco)
283
+ end
284
+ end
285
+ end
@@ -57,6 +57,13 @@ describe BrBoleto::Remessa::Cnab400::Bradesco do
57
57
  end
58
58
  end
59
59
 
60
+ it '#detalhe_posicao_002_003 - deve retornar brancos' do
61
+ subject.detalhe_posicao_002_003(pagamento).must_equal (' ' * 2)
62
+ end
63
+
64
+ it '#detalhe_posicao_004_017 - deve retornar brancos' do
65
+ subject.detalhe_posicao_004_017.must_equal (' ' * 14)
66
+ end
60
67
 
61
68
  describe '#detalhe_posicao_063_108' do
62
69
  it "deve ter o tamanho de 46 digitos" do
@@ -0,0 +1,174 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Santander do
4
+ subject { FactoryGirl.build(:remessa_cnab400_santander, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_santander) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do santander" do
10
+ BrBoleto::Remessa::Cnab400::Santander.new.conta_class.must_equal BrBoleto::Conta::Santander
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(:header).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
22
+ conta.codigo_transmissao = 1234
23
+ result = subject.informacoes_da_conta(:header)
24
+ result.must_equal '00000000000000001234' # codigo_transmissao
25
+ end
26
+
27
+ it "deve retornar com 20 caracteres" do
28
+ subject.informacoes_da_conta(:detalhe).size.must_equal 20
29
+ end
30
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
31
+ conta.codigo_transmissao = 1234
32
+ result = subject.informacoes_da_conta(:detalhe)
33
+ result.must_equal '00000000000000001234' # codigo_transmissao
34
+ end
35
+ end
36
+
37
+ describe '#complemento_registro' do
38
+ it "deve retornar as informações corretas do complemento_registro" do
39
+ subject.complemento_registro[0..15].must_equal ''.rjust(16, '0')
40
+ subject.complemento_registro[16..290].must_equal ''.rjust(275)
41
+ subject.complemento_registro[291..293].must_equal ''.rjust(3, '0')
42
+ subject.complemento_registro.size.must_equal 294
43
+ end
44
+ end
45
+
46
+
47
+ describe '#detalhe_posicao_063_108' do
48
+ it "deve ter o tamanho de 46 digitos" do
49
+ subject.detalhe_posicao_063_108(pagamento).size.must_equal 46
50
+ end
51
+ it "deve conter as informações nas posições corretas" do
52
+ conta.carteira = 123
53
+ conta.codigo_carteira = 1
54
+ pagamento.assign_attributes(tipo_emissao: 2)
55
+ pagamento.assign_attributes(nosso_numero: 763)
56
+
57
+ result = subject.detalhe_posicao_063_108(pagamento)
58
+
59
+ result[0..7].must_equal '00000763' # Numero documento
60
+ result[8..13].must_equal ('0' * 6) # Zeros
61
+ result[14..14].must_equal ' ' # Branco
62
+ result[15..15].must_equal '0' # Codigo Multa
63
+ result[16..19].must_equal '0000' # Percentual Multa
64
+ result[20..21].must_equal '00' # Zeros
65
+ result[22..34].must_equal ('0' * 13) # Zeros
66
+ result[35..38].must_equal (' ' * 4) # Brancos
67
+ result[39..44].must_equal ('0' * 6) # Data Multa
68
+ result[45].must_equal '1' # Cod. Carteira
69
+
70
+ result.size.must_equal 46
71
+ end
72
+ end
73
+
74
+ describe '#informacoes_do_pagamento' do
75
+ it "deve ter o tamanho de 40 digitos" do
76
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
77
+ end
78
+ it "deve conter as informações nas posições corretas" do
79
+ conta.agencia = 4587
80
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
81
+ pagamento.data_vencimento = Date.parse('05/08/2029')
82
+ pagamento.valor_documento = 47.56
83
+ pagamento.especie_titulo = "12"
84
+ pagamento.aceite = true
85
+ pagamento.data_emissao = Date.parse('15/09/2017')
86
+ result = subject.informacoes_do_pagamento(pagamento, 4)
87
+ result.size.must_equal 40
88
+
89
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
90
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
91
+ result[19..21].must_equal '033' # Número Banco
92
+ result[22..26].must_equal "00000" # 000000 ou Agencia
93
+ result[27..28].must_equal "02" # Espécie do Título
94
+ result[ 29 ].must_equal "N" # dentificação (Sempre 'N')
95
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
96
+ result[36..37].must_equal '00' # Primeira instrução codificada
97
+ result[38..39].must_equal '00' # Segunda instrução
98
+ end
99
+ end
100
+
101
+ describe '#detalhe_multas_e_juros_do_pagamento' do
102
+ it "deve ter o tamanho de 58 digitos" do
103
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
104
+ end
105
+ it "deve conter as informações nas posições corretas" do
106
+ pagamento.valor_mora = '0.39'
107
+ pagamento.valor_iof = '2.7'
108
+ pagamento.data_desconto = Date.parse('21/03/2018')
109
+ pagamento.valor_desconto = 4.3
110
+ pagamento.valor_abatimento = 56.47
111
+
112
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
113
+ result.size.must_equal 58
114
+
115
+ result[00..12].must_equal '0000000000039'
116
+ result[13..18].must_equal "210318"
117
+ result[19..31].must_equal '0000000000430'
118
+ result[32..44].must_equal '0000000000270'
119
+ result[45..57].must_equal '0000000005647'
120
+ end
121
+ end
122
+
123
+ describe '#informacoes_do_sacado' do
124
+ it "deve ter o tamanho de 176 digitos" do
125
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
126
+ end
127
+ it "deve conter as informações nas posições corretas" do
128
+ # pagador.tipo_cpf_cnpj = '1'
129
+ pagador.cpf_cnpj = '12345678901'
130
+ pagador.nome = 'nome pagador'
131
+ pagador.endereco = 'rua do pagador'
132
+ pagador.bairro = 'bairro do pagador'
133
+ pagador.cidade = 'Chapecó'
134
+ pagador.uf = 'SC'
135
+ pagador.cep = '89885-001'
136
+ pagador.nome_avalista = 'Avalista'
137
+ pagador.documento_avalista = '840.106.990-43'
138
+ conta.conta_corrente = 123456789
139
+ conta.conta_corrente_dv = 0
140
+
141
+ result = subject.informacoes_do_sacado(pagamento, 2)
142
+ result.size.must_equal 176
143
+
144
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
145
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
146
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
147
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
148
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
149
+ result[108..115].must_equal '89885001' # CEP do Pagador
150
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
151
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
152
+ result[133..162].must_equal 'Avalista'.adjust_size_to(30) # Nome Sacador/Avalista
153
+
154
+ result[163..163].must_equal ' ' # Complemento Registro (Brancos)
155
+ result[164..164].must_equal 'I' # Identificador do Complemento (I)
156
+ result[165..166].must_equal '90' # Complemento remessa
157
+ result[167..172].must_equal (' ' * 6) # Brancos
158
+ result[173..174].must_equal '00' # Quantidade de dias (Zeros)
159
+ result[175].must_equal ' ' # Complemento Registro (Branco)
160
+ end
161
+ end
162
+
163
+ describe "#trailer_arquivo_posicao_002_a_394" do
164
+ it "deve conter as informações nas posições corretas" do
165
+ result = subject.trailer_arquivo_posicao_002_a_394(2)
166
+
167
+ result[00..05].must_equal "000002" # Quantidade total de linhas no arquivo
168
+ result[06..18].must_equal '0000000010012' # Valor total dos títulos
169
+ result[19..392].must_equal ('0' * 374) # Zeros
170
+
171
+ result.size.must_equal 393
172
+ end
173
+ end
174
+ end