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.
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