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