boleto_bancario 0.0.1.beta

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 (47) hide show
  1. data/.gitignore +18 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +1 -0
  4. data/Changelog.markdown +6 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +22 -0
  7. data/Planning.markdown +131 -0
  8. data/README.markdown +208 -0
  9. data/Rakefile +9 -0
  10. data/TODO.markdown +5 -0
  11. data/boleto_bancario.gemspec +25 -0
  12. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  13. data/lib/boleto_bancario/calculos/digitos.rb +35 -0
  14. data/lib/boleto_bancario/calculos/fator_vencimento.rb +87 -0
  15. data/lib/boleto_bancario/calculos/fatores_de_multiplicacao.rb +67 -0
  16. data/lib/boleto_bancario/calculos/linha_digitavel.rb +158 -0
  17. data/lib/boleto_bancario/calculos/modulo10.rb +83 -0
  18. data/lib/boleto_bancario/calculos/modulo11.rb +54 -0
  19. data/lib/boleto_bancario/calculos/modulo11_fator_de2a7.rb +97 -0
  20. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9.rb +83 -0
  21. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
  22. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +101 -0
  23. data/lib/boleto_bancario/core/banco_brasil.rb +532 -0
  24. data/lib/boleto_bancario/core/boleto.rb +525 -0
  25. data/lib/boleto_bancario/core/bradesco.rb +285 -0
  26. data/lib/boleto_bancario/core/itau.rb +455 -0
  27. data/lib/boleto_bancario/core/santander.rb +274 -0
  28. data/lib/boleto_bancario/version.rb +4 -0
  29. data/lib/boleto_bancario.rb +83 -0
  30. data/spec/boleto_bancario/calculos/digitos_spec.rb +19 -0
  31. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +59 -0
  32. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +69 -0
  33. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +57 -0
  34. data/spec/boleto_bancario/calculos/modulo10_spec.rb +49 -0
  35. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +43 -0
  36. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +39 -0
  37. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +61 -0
  38. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +37 -0
  39. data/spec/boleto_bancario/calculos/modulo11_spec.rb +19 -0
  40. data/spec/boleto_bancario/core/banco_brasil_spec.rb +383 -0
  41. data/spec/boleto_bancario/core/boleto_spec.rb +102 -0
  42. data/spec/boleto_bancario/core/bradesco_spec.rb +170 -0
  43. data/spec/boleto_bancario/core/itau_spec.rb +336 -0
  44. data/spec/boleto_bancario/core/santander_spec.rb +135 -0
  45. data/spec/shared_examples/boleto_bancario_shared_example.rb +164 -0
  46. data/spec/spec_helper.rb +14 -0
  47. metadata +221 -0
@@ -0,0 +1,455 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Core
4
+ # Implementação de emissão de boleto bancário pelo Itaú.
5
+ #
6
+ # === Documentação Implementada
7
+ #
8
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
9
+ # 'documentacoes_dos_boletos/itau' dentro dessa biblioteca.
10
+ #
11
+ # === Contrato das classes de emissão de boletos
12
+ #
13
+ # Para ver o "<b>contrato</b>" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
14
+ # a classe BoletoBancario::Core::Boleto.
15
+ #
16
+ # === Carteiras suportadas
17
+ #
18
+ # Segue abaixo as carteiras suportadas do itáu <b>seguindo a documentação</b>:
19
+ #
20
+ # _______________________________________________________________________________________________________
21
+ # | Carteira | Descrição | Testada/Homologada no banco |
22
+ # | 107 | Sem registro com emissão integral – 15 posições | Esperando Contribuição |
23
+ # | 109 | Direta eletrônica sem emissão – simples | Esperando Contribuição |
24
+ # | 174 | Sem registro emissão parcial com protesto borderô | Esperando Contribuição |
25
+ # | 175 | Sem registro sem emissão com protesto eletrônico | Esperando Contribuição |
26
+ # | 196 | Sem registro com emissão e entrega – 15 posições | Esperando Contribuição |
27
+ # | 198 | Sem registro sem emissão 15 dígitos | Esperando Contribuição |
28
+ # | 126, 131, 146 | -------------------------------------------------- | Esperando Contribuição |
29
+ # | 122, 142, 143 | -------------------------------------------------- | Esperando Contribuição |
30
+ # | 150, 168 | -------------------------------------------------- | Esperando Contribuição |
31
+ # --------------------------------------------------------------------------------------------------------
32
+ #
33
+ # <b>OBS.: Seja um contribuidor dessa gem. Contribua para homologar os boletos e as
34
+ # devidas carteiras junto ao banco Itaú.</b>
35
+ #
36
+ # === Exemplos
37
+ #
38
+ # O recomendado é criar uma subclasse de BoletoBancario::Itau
39
+ #
40
+ # class BoletoItau < BoletoBancario::Itau
41
+ # end
42
+ #
43
+ # === Criando um boleto
44
+ #
45
+ # boleto_itau = BoletoItau.new do |boleto|
46
+ # boleto.conta_corrente = '89755'
47
+ # boleto.agencia = '0097'
48
+ # boleto.carteira = '198'
49
+ # boleto.numero_documento = '12345678'
50
+ # boleto.codigo_cedente = '909014'
51
+ # end
52
+ #
53
+ # === Validações
54
+ #
55
+ # A classe Itaú possui suas próprias validações.
56
+ # Primeiramente, <b>antes de renderizar qualquer boleto você precisar verificar se esse o boleto é válido</b>:
57
+ #
58
+ # if boleto_itau.valid?
59
+ # # render boleto_itau
60
+ # else
61
+ # # ...
62
+ # end
63
+ #
64
+ # === Campos do Boleto
65
+ #
66
+ # boleto_itau.codigo_de_barras
67
+ #
68
+ # boleto_itau.linha_digitavel
69
+ #
70
+ # boleto_itau.nosso_numero
71
+ #
72
+ # boleto_itau.agencia_codigo_cedente
73
+ #
74
+ # boleto_itau.carteira_formatada # Formata a carteira, para mostrar no boleto.
75
+ #
76
+ # boleto_itau.numero_documento
77
+ #
78
+ # boleto_itau.valor_documento
79
+ #
80
+ # === Sobrescrevendo validações
81
+ #
82
+ # Se você quiser sobrescrever alguma validação dessa classe a gem de boleto bancário
83
+ # possui alguns modos de fazer isso.
84
+ #
85
+ # Caso você precise mudar as validações, você pode sobrescrever alguns métodos que possuem <b>"Magic numbers"</b>.
86
+ # Foi colocado dessa forma, já que os bancos mudam bastante esse tipo de validação.
87
+ # Por exemplo, atualmente a conta corrente é validado com <b>'5' como máximo de tamanho</b>.
88
+ # Caso você queira que valide como 6, mude conforme abaixo:
89
+ #
90
+ # class BoletoItau < BoletoBancario::Itau
91
+ # def self.tamanho_maximo_conta_corrente
92
+ # 6
93
+ # end
94
+ # end
95
+ #
96
+ # Ou você pode desativar as validações que são feitas, sobrescrevendo os métodos de validação:
97
+ #
98
+ # class BoletoItau < BoletoBancario::Itau
99
+ # def deve_validar_agencia?
100
+ # false
101
+ # end
102
+ #
103
+ # def deve_validar_conta_corrente?
104
+ # false
105
+ # end
106
+ #
107
+ # def deve_validar_codigo_cedente?
108
+ # false
109
+ # end
110
+ #
111
+ # def deve_validar_numero_documento?
112
+ # false
113
+ # end
114
+ #
115
+ # def deve_validar_carteira?
116
+ # false
117
+ # end
118
+ # end
119
+ #
120
+ # <b>Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
121
+ # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
122
+ # sobreescritos também).</b>
123
+ #
124
+ # Caso exista algum cenário de sobrescrita de validação contate o dono dessa gem pelo github e conte um
125
+ # pouco mais sobre esses cenários.
126
+ #
127
+ class Itau < Boleto
128
+ # Usado somente em carteiras especiais para complementar o número do documento.
129
+ #
130
+ attr_accessor :seu_numero
131
+
132
+ # Tamanho máximo de uma conta corrente no Banco Itaú.
133
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
134
+ #
135
+ # @return [Fixnum] 5
136
+ #
137
+ def self.tamanho_maximo_conta_corrente
138
+ 5
139
+ end
140
+
141
+ # Tamanho máximo de uma agência no Banco Itaú.
142
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
143
+ #
144
+ # @return [Fixnum] 4
145
+ #
146
+ def self.tamanho_maximo_agencia
147
+ 4
148
+ end
149
+
150
+ # Tamanho máximo do número do documento emitido no Boleto.
151
+ # O tamanho máximo é justamente 8 porque no código de barras só é permitido 8 posições para este campo.
152
+ #
153
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
154
+ #
155
+ # @return [Fixnum] 8
156
+ #
157
+ def self.tamanho_maximo_numero_documento
158
+ 8
159
+ end
160
+
161
+ # Tamanho máximo do código do cedente emitido no Boleto.
162
+ # O tamanho máximo é justamente 5 porque no código de barras só é permitido 5 posições para este campo.
163
+ #
164
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
165
+ #
166
+ # @return [Fixnum] 5
167
+ #
168
+ def self.tamanho_maximo_codigo_cedente
169
+ 5
170
+ end
171
+
172
+ # Tamanho máximo do seu número emitido no Boleto.
173
+ # O tamanho máximo é justamente 7 porque no código de barras só é permitido 7 posições para este campo.
174
+ #
175
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
176
+ #
177
+ # @return [Fixnum] 7
178
+ #
179
+ def self.tamanho_maximo_seu_numero
180
+ 7
181
+ end
182
+
183
+ # Tamanho máximo da carteira.
184
+ # O tamanho máximo é justamente 3 porque no código de barras só é permitido 3 posições para este campo.
185
+ #
186
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
187
+ #
188
+ # @return [Fixnum] 3
189
+ #
190
+ def self.tamanho_maximo_carteira
191
+ 3
192
+ end
193
+
194
+ # Campos obrigatórios
195
+ #
196
+ # * Agencia
197
+ # * Conta Corrente
198
+ # * Dígito da conta corrente
199
+ #
200
+ validates :agencia, :conta_corrente, :digito_conta_corrente, presence: true
201
+ validates :digito_conta_corrente, length: { maximum: 1 }
202
+
203
+ # Validações de tamanho para os campos abaixo:
204
+ #
205
+ # * Número do documento
206
+ # * Conta Corrente
207
+ # * Agencia
208
+ # * Carteira
209
+ #
210
+ # Se você quiser sobrescrever os tamanhos permitidos, ficará a sua responsabilidade.
211
+ # Basta você sobrescrever os métodos de validação:
212
+ #
213
+ # class BoletoItau < BoletoBancario::Core::Itau
214
+ # def self.tamanho_maximo_agencia
215
+ # 5
216
+ # end
217
+ #
218
+ # def self.tamanho_maximo_conta_corrente
219
+ # 6
220
+ # end
221
+ #
222
+ # def self.tamanho_maximo_numero_documento
223
+ # 9
224
+ # end
225
+ # end
226
+ #
227
+ # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
228
+ # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
229
+ # sobreescritos também).
230
+ #
231
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
232
+ validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
233
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
234
+ validates :carteira, length: { maximum: tamanho_maximo_carteira }, if: :deve_validar_carteira?
235
+
236
+ # Campos obrigatórios e validações de tamanho para os campos:
237
+ #
238
+ # * Código do cedente
239
+ # * Seu número
240
+ #
241
+ # <b>Obs.: Essas validações só ocorrerão se a carteira do boleto for especial.</b>
242
+ # Para mais detalhes veja o método carteiras especiais dessa classe.
243
+ #
244
+ validates :codigo_cedente, :seu_numero, presence: true, :if => :carteira_especial?
245
+ validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, :if => :deve_validar_codigo_cedente_carteira_especial?
246
+ validates :seu_numero, length: { maximum: tamanho_maximo_seu_numero }, :if => :deve_validar_seu_numero_carteira_especial?
247
+
248
+ # <b>Nosso número</b> é a identificação do título no banco.
249
+ # Eu diria que há uma diferença bem sutil entre esse campo e o seu número.
250
+ #
251
+ # @return [String] 8 caracteres.
252
+ #
253
+ def numero_documento
254
+ @numero_documento.to_s.rjust(8, '0') if @numero_documento.present?
255
+ end
256
+
257
+ # <b>Seu número</b> é a identificação do documento na empresa emitida.
258
+ # <b>OBS.:</b> Campo usado somente para as <b>carteiras_especiais</b>.
259
+ #
260
+ # @return [String] 7 caracteres.
261
+ #
262
+ def seu_numero
263
+ @seu_numero.to_s.rjust(7, '0') if @seu_numero.present?
264
+ end
265
+
266
+ # @return [String] 4 caracteres
267
+ #
268
+ def agencia
269
+ @agencia.to_s.rjust(4, '0') if @agencia.present?
270
+ end
271
+
272
+ # @return [String] 5 caracteres.
273
+ #
274
+ def conta_corrente
275
+ @conta_corrente.to_s.rjust(5, '0') if @conta_corrente.present?
276
+ end
277
+
278
+ # <b>Código do Cedente</b> é o código do cliente, fornecido pelo banco.
279
+ # <b>OBS.:</b> Campo usado somente para as <b>carteiras_especiais</b>.
280
+ #
281
+ # @return [String] 5 caracteres.
282
+ #
283
+ def codigo_cedente
284
+ @codigo_cedente.to_s.rjust(5, '0') if @codigo_cedente.present?
285
+ end
286
+
287
+ # @return [String] Código do Banco descrito na documentação (Pag. 49).
288
+ #
289
+ def codigo_banco
290
+ '341'
291
+ end
292
+
293
+ # Dígito do código do banco. Precisa mostrar esse dígito no boleto.
294
+ #
295
+ # @return [String] Dígito do código do banco descrito na documentação (Pag. 49).
296
+ #
297
+ def digito_codigo_banco
298
+ '7'
299
+ end
300
+
301
+ # Agência, conta corrente and dígito da conta corrente formatado.
302
+ #
303
+ # @return [String] Campo descrito na documentação (Pag. 50).
304
+ #
305
+ def agencia_codigo_cedente
306
+ "#{agencia} / #{conta_corrente}-#{digito_conta_corrente}"
307
+ end
308
+
309
+ # Nosso Número descrito na documentação (Pag. 53).
310
+ #
311
+ # @return [String] Carteira, número do documento e calculo do dígito do nosso número.
312
+ #
313
+ def nosso_numero
314
+ "#{carteira}/#{numero_documento}-#{digito_nosso_numero}"
315
+ end
316
+
317
+ # Para a grande maioria das carteiras, são considerados para a obtenção do dígito do nosso número,
318
+ # os dados “AGÊNCIA / CONTA (sem dígito) / CARTEIRA / NOSSO NÚMERO”,
319
+ # calculado pelo critério do Módulo 10 (veja a classe Modulo10 para mais detalhes).
320
+ #
321
+ # À exceção, estão as carteiras 126 - 131 - 146 - 150 e 168 cuja obtenção
322
+ # está baseada apenas nos dados “CARTEIRA/NOSSO NÚMERO” da operação.
323
+ #
324
+ # @return [String]
325
+ #
326
+ def digito_nosso_numero
327
+ if carteira.in?(carteiras_com_calculo_junto_com_numero_documento)
328
+ Modulo10.new("#{carteira}#{numero_documento}")
329
+ else
330
+ Modulo10.new("#{agencia}#{conta_corrente}#{carteira}#{numero_documento}")
331
+ end
332
+ end
333
+
334
+ # Carteiras que devem ser calculadas o módulo 10 usando carteira e número do documento.
335
+ # Você pode sobrescrever esse método na subclasse caso for necessário
336
+ # <b>para incluir mais carteiras nesse cenário</b>.
337
+ #
338
+ # @return [Array] Carteiras.
339
+ #
340
+ def carteiras_com_calculo_junto_com_numero_documento
341
+ %w(126 131 146 150 168)
342
+ end
343
+
344
+ # Formata a <b>segunda posição do código de barras</b>.
345
+ #
346
+ # A carteira de cobrança 198 é uma carteira especial, sem registro, na qual são utilizadas 15 posições
347
+ # numéricas para identificação do título liquidado (8 do Nosso Número e 7 do Seu Número).
348
+ # Nessa mesma situação estão as carteiras 107, 122, 142, 143 e 196.
349
+ #
350
+ # === Carteiras 107, 122, 142, 143, 196 e 198
351
+ #
352
+ # Para essas carteiras o formato do código de barras é o seguinte:
353
+ #
354
+ # ________________________________________________________________
355
+ # | Posição | Tamanho | Descrição |
356
+ # |----------|---------|------------------------------------------|
357
+ # | 20-22 | 03 | Carteira |
358
+ # | 23-30 | 08 | Nosso Número (Número do documento) |
359
+ # | 31-37 | 07 | Seu número |
360
+ # | 38-42 | 05 | Código do Cliente (fornecido pelo banco) |
361
+ # | 43 | 01 | DAC dos campos acima (posições 20 a 42) |
362
+ # | 44 | 01 | Zero |
363
+ # -----------------------------------------------------------------
364
+ #
365
+ # === Demais Carteiras
366
+ #
367
+ # Para as demais carteiras o formato do código de barras é o seguinte:
368
+ #
369
+ # _________________________________________________________________________________________
370
+ # | Posição | Tamanho | Descrição |
371
+ # |----------|---------|-------------------------------------------------------------------|
372
+ # | 20-22 | 03 | Carteira |
373
+ # | 23-30 | 08 | Nosso Número (Número do documento) |
374
+ # | 31 | 01 | DAC Modulo 10 (Agencia/Conta Corrente/Carteira/Nosso Número) |
375
+ # | 32-35 | 04 | Agência |
376
+ # | 36-40 | 05 | Número da conta corrente |
377
+ # | 41 | 01 | DAC Modulo 10 [Agência/Conta Corrente] (Digito da Conta Corrente) |
378
+ # | 42-44 | 03 | Zeros |
379
+ # ------------------------------------------------------------------------------------------
380
+ #
381
+ # Algumas observações sobre as demais carteiras:
382
+ #
383
+ # * O campo DAC na posição 31 se refere ao método #digito_nosso_numero pois calcula o
384
+ # dígito verificador baseado na carteira.
385
+ #
386
+ # * O campo DAC na posição 41 se refere ao método #digito_conta_corrente pois calcula o
387
+ # dígito verificador baseado na agencia + conta corrente.
388
+ #
389
+ # * A posição 41 se refere ao dígito verificador da conta corrente.
390
+ #
391
+ def codigo_de_barras_do_banco
392
+ if carteira.in?(carteiras_especiais)
393
+ codigo = "#{carteira}#{numero_documento}#{seu_numero}#{codigo_cedente}"
394
+ "#{codigo}#{Modulo10.new(codigo)}0"
395
+ else
396
+ "#{carteira}#{numero_documento}#{digito_nosso_numero}#{agencia}#{conta_corrente}#{digito_conta_corrente}000"
397
+ end
398
+ end
399
+
400
+ # As carteiras de cobrança <b>107, 122, 142, 143, 196 e 198 são carteiras especiais</b>,
401
+ # na qual são utilizadas 15 posições numéricas para identificação do título
402
+ # liquidado (8 do Nosso Número e 7 do Seu Número).
403
+ #
404
+ # <b>Você pode sobrescrever esse método na subclasse caso haja mais carteiras nessa posição descrita acima</b>.
405
+ #
406
+ # @return [Array] Carteiras especiais que calculam o código barras usando 'Seu número' e 'Código do Cedente'.
407
+ #
408
+ def carteiras_especiais
409
+ %w(107 122 142 143 196 198)
410
+ end
411
+
412
+ # Verifica se a carteira é especial.
413
+ # Para mais detalhes veja o método #carteiras_especiais.
414
+ #
415
+ # @return [True, False]
416
+ #
417
+ def carteira_especial?
418
+ carteira.to_s.in?(carteiras_especiais)
419
+ end
420
+
421
+ # Verifica se deve validar o código do cedente e se a carteira é especial.
422
+ #
423
+ # Métodos usado para verificar se deve realizar a validação do campo 'codigo_cedente'.
424
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
425
+ #
426
+ # @return [True]
427
+ #
428
+ def deve_validar_codigo_cedente_carteira_especial?
429
+ deve_validar_codigo_cedente? and carteira_especial?
430
+ end
431
+
432
+ # Verifica se deve validar o seu número e se a carteira é especial.
433
+ #
434
+ # Métodos usado para verificar se deve realizar a validação do campo 'codigo_cedente'.
435
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
436
+ #
437
+ # @return [True]
438
+ #
439
+ def deve_validar_seu_numero_carteira_especial?
440
+ deve_validar_seu_numero? and carteira_especial?
441
+ end
442
+
443
+ # Verifica se deve validar o seu número. O padrão é validar o seu número.
444
+ #
445
+ # Métodos usado para verificar se deve realizar a validação do campo 'seu_numero'.
446
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
447
+ #
448
+ # @return [True] true
449
+ #
450
+ def deve_validar_seu_numero?
451
+ true
452
+ end
453
+ end
454
+ end
455
+ end