kivanio-brcobranca 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/History.txt +21 -0
  2. data/Manifest.txt +48 -0
  3. data/README.rdoc +72 -0
  4. data/Rakefile +32 -0
  5. data/brcobranca.gemspec +47 -0
  6. data/lib/brcobranca/arquivos/logos/bb.jpg +0 -0
  7. data/lib/brcobranca/arquivos/logos/bradesco.jpg +0 -0
  8. data/lib/brcobranca/arquivos/logos/hsbc.jpg +0 -0
  9. data/lib/brcobranca/arquivos/logos/itau.jpg +0 -0
  10. data/lib/brcobranca/arquivos/logos/real.jpg +0 -0
  11. data/lib/brcobranca/arquivos/logos/unibanco.jpg +0 -0
  12. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  13. data/lib/brcobranca/boleto/banco_bradesco.rb +31 -0
  14. data/lib/brcobranca/boleto/banco_brasil.rb +79 -0
  15. data/lib/brcobranca/boleto/banco_hsbc.rb +63 -0
  16. data/lib/brcobranca/boleto/banco_itau.rb +105 -0
  17. data/lib/brcobranca/boleto/banco_real.rb +56 -0
  18. data/lib/brcobranca/boleto/banco_unibanco.rb +65 -0
  19. data/lib/brcobranca/boleto/base.rb +148 -0
  20. data/lib/brcobranca/boleto/template/rghost.rb +151 -0
  21. data/lib/brcobranca/boleto/template/util.rb +30 -0
  22. data/lib/brcobranca/config.rb +9 -0
  23. data/lib/brcobranca/core_ext.rb +269 -0
  24. data/lib/brcobranca/currency.rb +70 -0
  25. data/lib/brcobranca/retorno/base.rb +43 -0
  26. data/lib/brcobranca/retorno/retorno_cbr643.rb +44 -0
  27. data/lib/brcobranca.rb +27 -0
  28. data/script/console +10 -0
  29. data/script/destroy +14 -0
  30. data/script/generate +14 -0
  31. data/script/txt2html +71 -0
  32. data/test/arquivos/CBR64310.RET +28 -0
  33. data/test/test_banco_bradesco.rb +87 -0
  34. data/test/test_banco_brasil.rb +276 -0
  35. data/test/test_banco_hsbc.rb +81 -0
  36. data/test/test_banco_itau.rb +103 -0
  37. data/test/test_banco_real.rb +112 -0
  38. data/test/test_banco_unibanco.rb +92 -0
  39. data/test/test_base.rb +162 -0
  40. data/test/test_core_ext.rb +227 -0
  41. data/test/test_currency.rb +51 -0
  42. data/test/test_helper.rb +5 -0
  43. data/test/test_retorno_cbr643.rb +66 -0
  44. data/website/index.html +89 -0
  45. data/website/index.txt +46 -0
  46. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  47. data/website/stylesheets/screen.css +159 -0
  48. data/website/template.html.erb +57 -0
  49. metadata +164 -0
data/History.txt ADDED
@@ -0,0 +1,21 @@
1
+ == 2.0.4 04-05-2009
2
+
3
+ * Solucionado problemas com refatoração do retorno.
4
+
5
+ == 2.0.3 25-04-2009
6
+
7
+ * Incluindo boleto para o banco Bradesco(Todas as Carteiras)
8
+ * Incluindo boleto para o banco UNIBANCO(com e sem registro)
9
+
10
+ == 2.0.2 21-04-2009
11
+
12
+ * Incluindo boleto para o banco Real(com e sem registro)
13
+
14
+ == 2.0.1 19-04-2009
15
+
16
+ * Ajustes finais para lançamento
17
+
18
+ == 2.0.0 06-04-2009
19
+
20
+ * 1 acts_as_payment torna-se brcobranca:
21
+ * Release inicial com versão em 2.0.0
data/Manifest.txt ADDED
@@ -0,0 +1,48 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ brcobranca.gemspec
6
+ lib/brcobranca.rb
7
+ lib/brcobranca/arquivos/logos/bb.jpg
8
+ lib/brcobranca/arquivos/logos/bradesco.jpg
9
+ lib/brcobranca/arquivos/logos/hsbc.jpg
10
+ lib/brcobranca/arquivos/logos/itau.jpg
11
+ lib/brcobranca/arquivos/logos/real.jpg
12
+ lib/brcobranca/arquivos/logos/unibanco.jpg
13
+ lib/brcobranca/arquivos/templates/modelo_generico.eps
14
+ lib/brcobranca/boleto/banco_bradesco.rb
15
+ lib/brcobranca/boleto/banco_brasil.rb
16
+ lib/brcobranca/boleto/banco_hsbc.rb
17
+ lib/brcobranca/boleto/banco_itau.rb
18
+ lib/brcobranca/boleto/banco_real.rb
19
+ lib/brcobranca/boleto/banco_unibanco.rb
20
+ lib/brcobranca/boleto/base.rb
21
+ lib/brcobranca/boleto/template/rghost.rb
22
+ lib/brcobranca/boleto/template/util.rb
23
+ lib/brcobranca/config.rb
24
+ lib/brcobranca/core_ext.rb
25
+ lib/brcobranca/currency.rb
26
+ lib/brcobranca/retorno/base.rb
27
+ lib/brcobranca/retorno/retorno_cbr643.rb
28
+ script/console
29
+ script/destroy
30
+ script/generate
31
+ script/txt2html
32
+ test/arquivos/CBR64310.RET
33
+ test/test_banco_bradesco.rb
34
+ test/test_banco_brasil.rb
35
+ test/test_banco_hsbc.rb
36
+ test/test_banco_itau.rb
37
+ test/test_banco_real.rb
38
+ test/test_banco_unibanco.rb
39
+ test/test_base.rb
40
+ test/test_core_ext.rb
41
+ test/test_currency.rb
42
+ test/test_helper.rb
43
+ test/test_retorno_cbr643.rb
44
+ website/index.html
45
+ website/index.txt
46
+ website/javascripts/rounded_corners_lite.inc.js
47
+ website/stylesheets/screen.css
48
+ website/template.html.erb
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ = brcobranca
2
+
3
+ * http://brcobranca.rubyforge.org
4
+
5
+ == EXEMPLO
6
+
7
+ * http://www.boletorails.com.br
8
+
9
+ == DESCRIÇÃO
10
+
11
+ Gem para emissão de bloquetos de cobrança para bancos brasileiros
12
+
13
+ == Bancos Disponíveis
14
+
15
+ * Banco do Brasil
16
+ * TODAS AS CARTEIRAS PRESENTES NA DOCUMENTAÇÃO
17
+
18
+ * Banco Itaú
19
+ * TODAS AS CARTEIRAS PRESENTES NA DOCUMENTAÇÃO
20
+
21
+ * Banco HSBC
22
+ * CNR
23
+
24
+ * Banco Real
25
+ * Sem registro
26
+ * Com registro
27
+
28
+ * Banco Bradesco
29
+ * TODAS AS CARTEIRAS PRESENTES NA DOCUMENTAÇÃO
30
+
31
+ * Banco UNIBANCO
32
+ * Sem registro
33
+ * Com registro
34
+
35
+ == Esta perdido?
36
+
37
+ Veja a documentação em http://brcobranca.rubyforge.org/rdoc
38
+
39
+ == REQUISITOS
40
+
41
+ * rghost
42
+ * rghost_barcode
43
+ * parseline
44
+ * GhostScript > 8.0
45
+
46
+ == INSTALAÇÃO
47
+
48
+ * sudo gem install brcobranca
49
+
50
+ == FONTES
51
+
52
+ * http://github.com/kivanio/brcobranca/tree/master
53
+
54
+ == WIKI
55
+
56
+ * http://wiki.github.com/kivanio/brcobranca
57
+
58
+ == PROBLEMAS? QUERENDO MAIS?
59
+
60
+ Informe em http://github.com/kivanio/brcobranca/issues
61
+
62
+ == Gostou?
63
+
64
+ Recomende-nos no http://www.workingwithrails.com/recommendation/new/person/5679-kivanio-pereira-barbosa
65
+
66
+ == LICENSA
67
+
68
+ BSD
69
+
70
+ De brasileiro para brasileiros.
71
+
72
+ Copyleft 2009 Kivanio Barbosa
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
+ require File.dirname(__FILE__) + '/lib/brcobranca'
3
+
4
+ # Generate all the Rake tasks
5
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
+ $hoe = Hoe.new('brcobranca', Brcobranca::VERSION) do |p|
7
+ p.developer('Kivanio Barbosa', 'kivanio@gmail.com')
8
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
+ p.rubyforge_name = p.name # TODO this is default value
10
+ p.extra_deps = [
11
+ ['rghost','>= 0.8.6'],
12
+ ['rghost_barcode','>= 0.8'],
13
+ ['parseline','>= 1.0.3']
14
+ ]
15
+ p.extra_dev_deps = [
16
+ ['newgem', ">= #{::Newgem::VERSION}"]
17
+ ]
18
+
19
+ p.rdoc_pattern = /rb$|rdoc$/
20
+ p.summary = 'Gem que permite trabalhar com cobranças via bancos brasileiros.'
21
+ p.description = 'Gem para emissão de bloquetos de cobrança de bancos brasileiros.'
22
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
23
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
24
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
25
+ p.rsync_args = '-av --delete --ignore-errors'
26
+ end
27
+
28
+ require 'newgem/tasks' # load /tasks/*.rake
29
+ Dir['tasks/**/*.rake'].each { |t| load t }
30
+
31
+ # TODO - want other tests/tasks run by default? Add them to the list
32
+ # task :default => [:spec, :features]
@@ -0,0 +1,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{brcobranca}
5
+ s.version = "2.0.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Kivanio Barbosa"]
9
+ s.date = %q{2009-05-04}
10
+ s.description = %q{Gem para emissão de bloquetos de cobrança de bancos brasileiros.}
11
+ s.email = ["kivanio@gmail.com"]
12
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc", "website/index.txt"]
13
+ s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "brcobranca.gemspec", "lib/brcobranca.rb", "lib/brcobranca/arquivos/logos/bb.jpg", "lib/brcobranca/arquivos/logos/bradesco.jpg", "lib/brcobranca/arquivos/logos/hsbc.jpg", "lib/brcobranca/arquivos/logos/itau.jpg", "lib/brcobranca/arquivos/logos/real.jpg", "lib/brcobranca/arquivos/logos/unibanco.jpg", "lib/brcobranca/arquivos/templates/modelo_generico.eps", "lib/brcobranca/boleto/banco_bradesco.rb", "lib/brcobranca/boleto/banco_brasil.rb", "lib/brcobranca/boleto/banco_hsbc.rb", "lib/brcobranca/boleto/banco_itau.rb", "lib/brcobranca/boleto/banco_real.rb", "lib/brcobranca/boleto/banco_unibanco.rb", "lib/brcobranca/boleto/base.rb", "lib/brcobranca/boleto/template/rghost.rb", "lib/brcobranca/boleto/template/util.rb", "lib/brcobranca/config.rb", "lib/brcobranca/core_ext.rb", "lib/brcobranca/currency.rb", "lib/brcobranca/retorno/base.rb", "lib/brcobranca/retorno/retorno_cbr643.rb", "script/console", "script/destroy", "script/generate", "script/txt2html", "test/arquivos/CBR64310.RET", "test/test_banco_bradesco.rb", "test/test_banco_brasil.rb", "test/test_banco_hsbc.rb", "test/test_banco_itau.rb", "test/test_banco_real.rb", "test/test_banco_unibanco.rb", "test/test_base.rb", "test/test_core_ext.rb", "test/test_currency.rb", "test/test_helper.rb", "test/test_retorno_cbr643.rb", "website/index.html", "website/index.txt", "website/javascripts/rounded_corners_lite.inc.js", "website/stylesheets/screen.css", "website/template.html.erb"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://brcobranca.rubyforge.org}
16
+ s.rdoc_options = ["--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{brcobranca}
19
+ s.rubygems_version = %q{1.3.2}
20
+ s.summary = %q{Gem que permite trabalhar com cobranças via bancos brasileiros.}
21
+ s.test_files = ["test/test_banco_bradesco.rb", "test/test_banco_brasil.rb", "test/test_banco_hsbc.rb", "test/test_banco_itau.rb", "test/test_banco_real.rb", "test/test_banco_unibanco.rb", "test/test_base.rb", "test/test_core_ext.rb", "test/test_currency.rb", "test/test_helper.rb", "test/test_retorno_cbr643.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<rghost>, [">= 0.8.6"])
29
+ s.add_runtime_dependency(%q<rghost_barcode>, [">= 0.8"])
30
+ s.add_runtime_dependency(%q<parseline>, [">= 1.0.3"])
31
+ s.add_development_dependency(%q<newgem>, [">= 1.4.1"])
32
+ s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
33
+ else
34
+ s.add_dependency(%q<rghost>, [">= 0.8.6"])
35
+ s.add_dependency(%q<rghost_barcode>, [">= 0.8"])
36
+ s.add_dependency(%q<parseline>, [">= 1.0.3"])
37
+ s.add_dependency(%q<newgem>, [">= 1.4.1"])
38
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
39
+ end
40
+ else
41
+ s.add_dependency(%q<rghost>, [">= 0.8.6"])
42
+ s.add_dependency(%q<rghost_barcode>, [">= 0.8"])
43
+ s.add_dependency(%q<parseline>, [">= 1.0.3"])
44
+ s.add_dependency(%q<newgem>, [">= 1.4.1"])
45
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ # Banco BRADESCO
2
+ class BancoBradesco < Brcobranca::Boleto::Base
3
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoBradesco
4
+ def initialize(campos={})
5
+ padrao={:carteira => "06", :banco => "237"}
6
+ campos = padrao.merge!(campos)
7
+ super(campos)
8
+ end
9
+
10
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
11
+ # As posições do campo livre ficam a critério de cada Banco arrecadador, sendo que o
12
+ # padrão do Bradesco é:
13
+ # Posição Tamanho Conteúdo
14
+ # 20 a 23 4 Agência Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)
15
+ # 24 a 25 2 Carteira
16
+ # 26 a 36 11 Número do Nosso Número(Sem o digito verificador)
17
+ # 37 a 43 7 Conta do Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)
18
+ # 44 a 44 1 Zero
19
+
20
+ def monta_codigo_43_digitos
21
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
22
+ fator = self.data_vencimento.fator_vencimento
23
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
24
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
25
+ carteira = self.carteira.zeros_esquerda(:tamanho => 2)
26
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 11)
27
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
28
+
29
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{carteira}#{numero_documento}#{conta}0"
30
+ end
31
+ end
@@ -0,0 +1,79 @@
1
+ # Banco do Brasil
2
+ class BancoBrasil < Brcobranca::Boleto::Base
3
+
4
+ # Responsável por definir dados iniciais quando se cria uma nova intância da classe BancoBrasil
5
+ def initialize(campos={})
6
+ padrao={:carteira => "18", :banco => "001", :codigo_servico => false}
7
+ campos = padrao.merge!(campos)
8
+ super(campos)
9
+ end
10
+
11
+ # Retorna digito verificador do banco, calculado com modulo11 de 9 para 2, porem em caso de resultado ser 10, usa-se 'X'
12
+ def banco_dv
13
+ self.banco.modulo11_9to2_10_como_x
14
+ end
15
+
16
+ # Retorna digito verificador da agencia, calculado com modulo11 de 9 para 2, porem em caso de resultado ser 10, usa-se 'X'
17
+ def agencia_dv
18
+ self.agencia.modulo11_9to2_10_como_x
19
+ end
20
+
21
+ # Retorna digito verificador da conta corrente, calculado com modulo11 de 9 para 2, porem em caso de resultado ser 10, usa-se 'X'
22
+ def conta_corrente_dv
23
+ self.conta_corrente.modulo11_9to2_10_como_x
24
+ end
25
+
26
+ # Retorna digito verificador do nosso numero, calculado com modulo11 de 9 para 2, porem em caso de resultado ser 10, usa-se 'X'
27
+ # Inclui ainda o numero do convenio no calculo
28
+ def nosso_numero_dv
29
+ "#{self.convenio}#{self.numero_documento}".modulo11_9to2_10_como_x
30
+ end
31
+
32
+ # Número sequencial utilizado para distinguir os boletos na agência
33
+ def nosso_numero
34
+ "#{self.convenio}#{self.numero_documento}-#{self.nosso_numero_dv}"
35
+ end
36
+
37
+ # Responsavel por montar uma String com 43 caracteres que será usado na criacao do codigo de barras
38
+ def monta_codigo_43_digitos
39
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
40
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
41
+ convenio = self.convenio.to_s
42
+ fator = self.data_vencimento.fator_vencimento
43
+ # A montagem é feita baseada na quantidade de dígitos do convênio.
44
+ case convenio.size
45
+ when 8 # Nosso Numero de 17 dígitos com Convenio de 8 dígitos e numero_documento de 9 dígitos
46
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 9)
47
+ raise "Seu complemento está com #{numero_documento.size} dígitos. Com convênio de 8 dígitos, somente permite-se até 9 dígitos no numero_documento do nosso numero." if numero_documento.size > 9
48
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{convenio}#{numero_documento}#{self.carteira}"
49
+ when 7 # Nosso Numero de 17 dígitos com Convenio de 7 dígitos e numero_documento de 10 dígitos
50
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 10)
51
+ raise "Seu complemento está com #{numero_documento.size} dígitos. Com convênio de 7 dígitos, somente permite-se até 10 dígitos no numero_documento do nosso numero." if numero_documento.size > 10
52
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{convenio}#{numero_documento}#{self.carteira}"
53
+ when 6 # Convenio de 6 dígitos
54
+ if self.codigo_servico == false
55
+ # Nosso Numero de 11 dígitos com Convenio de 6 dígitos e numero_documento de 5 digitos
56
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 5)
57
+ raise "Seu numero_documento está com #{numero_documento.size} dígitos. Com convênio de 6 dígitos, somente permite-se até 5 dígitos no numero_documento do nosso numero. Para emitir boletos com nosso numero de 17 dígitos, coloque o atributo codigo_servico=true" if numero_documento.size > 5
58
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
59
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 8)
60
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{convenio}#{numero_documento}#{agencia}#{conta}#{self.carteira}"
61
+ else
62
+ # Nosso Numero de 17 dígitos com Convenio de 6 dígitos e sem numero_documento, carteira 16 e 18
63
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 17)
64
+ raise "Seu numero_documento está com #{numero_documento.size} dígitos. Com convênio de 6 dígitos, somente permite-se até 17 dígitos no numero_documento do nosso numero." if (numero_documento.size > 17)
65
+ raise "Só é permitido emitir boletos com nosso número de 17 dígitos com carteiras 16 ou 18. Sua carteira atual é #{self.carteira}" unless (["16","18"].include?(self.carteira))
66
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{convenio}#{numero_documento}21"
67
+ end
68
+ when 4 # Nosso Numero de 7 dígitos com Convenio de 4 dígitos e sem numero_documento
69
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
70
+ raise "Seu numero_documento está com #{numero_documento.size} dígitos. Com convênio de 4 dígitos, somente permite-se até 7 dígitos no numero_documento do nosso numero." if numero_documento.size > 7
71
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
72
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 8)
73
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{convenio}#{numero_documento}#{agencia}#{conta}#{self.carteira}"
74
+ else
75
+ return nil
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,63 @@
1
+ # Banco HSBC
2
+ class BancoHsbc < Brcobranca::Boleto::Base
3
+
4
+ # Responsável por definir dados iniciais quando se cria uma nova intância da classe BancoBrasil
5
+ def initialize(campos={})
6
+ padrao={:carteira => "CNR", :banco => "399"}
7
+ campos = padrao.merge!(campos)
8
+ super(campos)
9
+ end
10
+
11
+ # Número sequencial utilizado para distinguir os boletos na agência
12
+ def nosso_numero
13
+ if self.data_vencimento
14
+ self.codigo_servico = 4
15
+ dia = self.data_vencimento.day.to_s.zeros_esquerda(:tamanho => 2)
16
+ mes = self.data_vencimento.month.to_s.zeros_esquerda(:tamanho => 2)
17
+ ano = self.data_vencimento.year.to_s[2..3]
18
+ data = "#{dia}#{mes}#{ano}"
19
+
20
+ numero_documento = "#{self.numero_documento.to_s}#{self.numero_documento.to_s.modulo11_9to2_10_como_zero}#{self.codigo_servico.to_s}"
21
+ soma = numero_documento.to_i + self.conta_corrente.to_i + data.to_i
22
+ numero = "#{numero_documento}#{soma.to_s.modulo11_9to2_10_como_zero}"
23
+ numero
24
+ else
25
+ self.codigo_servico = 5
26
+ numero_documento = "#{self.numero_documento.to_s}#{self.numero_documento.to_s.modulo11_9to2_10_como_zero}#{self.codigo_servico.to_s}"
27
+ soma = numero_documento.to_i + self.conta_corrente.to_i
28
+ numero = "#{numero_documento}#{soma.to_s.modulo11_9to2_10_como_zero}"
29
+ numero
30
+ end
31
+ end
32
+
33
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
34
+ def monta_codigo_43_digitos
35
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
36
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
37
+ convenio = self.convenio.to_s
38
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
39
+
40
+ # Montagem é baseada no tipo de carteira e na presença da data de vencimento
41
+ if self.carteira == "CNR"
42
+ if self.data_vencimento
43
+ raise "numero_documento pode ser de no máximo 13 caracteres." if (self.numero_documento.to_s.size > 13)
44
+ fator = self.data_vencimento.fator_vencimento
45
+ dias_julianos = self.data_vencimento.to_juliano
46
+ self.codigo_servico = 4
47
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
48
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{conta}#{numero_documento}#{dias_julianos}2"
49
+ else
50
+ # TODO
51
+ nil
52
+ end
53
+ else
54
+ raise "numero_documento pode ser de no máximo 6 caracteres." if (self.numero_documento.to_s.size > 6)
55
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 6)
56
+ nosso_numero = self.nosso_numero.zeros_esquerda(:tamanho => 9)
57
+ self.codigo_servico = 5
58
+ # TODO
59
+ nil
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,105 @@
1
+ # Banco Itaú
2
+ class BancoItau < Brcobranca::Boleto::Base
3
+ # Usado somente em carteiras especiais com registro para complementar o número do cocumento
4
+ attr_accessor :seu_numero
5
+
6
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoItau
7
+ def initialize(campos={})
8
+ padrao={:carteira => "175", :banco => "341"}
9
+ campos = padrao.merge!(campos)
10
+ super(campos)
11
+ end
12
+
13
+ # Retorna dígito verificador do nosso número, calculado com modulo10.
14
+ # Para a grande maioria das carteiras, são considerados para a obtenção do DAC/DV, os dados
15
+ # "AGENCIA(sem DAC/DV)/CONTA(sem DAC/DV)/CARTEIRA/NOSSO NUMERO", calculado pelo criterio do Modulo 10.
16
+ # A excecao, estão as carteiras 126, 131, 146, 150 e 168 cuja obtenção esta baseada apenas nos
17
+ # dados "CARTEIRA/NOSSO NUMERO".
18
+ def nosso_numero_dv
19
+ if %w(126 131 146 150 168).include?(self.carteira)
20
+ "#{self.carteira}#{self.numero_documento}".modulo10
21
+ else
22
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 8)
23
+ "#{self.agencia}#{self.conta_corrente}#{self.carteira}#{numero_documento}".modulo10
24
+ end
25
+ end
26
+
27
+ # Número sequencial utilizado para distinguir os boletos na agência
28
+ def nosso_numero
29
+ "#{self.carteira}/#{self.numero_documento}-#{self.nosso_numero_dv}"
30
+ end
31
+
32
+ # Calcula o dígito verificador para conta corrente do Itau.
33
+ # Retorna apenas o dígito verificador da conta ou nil caso seja impossível calcular.
34
+ def agencia_conta_corrente_dv
35
+ "#{self.agencia}#{self.conta_corrente}".modulo10
36
+ end
37
+
38
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras.
39
+ def monta_codigo_43_digitos
40
+ valor_documento_formatado = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
41
+ fator_vencimento = self.data_vencimento.fator_vencimento
42
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 8)
43
+ return nil if numero_documento.size != 8
44
+
45
+ # Monta a String baseado no tipo de carteira
46
+ case self.carteira.to_i
47
+ when 126, 131, 146, 150, 168
48
+ # CARTEIRAS 126 131 146 150 168
49
+ # 01 a 03 03 9(03) Código do Banco na Câmara de Compensação = '341'
50
+ # 04 a 04 01 9(01) Código da Moeda = '9'
51
+ # 05 a 05 01 9(01) DAC código de Barras MOD 11-2a9
52
+ # 06 a 09 04 9(04) Fator de Vencimento
53
+ # 10 a 19 10 9(08)V(2) Valor
54
+ # 20 a 22 03 9(03) Carteira
55
+ # 23 a 30 08 9(08) Nosso Número
56
+ # 31 a 31 01 9(01) DAC [Carteira/Nosso Número] MOD 10
57
+ # 32 a 35 04 9(04) N.º da Agência cedente
58
+ # 36 a 40 05 9(05) N.º da Conta Corrente
59
+ # 41 a 41 01 9(01) DAC [Agência/Conta Corrente] MOD 10
60
+ # 42 a 44 03 9(03) Zeros
61
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
62
+ codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
63
+ codigo
64
+ when 198, 106, 107, 122, 142, 143, 195, 196
65
+ # CARTEIRAS 198, 106, 107,122, 142, 143, 195 e 196
66
+ # 01 a 03 03 9(3) Código do Banco na Câmara de Compensação = ‘341’
67
+ # 04 a 04 01 9(1) Código da Moeda = '9'
68
+ # 05 a 05 01 9(1) DAC do Código de Barras MOD 11-2a9
69
+ # 06 a 09 04 9(04) Fator de Vencimento
70
+ # 10 a 19 10 9(08) V(2) Valor
71
+ # 20 a 22 03 9(3) Carteira
72
+ # 23 a 30 08 9(8) Nosso Número
73
+ # 31 a 37 07 9(7) Seu Número (Número do Documento)
74
+ # 38 a 42 05 9(5) Código do Cliente (fornecido pelo Banco)
75
+ # 43 a 43 01 9(1) DAC dos campos acima (posições 20 a 42) MOD 10
76
+ # 44 a 44 01 9(1) Zero
77
+ seu_numero = self.seu_numero.zeros_esquerda(:tamanho => 7)
78
+ return nil if seu_numero.size != 7
79
+ convenio = self.convenio.zeros_esquerda(:tamanho => 5)
80
+ return nil if convenio.size != 5
81
+ dv = "#{self.carteira}#{numero_documento}#{seu_numero}#{convenio}".modulo10
82
+
83
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
84
+ codigo << "#{numero_documento}#{seu_numero}#{convenio}#{dv}0"
85
+ codigo
86
+ else
87
+ # DEMAIS CARTEIRAS
88
+ # 01 a 03 03 9(03) Código do Banco na Câmara de Compensação = '341'
89
+ # 04 a 04 01 9(01) Código da Moeda = '9'
90
+ # 05 a 05 01 9(01) DAC código de Barras MOD 11-2a9
91
+ # 06 a 09 04 9(04) Fator de Vencimento
92
+ # 10 a 19 10 9(08)V(2) Valor
93
+ # 20 a 22 03 9(03) Carteira
94
+ # 23 a 30 08 9(08) Nosso Número
95
+ # 31 a 31 01 9(01) DAC [Agência /Conta/Carteira/Nosso Número] MOD 10
96
+ # 32 a 35 04 9(04) N.º da Agência cedente
97
+ # 36 a 40 05 9(05) N.º da Conta Corrente
98
+ # 41 a 41 01 9(01) DAC [Agência/Conta Corrente] MOD 10
99
+ # 42 a 44 03 9(03) Zeros
100
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
101
+ codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
102
+ codigo
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,56 @@
1
+ # Banco REAL
2
+ class BancoReal < Brcobranca::Boleto::Base
3
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoReal
4
+ def initialize(campos={})
5
+ padrao={:carteira => "57", :banco => "356"}
6
+ campos = padrao.merge!(campos)
7
+ super(campos)
8
+ end
9
+
10
+ # CALCULO DO DIGITO:
11
+ # APLICA-SE OS PESOS 2,1,2,1,.... AOS ALGARISMOS DO NUMERO COMPOSTO POR:
12
+ # NUMERO DO BANCO : COM 7 DIGITOS P/ COBRANCA REGISTRADA
13
+ # ATE 15 DIGITOS P/ COBRANCA SEM REGISTRO
14
+ # CODIGO DA AGENCIA: 4 DIGITOS
15
+ # NUMERO DA CONTA : 7 DIGITOS
16
+ def agencia_conta_corrente_nosso_numero_dv
17
+ case self.carteira.to_i
18
+ when 57
19
+ #agencia é 4 digitos
20
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
21
+ #conta é 7 digitos
22
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
23
+ #nosso número com maximo de 13 digitos
24
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
25
+ "#{numero_documento}#{agencia}#{conta}".modulo10
26
+ else
27
+ #agencia é 4 digitos
28
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
29
+ #conta é 7 digitos
30
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
31
+ #nosso número com maximo de 13 digitos
32
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
33
+ "#{numero_documento}#{agencia}#{conta}".modulo10
34
+ end
35
+ end
36
+
37
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
38
+ def monta_codigo_43_digitos
39
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
40
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
41
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
42
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
43
+ fator = self.data_vencimento.fator_vencimento
44
+ # Montagem é baseada no tipo de carteira, com registro e sem registro
45
+ case self.carteira.to_i
46
+ # Carteira sem registro
47
+ when 57
48
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
49
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
50
+ else
51
+ # TODO verificar com o banco, pois não consta na documentação
52
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
53
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,65 @@
1
+ # Banco UNIBANCO
2
+ class BancoUnibanco < Brcobranca::Boleto::Base
3
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoUnibanco
4
+ # Com Registro 4
5
+ # Sem Registro 5
6
+ def initialize(campos={})
7
+ padrao={:carteira => "5", :banco => "409"}
8
+ campos = padrao.merge!(campos)
9
+ super(campos)
10
+ end
11
+
12
+ def nosso_numero_dv
13
+ self.numero_documento.zeros_esquerda(:tamanho => 11).modulo11_2to9
14
+ end
15
+
16
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
17
+ def monta_codigo_43_digitos
18
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
19
+ fator = self.data_vencimento.fator_vencimento
20
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
21
+ carteira = self.carteira.zeros_esquerda(:tamanho => 1)
22
+
23
+ case carteira.to_i
24
+ when 5
25
+
26
+ # Cobrança sem registro (CÓDIGO DE BARRAS)
27
+ # Posição Tamanho Descrição
28
+ # 1 a 3 3 número de identificação do Unibanco: 409 (número FIXO)
29
+ # 4 1 código da moeda. Real (R$)=9 (número FIXO)
30
+ # 5 1 dígito verificador do CÓDIGO DE BARRAS
31
+ # 6 a 9 4 fator de vencimento
32
+ # 10 a 19 10 valor do título com zeros à esquerda
33
+ # 20 1 código para transação CVT: 5 (número FIXO)(5=7744-5)
34
+ # 21 a 27 7 número do cliente no CÓDIGO DE BARRAS + dígito verificador
35
+ # 28 a 29 2 vago. Usar 00 (número FIXO)
36
+ # 30 a 43 14 Número de referência do cliente
37
+ # 44 1 Dígito verificador
38
+
39
+ convenio = self.convenio.zeros_esquerda(:tamanho => 6)
40
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 14)
41
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}#{carteira}#{convenio}00#{numero_documento}#{self.nosso_numero_dv}"
42
+ when 4
43
+
44
+ # Cobrança com registro (CÓDIGO DE BARRAS)
45
+ # Posição Tamanho Descrição
46
+ # 1 a 3 3 Número de identificação do Unibanco: 409 (número FIXO)
47
+ # 4 1 Código da moeda. Real (R$)=9 (número FIXO)
48
+ # 5 1 dígito verificador do CÓDIGO DE BARRAS
49
+ # 6 a 9 4 fator de vencimento em 4 algarismos, conforme tabela da página 14
50
+ # 10 a 19 10 valor do título com zeros à esquerda
51
+ # 20 a 21 2 Código para transação CVT: 04 (número FIXO) (04=5539-5)
52
+ # 22 a 27 6 data de vencimento (AAMMDD)
53
+ # 28 a 32 5 Código da agência + dígito verificador
54
+ # 33 a 43 11 “Nosso Número” (NNNNNNNNNNN)
55
+ # 44 1 Super dígito do “Nosso Número” (calculado com o MÓDULO 11 (de 2 a 9))
56
+
57
+ data = self.data_vencimento.strftime('%y%m%d')
58
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
59
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 11)
60
+ "#{banco}#{self.moeda}#{fator}#{valor_documento}0#{carteira}#{data}#{agencia}#{self.agencia_dv}#{numero_documento}#{self.nosso_numero_dv}"
61
+ else
62
+ nil
63
+ end
64
+ end
65
+ end