conectiva-boleto_bancario 0.0.2.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +1 -0
  5. data/Changelog.markdown +10 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +22 -0
  8. data/Planning.markdown +137 -0
  9. data/README.markdown +215 -0
  10. data/Rakefile +9 -0
  11. data/TODO.markdown +11 -0
  12. data/boleto_bancario.gemspec +25 -0
  13. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  14. data/lib/boleto_bancario.rb +85 -0
  15. data/lib/boleto_bancario/calculos/digitos.rb +35 -0
  16. data/lib/boleto_bancario/calculos/fator_vencimento.rb +87 -0
  17. data/lib/boleto_bancario/calculos/fatores_de_multiplicacao.rb +67 -0
  18. data/lib/boleto_bancario/calculos/linha_digitavel.rb +158 -0
  19. data/lib/boleto_bancario/calculos/modulo10.rb +83 -0
  20. data/lib/boleto_bancario/calculos/modulo11.rb +54 -0
  21. data/lib/boleto_bancario/calculos/modulo11_fator_de2a7.rb +97 -0
  22. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9.rb +83 -0
  23. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
  24. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +101 -0
  25. data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
  26. data/lib/boleto_bancario/core/banco_brasil.rb +532 -0
  27. data/lib/boleto_bancario/core/banrisul.rb +182 -0
  28. data/lib/boleto_bancario/core/boleto.rb +559 -0
  29. data/lib/boleto_bancario/core/bradesco.rb +285 -0
  30. data/lib/boleto_bancario/core/itau.rb +455 -0
  31. data/lib/boleto_bancario/core/santander.rb +273 -0
  32. data/lib/boleto_bancario/version.rb +4 -0
  33. data/spec/boleto_bancario/calculos/digitos_spec.rb +19 -0
  34. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +59 -0
  35. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +69 -0
  36. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +57 -0
  37. data/spec/boleto_bancario/calculos/modulo10_spec.rb +53 -0
  38. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +43 -0
  39. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +39 -0
  40. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +67 -0
  41. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +37 -0
  42. data/spec/boleto_bancario/calculos/modulo11_spec.rb +19 -0
  43. data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
  44. data/spec/boleto_bancario/core/banco_brasil_spec.rb +383 -0
  45. data/spec/boleto_bancario/core/banrisul_spec.rb +130 -0
  46. data/spec/boleto_bancario/core/boleto_spec.rb +161 -0
  47. data/spec/boleto_bancario/core/bradesco_spec.rb +170 -0
  48. data/spec/boleto_bancario/core/itau_spec.rb +336 -0
  49. data/spec/boleto_bancario/core/santander_spec.rb +135 -0
  50. data/spec/shared_examples/boleto_bancario_shared_example.rb +157 -0
  51. data/spec/spec_helper.rb +14 -0
  52. metadata +211 -0
@@ -0,0 +1,117 @@
1
+ module BoletoBancario
2
+ module Calculos
3
+ # === Cálculo do Módulo do Número de Controle (2 dígitos)
4
+ #
5
+ # Tipo de cálculo usado pelo Banco Banrisul.
6
+ #
7
+ # === Cálculo do Primeiro Dígito
8
+ #
9
+ # 1) Multiplica-se cada algarismo do campo pela seqüência de multiplicadores <b>2, 1, 2, 1, 2, 1 ...</b>, posicionados da direita para a esquerda.
10
+ #
11
+ # 2) Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N).
12
+ #
13
+ # 3) Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N).
14
+ #
15
+ # 4) Encontre o DAC através da seguinte expressão:
16
+ #
17
+ # DAC = 10 - Mod 10 (n)
18
+ #
19
+ # === Cálculo do segundo dígito
20
+ #
21
+ # # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
22
+ # pela seqüência numérica de 2 a 7 (2, 3, 4, 5, 6, 7 ... e assim por diante).
23
+ #
24
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
25
+ #
26
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
27
+ #
28
+ # 4) Calcule o dígito verificador (DAC) através da expressão:
29
+ #
30
+ # DIGIT = 11 - Mod 11 (n)
31
+ #
32
+ # <b>Observações:</b>
33
+ #
34
+ # Caso o 'resto' obtido no cálculo do módulo '11' seja igual a '1', considera-se o DV inválido.
35
+ # Soma-se, então, "1" ao DV obtido do módulo "10" e refaz-se o cálculo do módulo “11”.
36
+ # Se o dígito obtido pelo módulo “10” era igual a "9", considera-se então (9+1=10) DV inválido.
37
+ # Neste caso, o DV do módulo "10" automaticamente será igual a "0" e procede-se assim
38
+ # novo cálculo pelo módulo "11".
39
+ #
40
+ # === Exemplo com Primeiro Dígito Inválido
41
+ #
42
+ # Dado o número '00009194':
43
+ #
44
+ # O somatório do primeiro cálculo é igual a '28' e o Resto é igual a '8'.
45
+ # Portanto, o primeiro DV é igual a 10 - 8 ou DV = 2.
46
+ #
47
+ # O somatório do segundo cálculo é igual a '111' e o Resto é, neste caso, igual a '1'.
48
+ # Portanto, o segundo DV é inválido (11 - 1 = 10).
49
+ #
50
+ # Neste caso, soma-se '1' ao DV obtido do primeiro cálculo:
51
+ #
52
+ # 2 + 1
53
+ # # ======> 3 # Primeiro dígito do número de controle
54
+ #
55
+ # Agora, efetua-se novo cálculo do módulo 11, agora com o novo número, ou seja, 000091943:
56
+ #
57
+ # A somatório do segundo cálculo é igual a '113' e o Resto igual a '3'.
58
+ # Portanto, o segundo DV é igual a:
59
+ #
60
+ # 11 - 3
61
+ # # ====> 8 # Segundo dígito do número de controle
62
+ #
63
+ # Neste exemplo, o número de controle será '38'.
64
+ #
65
+ class ModuloNumeroDeControle < String
66
+ attr_reader :number, :first_digit, :second_digit
67
+
68
+ def initialize(number)
69
+ @number = number
70
+ @first_digit = calculate_first_digit
71
+ @second_digit = calculate_second_digit
72
+
73
+ super(calculate)
74
+ end
75
+
76
+ # Retorna 2 dígitos verificando o segundo dígito se é válido ou não.
77
+ #
78
+ # @return [String]
79
+ #
80
+ def calculate
81
+ if second_digit_result.equal?(10)
82
+ @first_digit = first_digit.to_i + 1
83
+ @first_digit = 0 if @first_digit.equal?(10)
84
+ @second_digit = calculate_second_digit
85
+ end
86
+
87
+ "#{first_digit}#{second_digit}"
88
+ end
89
+
90
+ # Retorna a subtração de 11 pelo resto da divisão por 11 do segundo dígito.
91
+ #
92
+ # @return [Integer]
93
+ #
94
+ def second_digit_result
95
+ 11 - @second_digit.mod_division
96
+ end
97
+
98
+ # Calcula o primeiro dígito pelo módulo 10.
99
+ # Para mais detalhes veja a classe Modulo10.
100
+ #
101
+ # @return [String]
102
+ #
103
+ def calculate_first_digit
104
+ Modulo10.new(number)
105
+ end
106
+
107
+ # Calcula o segundo dígito pelo módulo 11 usando os fatores de 2 a 7.
108
+ # Para mais detalhes veja a classe Modulo11FatorDe2a7.
109
+ #
110
+ # @return [String]
111
+ #
112
+ def calculate_second_digit
113
+ Modulo11FatorDe2a7.new("#{number}#{first_digit}")
114
+ end
115
+ end
116
+ end
117
+ end
@@ -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