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
@@ -0,0 +1,274 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BoletoBancario
|
3
|
+
module Core
|
4
|
+
# Implementação de emissão de boleto bancário pelo Santander.
|
5
|
+
#
|
6
|
+
# === Documentação Implementada
|
7
|
+
#
|
8
|
+
# A documentação na qual essa implementação foi baseada está localizada na pasta
|
9
|
+
# 'documentacoes_dos_boletos/santander' dentro dessa biblioteca.
|
10
|
+
#
|
11
|
+
# === Contrato das classes de emissão de boletos
|
12
|
+
#
|
13
|
+
# Para ver o "<b>contrato</b>" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
|
14
|
+
# a classe BoletoBancario::Core::Boleto.
|
15
|
+
#
|
16
|
+
# === Carteiras suportadas
|
17
|
+
#
|
18
|
+
# Segue abaixo as carteiras suportadas do itáu <b>seguindo a documentação</b>:
|
19
|
+
#
|
20
|
+
# _________________________________________________________________________
|
21
|
+
# | Carteira | Descrição | Testada/Homologada no banco |
|
22
|
+
# | 101 | Cobrança Simples com registro | Esperando Contribuição |
|
23
|
+
# | 102 | Cobrança Simples sem registro | Esperando Contribuição |
|
24
|
+
# | 121 | Penhor Rápida com registro | Esperando Contribuição |
|
25
|
+
# --------------------------------------------------------------------------
|
26
|
+
#
|
27
|
+
# <b>OBS.: Seja um contribuidor dessa gem. Contribua para homologar os boletos e as
|
28
|
+
# devidas carteiras junto ao banco Santander.</b>
|
29
|
+
#
|
30
|
+
# === Validações
|
31
|
+
#
|
32
|
+
# Caso você queira <b>desabilitar todas as validações</b>, existem alguns métodos que você pode sobrescrever
|
33
|
+
# na subclasse que você irá criar. No exemplo abaixo, desabilitará todas as validações:
|
34
|
+
#
|
35
|
+
# class Santander < BoletoBancario::Santander
|
36
|
+
# def deve_validar_agencia?
|
37
|
+
# false
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# def deve_validar_codigo_cedente?
|
41
|
+
# false
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# def deve_validar_numero_documento?
|
45
|
+
# false
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# def deve_validar_carteira?
|
49
|
+
# false
|
50
|
+
# end
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# <b>OBS.:</b> Muito cuidado ao desabilitar as validações, pois poderá ocorrer problemas no código de barras e na
|
54
|
+
# linha digitável. Ambos os métodos podem ser sobrescritos se você quiser também.
|
55
|
+
#
|
56
|
+
class Santander < Boleto
|
57
|
+
# Campo IOF que será mostrado no código de barras.
|
58
|
+
# Padrão é 0 (zero), conforme a documentação do Santander.
|
59
|
+
# Para mais detalhes veja o método #iof.
|
60
|
+
#
|
61
|
+
attr_accessor :iof
|
62
|
+
|
63
|
+
# Tamanho máximo de uma agência no Banco Bradesco.
|
64
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
65
|
+
#
|
66
|
+
# @return [Fixnum] 4
|
67
|
+
#
|
68
|
+
def self.tamanho_maximo_agencia
|
69
|
+
4
|
70
|
+
end
|
71
|
+
|
72
|
+
# Tamanho máximo do número do documento emitido no Boleto.
|
73
|
+
# O tamanho máximo é justamente 8 porque no código de barras só é permitido 8 posições para este campo.
|
74
|
+
#
|
75
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
76
|
+
#
|
77
|
+
# @return [Fixnum] 11
|
78
|
+
#
|
79
|
+
def self.tamanho_maximo_numero_documento
|
80
|
+
12
|
81
|
+
end
|
82
|
+
|
83
|
+
# Tamanho máximo da carteira.
|
84
|
+
# O tamanho máximo é justamente 2 porque no código de barras só é permitido 2 posições para este campo.
|
85
|
+
#
|
86
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
87
|
+
#
|
88
|
+
# @return [Fixnum] 2
|
89
|
+
#
|
90
|
+
def self.tamanho_maximo_carteira
|
91
|
+
3
|
92
|
+
end
|
93
|
+
|
94
|
+
# Tamanho máximo do código do cedente emitido no Boleto.
|
95
|
+
# O tamanho máximo é justamente 7 porque no código de barras só é permitido 7 posições para este campo.
|
96
|
+
#
|
97
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
98
|
+
#
|
99
|
+
# @return [Fixnum] 7
|
100
|
+
#
|
101
|
+
def self.tamanho_maximo_codigo_cedente
|
102
|
+
7
|
103
|
+
end
|
104
|
+
|
105
|
+
# Validações de tamanho para os campos abaixo:
|
106
|
+
#
|
107
|
+
# * Número do documento
|
108
|
+
# * Conta Corrente
|
109
|
+
# * Agencia
|
110
|
+
# * Carteira
|
111
|
+
#
|
112
|
+
# Se você quiser sobrescrever os tamanhos permitidos, <b>ficará a sua responsabilidade.</b>
|
113
|
+
# Basta você sobrescrever os métodos de validação:
|
114
|
+
#
|
115
|
+
# class Santander < BoletoBancario::Core::Santander
|
116
|
+
# def self.tamanho_maximo_agencia
|
117
|
+
# 5
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# def self.tamanho_maximo_codigo_cedente
|
121
|
+
# 8
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# def self.tamanho_maximo_numero_documento
|
125
|
+
# 9
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
#
|
129
|
+
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
130
|
+
# Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
|
131
|
+
# sobreescritos também).
|
132
|
+
#
|
133
|
+
validates :agencia, :codigo_cedente, presence: true
|
134
|
+
|
135
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
136
|
+
validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
|
137
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
138
|
+
validates :carteira, length: { maximum: tamanho_maximo_carteira }, if: :deve_validar_carteira?
|
139
|
+
|
140
|
+
# @return [String] 4 caracteres
|
141
|
+
#
|
142
|
+
def agencia
|
143
|
+
@agencia.to_s.rjust(4, '0') if @agencia.present?
|
144
|
+
end
|
145
|
+
|
146
|
+
# @return [String] 7 caracteres
|
147
|
+
#
|
148
|
+
def codigo_cedente
|
149
|
+
@codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
|
150
|
+
end
|
151
|
+
|
152
|
+
# @return [String] 12 caracteres
|
153
|
+
#
|
154
|
+
def numero_documento
|
155
|
+
@numero_documento.to_s.rjust(12, '0') if @numero_documento.present?
|
156
|
+
end
|
157
|
+
|
158
|
+
# @return [String] 3 caracteres
|
159
|
+
#
|
160
|
+
def carteira
|
161
|
+
@carteira.to_s.rjust(3, '0') if @carteira.present?
|
162
|
+
end
|
163
|
+
|
164
|
+
# Formata a carteira dependendo se ela é registrada ou não.
|
165
|
+
#
|
166
|
+
# Para cobrança COM registro usar: <b>COBRANCA SIMPLES ECR</b>
|
167
|
+
#
|
168
|
+
# Para Cobrança SEM registro usar: <b>COBRANCA SIMPLES CSR</b>
|
169
|
+
#
|
170
|
+
# @return [String]
|
171
|
+
#
|
172
|
+
def carteira_formatada
|
173
|
+
if @carteira.to_s.in?(carteiras_com_registro)
|
174
|
+
"COBRANÇA SIMPLES ECR"
|
175
|
+
else
|
176
|
+
'COBRANÇA SIMPLES CSR'
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Retorna as carteiras com registro do banco Santander.
|
181
|
+
# <b>Você pode sobrescrever esse método na subclasse caso exista mais
|
182
|
+
# carteiras com registro no Santander.</b>
|
183
|
+
#
|
184
|
+
# @return [Array]
|
185
|
+
#
|
186
|
+
def carteiras_com_registro
|
187
|
+
%w(101 121)
|
188
|
+
end
|
189
|
+
|
190
|
+
# @return [String] Código do Banco descrito na documentação.
|
191
|
+
#
|
192
|
+
def codigo_banco
|
193
|
+
'033'
|
194
|
+
end
|
195
|
+
|
196
|
+
# Dígito do código do banco. Precisa mostrar esse dígito no boleto.
|
197
|
+
#
|
198
|
+
# @return [String] Dígito do código do banco descrito na documentação.
|
199
|
+
#
|
200
|
+
def digito_codigo_banco
|
201
|
+
'7'
|
202
|
+
end
|
203
|
+
|
204
|
+
# Campo Agência / Código do Cedente (Número fornecido pelo Banco)
|
205
|
+
#
|
206
|
+
# @return [String]
|
207
|
+
#
|
208
|
+
def agencia_codigo_cedente
|
209
|
+
"#{agencia}-#{digito_agencia} / #{codigo_cedente}"
|
210
|
+
end
|
211
|
+
|
212
|
+
# Mostra o campo nosso número calculando o dígito verificador do nosso número.
|
213
|
+
#
|
214
|
+
# @return [String]
|
215
|
+
#
|
216
|
+
def nosso_numero
|
217
|
+
"#{numero_documento}-#{digito_nosso_numero}"
|
218
|
+
end
|
219
|
+
|
220
|
+
# Calcula o dígito do nosso número pelo Módulo 11 fator de 2 a 9 verificando o resto como zero.
|
221
|
+
# Para mais detalhes veja a classe <b>BoletoBancario::Calculos::Modulo11FatorDe2a9RestoZero</b>.
|
222
|
+
#
|
223
|
+
# @return [String]
|
224
|
+
#
|
225
|
+
def digito_nosso_numero
|
226
|
+
Modulo11FatorDe2a9RestoZero.new(numero_documento)
|
227
|
+
end
|
228
|
+
|
229
|
+
# === Código de barras do banco
|
230
|
+
#
|
231
|
+
# ___________________________________________________________________________________________________
|
232
|
+
# | Posição | Tamanho | Descrição |
|
233
|
+
# |----------|---------|-----------------------------------------------------------------------------|
|
234
|
+
# | 20 | 01 | Fixo '9' |
|
235
|
+
# | 21-27 | 07 | Código do cedente padrão Santander |
|
236
|
+
# | 28-40 | 13 | Nosso Número (veja a observação abaixo) |
|
237
|
+
# | 41 | 01 | IOF (veja o método #iof) |
|
238
|
+
# | 42-44 | 03 | Carteira |
|
239
|
+
# ----------------------------------------------------------------------------------------------------
|
240
|
+
#
|
241
|
+
# <b>OBS.:</b> Caso o arquivo de registro para os títulos seja de 400 bytes (CNAB).
|
242
|
+
# Utilizar somente 08 posições do Nosso Numero (07 posições + DV), zerando os 05 primeiros dígitos.
|
243
|
+
# Utilizar somente 09 posições do Nosso Numero (08 posições + DV), zerando os 04 primeiros dígitos.
|
244
|
+
#
|
245
|
+
# Para utilizar esse número de posições no nosso número é só colocar o tamanho ideal no
|
246
|
+
# numero_documento.
|
247
|
+
# Por exemplo:
|
248
|
+
#
|
249
|
+
# Santander.new(:numero_documento => '1234567') # Irá zerar os 05 primeiros dígitos.
|
250
|
+
# Santander.new(:numero_documento => '12345678') # Irá zerar os 04 primeiros dígitos.
|
251
|
+
#
|
252
|
+
# @return [String]
|
253
|
+
#
|
254
|
+
def codigo_de_barras_do_banco
|
255
|
+
"9#{codigo_cedente}#{numero_documento}#{digito_nosso_numero}#{iof}#{carteira}"
|
256
|
+
end
|
257
|
+
|
258
|
+
# IOF é a sigla de Imposto sobre Operações de Crédito, Câmbio e Seguros,
|
259
|
+
# e é um imposto federal no Brasil.
|
260
|
+
#
|
261
|
+
# Seguradoras (Se 7% informar 7. Limitado a 9%)
|
262
|
+
# <b>Demais clientes usar 0 (zero)</b>
|
263
|
+
# O padrão é zero.
|
264
|
+
#
|
265
|
+
# @return [String]
|
266
|
+
#
|
267
|
+
def iof
|
268
|
+
return @iof.to_s if @iof.present?
|
269
|
+
|
270
|
+
'0'
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'boleto_bancario/version'
|
3
|
+
require 'active_model'
|
4
|
+
require 'active_support/core_ext/class'
|
5
|
+
require 'active_support/core_ext/enumerable'
|
6
|
+
require 'active_support/core_ext/object'
|
7
|
+
require 'active_support/core_ext/string'
|
8
|
+
|
9
|
+
# Copyright (C) 2012 Tomás D'Stefano <http://successoft.com>
|
10
|
+
#
|
11
|
+
# @author Tomás D'Stefano <tomas_stefano@successoft.com>
|
12
|
+
#
|
13
|
+
# == Boleto Bancário
|
14
|
+
#
|
15
|
+
# Emissão de Boletos Bancários em Ruby. Simples e principalmente, flexível.
|
16
|
+
#
|
17
|
+
# Essa biblioteca é baseada em outras <b>ótimas</b> bibliotecas.
|
18
|
+
# Recomendo analisar muito bem cada solução!
|
19
|
+
#
|
20
|
+
# * Novo Gateway de Pagamentos da Locaweb: http://www.locaweb.com.br/produtos/gateway-pagamento.html
|
21
|
+
# * Brcobranca: https://github.com/kivanio/brcobranca
|
22
|
+
# * Boleto Php: http://boletophp.com.br
|
23
|
+
# * Stella Caelum: http://stella.caelum.com.br
|
24
|
+
#
|
25
|
+
# === Coreuições
|
26
|
+
#
|
27
|
+
# Você pode contribuir de N formas. Seguem elas:
|
28
|
+
#
|
29
|
+
# * Homologando os boletos junto aos bancos (Super importante!!! :] ).
|
30
|
+
# * Fornecendo documentações mais atualizadas dos Bancos.
|
31
|
+
# * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
|
32
|
+
# * Refatorando código!! (Sempre bem vindo!)
|
33
|
+
# * Fornecendo Feedback construtivo! (Sempre bem vindo!)
|
34
|
+
#
|
35
|
+
# === Instalação via Rubygems
|
36
|
+
#
|
37
|
+
# gem install boleto_bancario
|
38
|
+
#
|
39
|
+
# === Instalar via Bundler
|
40
|
+
#
|
41
|
+
# Coloque no Gemfile:
|
42
|
+
#
|
43
|
+
# gem 'boleto_bancario'
|
44
|
+
#
|
45
|
+
# Depois de colocar no Gemfile:
|
46
|
+
#
|
47
|
+
# bundle install
|
48
|
+
#
|
49
|
+
module BoletoBancario
|
50
|
+
# Modulo responsável por guardar todas as regras dos campos de
|
51
|
+
# todos os Boletos Bancários. <b>Contribuicões com novas documentações dos
|
52
|
+
# bancos e homologação dos boletos são extremamente bem vindas!</b>
|
53
|
+
#
|
54
|
+
# Esse módulo também é responsável por guardar todas as regras de validação dos boletos e
|
55
|
+
# contém a forma de chamar os objetos necessários para renderização
|
56
|
+
# dos formatos (pdf, html, etc) e internacionalização dos boletos (caso
|
57
|
+
# você precise mudar os nomes dos campos nos boletos)
|
58
|
+
#
|
59
|
+
module Core
|
60
|
+
autoload :Boleto, 'boleto_bancario/core/boleto'
|
61
|
+
autoload :BancoBrasil, 'boleto_bancario/core/banco_brasil'
|
62
|
+
autoload :Bradesco, 'boleto_bancario/core/bradesco'
|
63
|
+
autoload :Itau, 'boleto_bancario/core/itau'
|
64
|
+
autoload :Santander, 'boleto_bancario/core/santander'
|
65
|
+
end
|
66
|
+
|
67
|
+
# Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
|
68
|
+
#
|
69
|
+
module Calculos
|
70
|
+
autoload :FatorVencimento, 'boleto_bancario/calculos/fator_vencimento'
|
71
|
+
autoload :FatoresDeMultiplicacao, 'boleto_bancario/calculos/fatores_de_multiplicacao'
|
72
|
+
autoload :LinhaDigitavel, 'boleto_bancario/calculos/linha_digitavel'
|
73
|
+
autoload :Modulo10, 'boleto_bancario/calculos/modulo10'
|
74
|
+
autoload :Modulo11, 'boleto_bancario/calculos/modulo11'
|
75
|
+
autoload :Modulo11FatorDe2a9, 'boleto_bancario/calculos/modulo11_fator_de2a9'
|
76
|
+
autoload :Modulo11FatorDe2a9RestoZero, 'boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero'
|
77
|
+
autoload :Modulo11FatorDe2a7, 'boleto_bancario/calculos/modulo11_fator_de2a7'
|
78
|
+
autoload :Modulo11FatorDe9a2RestoX, 'boleto_bancario/calculos/modulo11_fator_de9a2_resto_x'
|
79
|
+
autoload :Digitos, 'boleto_bancario/calculos/digitos'
|
80
|
+
end
|
81
|
+
|
82
|
+
include Core
|
83
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe Digitos do
|
6
|
+
(0..9).each do |number|
|
7
|
+
it "should return self when is #{number}" do
|
8
|
+
Digitos.new(number).sum.should eq number
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
{ 11 => 2, '18' => 9, 99 => 18, '58' => 13, 112 => 4, '235' => 10 }.each do |number, expecting|
|
13
|
+
it "should sum the sum of the digits when is '#{number}', expecting to be '#{expecting}'" do
|
14
|
+
Digitos.new(number).sum.should eq expecting
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe FatorVencimento do
|
6
|
+
describe "#base_date" do
|
7
|
+
it "should be 1997-10-07" do
|
8
|
+
FatorVencimento.new(Date.parse("2012-02-01")).base_date.should eq Date.new(1997, 10, 7)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#calculate" do
|
13
|
+
it 'should return an empty string when passing nil value' do
|
14
|
+
FatorVencimento.new(nil).should eq ''
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should return an empty string when passing empty value' do
|
18
|
+
FatorVencimento.new('').should eq ''
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should calculate the days between expiration date and base date" do
|
22
|
+
FatorVencimento.new(Date.parse("2012-12-2")).should eq "5535"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should calculate equal to itau documentation example" do
|
26
|
+
FatorVencimento.new(Date.parse("2000-07-04")).should eq "1001"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should calculate equal to itau documentation last section of the docs" do
|
30
|
+
FatorVencimento.new(Date.parse("2002-05-01")).should eq "1667"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should calculate to the maximum date equal to itau documentation example" do
|
34
|
+
FatorVencimento.new(Date.parse("2025-02-21")).should eq "9999"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should calculate the days between expiration date one year ago" do
|
38
|
+
FatorVencimento.new(Date.parse("2011-05-25")).should eq "4978"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should calculate the days between expiration date two years ago" do
|
42
|
+
FatorVencimento.new(Date.parse("2010-10-02")).should eq "4743"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should calculate the days between expiration date one year from now" do
|
46
|
+
FatorVencimento.new(Date.parse("2013-02-01")).should eq "5596"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should calculate the days between expiration date eigth years from now" do
|
50
|
+
FatorVencimento.new(Date.parse("2020-02-01")).should eq "8152"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should calculate the days between expiration date formating with 4 digits" do
|
54
|
+
FatorVencimento.new(Date.parse("1997-10-08")).should eq "0001"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe FatoresDeMultiplicacao do
|
6
|
+
context 'with factors of 2 and 1' do
|
7
|
+
let(:factors) { [2, 1] }
|
8
|
+
|
9
|
+
context 'with one digit' do
|
10
|
+
subject { FatoresDeMultiplicacao.new(1, fatores: factors) }
|
11
|
+
|
12
|
+
it { should eq [2] }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with four digits' do
|
16
|
+
subject { FatoresDeMultiplicacao.new(1234, fatores: factors) }
|
17
|
+
|
18
|
+
it { should eq [1, 4, 3, 8] }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with five digits' do
|
22
|
+
subject { FatoresDeMultiplicacao.new(11385, fatores: factors) }
|
23
|
+
|
24
|
+
it { should eq [2, 1, 6, 8, 10] }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with ten digits' do
|
28
|
+
subject { FatoresDeMultiplicacao.new(1234567890, fatores: factors) }
|
29
|
+
|
30
|
+
it { should eq [1, 4, 3, 8, 5, 12, 7, 16, 9, 0] }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with factors of 2..9' do
|
35
|
+
let(:factors) { (2..9).to_a }
|
36
|
+
|
37
|
+
context 'with one digit' do
|
38
|
+
subject { FatoresDeMultiplicacao.new(4, fatores: factors) }
|
39
|
+
|
40
|
+
it { should eq [8] }
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with four digits' do
|
44
|
+
subject { FatoresDeMultiplicacao.new(1864, fatores: factors) }
|
45
|
+
|
46
|
+
it { should eq [ 5, 32, 18, 8] }
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with ten digits' do
|
50
|
+
subject { FatoresDeMultiplicacao.new(1234567890, fatores: factors) }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with bradesco documentation example' do
|
54
|
+
let(:bradesco_example) { '9999101200000350007772130530150081897500000' }
|
55
|
+
subject { FatoresDeMultiplicacao.new(bradesco_example, fatores: factors) }
|
56
|
+
|
57
|
+
it { should eq [36, 27, 18, 81, 8, 0, 6, 10, 0, 0, 0, 0, 0, 21, 30, 0, 0, 0, 14, 63, 56, 14, 6, 15, 0, 15, 6, 0, 8, 35, 0, 0, 32, 3, 16, 81, 56, 35, 0, 0, 0, 0, 0] }
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with itau documentation example' do
|
61
|
+
let(:itau_example) { '3419166700000123451101234567880057123457000' }
|
62
|
+
subject { FatoresDeMultiplicacao.new(itau_example, fatores: factors) }
|
63
|
+
|
64
|
+
it { should eq [12, 12, 2, 81, 8, 42, 36, 35, 0, 0, 0, 0, 0, 7, 12, 15, 16, 15, 2, 9, 0, 7, 12, 15, 16, 15, 12, 63, 64, 56, 0, 0, 20, 21, 2, 18, 24, 28, 30, 35, 0, 0, 0] }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe LinhaDigitavel do
|
6
|
+
context "using the Itau documentation example" do
|
7
|
+
subject { LinhaDigitavel.new('34196166700000123451091234567880057123457000') }
|
8
|
+
|
9
|
+
it { should eq '34191.09123 34567.880058 71234.570001 6 16670000012345' }
|
10
|
+
end
|
11
|
+
|
12
|
+
context "using the Bradesco documentation example" do
|
13
|
+
subject { LinhaDigitavel.new('99991101200000350007772130530150081897500000') }
|
14
|
+
|
15
|
+
it { should eq '99997.77213 30530.150082 18975.000003 1 10120000035000' }
|
16
|
+
end
|
17
|
+
|
18
|
+
context "using the HSBC documentation example" do
|
19
|
+
subject { LinhaDigitavel.new('39998100100000311551111122222500546666666001') }
|
20
|
+
|
21
|
+
it { should eq '39991.11119 22222.500542 66666.660015 8 10010000031155' }
|
22
|
+
end
|
23
|
+
|
24
|
+
context "using the Caixa documentation example" do
|
25
|
+
subject { LinhaDigitavel.new('10491107400000160000001100128701000901200200') }
|
26
|
+
|
27
|
+
it { should eq '10490.00118 00128.701000 09012.002003 1 10740000016000' }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "when 'codigo_de_barras' invalid" do
|
31
|
+
context "when is empty" do
|
32
|
+
subject { LinhaDigitavel.new('') }
|
33
|
+
|
34
|
+
it { should eq '' }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when nil" do
|
38
|
+
subject { LinhaDigitavel.new(nil) }
|
39
|
+
|
40
|
+
it { should eq '' }
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when have less than 44 positions" do
|
44
|
+
subject { LinhaDigitavel.new('121212121') }
|
45
|
+
|
46
|
+
it { should eq '' }
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when have more than 44 positions" do
|
50
|
+
subject { LinhaDigitavel.new('12345678901234567890123456789012345678901234567890') }
|
51
|
+
|
52
|
+
it { should eq '' }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe Modulo10 do
|
6
|
+
it "should accept the examples by the 'Itau documentation'" do
|
7
|
+
Modulo10.new('341911012').should eq '1'
|
8
|
+
Modulo10.new('3456788005').should eq '8'
|
9
|
+
Modulo10.new('7123457000').should eq '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns zero when number is 0" do
|
13
|
+
Modulo10.new('0').should eq '0'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns zero when mod 10 is zero" do
|
17
|
+
Modulo10.new('99906').should eq '0'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "calculate when number had 1 digit" do
|
21
|
+
Modulo10.new('1').should eq '8'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "calculate when number had 2 digits" do
|
25
|
+
Modulo10.new('10').should eq '9'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "calculate when number had 3 digits" do
|
29
|
+
Modulo10.new('994').should eq '4'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "calculate when number had 5 digits" do
|
33
|
+
Modulo10.new('97831').should eq '2'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "calculate when number had 6 digits" do
|
37
|
+
Modulo10.new('147966').should eq '6'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "calculate when number had 10 digits" do
|
41
|
+
Modulo10.new('3456788005').should eq '8'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should accept numbers too" do
|
45
|
+
Modulo10.new(12345).should eq '5'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BoletoBancario
|
4
|
+
module Calculos
|
5
|
+
describe Modulo11FatorDe2a7 do
|
6
|
+
context 'with Bradesco documentation example' do
|
7
|
+
subject { Modulo11FatorDe2a7.new('1900000000002') }
|
8
|
+
|
9
|
+
it { should eq '8' }
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with Bradesco example that returns P' do
|
13
|
+
subject { Modulo11FatorDe2a7.new('1900000000001') }
|
14
|
+
|
15
|
+
it { should eq 'P' }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with Bradesco example that returns zero' do
|
19
|
+
subject { Modulo11FatorDe2a7.new('1900000000006') }
|
20
|
+
|
21
|
+
it { should eq '0' }
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when have two digits" do
|
25
|
+
subject { Modulo11FatorDe2a7.new('20') }
|
26
|
+
|
27
|
+
it { should eq '5' }
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when have two digits (more examples)" do
|
31
|
+
subject { Modulo11FatorDe2a7.new('26') }
|
32
|
+
|
33
|
+
it { should eq '4' }
|
34
|
+
end
|
35
|
+
|
36
|
+
context "more examples" do
|
37
|
+
subject { Modulo11FatorDe2a7.new('64') }
|
38
|
+
|
39
|
+
it { should eq '7' }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|