brcobranca 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +39 -0
  3. data/README.rdoc +71 -0
  4. data/Rakefile +32 -0
  5. data/brcobranca.gemspec +49 -0
  6. data/config/website.yml +2 -0
  7. data/lib/brcobranca/arquivos/logos/bb.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/templates/modelo_generico.eps +0 -0
  11. data/lib/brcobranca/boleto/banco_brasil.rb +79 -0
  12. data/lib/brcobranca/boleto/banco_hsbc.rb +63 -0
  13. data/lib/brcobranca/boleto/banco_itau.rb +105 -0
  14. data/lib/brcobranca/boleto/base.rb +142 -0
  15. data/lib/brcobranca/boleto/template/rghost.rb +151 -0
  16. data/lib/brcobranca/boleto/template/util.rb +24 -0
  17. data/lib/brcobranca/config.rb +9 -0
  18. data/lib/brcobranca/core_ext.rb +250 -0
  19. data/lib/brcobranca/currency.rb +70 -0
  20. data/lib/brcobranca/retorno/retorno_cbr643.rb +84 -0
  21. data/lib/brcobranca.rb +27 -0
  22. data/script/console +10 -0
  23. data/script/destroy +14 -0
  24. data/script/generate +14 -0
  25. data/script/txt2html +71 -0
  26. data/test/arquivos/CBR64310.RET +51 -0
  27. data/test/test_banco_brasil.rb +276 -0
  28. data/test/test_banco_hsbc.rb +66 -0
  29. data/test/test_banco_itau.rb +103 -0
  30. data/test/test_base.rb +162 -0
  31. data/test/test_core_ext.rb +227 -0
  32. data/test/test_currency.rb +51 -0
  33. data/test/test_helper.rb +5 -0
  34. data/test/test_retorno_cbr643.rb +17 -0
  35. data/website/index.html +74 -0
  36. data/website/index.txt +41 -0
  37. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  38. data/website/stylesheets/screen.css +159 -0
  39. data/website/template.html.erb +49 -0
  40. data.tar.gz.sig +0 -0
  41. metadata +175 -0
  42. metadata.gz.sig +0 -0
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 2.0.0 06-04-2009
2
+
3
+ * 1 acts_as_payment torna-se brcobranca:
4
+ * Release inicial com versão em 2.0.0
data/Manifest.txt ADDED
@@ -0,0 +1,39 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ brcobranca.gemspec
6
+ config/website.yml
7
+ lib/brcobranca.rb
8
+ lib/brcobranca/arquivos/logos/bb.jpg
9
+ lib/brcobranca/arquivos/logos/hsbc.jpg
10
+ lib/brcobranca/arquivos/logos/itau.jpg
11
+ lib/brcobranca/arquivos/templates/modelo_generico.eps
12
+ lib/brcobranca/boleto/banco_brasil.rb
13
+ lib/brcobranca/boleto/banco_hsbc.rb
14
+ lib/brcobranca/boleto/banco_itau.rb
15
+ lib/brcobranca/boleto/base.rb
16
+ lib/brcobranca/boleto/template/rghost.rb
17
+ lib/brcobranca/boleto/template/util.rb
18
+ lib/brcobranca/config.rb
19
+ lib/brcobranca/core_ext.rb
20
+ lib/brcobranca/currency.rb
21
+ lib/brcobranca/retorno/retorno_cbr643.rb
22
+ script/console
23
+ script/destroy
24
+ script/generate
25
+ script/txt2html
26
+ test/arquivos/CBR64310.RET
27
+ test/test_banco_brasil.rb
28
+ test/test_banco_hsbc.rb
29
+ test/test_banco_itau.rb
30
+ test/test_base.rb
31
+ test/test_core_ext.rb
32
+ test/test_currency.rb
33
+ test/test_helper.rb
34
+ test/test_retorno_cbr643.rb
35
+ website/index.html
36
+ website/index.txt
37
+ website/javascripts/rounded_corners_lite.inc.js
38
+ website/stylesheets/screen.css
39
+ website/template.html.erb
data/README.rdoc ADDED
@@ -0,0 +1,71 @@
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
+
16
+ * Banco do Brasil
17
+ * Carteira 16
18
+ - Nosso Número de 11 dígitos(4 para convênio e 7 para número do documento)
19
+ - Nosso Número de 11 dígitos(6 para convênio e 5 para número do documento)
20
+ - Nosso Numero de 17 dígitos(7 para convênio e 10 para número do documento)
21
+ - Nosso Numero de 17 dígitos(convênio de 6 dígitos, porem usa-se 17 para número do documento)
22
+ * Carteira 17
23
+ - Nosso Numero de 11 dígitos(4 para convênio e 7 para número do documento)
24
+ - Nosso Numero de 11 dígitos(6 para convênio e 5 para número do documento)
25
+ - Nosso Numero de 17 dígitos(7 para convênio e 10 para número do documento)
26
+ * Carteira 18
27
+ - Nosso Numero de 11 dígitos(4 para convênio e 7 para número do documento)
28
+ - Nosso Numero de 11 dígitos(6 para convênio e 5 para número do documento)
29
+ - Nosso Numero de 17 dígitos(7 para convênio e 10 para número do documento)
30
+ - Nosso Numero de 17 dígitos(convênio de 6 dígitos, porem usa-se 17 para número do documento)
31
+
32
+ * Itaú
33
+ * TODAS AS CARTEIRAS PRESENTES NA DOCUMENTAÇÃO
34
+
35
+ * HSBC
36
+ * CNR
37
+
38
+
39
+ == Esta perdido?
40
+
41
+ Veja a documentação em http://brcobranca.rubyforge.org/rdoc
42
+
43
+ == REQUISITOS
44
+
45
+ * rghost
46
+ * rghost_barcode
47
+ * parseline
48
+
49
+ == INSTALAÇÃO
50
+
51
+ * sudo gem install brcobranca
52
+
53
+ == FONTES
54
+
55
+ * http://github.com/kivanio/brcobranca/tree/master
56
+
57
+ == PROBLEMAS? QUERENDO MAIS?
58
+
59
+ Informe em http://github.com/kivanio/brcobranca/issues
60
+
61
+ == Gostou?
62
+
63
+ Recomende-nos no http://www.workingwithrails.com/recommendation/new/person/5679-kivanio-pereira-barbosa
64
+
65
+ == LICENSA
66
+
67
+ Este gem é licenciada pela licensa BSD
68
+
69
+ De brasileiro para brasileiros.
70
+
71
+ 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.3'],
12
+ ['rghost_barcode','>= 0.8'],
13
+ ['parseline','>= 1.0.2']
14
+ ]
15
+ p.extra_dev_deps = [
16
+ ['newgem', ">= #{::Newgem::VERSION}"]
17
+ ]
18
+
19
+ p.rdoc_pattern = /rb$|rdoc$/
20
+ p.summary = 'Gem para emissão de bloquetos de cobrança de bancos brasileiros.'
21
+ p.description = p.summary
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,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{brcobranca}
5
+ s.version = "2.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Kivanio Barbosa"]
9
+ s.cert_chain = ["/Users/kivanio/.gem/gem-public_cert.pem"]
10
+ s.date = %q{2009-04-19}
11
+ s.description = %q{Gem para emissão de bloquetos de cobrança de bancos brasileiros.}
12
+ s.email = ["kivanio@gmail.com"]
13
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc", "website/index.txt"]
14
+ s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "brcobranca.gemspec", "config/website.yml", "lib/brcobranca.rb", "lib/brcobranca/arquivos/logos/bb.jpg", "lib/brcobranca/arquivos/logos/hsbc.jpg", "lib/brcobranca/arquivos/logos/itau.jpg", "lib/brcobranca/arquivos/templates/modelo_generico.eps", "lib/brcobranca/boleto/banco_brasil.rb", "lib/brcobranca/boleto/banco_hsbc.rb", "lib/brcobranca/boleto/banco_itau.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/retorno_cbr643.rb", "script/console", "script/destroy", "script/generate", "script/txt2html", "test/arquivos/CBR64310.RET", "test/test_banco_brasil.rb", "test/test_banco_hsbc.rb", "test/test_banco_itau.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"]
15
+ s.has_rdoc = true
16
+ s.homepage = %q{http://brcobranca.rubyforge.org}
17
+ s.rdoc_options = ["--main", "README.rdoc"]
18
+ s.require_paths = ["lib"]
19
+ s.rubyforge_project = %q{brcobranca}
20
+ s.rubygems_version = %q{1.3.2}
21
+ s.signing_key = %q{/Users/kivanio/.gem/gem-private_key.pem}
22
+ s.summary = %q{Gem para emissão de bloquetos de cobrança de bancos brasileiros.}
23
+ s.test_files = ["test/test_banco_brasil.rb", "test/test_banco_hsbc.rb", "test/test_banco_itau.rb", "test/test_base.rb", "test/test_core_ext.rb", "test/test_currency.rb", "test/test_helper.rb", "test/test_retorno_cbr643.rb"]
24
+
25
+ if s.respond_to? :specification_version then
26
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
+ s.specification_version = 3
28
+
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
+ s.add_runtime_dependency(%q<rghost>, [">= 0.8.3"])
31
+ s.add_runtime_dependency(%q<rghost_barcode>, [">= 0.8"])
32
+ s.add_runtime_dependency(%q<parseline>, [">= 1.0.2"])
33
+ s.add_development_dependency(%q<newgem>, [">= 1.3.0"])
34
+ s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
35
+ else
36
+ s.add_dependency(%q<rghost>, [">= 0.8.3"])
37
+ s.add_dependency(%q<rghost_barcode>, [">= 0.8"])
38
+ s.add_dependency(%q<parseline>, [">= 1.0.2"])
39
+ s.add_dependency(%q<newgem>, [">= 1.3.0"])
40
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
41
+ end
42
+ else
43
+ s.add_dependency(%q<rghost>, [">= 0.8.3"])
44
+ s.add_dependency(%q<rghost_barcode>, [">= 0.8"])
45
+ s.add_dependency(%q<parseline>, [">= 1.0.2"])
46
+ s.add_dependency(%q<newgem>, [">= 1.3.0"])
47
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
48
+ end
49
+ end
@@ -0,0 +1,2 @@
1
+ host: kivanio@rubyforge.org
2
+ remote_dir: /var/www/gforge-projects/brcobranca
@@ -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,142 @@
1
+ module Brcobranca
2
+ module Boleto
3
+ # Classe base para todas as classes de boletos
4
+ class Base
5
+ # <b>REQUERIDO</b>: Codigo do banco emissor (3 dígitos sempre)
6
+ attr_accessor :banco
7
+ # <b>REQUERIDO</b>: Número do convênio/contrato do cliente junto ao banco emissor
8
+ attr_accessor :convenio
9
+ # <b>REQUERIDO</b>: Tipo de moeda utilizada (Real(R$) e igual a 9)
10
+ attr_accessor :moeda
11
+ # <b>REQUERIDO</b>: Carteira utilizada
12
+ attr_accessor :carteira
13
+ # <b>OPCIONAL</b>: Variacao da carteira(opcional para a maioria dos bancos)
14
+ attr_accessor :variacao
15
+ # <b>OPCIONAL</b>: Data de processamento do boleto, geralmente igual a data_documento
16
+ attr_accessor :data_processamento
17
+ # <b>REQUERIDO</b>: Número de dias a vencer
18
+ attr_accessor :dias_vencimento
19
+ # <b>REQUERIDO</b>: Quantidade de boleto(padrão = 1)
20
+ attr_accessor :quantidade
21
+ # <b>REQUERIDO</b>: Valor do boleto
22
+ attr_accessor :valor
23
+ # <b>REQUERIDO</b>: Número da agencia
24
+ attr_accessor :agencia
25
+ # <b>REQUERIDO</b>: Número da conta corrente
26
+ attr_accessor :conta_corrente
27
+ # <b>REQUERIDO</b>: Nome do proprietario da conta corrente
28
+ attr_accessor :cedente
29
+ # <b>REQUERIDO</b>: Documento do proprietario da conta corrente (CPF ou CNPJ)
30
+ attr_accessor :documento_cedente
31
+ # <b>OPCIONAL</b>: Número sequencial utilizado identificar o boleto
32
+ attr_accessor :numero_documento
33
+ # <b>REQUERIDO</b>: Símbolo da moeda utilizada (R$ no brasil)
34
+ attr_accessor :especie
35
+ # <b>REQUERIDO</b>: Tipo do documento (Geralmente DM que quer dizer Duplicata Mercantil)
36
+ attr_accessor :especie_documento
37
+ # <b>REQUERIDO</b>: Data em que foi emitido o boleto
38
+ attr_accessor :data_documento
39
+ # <b>OPCIONAL</b>: Código utilizado para identificar o tipo de serviço cobrado
40
+ attr_accessor :codigo_servico
41
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
42
+ attr_accessor :instrucao1
43
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
44
+ attr_accessor :instrucao2
45
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
46
+ attr_accessor :instrucao3
47
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
48
+ attr_accessor :instrucao4
49
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
50
+ attr_accessor :instrucao5
51
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
52
+ attr_accessor :instrucao6
53
+ # <b>OPCIONAL</b>: Utilizado para mostrar alguma informação ao sacado
54
+ attr_accessor :instrucao7
55
+ # <b>REQUERIDO</b>: Informação sobre onde o sacado podera efetuar o pagamento
56
+ attr_accessor :local_pagamento
57
+ # <b>REQUERIDO</b>: Informa se o banco deve aceitar o boleto após o vencimento ou não( S ou N, quase sempre S)
58
+ attr_accessor :aceite
59
+ # <b>REQUERIDO</b>: Nome da pessoa que receberá o boleto
60
+ attr_accessor :sacado
61
+ # <b>OPCIONAL</b>: Endereco da pessoa que receberá o boleto
62
+ attr_accessor :sacado_endereco
63
+ # <b>REQUERIDO</b>: Documento da pessoa que receberá o boleto
64
+ attr_accessor :sacado_documento
65
+
66
+ # Responsável por definir dados iniciais quando se cria uma nova intância da classe Base.
67
+ def initialize(campos={})
68
+ padrao = { :moeda => "9", :data_documento => Date.today, :dias_vencimento => 1, :quantidade => 1,
69
+ :especie_documento => "DM", :especie => "R$", :aceite => "S", :valor => 0.0,
70
+ :local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO"}
71
+
72
+ campos = padrao.merge!(campos)
73
+
74
+ campos.each do |campo, valor|
75
+ instance_variable_set "@#{campo}", valor if self.respond_to?(campo)
76
+ end
77
+
78
+ end
79
+
80
+ # Retorna dígito verificador do banco, calculado com modulo11 de 9 para 2
81
+ def banco_dv
82
+ self.banco.modulo11_9to2
83
+ end
84
+
85
+ # Retorna dígito verificador da agência, calculado com modulo11 de 9 para 2
86
+ def agencia_dv
87
+ self.agencia.modulo11_9to2
88
+ end
89
+
90
+ # Retorna dígito verificador da conta corrente, calculado com modulo11 de 9 para 2
91
+ def conta_corrente_dv
92
+ self.conta_corrente.modulo11_9to2
93
+ end
94
+
95
+ # Retorna dígito verificador do nosso número, calculado com modulo11 de 9 para 2
96
+ def nosso_numero_dv
97
+ self.numero_documento.modulo11_9to2
98
+ end
99
+
100
+ # Número sequencial utilizado para distinguir os boletos na agência
101
+ def nosso_numero
102
+ self.numero_documento
103
+ end
104
+
105
+ # Retorna o valor total do documento: <b>quantidate * valor</b> ou <b>zero(0)</b> caso não consiga efetuar o cálculo.
106
+ def valor_documento
107
+ begin
108
+ self.quantidade * self.valor.to_f
109
+ rescue
110
+ 0
111
+ end
112
+ end
113
+
114
+ # Retorna data de vencimento baseado na <b>data_documento + dias_vencimento</b> ou <b>false</b> caso não consiga efetuar o cálculo.
115
+ def data_vencimento
116
+ begin
117
+ return false unless self.data_documento.kind_of?(Date)
118
+ (self.data_documento + self.dias_vencimento.to_i)
119
+ rescue
120
+ false
121
+ end
122
+ end
123
+
124
+ # Retorna uma String com 44 caracteres representando o codigo de barras do boleto
125
+ def codigo_barras
126
+ codigo = monta_codigo_43_digitos
127
+ return nil unless codigo
128
+ return nil if codigo.size != 43
129
+ codigo_dv = codigo.modulo11_2to9
130
+
131
+ "#{codigo[0..3]}#{codigo_dv}#{codigo[4..42]}"
132
+ end
133
+
134
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
135
+ # Este metodo precisa ser reescrito para cada classe de boleto a ser criada.
136
+ def monta_codigo_43_digitos
137
+ "Sobreescreva este método na classe referente ao banco que você esta criando"
138
+ end
139
+ end
140
+ end
141
+ end
142
+