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.
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Changelog.markdown +6 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/Planning.markdown +131 -0
- data/README.markdown +208 -0
- data/Rakefile +9 -0
- data/TODO.markdown +5 -0
- data/boleto_bancario.gemspec +25 -0
- data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -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/core/banco_brasil.rb +532 -0
- data/lib/boleto_bancario/core/boleto.rb +525 -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 +274 -0
- data/lib/boleto_bancario/version.rb +4 -0
- data/lib/boleto_bancario.rb +83 -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 +49 -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 +61 -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/core/banco_brasil_spec.rb +383 -0
- data/spec/boleto_bancario/core/boleto_spec.rb +102 -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 +164 -0
- data/spec/spec_helper.rb +14 -0
- metadata +221 -0
@@ -0,0 +1,285 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BoletoBancario
|
3
|
+
module Core
|
4
|
+
# Implementação de emissão de boleto bancário pelo Bradesco.
|
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/bradesco' 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 bradesco <b>seguindo a documentação</b>:
|
19
|
+
#
|
20
|
+
# _________________________________________________________________________
|
21
|
+
# | Carteira | Descrição | Testada/Homologada no banco |
|
22
|
+
# | 03 | Sem registro | Esperando Contribuição |
|
23
|
+
# | 06 | Sem registro | Esperando Contribuição |
|
24
|
+
# | 09 | Com registro | Esperando Contribuição |
|
25
|
+
# | 19 | Com registro | Esperando Contribuição |
|
26
|
+
# | 21 | Cobrança Interna com registro | Esperando Contribuição |
|
27
|
+
# | 22 | Cobrança Interna sem registro | Esperando Contribuição |
|
28
|
+
# --------------------------------------------------------------------------
|
29
|
+
#
|
30
|
+
# <b>OBS.: Seja um contribuidor dessa gem. Contribua para homologar os boletos e as
|
31
|
+
# devidas carteiras junto ao banco Bradesco.</b>
|
32
|
+
#
|
33
|
+
# === Exemplos
|
34
|
+
#
|
35
|
+
# O recomendado é criar uma subclasse de BoletoBancario::Bradesco
|
36
|
+
#
|
37
|
+
# class Bradesco < BoletoBancario::Bradesco
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# E a partir daí usar a sua classe para emitir o boleto:
|
41
|
+
#
|
42
|
+
# Bradesco.new do |boleto|
|
43
|
+
# boleto.conta_corrente = '89755'
|
44
|
+
# boleto.agencia = '0097'
|
45
|
+
# boleto.carteira = '198'
|
46
|
+
# boleto.numero_documento = '12345678'
|
47
|
+
# boleto.codigo_cedente = '909014'
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# === Validações
|
51
|
+
#
|
52
|
+
# A classe Bradesco possui suas próprias validações.
|
53
|
+
# Primeiramente, <b>antes de renderizar qualquer boleto você precisar verificar se esse boleto é válido</b>:
|
54
|
+
#
|
55
|
+
# @bradesco = Bradesco.new
|
56
|
+
# if @bradesco.valid?
|
57
|
+
# # render @bradesco
|
58
|
+
# else
|
59
|
+
# # ...
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# Se você quiser sobrescrever alguma validação dessa classe a gem de boleto bancário
|
63
|
+
# possui alguns modos de fazer isso.
|
64
|
+
#
|
65
|
+
# === Sobrescrevendo validações
|
66
|
+
#
|
67
|
+
# Caso você precise mudar as validações, você pode sobrescrever alguns métodos que possuem <b>"Magic numbers"</b>.
|
68
|
+
# Foi colocado dessa forma, já que os bancos mudam bastante esse tipo de validação.
|
69
|
+
# Por exemplo, atualmente a conta corrente é validado com <b>'5' como máximo de tamanho</b>.
|
70
|
+
# Caso você queira que valide como 6, mude conforme abaixo:
|
71
|
+
#
|
72
|
+
# class Bradesco < BoletoBancario::Bradesco
|
73
|
+
# def self.tamanho_maximo_conta_corrente
|
74
|
+
# 6
|
75
|
+
# end
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# <b>Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
79
|
+
# Você precisará analisar o efeito no #codigo_de_barras, #nosso_numero e na
|
80
|
+
# #linha_digitável (ambos podem ser sobreescritos também).</b>
|
81
|
+
#
|
82
|
+
# Caso exista algum cenário de sobrescrita de validação contate o dono dessa gem pelo github e conte um
|
83
|
+
# pouco mais sobre esses cenários.
|
84
|
+
#
|
85
|
+
class Bradesco < Boleto
|
86
|
+
# Tamanho máximo de uma conta corrente no Banco Bradesco.
|
87
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
88
|
+
#
|
89
|
+
# @return [Fixnum] 7
|
90
|
+
#
|
91
|
+
def self.tamanho_maximo_conta_corrente
|
92
|
+
7
|
93
|
+
end
|
94
|
+
|
95
|
+
# Tamanho máximo de uma agência no Banco Bradesco.
|
96
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
97
|
+
#
|
98
|
+
# @return [Fixnum] 4
|
99
|
+
#
|
100
|
+
def self.tamanho_maximo_agencia
|
101
|
+
4
|
102
|
+
end
|
103
|
+
|
104
|
+
# Tamanho máximo do número do documento emitido no Boleto.
|
105
|
+
# O tamanho máximo é justamente 8 porque no código de barras só é permitido 8 posições para este campo.
|
106
|
+
#
|
107
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
108
|
+
#
|
109
|
+
# @return [Fixnum] 11
|
110
|
+
#
|
111
|
+
def self.tamanho_maximo_numero_documento
|
112
|
+
11
|
113
|
+
end
|
114
|
+
|
115
|
+
# Tamanho máximo da carteira.
|
116
|
+
# O tamanho máximo é justamente 2 porque no código de barras só é permitido 2 posições para este campo.
|
117
|
+
#
|
118
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
119
|
+
#
|
120
|
+
# @return [Fixnum] 2
|
121
|
+
#
|
122
|
+
def self.tamanho_maximo_carteira
|
123
|
+
2
|
124
|
+
end
|
125
|
+
|
126
|
+
validates :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
|
127
|
+
|
128
|
+
# Validações de tamanho para os campos abaixo:
|
129
|
+
#
|
130
|
+
# * Agencia
|
131
|
+
# * Digito verificador da agencia
|
132
|
+
# * Conta corrente
|
133
|
+
# * Digito verificador da conta corrente
|
134
|
+
# * Número do documento
|
135
|
+
# * Carteira
|
136
|
+
#
|
137
|
+
# Se você quiser sobrescrever os tamanhos permitidos, ficará a sua responsabilidade.
|
138
|
+
# Basta você sobrescrever os métodos de validação:
|
139
|
+
#
|
140
|
+
# class Bradesco < BoletoBancario::Core::Bradesco
|
141
|
+
# def self.tamanho_maximo_agencia
|
142
|
+
# 5
|
143
|
+
# end
|
144
|
+
#
|
145
|
+
# def self.tamanho_maximo_conta_corrente
|
146
|
+
# 6
|
147
|
+
# end
|
148
|
+
#
|
149
|
+
# def self.tamanho_maximo_numero_documento
|
150
|
+
# 9
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# def self.tamanho_maximo_carteira
|
154
|
+
# 2
|
155
|
+
# end
|
156
|
+
# end
|
157
|
+
#
|
158
|
+
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
159
|
+
# Você precisará analisar o efeito no #codigo_de_barras, #nosso_numero e na
|
160
|
+
# #linha_digitável (ambos podem ser sobreescritos também).
|
161
|
+
#
|
162
|
+
validates :digito_agencia, length: { maximum: 1 }
|
163
|
+
validates :digito_conta_corrente, length: { maximum: 1 }
|
164
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
165
|
+
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
|
166
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
167
|
+
validates :carteira, length: { maximum: tamanho_maximo_carteira }, if: :deve_validar_carteira?
|
168
|
+
|
169
|
+
# @return [String] 7 caracteres
|
170
|
+
#
|
171
|
+
def conta_corrente
|
172
|
+
@conta_corrente.to_s.rjust(7, '0') if @conta_corrente.present?
|
173
|
+
end
|
174
|
+
|
175
|
+
# @return [String] 4 caracteres
|
176
|
+
#
|
177
|
+
def agencia
|
178
|
+
@agencia.to_s.rjust(4, '0') if @agencia.present?
|
179
|
+
end
|
180
|
+
|
181
|
+
# @return [String] 11 caracteres
|
182
|
+
#
|
183
|
+
def numero_documento
|
184
|
+
@numero_documento.to_s.rjust(11, '0') if @numero_documento.present?
|
185
|
+
end
|
186
|
+
|
187
|
+
# @return [String] 2 caracteres
|
188
|
+
#
|
189
|
+
def carteira
|
190
|
+
@carteira.to_s.rjust(2, '0') if @carteira.present?
|
191
|
+
end
|
192
|
+
|
193
|
+
# Número da Carteira de Cobrança, que a empresa opera no Banco.
|
194
|
+
# No caso da Cobrança Interna será:
|
195
|
+
#
|
196
|
+
# 21 – Cobrança Interna Com Registro
|
197
|
+
# 22 – Cobrança Interna sem registro
|
198
|
+
#
|
199
|
+
# Para as demais carteiras, retornar o número da carteira.
|
200
|
+
#
|
201
|
+
def carteira_formatada
|
202
|
+
if cobranca_interna_formatada.present?
|
203
|
+
cobranca_interna_formatada
|
204
|
+
else
|
205
|
+
carteira
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# @return [String] Código do Banco descrito na documentação.
|
210
|
+
#
|
211
|
+
def codigo_banco
|
212
|
+
'237'
|
213
|
+
end
|
214
|
+
|
215
|
+
# Dígito do código do banco. Precisa mostrar esse dígito no boleto.
|
216
|
+
#
|
217
|
+
# @return [String] Dígito do código do banco descrito na documentação.
|
218
|
+
#
|
219
|
+
def digito_codigo_banco
|
220
|
+
'2'
|
221
|
+
end
|
222
|
+
|
223
|
+
# Campo preenchido com:
|
224
|
+
#
|
225
|
+
# - Agência com 4 caracteres - digito da agência / Conta de Cobrança com 7 caracteres - Digito da Conta
|
226
|
+
#
|
227
|
+
# Exemplo: 9999-D/9999999-D
|
228
|
+
#
|
229
|
+
# Obs.: Preencher com zeros a Esquerda quando necessário.
|
230
|
+
#
|
231
|
+
# @return [String] Agência e Código do Cedente que será exibido no boleto
|
232
|
+
#
|
233
|
+
def agencia_codigo_cedente
|
234
|
+
"#{agencia}-#{digito_agencia} / #{conta_corrente}-#{digito_conta_corrente}"
|
235
|
+
end
|
236
|
+
|
237
|
+
# Nosso Número descrito na documentação (Pag. 53).
|
238
|
+
#
|
239
|
+
# Carteira com 2 (dois) caracteres / N.Número com 11 (onze) caracteres + digito.
|
240
|
+
#
|
241
|
+
# Exemplo: 99 / 99999999999-D
|
242
|
+
#
|
243
|
+
def nosso_numero
|
244
|
+
"#{carteira}/#{numero_documento}-#{digito_nosso_numero}"
|
245
|
+
end
|
246
|
+
|
247
|
+
# Para o cálculo do dígito, será necessário acrescentar o número da carteira à esquerda
|
248
|
+
# antes do Nosso Número (número do documento), e aplicar o módulo 11, com fatores de 2 a 7.
|
249
|
+
#
|
250
|
+
# Para mais detalhes de como o cálculo é feito veja a classe Modulo11FatorDe2a7.
|
251
|
+
#
|
252
|
+
# @return [String] Retorno do cálculo do módulo 11 na base 7 (2,3,4,5,6,7)
|
253
|
+
#
|
254
|
+
def digito_nosso_numero
|
255
|
+
Modulo11FatorDe2a7.new("#{carteira}#{numero_documento}")
|
256
|
+
end
|
257
|
+
|
258
|
+
# === Código de barras do banco
|
259
|
+
#
|
260
|
+
# ___________________________________________________________________________________________________
|
261
|
+
# | Posição | Tamanho | Descrição |
|
262
|
+
# |----------|---------|-----------------------------------------------------------------------------|
|
263
|
+
# | 20-23 | 04 | Agência (Sem o digito, completar com zeros a esquerda se necessário) |
|
264
|
+
# | 24-25 | 02 | Carteira |
|
265
|
+
# | 26-36 | 11 | Número do Documento - Número do Nosso Número (Sem o digito verificador) |
|
266
|
+
# | 37-43 | 07 | Conta Corrente (Sem o digito, completar com zeros a esquerda se necessário) |
|
267
|
+
# | 44 | 01 | Zero |
|
268
|
+
# ----------------------------------------------------------------------------------------------------
|
269
|
+
#
|
270
|
+
def codigo_de_barras_do_banco
|
271
|
+
"#{agencia}#{carteira}#{numero_documento}#{conta_corrente}0"
|
272
|
+
end
|
273
|
+
|
274
|
+
# @api private
|
275
|
+
# Retorna a mensagem que devera aparecer no campo carteira para cobranca interna.
|
276
|
+
#
|
277
|
+
# @return [String]
|
278
|
+
#
|
279
|
+
def cobranca_interna_formatada
|
280
|
+
cobranca_interna = { '21' => '21 – Cobrança Interna Com Registro', '22' => '22 – Cobrança Interna sem registro' }
|
281
|
+
cobranca_interna[carteira.to_s]
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|