boleto_bancario 0.0.1.beta

Sign up to get free protection for your applications and to get access to all the features.
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