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
@@ -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,4 @@
1
+ module BoletoBancario
2
+ # @version '0.0.1'
3
+ VERSION = '0.0.1.beta'
4
+ 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