brcobranca 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +39 -0
- data/README.rdoc +71 -0
- data/Rakefile +32 -0
- data/brcobranca.gemspec +49 -0
- data/config/website.yml +2 -0
- data/lib/brcobranca/arquivos/logos/bb.jpg +0 -0
- data/lib/brcobranca/arquivos/logos/hsbc.jpg +0 -0
- data/lib/brcobranca/arquivos/logos/itau.jpg +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +79 -0
- data/lib/brcobranca/boleto/banco_hsbc.rb +63 -0
- data/lib/brcobranca/boleto/banco_itau.rb +105 -0
- data/lib/brcobranca/boleto/base.rb +142 -0
- data/lib/brcobranca/boleto/template/rghost.rb +151 -0
- data/lib/brcobranca/boleto/template/util.rb +24 -0
- data/lib/brcobranca/config.rb +9 -0
- data/lib/brcobranca/core_ext.rb +250 -0
- data/lib/brcobranca/currency.rb +70 -0
- data/lib/brcobranca/retorno/retorno_cbr643.rb +84 -0
- data/lib/brcobranca.rb +27 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/test/arquivos/CBR64310.RET +51 -0
- data/test/test_banco_brasil.rb +276 -0
- data/test/test_banco_hsbc.rb +66 -0
- data/test/test_banco_itau.rb +103 -0
- data/test/test_base.rb +162 -0
- data/test/test_core_ext.rb +227 -0
- data/test/test_currency.rb +51 -0
- data/test/test_helper.rb +5 -0
- data/test/test_retorno_cbr643.rb +17 -0
- data/website/index.html +74 -0
- data/website/index.txt +41 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +159 -0
- data/website/template.html.erb +49 -0
- data.tar.gz.sig +0 -0
- metadata +175 -0
- metadata.gz.sig +0 -0
data/History.txt
ADDED
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]
|
data/brcobranca.gemspec
ADDED
@@ -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
|
data/config/website.yml
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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
|
+
|