conectiva-boleto_bancario 0.0.2.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Changelog.markdown +10 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/Planning.markdown +137 -0
- data/README.markdown +215 -0
- data/Rakefile +9 -0
- data/TODO.markdown +11 -0
- data/boleto_bancario.gemspec +25 -0
- data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
- data/lib/boleto_bancario.rb +85 -0
- data/lib/boleto_bancario/calculos/digitos.rb +35 -0
- data/lib/boleto_bancario/calculos/fator_vencimento.rb +87 -0
- data/lib/boleto_bancario/calculos/fatores_de_multiplicacao.rb +67 -0
- data/lib/boleto_bancario/calculos/linha_digitavel.rb +158 -0
- data/lib/boleto_bancario/calculos/modulo10.rb +83 -0
- data/lib/boleto_bancario/calculos/modulo11.rb +54 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a7.rb +97 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a9.rb +83 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +101 -0
- data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
- data/lib/boleto_bancario/core/banco_brasil.rb +532 -0
- data/lib/boleto_bancario/core/banrisul.rb +182 -0
- data/lib/boleto_bancario/core/boleto.rb +559 -0
- data/lib/boleto_bancario/core/bradesco.rb +285 -0
- data/lib/boleto_bancario/core/itau.rb +455 -0
- data/lib/boleto_bancario/core/santander.rb +273 -0
- data/lib/boleto_bancario/version.rb +4 -0
- data/spec/boleto_bancario/calculos/digitos_spec.rb +19 -0
- data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +59 -0
- data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +69 -0
- data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +57 -0
- data/spec/boleto_bancario/calculos/modulo10_spec.rb +53 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +43 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +39 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +67 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +37 -0
- data/spec/boleto_bancario/calculos/modulo11_spec.rb +19 -0
- data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
- data/spec/boleto_bancario/core/banco_brasil_spec.rb +383 -0
- data/spec/boleto_bancario/core/banrisul_spec.rb +130 -0
- data/spec/boleto_bancario/core/boleto_spec.rb +161 -0
- data/spec/boleto_bancario/core/bradesco_spec.rb +170 -0
- data/spec/boleto_bancario/core/itau_spec.rb +336 -0
- data/spec/boleto_bancario/core/santander_spec.rb +135 -0
- data/spec/shared_examples/boleto_bancario_shared_example.rb +157 -0
- data/spec/spec_helper.rb +14 -0
- 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
|