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,532 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Core
4
+ # Implementação de emissão de boleto bancário pelo Banco do Brasil.
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/banco_brasil' dentro dessa biblioteca.
10
+ #
11
+ # === Experimental
12
+ #
13
+ # O Boleto do Banco do Brasil ainda está categorizado como experimental. POr favor ajude a validar e homologar
14
+ # esse banco para as carteiras suportadas conforme descrito abaixo.
15
+ #
16
+ # === Contrato das classes de emissão de boletos
17
+ #
18
+ # Para ver o "<b>contrato</b>" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
19
+ # a classe BoletoBancario::Core::Boleto.
20
+ #
21
+ # === Carteiras suportadas
22
+ #
23
+ # Segue abaixo as carteiras suportadas do Banco do Brasil <b>seguindo a documentação</b>:
24
+ #
25
+ # ________________________________________________________________________________________________________
26
+ # | Carteira | Descrição | Testada/Homologada no banco |
27
+ # | 12 | Código do cedente de 6 dígitos | Esperando Contribuição |
28
+ # | 16 | Código do cedente de 6 dígitos e nosso numero com 17 dígitos | Esperando Contribuição |
29
+ # | 16 | Código do cedente de 4 dígitos | Esperando Contribuição |
30
+ # | 16 | Código do cedente de 6 dígitos | Esperando Contribuição |
31
+ # | 17 | Código do cedente de 7 dígitos | Esperando Contribuição |
32
+ # | 17 | Código do cedente de 8 dígitos | Esperando Contribuição |
33
+ # | 18 | Código do cedente de 4 dígitos | Esperando Contribuição |
34
+ # | 18 | Código do cedente de 6 dígitos | Esperando Contribuição |
35
+ # | 18 | Código do cedente de 6 dígitos e nosso numero com 17 dígitos | Esperando Contribuição |
36
+ # | 18 | Código do cedente de 7 dígitos | Esperando Contribuição |
37
+ # | 18 | Código do cedente de 8 dígitos | Esperando Contribuição |
38
+ # ---------------------------------------------------------------------------------------------------------
39
+ #
40
+ # # <b>OBS.: Seja um contribuidor dessa gem. Contribua para homologar os boletos e as
41
+ # devidas carteiras junto ao banco Bradesco.</b>
42
+ #
43
+ class BancoBrasil < Boleto
44
+ # Tamanho máximo de uma agência no Banco do Brasil.
45
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
46
+ #
47
+ # @return [Fixnum] 4
48
+ #
49
+ def self.tamanho_maximo_agencia
50
+ 4
51
+ end
52
+
53
+ # Tamanho máximo de uma conta corrente no Banco do Brasil.
54
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
55
+ #
56
+ # @return [Fixnum] 8
57
+ #
58
+ def self.tamanho_maximo_conta_corrente
59
+ 8
60
+ end
61
+
62
+ # <b>Tamanho máximo do número do documento emitido no Boleto, quando o código do cedente tiver 4 dígitos.</b>
63
+ #
64
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
65
+ #
66
+ # @return [Fixnum] 7
67
+ #
68
+ def self.tamanho_maximo_numero_documento_com_codigo_cedente_quatro_digitos
69
+ 7
70
+ end
71
+
72
+ # <b>Tamanho máximo do número do documento emitido no Boleto, quando o código do cedente tiver 6 dígitos.</b>
73
+ #
74
+ # === Convenção
75
+ #
76
+ # Sempre que você for usar o número do documento com 17 dígitos nas carteiras 16 ou 18 com
77
+ # código cedente de 6 dígitos, <b>fica a seu cargo colocar os 17 dígitos do número do documento</b>.
78
+ #
79
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
80
+ #
81
+ # @return [Fixnum] 17 ou 5
82
+ #
83
+ #
84
+ def self.tamanho_maximo_numero_documento_com_codigo_cedente_seis_digitos
85
+ 5
86
+ end
87
+
88
+ # <b>Tamanho máximo do número do documento emitido no Boleto, quando o código do cedente tiver 7 dígitos.</b>
89
+ #
90
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
91
+ #
92
+ # @return [Fixnum] 10
93
+ #
94
+ def self.tamanho_maximo_numero_documento_com_codigo_cedente_sete_digitos
95
+ 10
96
+ end
97
+
98
+ # <b>Tamanho máximo do número do documento emitido no Boleto, quando o código do cedente tiver 8 dígitos.</b>
99
+ #
100
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
101
+ #
102
+ # @return [Fixnum] 9
103
+ #
104
+ def self.tamanho_maximo_numero_documento_com_codigo_cedente_oito_digitos
105
+ 9
106
+ end
107
+
108
+ # <b>Tamanho máximo do número do documento emitido no Boleto, quando o código do cedente tiver 6 dígitos,
109
+ # ser carteira 16 ou 18 e ter o nosso número com 17 dígitos.</b>
110
+ #
111
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
112
+ #
113
+ # @return [Fixnum] 9
114
+ #
115
+ def self.tamanho_maximo_numero_documento_dezessete_digitos
116
+ 17
117
+ end
118
+
119
+ validates :codigo_cedente, :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
120
+
121
+ validates :digito_agencia, length: { maximum: 1 }
122
+ validates :digito_conta_corrente, length: { maximum: 1 }
123
+
124
+ # Validações de Agencia e Conta corrente.
125
+ #
126
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
127
+ validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
128
+
129
+ # Validações do número do documento.
130
+ #
131
+ # === Número do Documento e Código do Cedente.
132
+ #
133
+ # A validação do número do documento, varia, dependendo da quantidade de dígitos do código do cedente.
134
+ #
135
+ # <b>Para mais detalhes, veja o método #numero_documento, para entender essas validações</b>.
136
+ #
137
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento_com_codigo_cedente_quatro_digitos }, if: :deve_validar_com_codigo_cedente_quatro_digitos?
138
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento_com_codigo_cedente_sete_digitos }, if: :deve_validar_com_codigo_cedente_sete_digitos?
139
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento_com_codigo_cedente_oito_digitos }, if: :deve_validar_com_codigo_cedente_oito_digitos?
140
+
141
+ # Possui 2 tipos de validações de código do cedente com 6 dígitos:
142
+ #
143
+ # 1) Quando for nosso número com onze posições (6 do código cedente + 5 do número do documento).
144
+ # 2) Quando for nosso número com dezessete posições (17 do número do documento).
145
+ #
146
+ #
147
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento_com_codigo_cedente_seis_digitos }, if: :deve_validar_com_codigo_cedente_seis_digitos?
148
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento_dezessete_digitos }, if: :deve_validar_com_nosso_numero_dezessete_digitos?
149
+
150
+ validate :validacao_tamanho_de_digitos_codigo_cedente, if: :deve_validar_codigo_cedente?
151
+
152
+ # @return [String] 4 caracteres
153
+ #
154
+ def agencia
155
+ @agencia.to_s.rjust(4, '0') if @agencia.present?
156
+ end
157
+
158
+ # @return [String] 8 caracteres
159
+ #
160
+ def conta_corrente
161
+ @conta_corrente.to_s.rjust(8, '0') if @conta_corrente.present?
162
+ end
163
+
164
+ # === Número do Documento VS. Código do Cedente
165
+ #
166
+ # No caso do Banco do Brasil, o tamanho do código do cedente ditará o tamanho do número do documento.
167
+ # Ou seja, <b>quando o código do cedente for X, o tamanho do número do documento deverá ser Y</b>.
168
+ # Segue abaixo:
169
+ #
170
+ # ______________________________________________________________
171
+ # | Tamanho do Código Cedente | Tamanho do Número do documento |
172
+ # |----------------------------|--------------------------------|
173
+ # | 04 | 07 |
174
+ # | 06 | 05 |
175
+ # | 07 | 10 |
176
+ # | 08 | 09 |
177
+ # ---------------------------------------------------------------
178
+ #
179
+ # <b>OBS.: Quando o tamanho do código do cedente for 6, o número do documento
180
+ # pode ter 17 dígitos, se for usado com a carteira 16 ou 18.</b>
181
+ #
182
+ # @return [String]
183
+ #
184
+ def numero_documento
185
+ if @numero_documento.present?
186
+ @numero_documento.to_s.rjust(numero_documento_esperado[tamanho_codigo_cedente], '0')
187
+ else
188
+ @numero_documento
189
+ end
190
+ end
191
+
192
+ # Para ficar documentado preferi criar um método onde retorna o tamanho esperado
193
+ # do número do documento dependendo do tamanho do código do cedente.
194
+ #
195
+ # <b>Para mais detalhes veja o método #numero_documento dessa classe.</b>
196
+ #
197
+ # @return [Hash] As chaves significam o tamanho do código cedente e o valor o tamanho esperado do número do documento.
198
+ #
199
+ def numero_documento_esperado
200
+ { 0 => 0, 4 => 7, 6 => 5, 7 => 10, 8 => 9 }
201
+ end
202
+
203
+ # @return [String] Código do Banco descrito na documentação.
204
+ #
205
+ def codigo_banco
206
+ '001'
207
+ end
208
+
209
+ # Dígito do código do banco. Precisa mostrar esse dígito no boleto.
210
+ #
211
+ # @return [String] Dígito do código do banco descrito na documentação.
212
+ #
213
+ def digito_codigo_banco
214
+ '9'
215
+ end
216
+
217
+ # Campo Agencia / Código do Cedente
218
+ # Retorna formatado a agência, digito da agência, número da conta corrente e dígito da conta.
219
+ #
220
+ # @return [String]
221
+ #
222
+ def agencia_codigo_cedente
223
+ "#{agencia}-#{digito_agencia} / #{conta_corrente}-#{digito_conta_corrente}"
224
+ end
225
+
226
+ # === Composição do nosso número
227
+ #
228
+ # ==== Código do Cedente de 4 dígitos
229
+ #
230
+ # ___________________________________________________________
231
+ # | Posição | Tamanho | Descrição |
232
+ # |----------|---------|-------------------------------------|
233
+ # | 01-04 | 04 | Código do cedente de 4 dígitos |
234
+ # | 05-11 | 07 | Nosso número livre do cliente |
235
+ # | 12 | 01 | Dígito Verificador do Nosso número |
236
+ # ------------------------------------------------------------
237
+ #
238
+ # ==== Código do Cedente de 6 dígitos
239
+ #
240
+ # ___________________________________________________________
241
+ # | Posição | Tamanho | Descrição |
242
+ # |----------|---------|-------------------------------------|
243
+ # | 01-06 | 06 | Código do cedente de 6 dígitos |
244
+ # | 07-11 | 05 | Nosso número livre do cliente |
245
+ # | 12 | 01 | Dígito Verificador do Nosso número |
246
+ # ------------------------------------------------------------
247
+ #
248
+ # ==== Código do Cedente de 7 dígitos
249
+ #
250
+ # ___________________________________________________________
251
+ # | Posição | Tamanho | Descrição |
252
+ # |----------|---------|-------------------------------------|
253
+ # | 01-07 | 07 | Código do cedente de 7 dígitos |
254
+ # | 08-17 | 10 | Nosso número livre do cliente |
255
+ # ------------------------------------------------------------
256
+ #
257
+ # <b>Obs.: Não existe Dígito Verificador na composição do nosso-número para convênios
258
+ # de sete posições.</b>
259
+ #
260
+ # ==== Código do Cedente de 8 dígitos
261
+ #
262
+ # ___________________________________________________________
263
+ # | Posição | Tamanho | Descrição |
264
+ # |----------|---------|-------------------------------------|
265
+ # | 01-08 | 08 | Código do cedente de 7 dígitos |
266
+ # | 09-17 | 09 | Nosso número livre do cliente |
267
+ # ------------------------------------------------------------
268
+ #
269
+ # <b>Obs.: Não existe Dígito Verificador na composição do nosso-número para convênios
270
+ # de oito posições.</b>
271
+ #
272
+ # @return [String] Nosso número que será mostrado no boleto
273
+ #
274
+ def nosso_numero
275
+ if codigo_cedente_oito_digitos? or codigo_cedente_sete_digitos?
276
+ "#{codigo_cedente}#{numero_documento}"
277
+ else
278
+ "#{codigo_cedente}#{numero_documento}-#{digito_nosso_numero}"
279
+ end
280
+ end
281
+
282
+ # Para o cálculo do dígito, será necessário acrescentar o código do cedente e
283
+ # Nosso Número (número do documento), e aplicar o módulo 11, com fatores de 9 a 2
284
+ # verificando o resto da divisão.
285
+ #
286
+ # <b>Para mais detalhes de como o cálculo é feito veja a classe Modulo11FatorDe9a2RestoX.</b>
287
+ #
288
+ # @return [String] Retorno do cálculo do módulo 11 com os fatores (9,8,7,6,5,4,3,2).
289
+ #
290
+ def digito_nosso_numero
291
+ Modulo11FatorDe9a2RestoX.new("#{codigo_cedente}#{numero_documento}")
292
+ end
293
+
294
+ # === Código do cedente com 4 dígitos
295
+ #
296
+ # Quando o código do cedente possui 4 dígitos o formato do código de barras deve ficar assim:
297
+ #
298
+ # __________________________________________________________________________
299
+ # | Posição | Tamanho | Descrição |
300
+ # |----------|---------|----------------------------------------------------|
301
+ # | 20-30 | 11 | Nosso-Número, sem dígito verificador |
302
+ # | 20-23 | Código do cedente fornecido pelo Banco (4 dígitos) |
303
+ # | 24-30 | Nosso-Número, sem dígito verificador (7 dígitos) |
304
+ # | 31-34 | 04 | Agência (sem o dígito) |
305
+ # | 35-42 | 08 | Conta corrente (sem o dígito) |
306
+ # | 43-44 | 02 | Carteira |
307
+ # ---------------------------------------------------------------------------
308
+ #
309
+ # === Código do cedente com 6 dígitos
310
+ #
311
+ # Quando o código do cedente possui 6 dígitos o formato do código de barras deve ficar assim:
312
+ #
313
+ # __________________________________________________________________________
314
+ # | Posição | Tamanho | Descrição |
315
+ # |----------|---------|----------------------------------------------------|
316
+ # | 20-30 | 11 | Nosso-Número, sem dígito verificador |
317
+ # | 20-25 | Código do cedente fornecido pelo Banco (6 dígitos) |
318
+ # | 26-30 | Nosso-Número, sem dígito verificador (5 dígitos) |
319
+ # | 31-34 | 04 | Agência (sem o dígito) |
320
+ # | 35-42 | 08 | Conta corrente (sem o dígito) |
321
+ # | 43-44 | 02 | Carteira |
322
+ # ---------------------------------------------------------------------------
323
+ #
324
+ # === Código do cedente com 7 dígitos
325
+ #
326
+ # Quando o código do cedente possui 7 dígitos o formato do código de barras deve ficar assim:
327
+ #
328
+ # __________________________________________________________________________
329
+ # | Posição | Tamanho | Descrição |
330
+ # |----------|---------|----------------------------------------------------|
331
+ # | 20-30 | 17 | Nosso-Número, sem dígito verificador |
332
+ # | 20-32 | Código do cedente fornecido pelo Banco (7 dígitos) |
333
+ # | 33-42 | Nosso-Número, sem dígito verificador (10 dígitos) |
334
+ # | 43-44 | 02 | Carteira |
335
+ # ---------------------------------------------------------------------------
336
+ #
337
+ # === Código do cedente com 8 dígitos
338
+ #
339
+ # Quando o código do cedente possui 8 dígitos o formato do código de barras deve ficar assim:
340
+ #
341
+ # __________________________________________________________________________
342
+ # | Posição | Tamanho | Descrição |
343
+ # |----------|---------|----------------------------------------------------|
344
+ # | 20-30 | 17 | Nosso-Número, sem dígito verificador |
345
+ # | 20-33 | Código do cedente fornecido pelo Banco (8 dígitos) |
346
+ # | 34-42 | Nosso-Número, sem dígito verificador (9 dígitos) |
347
+ # | 43-44 | 02 | Carteira |
348
+ # ---------------------------------------------------------------------------
349
+ #
350
+ # === Carteiras 16 e 18, código do cedente de 6 posições, nosso número com 17 dígitos.
351
+ #
352
+ # Código do cedente possui 6 dígitos, nosso número com 17 dígitos e a carteira for 16 ou 18,
353
+ # o formato do código de barras deve ficar assim:
354
+ #
355
+ # ___________________________________________________________
356
+ # | Posição | Tamanho | Descrição |
357
+ # |----------|---------|-------------------------------------|
358
+ # | 20-25 | 6 | Código do cedente de 6 dígitos |
359
+ # | 26-42 | 17 | Nosso número livre do cliente |
360
+ # | 43-44 | 02 | "21" Tipo da modalidade de cobranca |
361
+ # ------------------------------------------------------------
362
+ #
363
+ def codigo_de_barras_do_banco
364
+ if nosso_numero_dezessete_posicoes?
365
+ return codigo_de_barras_codigo_cedente_seis_posicoes_nosso_numero_dezessete_posicoes
366
+ end
367
+
368
+ if codigo_cedente_quatro_digitos? or codigo_cedente_seis_digitos?
369
+ return codigo_de_barras_codigo_cedente_quatro_ou_seis_digitos
370
+ end
371
+
372
+ if codigo_cedente_sete_digitos? or codigo_cedente_oito_digitos?
373
+ codigo_de_barras_codigo_cedente_sete_ou_oito_digitos
374
+ end
375
+ end
376
+
377
+ # Retorna o código de barras do campo livre para emissão de boletos com:
378
+ #
379
+ # <b>Nosso número de 11 posições - EXCLUSIVO PARA CONVÊNIOS DE SEIS POSIÇÕES.</b>
380
+ #
381
+ # @return [String]
382
+ #
383
+ def codigo_de_barras_codigo_cedente_quatro_ou_seis_digitos
384
+ "#{codigo_cedente}#{numero_documento}#{agencia}#{conta_corrente}#{carteira}"
385
+ end
386
+
387
+ # Retorna o código de barras do campo livre para emissão de boletos com:
388
+ #
389
+ # <b>Carteira 17 e 18 - VINCULADOS À CONVÊNIOS COM NUMERAÇÃO SUPERIOR A 1.000.000 (um milhão).</b>
390
+ #
391
+ # @return [String]
392
+ #
393
+ def codigo_de_barras_codigo_cedente_sete_ou_oito_digitos
394
+ "000000#{codigo_cedente}#{numero_documento}#{carteira}"
395
+ end
396
+
397
+ # Retorna o código de barras do campo livre para emissão de bloquetos com:
398
+ #
399
+ # <b>Nosso número de 17 posições - EXCLUSIVO PARA AS CARTEIRAS 16 E 18, VINCULADAS À CONVÊNIOS COM SEIS POSIÇÕES.</b>
400
+ #
401
+ # @return [String]
402
+ #
403
+ def codigo_de_barras_codigo_cedente_seis_posicoes_nosso_numero_dezessete_posicoes
404
+ "#{codigo_cedente}#{numero_documento}#{modalidade_de_cobranca}"
405
+ end
406
+
407
+ # Modalidade de cobranca definida pelo Banco do Brasil para ser mostrado no código de barras
408
+ # com código de cedente de seis posições e nosso número de 17 posições, carteira 16 e 18.
409
+ #
410
+ # @return [String] 21
411
+ #
412
+ def modalidade_de_cobranca
413
+ "21"
414
+ end
415
+
416
+ # Verifica se o código do cedente possui 4 dígitos.
417
+ #
418
+ # @return [true, false]
419
+ #
420
+ def codigo_cedente_quatro_digitos?
421
+ tamanho_codigo_cedente == 4
422
+ end
423
+
424
+ # Verifica se o código do cedente possui 6 dígitos.
425
+ #
426
+ # @return [true, false]
427
+ #
428
+ def codigo_cedente_seis_digitos?
429
+ tamanho_codigo_cedente == 6
430
+ end
431
+
432
+ # Verifica se o código do cedente possui 7 dígitos.
433
+ #
434
+ # @return [true, false]
435
+ #
436
+ def codigo_cedente_sete_digitos?
437
+ tamanho_codigo_cedente == 7
438
+ end
439
+
440
+ # Verifica se o código do cedente possui 8 dígitos.
441
+ #
442
+ # @return [true, false]
443
+ #
444
+ def codigo_cedente_oito_digitos?
445
+ tamanho_codigo_cedente == 8
446
+ end
447
+
448
+ # Retorna o tamanho do campo código do cedente.
449
+ # Super importante para o número do documento e e para o código de barras
450
+ #
451
+ # @return [Fixnum] Tamanho do campo código do cedente.
452
+ #
453
+ def tamanho_codigo_cedente
454
+ codigo_cedente.to_s.size
455
+ end
456
+
457
+ # Verifica se:
458
+ #
459
+ # * Número do documento possui 17 dígitos
460
+ # * Carteira está habilitada para usar 17 dígitos do número documento.
461
+ # * Código do Cedente está habilitado para usar 17 dígitos do número documento (se tiver 6 dígitos).
462
+ #
463
+ # @return [true, false]
464
+ #
465
+ def nosso_numero_dezessete_posicoes?
466
+ codigo_cedente_seis_digitos? and carteira.to_s.in?(carteiras_nosso_numero_dezessete_posicoes) and numero_documento.to_s.size == 17
467
+ end
468
+
469
+ # Retorna as carteiras que aceitam nosso número com 17 posições.
470
+ #
471
+ # @return [Array]
472
+ #
473
+ def carteiras_nosso_numero_dezessete_posicoes
474
+ %w(16 18)
475
+ end
476
+
477
+ # Verifica se o campo código do cedente tem o tamanho suportado pelo Banco do Brasil.
478
+ #
479
+ def validacao_tamanho_de_digitos_codigo_cedente
480
+ errors.add(:codigo_cedente, :invalid) unless tamanho_codigo_cedente.in?(tamanhos_codigo_cedente_suportado)
481
+ end
482
+
483
+ # Retorna os tamanhos do código do cedente suportados pelo Banco do Brasil.
484
+ #
485
+ # @return [Array]
486
+ #
487
+ def tamanhos_codigo_cedente_suportado
488
+ [4, 6, 7, 8]
489
+ end
490
+
491
+ # Método que pode ser sobrescrito na subclasse se você <b>não quiser</b> que essa validação ocorra.
492
+ #
493
+ # <b>Lembre-se que fica a seu critério, mudar as validações da gem</b>.
494
+ #
495
+ def deve_validar_com_codigo_cedente_quatro_digitos?
496
+ deve_validar_codigo_cedente? and codigo_cedente_quatro_digitos?
497
+ end
498
+
499
+ # Método que pode ser sobrescrito na subclasse se você <b>não quiser</b> que essa validação ocorra.
500
+ #
501
+ # <b>Lembre-se que fica a seu critério, mudar as validações da gem</b>.
502
+ #
503
+ def deve_validar_com_codigo_cedente_seis_digitos?
504
+ deve_validar_codigo_cedente? and codigo_cedente_seis_digitos? and not nosso_numero_dezessete_posicoes?
505
+ end
506
+
507
+ # Método que pode ser sobrescrito na subclasse se você <b>não quiser</b> que essa validação ocorra.
508
+ #
509
+ # <b>Lembre-se que fica a seu critério, mudar as validações da gem</b>.
510
+ #
511
+ def deve_validar_com_nosso_numero_dezessete_digitos?
512
+ deve_validar_codigo_cedente? and codigo_cedente_seis_digitos? and nosso_numero_dezessete_posicoes?
513
+ end
514
+
515
+ # Método que pode ser sobrescrito na subclasse se você <b>não quiser</b> que essa validação ocorra.
516
+ #
517
+ # <b>Lembre-se que fica a seu critério, mudar as validações da gem</b>.
518
+ #
519
+ def deve_validar_com_codigo_cedente_sete_digitos?
520
+ deve_validar_codigo_cedente? and codigo_cedente_sete_digitos?
521
+ end
522
+
523
+ # Método que pode ser sobrescrito na subclasse se você <b>não quiser</b> que essa validação ocorra.
524
+ #
525
+ # <b>Lembre-se que fica a seu critério, mudar as validações da gem</b>.
526
+ #
527
+ def deve_validar_com_codigo_cedente_oito_digitos?
528
+ deve_validar_codigo_cedente? and codigo_cedente_oito_digitos?
529
+ end
530
+ end
531
+ end
532
+ end