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
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color -f d
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.9.3@boleto_bancario --create
@@ -0,0 +1,6 @@
1
+ # development
2
+
3
+ * Implementado Banco do Brasil.
4
+ * Implementado Santander.
5
+ * Implementado Bradesco.
6
+ * Implementado Itaú.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Tomas D'Stefano http://successoft.com
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Planning.markdown ADDED
@@ -0,0 +1,131 @@
1
+ # BoletoBancario
2
+
3
+ Emissão de Boletos Bancários em Ruby. Simples, fácil e principalmente, flexível.
4
+
5
+ ## Alternativas
6
+
7
+ Essa biblioteca é baseada em outras **ótimas** bibliotecas (**Recomendo analisar muito bem cada solução e usar a que resolver o seu problema!**):
8
+
9
+ * Stella Caelum [http://stella.caelum.com.br/](http://stella.caelum.com.br/)
10
+ * Novo Gateway de Pagamentos da Locaweb [http://www.locaweb.com.br/produtos/gateway-pagamento.html](http://www.locaweb.com.br/produtos/gateway-pagamento.html)
11
+ * Brcobranca [https://github.com/kivanio/brcobranca](https://github.com/kivanio/brcobranca)
12
+ * Boleto Php [http://boletophp.com.br/](http://boletophp.com.br/)
13
+ * Gem de Boleto Bancário (essa gem) [https://github.com/tomas-stefano/boleto_bancario](https://github.com/tomas-stefano/boleto_bancario)
14
+
15
+ ## Instalação
16
+
17
+ gem install boleto_bancario
18
+
19
+ ## Bancos Suportados
20
+
21
+ * TODO: Precisa escrever essa parte
22
+
23
+ ## Usage
24
+
25
+ Você pode usar as próprias classes da gem, porém, **recomendo criar uma subclasse** para os bancos que você gostaria de desenvolver.
26
+
27
+ Exemplo:
28
+
29
+ ```ruby
30
+ class Itau < BoletoBancario::Itau
31
+ end
32
+
33
+ class Santander < BoletoBancario::Santander
34
+ end
35
+
36
+ class Bradesco < BoletoBancario::Bradesco
37
+ end
38
+
39
+ class BancoBrasil < BoletoBancario::BancoBrasil
40
+ end
41
+ ```
42
+
43
+ ## Attributos
44
+
45
+ * TODO: Precisa escrever essa parte
46
+
47
+ ## Internacionalização (i18n)
48
+
49
+ * TODO: Precisa escrever essa parte
50
+
51
+ ## Validações
52
+
53
+ * TODO: Precisa escrever essa parte
54
+
55
+ ## Código do Banco
56
+
57
+ * TODO: Precisa escrever essa parte
58
+
59
+ ## Agência / Código do Cedente
60
+
61
+ * TODO: Precisa escrever essa parte
62
+
63
+ ## Nosso Número
64
+
65
+ * TODO: Precisa escrever essa parte
66
+
67
+ ## Código de Barras
68
+
69
+ * TODO: Precisa escrever essa parte
70
+
71
+ ## Linha digitável
72
+
73
+ * TODO: Precisa escrever essa parte
74
+
75
+ ## Documentação
76
+
77
+ * TODO: Precisa escrever essa parte
78
+
79
+ ## Formatos
80
+
81
+ * TODO: Essa parte ainda pode mudar até a versão 0.0.1.
82
+
83
+ HTML 5 é o formato suportado por enquanto. Para usar em Html, você precisa usar a gem **[boleto_bancario_html](https://github.com/tomas-stefano/boleto_bancario_html)**:
84
+
85
+ gem install boleto_bancario_html
86
+
87
+ E colocar na classe:
88
+
89
+ ```ruby
90
+ class Itau < BoletoBancario::Itau
91
+ def format
92
+ BoletoBancario::HTML5
93
+ end
94
+ end
95
+ ```
96
+
97
+ Para renderizar o html:
98
+
99
+ ```ruby
100
+ itau = Itau.new
101
+
102
+ itau.render # Irá chamar o método render da instância do objeto passado no método format.
103
+ ```
104
+
105
+ ### Criando um novo Formato
106
+
107
+ Em relação a parte de formatos a gem de boleto bancário é extremamente flexível.
108
+
109
+ Basta criar um objeto que responda ao método **render**:
110
+
111
+ ```ruby
112
+ module BoletoBancario
113
+ module Formato
114
+ class Pdf < Boleto
115
+ def render(*args)
116
+ # ...
117
+ end
118
+ end
119
+ end
120
+ end
121
+ ```
122
+
123
+ ## Contribuições
124
+
125
+ Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
126
+
127
+ * Homologando boletos junto ao banco.
128
+ * Fornecendo documentações mais atualizadas dos Bancos.
129
+ * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
130
+ * Refatorando código!!
131
+ * Fornecendo Feedback construtivo! (Sempre bem vindo!)
data/README.markdown ADDED
@@ -0,0 +1,208 @@
1
+ # BoletoBancario
2
+
3
+ Emissão de Boletos Bancários em Ruby.
4
+
5
+ Foi colocado um esforço enorme para tornar a gem **simples e principalmente, flexível**.
6
+
7
+ ## Versão Beta
8
+
9
+ Essa gem ainda está em versão beta. Algumas coisas podem mudar até que a versão oficial seja lançada.
10
+
11
+ ## Alternativas
12
+
13
+ Essa biblioteca é baseada em outras **ótimas** bibliotecas.
14
+ **Recomendo analisar muito bem cada solução**:
15
+
16
+ * Stella Caelum [http://stella.caelum.com.br/](http://stella.caelum.com.br/)
17
+ * Novo Gateway de Pagamentos da Locaweb [http://www.locaweb.com.br/produtos/gateway-pagamento.html](http://www.locaweb.com.br/produtos/gateway-pagamento.html)
18
+ * Brcobranca [https://github.com/kivanio/brcobranca](https://github.com/kivanio/brcobranca)
19
+ * Boleto Php [http://boletophp.com.br/](http://boletophp.com.br/)
20
+ * Gem de Boleto Bancário (essa gem) [https://github.com/tomas-stefano/boleto_bancario](https://github.com/tomas-stefano/boleto_bancario)
21
+
22
+ ## Instalação
23
+
24
+ gem install boleto_bancario
25
+
26
+ ## Documentação
27
+
28
+ Seguimos todas as documentações que estão dentro do repositório:
29
+
30
+ * [Bradesco](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/bradesco)
31
+ * [Banco do Brasil](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/banco_brasil)
32
+ * [Itaú](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/itau)
33
+ * [Santander](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/santander)
34
+
35
+ Se você tiver uma documentação do boleto, **mais atualizada**, venha contribuir para a gem. :)
36
+
37
+ ## Bancos Suportados
38
+
39
+ Para todos os bancos e carteiras implementadas, **seguimos as documentações** que estão dentro do repositório:
40
+
41
+ <table>
42
+ <tr>
43
+ <th>Nome do Banco</th>
44
+ <th>Carteiras Suportadas</th>
45
+ <th>Testada/Homologada no banco</th>
46
+ </tr>
47
+ <tr>
48
+ <td>Banco do Brasil</td>
49
+ <td>
50
+ 12 com código do cedente de 6 dígitos,
51
+ 16 e 18 com código do cedente de 4 dígitos,
52
+ 16 e 18 com código do cedente e nosso número de 17 dígitos,
53
+ 16 e 18 com código do cedente de 6 dígitos,
54
+ 16, 17 e 18 código do cedente de 7 e 8 dígitos.
55
+ </td>
56
+ <td>Esperando Contribuição</td>
57
+ </tr>
58
+ <tr>
59
+ <td>Itaú</td>
60
+ <td>107, 109, 122, 142, 143, 126, 174, 175, 196, 198, 131, 146, 150, 168.</td>
61
+ <td>Esperando Contribuição</td>
62
+ </tr>
63
+ <tr>
64
+ <td>Bradesco</td>
65
+ <td>03, 06, 09, 19, 21, 22.</td>
66
+ <td>Esperando Contribuição</td>
67
+ </tr>
68
+ <tr>
69
+ <td>Santander</td>
70
+ <td>101, 102, 121.</td>
71
+ <td>Esperando Contribuição</td>
72
+ </tr>
73
+ </table>
74
+
75
+ **OBS.: Caso a homologação seja aceita junto ao banco, contribua e mude a seção acima. Caso recuse alguma carteira acima, por favor me avise, para tirar dessa lista.**
76
+
77
+ ## Homologação no Banco
78
+
79
+ Uma ótima forma de contribuir para a gem, é validar junto ao banco os boletos implementados acima.
80
+
81
+ ## Usage
82
+
83
+ Você pode usar as próprias classes da gem, porém, **recomendo criar uma subclasse** para os bancos que você gostaria de desenvolver.
84
+
85
+ ### Exemplo
86
+
87
+ ```ruby
88
+ class BoletoItau < BoletoBancario::Itau
89
+ end
90
+
91
+ class BoletoSantander < BoletoBancario::Santander
92
+ end
93
+
94
+ class BoletoBradesco < BoletoBancario::Bradesco
95
+ end
96
+
97
+ class BoletoBancoBrasil < BoletoBancario::BancoBrasil
98
+ end
99
+ ```
100
+
101
+ Segue os attributos dos boletos:
102
+
103
+ * Agência
104
+ * Dígito da agência
105
+ * Conta Corrente
106
+ * Dígito da Conta Corrente
107
+ * Carteira
108
+ * Cedente
109
+ * Código do Cedente
110
+ * Documento do Cedente
111
+ * Endereço do Cedente
112
+ * Sacado
113
+ * Documento do Sacado
114
+ * Código da Moeda
115
+ * Data do documento
116
+ * Data do vencimento
117
+ * Número do documento
118
+ * Valor do documento (valor do boleto)
119
+ * Espécie
120
+ * Espécie do documento
121
+
122
+ ### Criando os boletos / Validações
123
+
124
+ Agora você pode emitir um boleto, **usando a classe criada no exemplo acima**:
125
+
126
+ BoletoItau.new(conta_corrente: '89755', agencia: '0097', :carteira => '195')
127
+
128
+ Você pode usar blocos se quiser:
129
+
130
+ BoletoItau.new do |boleto|
131
+ boleto_itau.conta_corrente = '89755'
132
+ boleto_itau.digito_conta_corrente = '1'
133
+ boleto_itau.agencia = '0097'
134
+ boleto_itau.carteira = '198'
135
+ boleto_itau.cedente = 'Razao Social da Empresa'
136
+ boleto_itau.codigo_cedente = '90901'
137
+ boleto_itau.endereco_cedente = 'Rua nome da rua, 9999'
138
+ boleto_itau.numero_documento = '12345678'
139
+ boleto_itau.sacado = 'Nome do Sacado'
140
+ boleto_itau.documento_sacado = '35433793990'
141
+ boleto_itau.data_vencimento = Date.tomorrow
142
+ boleto_itau.valor_documento = 31678.99
143
+ boleto_itau.seu_numero = 1234
144
+ end
145
+
146
+ **Cada banco possui suas próprias validações de campo e de tamanho**.
147
+ Primeiramente, **antes de renderizar qualquer boleto você precisar verificar se esse o boleto é válido**.
148
+
149
+ if boleto_itau.valid?
150
+ # Renderiza o boleto itau
151
+ else
152
+ # Trata os erros
153
+ end
154
+
155
+ ### Campos do Boleto
156
+
157
+ Segue abaixo os métodos para serem chamados, no momento de renderizar os boletos. Os campos são de mesmo nome:
158
+
159
+ boleto_itau.codigo_banco_formatado # Retorna o código do banco, junto com seu dígito
160
+
161
+ boleto_itau.codigo_de_barras
162
+
163
+ boleto_itau.linha_digitavel
164
+
165
+ boleto_itau.nosso_numero
166
+
167
+ boleto_itau.agencia_codigo_cedente
168
+
169
+ boleto_itau.carteira_formatada # Formata a carteira, para mostrar no boleto.
170
+
171
+ boleto_itau.numero_documento
172
+
173
+ boleto_itau.valor_documento
174
+
175
+ boleto_itau.especie
176
+
177
+ boleto_itau.especie_documento
178
+
179
+ ## Sobrescrevendo comportamentos
180
+
181
+ Você pode sobrescrever os comportamentos na subclasse.
182
+
183
+ Por exemplo, imagine que você quer sobrescrever a forma como é tratada a segunda parte do código de barras.
184
+ **Seguindo a interface da classe BoletoBancario::Boleto** fica bem simples:
185
+
186
+ class BoletoItau < BoletoBancario::Itau
187
+ def codigo_de_barras_do_banco
188
+ # Sua implementação ...
189
+ end
190
+ end
191
+
192
+ ## O que a gem não faz
193
+
194
+ A gem não trata os arquivos de remessa e os arquivos de retorno do banco.
195
+
196
+ Na minha opinião não deveria ser responsabilidade dessa gem.
197
+ Essa gem **apenas emite o boleto**, com todas as informações necessárias para o pagamento.
198
+
199
+ ## Contribuições
200
+
201
+ Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
202
+
203
+ * Homologando boletos junto ao banco.
204
+ * Fornecendo documentações mais atualizadas dos Bancos.
205
+ * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
206
+ * Refatorando código!!
207
+ * Fornecendo Feedback construtivo! (Sempre bem vindo!)
208
+
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ require 'bundler/gem_tasks'
3
+ require 'yard'
4
+
5
+ desc 'Generate documentation'
6
+ YARD::Rake::YardocTask.new do |t|
7
+ t.files = ['lib/**/*.rb', '-', 'LICENSE']
8
+ t.options = ['--main', 'README.markdown', '--no-private', '--title', "Boleto Bancário #{BoletoBancario::VERSION}"]
9
+ end
data/TODO.markdown ADDED
@@ -0,0 +1,5 @@
1
+ * Colocar exemplos melhores na documentação de cada banco.
2
+ * Nos exemplos de cada banco colocar os métodos que são chamados pelo objeto.
3
+ * Verificar as validações e suas mensagens de erro.
4
+ * Internacionalização / Locales.
5
+ * Verificar a questão dos formatos (html, pdf).
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/boleto_bancario/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Tomas D'Stefano"]
6
+ gem.email = ["tomas_stefano@successoft.com"]
7
+ gem.description = %q{Emissão de Boletos Bancários em Ruby}
8
+ gem.summary = %q{Emissão de Boletos Bancários em Ruby}
9
+ gem.homepage = "https://github.com/tomas-stefano/boleto_bancario"
10
+
11
+ gem.files = `git ls-files`.split($\).reject { |f| File.extname(f) == '.pdf' }
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "boleto_bancario"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = BoletoBancario::VERSION
17
+
18
+ gem.add_dependency "activesupport", "~> 3.2"
19
+ gem.add_dependency "activemodel", "~> 3.2"
20
+ gem.add_development_dependency "rspec", "~> 2.11"
21
+ gem.add_development_dependency "valid_attribute", "~> 1.3"
22
+ gem.add_development_dependency "pry", "~> 0.9"
23
+ gem.add_development_dependency "simplecov", "~> 0.2"
24
+ gem.add_development_dependency "simplecov-html", "~> 0.7"
25
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/enumerable'
3
+
4
+ module BoletoBancario
5
+ module Calculos
6
+ # Classe responsável por lidar com os dígitos dos módulos.
7
+ #
8
+ class Digitos
9
+ # @param [Integer] number Número que servirá para os cálculo com os dígitos desse número.
10
+ #
11
+ def initialize(number)
12
+ @number = number
13
+ end
14
+
15
+ # Soma cada dígito do número passado no #initialize.
16
+ # Alguns bancos requerem esse tipo estranho de cálculo em alguns módulos.
17
+ # @return [Fixnum] Resultado da soma de cada dígito.
18
+ #
19
+ # @example
20
+ #
21
+ # Digitos.new(12).sum
22
+ # # => 3
23
+ #
24
+ # Digitos.new(2244).sum
25
+ # # => 12
26
+ #
27
+ # Digitos.new(90123451).sum
28
+ # # => 25
29
+ #
30
+ def sum
31
+ @number.to_s.split('').collect { |number| number.to_i }.sum
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Calculos
4
+ # Classe responsável pelo cálculo de Fator de Vencimento do boleto bancário.
5
+ #
6
+ # === Descricão
7
+ #
8
+ # Conforme Carta-circular 002926 do Banco Central do Brasil, de 24/07/2000, recomenda-se a indicação do Fator de Vencimento no Código de Barras.
9
+ # A partir de 02/04/2001, o Banco acolhedor/recebedor não será mais responsável por eventuais diferenças de recebimento de BOLETOs fora do prazo,
10
+ # ou sem a indicação do fator de vencimento.
11
+ #
12
+ # === Forma para obtenção do Fator de Vencimento
13
+ #
14
+ # Calcula-se <b>o número de dias corridos</b> entre a data base (<b>“Fixada” em 07/10/1997</b>) e a do vencimento desejado:
15
+ #
16
+ # Vencimento desejado: 04/07/2000
17
+ # Data base : - 07/10/1997
18
+ # # => 1001
19
+ #
20
+ # === Atenção
21
+ #
22
+ # Caso ocorra divergência entre a data impressa no campo “data de vencimento” e a constante no código de barras,
23
+ # o recebimento se dará da seguinte forma:
24
+ #
25
+ # * Quando pago por sistemas eletrônicos (Home-Banking, Auto-Atendimento, Internet, SISPAG, telefone, etc.), prevalecerá à representada no “código de barras”;
26
+ # * Quando quitado na rede de agências, diretamente no caixa, será considerada a data impressa no campo “vencimento” do BOLETO.
27
+ #
28
+ # @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
29
+ #
30
+ # @example
31
+ #
32
+ # FatorVencimento.new(Date.parse("2012-12-02"))
33
+ # #=> "5535"
34
+ #
35
+ # FatorVencimento.new(Date.parse("1997-10-08"))
36
+ # #=> "0001"
37
+ #
38
+ # FatorVencimento.new(Date.parse("2012-12-16"))
39
+ # #=> "5549"
40
+ #
41
+ # FatorVencimento.new(Date.parse("2014-12-15"))
42
+ # #=> "6278"
43
+ #
44
+ class FatorVencimento < String
45
+ attr_reader :base_date
46
+ # @param [Date] expiration_date
47
+ # @param [Date] base_date
48
+ # @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
49
+ # @example
50
+ # FatorVencimento.new(Date.parse("2012-09-02"))
51
+ # #=> "5444"
52
+ #
53
+ # FatorVencimento.new(Date.parse("1999-10-01"))
54
+ # #=> "0724"
55
+ #
56
+ # FatorVencimento.new(Date.parse("2022-12-16"))
57
+ # #=> "9201"
58
+ #
59
+ def initialize(expiration_date, base_date = Date.new(1997, 10, 7))
60
+ @base_date = base_date
61
+ @expiration_date = expiration_date
62
+
63
+ if @expiration_date.present?
64
+ super(calculate)
65
+ end
66
+ end
67
+
68
+ # Cálculo da data de vencimento com a data base.
69
+ #
70
+ # @return [String] exatamente 4 dígitos
71
+ #
72
+ def calculate
73
+ expiration_date_minus_base_date.to_s.rjust(4, '0')
74
+ end
75
+
76
+ # @api private
77
+ #
78
+ # Cálculo da data de vencimento com a data base.
79
+ # Chamando #to_i para não retornar um Float.
80
+ # @return [Integer] diff between this two dates.
81
+ #
82
+ def expiration_date_minus_base_date
83
+ (@expiration_date - @base_date).to_i
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Calculos
4
+ # Classe responsável por multiplicar cada dígito pelos fatores de multiplicação passado como argumento.
5
+ #
6
+ # Imagine que temos o número <b>'2468'</b> e os fatores de multiplicação <b>[2, 1]</b>.
7
+ #
8
+ # Será calculado da seguinte maneira:
9
+ #
10
+ # 2 4 6 8
11
+ # * * * * ===> Multiplicação
12
+ # 1 2 1 2
13
+ #
14
+ # #=> [2, 8, 6, 16]
15
+ #
16
+ # Você pode passar outros fatores de multiplicação se você precisar.
17
+ # Por exemplo, dado o número '1234567890' e os fatores de multiplicação: <b>[2, 3, 4, 5, 6, 7, 8, 9]</b>.
18
+ # Será calculado da seguinte maneira:
19
+ #
20
+ # 1 2 3 4 5 6 7 8 9 0
21
+ # * * * * * * * * * *
22
+ # 3 2 9 8 7 6 5 4 3 2
23
+ #
24
+ # #=> [3, 4, 27, 32, 35, 36, 35, 32, 27, 0]
25
+ #
26
+ # @param [String] O número que será usado para multiplicar cada dígito.
27
+ # @param [Hash] Os fatores de multiplicação que irão ser calculados na ordem reversa.
28
+ #
29
+ # @example Calculo
30
+ #
31
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 1])
32
+ # # => [1, 2, 6]
33
+ #
34
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
35
+ # # => [4, 6, 6]
36
+ #
37
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(809070608090, fatores: [9, 8, 7, 6, 5, 4, 3, 2])
38
+ # # => [48, 0, 72, 0, 14, 0, 24, 0, 48, 0, 72, 0]
39
+ #
40
+ class FatoresDeMultiplicacao < Array
41
+ # @param [String || Integer] number
42
+ # @param [Hash] options
43
+ # @option options [Array] :fatores
44
+ # @return [Array]
45
+ # @example
46
+ #
47
+ # FatoresDeMultiplicacao.new(12, fatores: [2, 1])
48
+ # # => [1, 4]
49
+ #
50
+ # FatoresDeMultiplicacao.new(1864, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
51
+ # # => [5, 32, 18, 8]
52
+ #
53
+ def initialize(number, options)
54
+ @number = number.to_s.reverse.split('')
55
+ @factors = options.fetch(:fatores).cycle.take(@number.size)
56
+ super(calculate)
57
+ end
58
+
59
+ # Para cada número realiza a multiplicação para cada dígito.
60
+ # @return [Array]
61
+ #
62
+ def calculate
63
+ @number.collect.each_with_index { |n, index| n.to_i * @factors[index] }.reverse
64
+ end
65
+ end
66
+ end
67
+ end