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
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color -f d
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@boleto_bancario --create
|
data/Changelog.markdown
ADDED
data/Gemfile
ADDED
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
|
Binary file
|
@@ -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
|