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,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