brcobranca 2.0.6 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +30 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +48 -0
- data/History.txt +13 -1
- data/LICENSE +20 -0
- data/README.rdoc +12 -5
- data/Rakefile +33 -37
- data/VERSION +1 -0
- data/brcobranca.gemspec +26 -35
- data/lib/brcobranca/arquivos/logos/{bb.jpg → bancobrasil.jpg} +0 -0
- data/lib/brcobranca/arquivos/logos/banespa.jpg +0 -0
- data/lib/brcobranca/arquivos/logos/caixa.jpg +0 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +150 -77
- data/lib/brcobranca/boleto/base.rb +146 -75
- data/lib/brcobranca/boleto/bradesco.rb +69 -0
- data/lib/brcobranca/boleto/caixa.rb +100 -0
- data/lib/brcobranca/boleto/hsbc.rb +95 -0
- data/lib/brcobranca/boleto/itau.rb +133 -0
- data/lib/brcobranca/boleto/real.rb +74 -0
- data/lib/brcobranca/boleto/template/base.rb +13 -0
- data/lib/brcobranca/boleto/template/rghost.rb +136 -62
- data/lib/brcobranca/boleto/unibanco.rb +115 -0
- data/lib/brcobranca/calculo.rb +132 -0
- data/lib/brcobranca/calculo_data.rb +42 -0
- data/lib/brcobranca/currency.rb +3 -4
- data/lib/brcobranca/formatacao.rb +102 -0
- data/lib/brcobranca/limpeza.rb +19 -0
- data/lib/brcobranca/retorno/base.rb +1 -2
- data/lib/brcobranca/retorno/retorno_cbr643.rb +42 -40
- data/lib/brcobranca/version.rb +3 -0
- data/lib/brcobranca.rb +93 -16
- data/spec/brcobranca/banco_bradesco_spec.rb +63 -50
- data/spec/brcobranca/banco_brasil_spec.rb +102 -136
- data/spec/brcobranca/banco_caixa_spec.rb +166 -0
- data/spec/brcobranca/banco_hsbc_spec.rb +83 -76
- data/spec/brcobranca/banco_real_spec.rb +54 -37
- data/spec/brcobranca/banco_unibanco_spec.rb +69 -52
- data/spec/brcobranca/base_spec.rb +24 -79
- data/spec/brcobranca/boletos_em_lote_spec.rb +46 -0
- data/spec/brcobranca/core_ext_spec.rb +24 -114
- data/spec/brcobranca/currency_spec.rb +1 -0
- data/spec/brcobranca/{banco_itau_spec.rb → itau_spec.rb} +112 -67
- data/spec/brcobranca/retorno_cbr643_spec.rb +13 -12
- data/spec/brcobranca/rghost_spec.rb +8 -7
- data/spec/brcobranca_spec.rb +16 -6
- data/spec/spec_helper.rb +11 -8
- metadata +107 -58
- data/Manifest.txt +0 -51
- data/PostInstall.txt +0 -4
- data/lib/brcobranca/boleto/banco_banespa.rb +0 -85
- data/lib/brcobranca/boleto/banco_bradesco.rb +0 -44
- data/lib/brcobranca/boleto/banco_hsbc.rb +0 -77
- data/lib/brcobranca/boleto/banco_itau.rb +0 -115
- data/lib/brcobranca/boleto/banco_real.rb +0 -70
- data/lib/brcobranca/boleto/banco_unibanco.rb +0 -79
- data/lib/brcobranca/boleto/template/util.rb +0 -32
- data/lib/brcobranca/config.rb +0 -9
- data/lib/brcobranca/core_ext.rb +0 -279
- data/spec/brcobranca/banco_banespa_spec.rb +0 -195
- data/spec/brcobranca/template/rghost_spec.rb +0 -65
- data/spec/brcobranca/template/util_spec.rb +0 -42
- data/spec/rcov.opts +0 -2
- data/spec/spec.opts +0 -6
- data/tasks/rcov.rake +0 -12
- data/tasks/rspec.rake +0 -21
@@ -1,9 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# @author Kivanio Barbosa
|
1
3
|
module Brcobranca
|
2
4
|
module Boleto
|
3
5
|
# Classe base para todas as classes de boletos
|
4
6
|
class Base
|
5
|
-
|
6
|
-
|
7
|
+
extend Template::Base
|
8
|
+
|
9
|
+
# Configura gerador de arquivo de boleto e código de barras.
|
10
|
+
extend define_template(Brcobranca.configuration.gerador)
|
11
|
+
include define_template(Brcobranca.configuration.gerador)
|
12
|
+
|
13
|
+
# Validações do Rails 3
|
14
|
+
include ActiveModel::Validations
|
15
|
+
|
7
16
|
# <b>REQUERIDO</b>: Número do convênio/contrato do cliente junto ao banco emissor
|
8
17
|
attr_accessor :convenio
|
9
18
|
# <b>REQUERIDO</b>: Tipo de moeda utilizada (Real(R$) e igual a 9)
|
@@ -20,15 +29,15 @@ module Brcobranca
|
|
20
29
|
attr_accessor :quantidade
|
21
30
|
# <b>REQUERIDO</b>: Valor do boleto
|
22
31
|
attr_accessor :valor
|
23
|
-
# <b>REQUERIDO</b>: Número da agencia
|
32
|
+
# <b>REQUERIDO</b>: Número da agencia sem <b>Digito Verificador</b>
|
24
33
|
attr_accessor :agencia
|
25
|
-
# <b>REQUERIDO</b>: Número da conta corrente
|
34
|
+
# <b>REQUERIDO</b>: Número da conta corrente sem <b>Digito Verificador</b>
|
26
35
|
attr_accessor :conta_corrente
|
27
36
|
# <b>REQUERIDO</b>: Nome do proprietario da conta corrente
|
28
37
|
attr_accessor :cedente
|
29
38
|
# <b>REQUERIDO</b>: Documento do proprietario da conta corrente (CPF ou CNPJ)
|
30
39
|
attr_accessor :documento_cedente
|
31
|
-
# <b>OPCIONAL</b>: Número sequencial utilizado identificar o boleto
|
40
|
+
# <b>OPCIONAL</b>: Número sequencial utilizado para identificar o boleto
|
32
41
|
attr_accessor :numero_documento
|
33
42
|
# <b>REQUERIDO</b>: Símbolo da moeda utilizada (R$ no brasil)
|
34
43
|
attr_accessor :especie
|
@@ -63,92 +72,154 @@ module Brcobranca
|
|
63
72
|
# <b>REQUERIDO</b>: Documento da pessoa que receberá o boleto
|
64
73
|
attr_accessor :sacado_documento
|
65
74
|
|
66
|
-
#
|
75
|
+
# Validações
|
76
|
+
validates_presence_of :agencia, :conta_corrente, :moeda, :especie_documento, :especie, :aceite, :numero_documento, :message => "não pode estar em branco."
|
77
|
+
validates_numericality_of :convenio, :agencia, :conta_corrente, :numero_documento, :message => "não é um número.", :allow_nil => true
|
78
|
+
|
79
|
+
# Nova instancia da classe Base
|
80
|
+
# @param [Hash] campos
|
67
81
|
def initialize(campos={})
|
68
|
-
padrao = {
|
82
|
+
padrao = {
|
83
|
+
:moeda => "9", :data_documento => Date.today, :dias_vencimento => 1, :quantidade => 1,
|
69
84
|
:especie_documento => "DM", :especie => "R$", :aceite => "S", :valor => 0.0,
|
70
|
-
:local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO"
|
85
|
+
:local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO"
|
86
|
+
}
|
71
87
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
88
|
+
campos = padrao.merge!(campos)
|
89
|
+
campos.each do |campo, valor|
|
90
|
+
send "#{campo}=", valor
|
76
91
|
end
|
77
92
|
|
78
|
-
|
79
|
-
|
80
|
-
self.banco.modulo11_9to2
|
81
|
-
end
|
93
|
+
yield self if block_given?
|
94
|
+
end
|
82
95
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
96
|
+
# Logotipo do banco
|
97
|
+
# @return [Path] Caminho para o arquivo de logotipo do banco.
|
98
|
+
def logotipo
|
99
|
+
File.join(File.dirname(__FILE__),'..','arquivos','logos',"#{class_name}.jpg")
|
100
|
+
end
|
87
101
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
102
|
+
# Dígito verificador do banco
|
103
|
+
# @return [Integer] 1 caracteres numéricos.
|
104
|
+
def banco_dv
|
105
|
+
self.banco.modulo11_9to2
|
106
|
+
end
|
92
107
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
108
|
+
# Código da agencia
|
109
|
+
# @return [String] 4 caracteres numéricos.
|
110
|
+
def agencia=(valor)
|
111
|
+
@agencia = valor.to_s.rjust(4,'0') unless valor.nil?
|
112
|
+
end
|
97
113
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
114
|
+
# Dígito verificador da agência
|
115
|
+
# @return [Integer] 1 caracteres numéricos.
|
116
|
+
def agencia_dv
|
117
|
+
self.agencia.modulo11_9to2
|
118
|
+
end
|
102
119
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
120
|
+
# Dígito verificador da conta corrente
|
121
|
+
# @return [Integer] 1 caracteres numéricos.
|
122
|
+
def conta_corrente_dv
|
123
|
+
self.conta_corrente.modulo11_9to2
|
124
|
+
end
|
108
125
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
126
|
+
# Dígito verificador do nosso número
|
127
|
+
# @return [Integer] 1 caracteres numéricos.
|
128
|
+
def nosso_numero_dv
|
129
|
+
self.numero_documento.modulo11_9to2
|
130
|
+
end
|
114
131
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
132
|
+
# @abstract Deverá ser sobreescrito para cada banco.
|
133
|
+
def nosso_numero_boleto
|
134
|
+
raise Brcobranca::NaoImplementado.new("Sobreescreva este método na classe referente ao banco que você esta criando")
|
135
|
+
end
|
120
136
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
137
|
+
# @abstract Deverá ser sobreescrito para cada banco.
|
138
|
+
def agencia_conta_boleto
|
139
|
+
raise Brcobranca::NaoImplementado.new("Sobreescreva este método na classe referente ao banco que você esta criando")
|
140
|
+
end
|
126
141
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
# 05 a 05 1 Dígito verificador do Código de Barras
|
133
|
-
# 06 a 09 4 Fator de Vencimento (Vide Nota)
|
134
|
-
# 10 a 19 10 Valor
|
135
|
-
# 20 a 44 25 Campo Livre
|
136
|
-
# As posições do campo livre ficam a critério de cada Banco arrecadador.
|
137
|
-
def codigo_barras
|
138
|
-
codigo = monta_codigo_43_digitos
|
139
|
-
return unless codigo
|
140
|
-
return if codigo.size != 43
|
141
|
-
codigo_dv = codigo.modulo11_2to9
|
142
|
+
# Valor total do documento: <b>quantidate * valor</b>
|
143
|
+
# @return [Float]
|
144
|
+
def valor_documento
|
145
|
+
self.quantidade.to_f * self.valor.to_f
|
146
|
+
end
|
142
147
|
|
143
|
-
|
144
|
-
|
148
|
+
# Data de vencimento baseado na <b>data_documento + dias_vencimento</b>
|
149
|
+
#
|
150
|
+
# @return [Date]
|
151
|
+
# @raise [ArgumentError] Caso {#data_documento} esteja em branco.
|
152
|
+
def data_vencimento
|
153
|
+
raise ArgumentError, "data_documento não pode estar em branco." unless self.data_documento
|
154
|
+
return self.data_documento unless self.dias_vencimento
|
155
|
+
(self.data_documento + self.dias_vencimento.to_i)
|
156
|
+
end
|
145
157
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
158
|
+
# Fator de vencimento calculado com base na data de vencimento do boleto.
|
159
|
+
# @return [String] 4 caracteres numéricos.
|
160
|
+
def fator_vencimento
|
161
|
+
self.data_vencimento.fator_vencimento
|
162
|
+
end
|
163
|
+
|
164
|
+
# Número da conta corrente
|
165
|
+
# @return [String] 7 caracteres numéricos.
|
166
|
+
def conta_corrente=(valor)
|
167
|
+
@conta_corrente = valor.to_s.rjust(7,'0') unless valor.nil?
|
168
|
+
end
|
169
|
+
|
170
|
+
# Codigo de barras do boleto
|
171
|
+
#
|
172
|
+
# O codigo de barra para cobrança contém 44 posições dispostas da seguinte forma:<br/>
|
173
|
+
# Posição |Tamanho |Conteúdo<br/>
|
174
|
+
# 01 a 03 | 3 | Identificação do Banco<br/>
|
175
|
+
# 04 a 04 | 1 | Código da Moeda (Real = 9, Outras=0)<br/>
|
176
|
+
# 05 a 05 | 1 | Dígito verificador do Código de Barras<br/>
|
177
|
+
# 06 a 09 | 4 | Fator de Vencimento (Vide Nota)<br/>
|
178
|
+
# 10 a 19 | 10 | Valor<br/>
|
179
|
+
# 20 a 44 | 25 | Campo Livre - As posições do campo livre ficam a critério de cada Banco arrecadador.<br/>
|
180
|
+
#
|
181
|
+
# @raise [Brcobranca::BoletoInvalido] Caso as informações fornecidas não sejam suficientes ou sejam inválidas.
|
182
|
+
# @return [String] código de barras formado por 44 caracteres numéricos.
|
183
|
+
def codigo_barras
|
184
|
+
raise Brcobranca::BoletoInvalido.new(self) unless self.valid?
|
185
|
+
codigo = codigo_barras_primeira_parte #18 digitos
|
186
|
+
codigo << codigo_barras_segunda_parte #25 digitos
|
187
|
+
if codigo =~ /^(\d{4})(\d{39})$/
|
188
|
+
codigo_dv = codigo.modulo11_2to9
|
189
|
+
codigo = "#{$1}#{codigo_dv}#{$2}"
|
190
|
+
codigo
|
191
|
+
else
|
192
|
+
raise Brcobranca::BoletoInvalido.new(self)
|
150
193
|
end
|
151
|
-
|
152
194
|
end
|
195
|
+
|
196
|
+
# Monta a segunda parte do código de barras, que é específico para cada banco.
|
197
|
+
#
|
198
|
+
# @abstract Deverá ser sobreescrito para cada banco.
|
199
|
+
def codigo_barras_segunda_parte
|
200
|
+
raise Brcobranca::NaoImplementado.new("Sobreescreva este método na classe referente ao banco que você esta criando")
|
201
|
+
end
|
202
|
+
|
203
|
+
private
|
204
|
+
|
205
|
+
# Monta a primeira parte do código de barras, que é a mesma para todos bancos.
|
206
|
+
# @return [String] 18 caracteres numéricos.
|
207
|
+
def codigo_barras_primeira_parte
|
208
|
+
"#{self.banco}#{self.moeda}#{self.fator_vencimento}#{valor_documento_formatado}"
|
209
|
+
end
|
210
|
+
|
211
|
+
# Valor total do documento
|
212
|
+
# @return [String] 10 caracteres numéricos.
|
213
|
+
def valor_documento_formatado
|
214
|
+
self.valor_documento.limpa_valor_moeda.to_s.rjust(10,'0')
|
215
|
+
end
|
216
|
+
|
217
|
+
# Nome da classe do boleto
|
218
|
+
# @return [String]
|
219
|
+
def class_name
|
220
|
+
self.class.to_s.split("::").last.downcase
|
221
|
+
end
|
222
|
+
|
153
223
|
end
|
154
|
-
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Boleto
|
4
|
+
class Bradesco < Base # Banco BRADESCO
|
5
|
+
|
6
|
+
validates_length_of :agencia, :maximum => 4, :message => "deve ser menor ou igual a 4 dígitos."
|
7
|
+
validates_length_of :numero_documento, :maximum => 11, :message => "deve ser menor ou igual a 11 dígitos."
|
8
|
+
validates_length_of :conta_corrente, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos."
|
9
|
+
validates_length_of :carteira, :maximum => 2, :message => "deve ser menor ou igual a 2 dígitos."
|
10
|
+
|
11
|
+
# Nova instancia do Bradesco
|
12
|
+
# @param (see Brcobranca::Boleto::Base#initialize)
|
13
|
+
def initialize(campos={})
|
14
|
+
campos = {:carteira => "06"}.merge!(campos)
|
15
|
+
super(campos)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Codigo do banco emissor (3 dígitos sempre)
|
19
|
+
#
|
20
|
+
# @return [String] 3 caracteres numéricos.
|
21
|
+
def banco
|
22
|
+
"237"
|
23
|
+
end
|
24
|
+
|
25
|
+
# Carteira
|
26
|
+
#
|
27
|
+
# @return [String] 2 caracteres numéricos.
|
28
|
+
def carteira=(valor)
|
29
|
+
@carteira = valor.to_s.rjust(2,'0') unless valor.nil?
|
30
|
+
end
|
31
|
+
|
32
|
+
# Número seqüencial utilizado para identificar o boleto.
|
33
|
+
# @return [String] 11 caracteres numéricos.
|
34
|
+
def numero_documento=(valor)
|
35
|
+
@numero_documento = valor.to_s.rjust(11,'0') unless valor.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
# Nosso número para exibir no boleto.
|
39
|
+
# @return [String]
|
40
|
+
# @example
|
41
|
+
# boleto.nosso_numero_boleto #=> ""06/00000004042-8"
|
42
|
+
def nosso_numero_boleto
|
43
|
+
"#{self.carteira}/#{self.numero_documento}-#{self.nosso_numero_dv}"
|
44
|
+
end
|
45
|
+
|
46
|
+
# Agência + conta corrente do cliente para exibir no boleto.
|
47
|
+
# @return [String]
|
48
|
+
# @example
|
49
|
+
# boleto.agencia_conta_boleto #=> "0548-7 / 00001448-6"
|
50
|
+
def agencia_conta_boleto
|
51
|
+
"#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
|
52
|
+
end
|
53
|
+
|
54
|
+
# Segunda parte do código de barras.
|
55
|
+
#
|
56
|
+
# Posição | Tamanho | Conteúdo<br/>
|
57
|
+
# 20 a 23 | 4 | Agência Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)<br/>
|
58
|
+
# 24 a 25 | 2 | Carteira<br/>
|
59
|
+
# 26 a 36 | 11 | Número do Nosso Número(Sem o digito verificador)<br/>
|
60
|
+
# 37 a 43 | 7 | Conta do Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)<br/>
|
61
|
+
# 44 a 44 | 1 | Zero<br/>
|
62
|
+
#
|
63
|
+
# @return [String] 25 caracteres numéricos.
|
64
|
+
def codigo_barras_segunda_parte
|
65
|
+
"#{self.agencia}#{self.carteira}#{self.numero_documento}#{self.conta_corrente}0"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# A Caixa tem dois padrões para a geração de boleto: SIGCB e SICOB.
|
4
|
+
# O SICOB foi substiuido pelo SIGCB que é implementado por esta classe.
|
5
|
+
# http://downloads.caixa.gov.br/_arquivos/cobranca_caixa_sigcb/manuais/CODIGO_BARRAS_SIGCB.PDF
|
6
|
+
#
|
7
|
+
module Brcobranca
|
8
|
+
module Boleto
|
9
|
+
class Caixa < Base # Caixa
|
10
|
+
|
11
|
+
MODALIDADE_COBRANCA = {
|
12
|
+
:registrada => '1',
|
13
|
+
:sem_registro => '2'
|
14
|
+
}
|
15
|
+
|
16
|
+
EMISSAO_BOLETO = {
|
17
|
+
:cedente => '4'
|
18
|
+
}
|
19
|
+
|
20
|
+
# Validações
|
21
|
+
validates_length_of :carteira, :is => 2, :message => 'deve possuir 2 dígitos.'
|
22
|
+
validates_length_of :convenio, :is => 6, :message => 'deve possuir 6 dígitos.'
|
23
|
+
validates_length_of :numero_documento, :is => 15, :message => 'deve possuir 15 dígitos.'
|
24
|
+
|
25
|
+
# Nova instância da CaixaEconomica
|
26
|
+
# @param (see Brcobranca::Boleto::Base#initialize)
|
27
|
+
def initialize campos = {}
|
28
|
+
campos = {
|
29
|
+
:carteira => "#{MODALIDADE_COBRANCA[:sem_registro]}#{EMISSAO_BOLETO[:cedente]}"
|
30
|
+
}.merge!(campos)
|
31
|
+
|
32
|
+
campos.merge!(:convenio => campos[:convenio].rjust(6, '0')) if campos[:convenio]
|
33
|
+
campos.merge!(:numero_documento => campos[:numero_documento].rjust(15, '0')) if campos[:numero_documento]
|
34
|
+
|
35
|
+
super(campos)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Código do banco emissor
|
39
|
+
# @return [String]
|
40
|
+
def banco; '104' end
|
41
|
+
|
42
|
+
# Dígito verificador do código do banco em módulo 10
|
43
|
+
# Módulo 10 de 104 é 0
|
44
|
+
# @return [String]
|
45
|
+
def banco_dv; '0' end
|
46
|
+
|
47
|
+
# Nosso número, 17 dígitos
|
48
|
+
# 1 à 2: carteira
|
49
|
+
# 3 à 17: campo_livre
|
50
|
+
# @return [String]
|
51
|
+
def nosso_numero_boleto
|
52
|
+
"#{carteira}#{numero_documento}-#{nosso_numero_dv}"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Dígito verificador do Nosso Número
|
56
|
+
# Utiliza-se o [-1..-1] para retornar o último caracter
|
57
|
+
# @return [String]
|
58
|
+
def nosso_numero_dv
|
59
|
+
"#{carteira}#{numero_documento}".modulo11_9to2.to_s[-1..-1]
|
60
|
+
end
|
61
|
+
|
62
|
+
# Número da agência/código cedente do cliente para exibir no boleto.
|
63
|
+
# @return [String]
|
64
|
+
# @example
|
65
|
+
# boleto.agencia_conta_boleto #=> "1565/100000-4"
|
66
|
+
def agencia_conta_boleto
|
67
|
+
"#{agencia}/#{convenio}-#{convenio_dv}"
|
68
|
+
end
|
69
|
+
|
70
|
+
# Dígito verificador do convênio ou código do cedente
|
71
|
+
# @return [String]
|
72
|
+
def convenio_dv
|
73
|
+
"#{convenio.modulo11_2to9}"
|
74
|
+
end
|
75
|
+
|
76
|
+
# Monta a segunda parte do código de barras.
|
77
|
+
# 1 à 6: código do cedente, também conhecido como convênio
|
78
|
+
# 7: dígito verificador do código do cedente
|
79
|
+
# 8 à 10: dígito 3 à 5 do nosso número
|
80
|
+
# 11: dígito 1 do nosso número (modalidade da cobrança)
|
81
|
+
# 12 à 14: dígito 6 à 8 do nosso número
|
82
|
+
# 15: dígito 2 do nosso número (emissão do boleto)
|
83
|
+
# 16 à 24: dígito 9 à 17 do nosso número
|
84
|
+
# 25: dígito verificador do campo livre
|
85
|
+
# @return [String]
|
86
|
+
def codigo_barras_segunda_parte
|
87
|
+
campo_livre = "#{convenio}" <<
|
88
|
+
"#{convenio_dv}" <<
|
89
|
+
"#{nosso_numero_boleto[2..4]}" <<
|
90
|
+
"#{nosso_numero_boleto[0..0]}" <<
|
91
|
+
"#{nosso_numero_boleto[5..7]}" <<
|
92
|
+
"#{nosso_numero_boleto[1..1]}" <<
|
93
|
+
"#{nosso_numero_boleto[8..16]}"
|
94
|
+
|
95
|
+
"#{campo_livre}#{campo_livre.modulo11_2to9}"
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Boleto
|
4
|
+
class Hsbc < Base # Banco HSBC
|
5
|
+
|
6
|
+
validates_inclusion_of :carteira, :in => %w( CNR ), :message => "não existente para este banco."
|
7
|
+
validates_length_of :agencia, :maximum => 4, :message => "deve ser menor ou igual a 4 dígitos."
|
8
|
+
validates_length_of :numero_documento, :maximum => 13, :message => "deve ser menor ou igual a 13 dígitos."
|
9
|
+
validates_length_of :conta_corrente, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos."
|
10
|
+
|
11
|
+
# Nova instancia do Hsbc
|
12
|
+
# @param (see Brcobranca::Boleto::Base#initialize)
|
13
|
+
def initialize(campos={})
|
14
|
+
campos = {:carteira => "CNR"}.merge!(campos)
|
15
|
+
super(campos)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Codigo do banco emissor (3 dígitos sempre)
|
19
|
+
#
|
20
|
+
# @return [String] 3 caracteres numéricos.
|
21
|
+
def banco
|
22
|
+
"399"
|
23
|
+
end
|
24
|
+
|
25
|
+
# Número seqüencial utilizado para identificar o boleto.
|
26
|
+
# @return [String] 13 caracteres numéricos.
|
27
|
+
def numero_documento=(valor)
|
28
|
+
@numero_documento = valor.to_s.rjust(13,'0') unless valor.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
# Número seqüencial utilizado para identificar o boleto.
|
32
|
+
#
|
33
|
+
# Montagem é baseada na presença da data de vencimento.<br/>
|
34
|
+
# <b>OBS:</b> Somente a carteira <b>CNR</b> está implementada.<br/>
|
35
|
+
#
|
36
|
+
# @return [String]
|
37
|
+
# @raise [Brcobranca::NaoImplementado] Caso a carteira informada não for CNR.
|
38
|
+
def nosso_numero
|
39
|
+
if self.data_vencimento.kind_of?(Date)
|
40
|
+
self.codigo_servico = "4"
|
41
|
+
dia = self.data_vencimento.day.to_s.rjust(2,'0')
|
42
|
+
mes = self.data_vencimento.month.to_s.rjust(2,'0')
|
43
|
+
ano = self.data_vencimento.year.to_s[2..3]
|
44
|
+
data = "#{dia}#{mes}#{ano}"
|
45
|
+
|
46
|
+
parte_1 = "#{self.numero_documento}#{self.numero_documento.modulo11_9to2_10_como_zero}#{self.codigo_servico}"
|
47
|
+
soma = parte_1.to_i + self.conta_corrente.to_i + data.to_i
|
48
|
+
numero = "#{parte_1}#{soma.to_s.modulo11_9to2_10_como_zero}"
|
49
|
+
numero
|
50
|
+
else
|
51
|
+
raise Brcobranca::NaoImplementado.new("Tipo de carteira não implementado.")
|
52
|
+
# TODO - Verificar outras carteiras.
|
53
|
+
# self.codigo_servico = "5"
|
54
|
+
# parte_1 = "#{self.numero_documento}#{self.numero_documento.modulo11_9to2_10_como_zero}#{self.codigo_servico}"
|
55
|
+
# soma = parte_1.to_i + self.conta_corrente.to_i
|
56
|
+
# numero = "#{parte_1}#{soma.to_s.modulo11_9to2_10_como_zero}"
|
57
|
+
# numero
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Nosso número para exibir no boleto.
|
62
|
+
# @return [String]
|
63
|
+
# @example
|
64
|
+
# boleto.nosso_numero_boleto #=> "0000000004042847"
|
65
|
+
def nosso_numero_boleto
|
66
|
+
self.nosso_numero
|
67
|
+
end
|
68
|
+
|
69
|
+
# Número do convênio/contrato do cliente para exibir no boleto.
|
70
|
+
# @return [String]
|
71
|
+
# @example
|
72
|
+
# boleto.agencia_conta_boleto #=> "0061900"
|
73
|
+
def agencia_conta_boleto
|
74
|
+
self.conta_corrente
|
75
|
+
end
|
76
|
+
|
77
|
+
# Segunda parte do código de barras.
|
78
|
+
#
|
79
|
+
# Montagem é baseada no tipo de carteira e na presença da data de vencimento<br/>
|
80
|
+
# <b>OBS:</b> Somente a carteira <b>CNR</b> está implementada.<br/>
|
81
|
+
#
|
82
|
+
# @return [String] 25 caracteres numéricos.
|
83
|
+
# @raise [Brcobranca::NaoImplementado] Caso a carteira informada não for CNR.
|
84
|
+
def codigo_barras_segunda_parte
|
85
|
+
if self.carteira == "CNR"
|
86
|
+
dias_julianos = self.data_vencimento.to_juliano
|
87
|
+
"#{self.conta_corrente}#{self.numero_documento}#{dias_julianos}2"
|
88
|
+
else
|
89
|
+
raise Brcobranca::NaoImplementado.new("Tipo de carteira não implementado.")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Boleto
|
4
|
+
class Itau < Base # Banco Itaú
|
5
|
+
|
6
|
+
# Usado somente em carteiras especiais com registro para complementar o número do cocumento
|
7
|
+
attr_reader :seu_numero
|
8
|
+
|
9
|
+
validates_length_of :agencia, :maximum => 4, :message => "deve ser menor ou igual a 4 dígitos."
|
10
|
+
validates_length_of :convenio, :maximum => 5, :message => "deve ser menor ou igual a 5 dígitos."
|
11
|
+
validates_length_of :numero_documento, :maximum => 8, :message => "deve ser menor ou igual a 8 dígitos."
|
12
|
+
validates_length_of :conta_corrente, :maximum => 5, :message => "deve ser menor ou igual a 5 dígitos."
|
13
|
+
validates_length_of :seu_numero, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos."
|
14
|
+
|
15
|
+
# Nova instancia do Itau
|
16
|
+
# @param (see Brcobranca::Boleto::Base#initialize)
|
17
|
+
def initialize(campos={})
|
18
|
+
campos = {:carteira => "175"}.merge!(campos)
|
19
|
+
super(campos)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Codigo do banco emissor (3 dígitos sempre)
|
23
|
+
#
|
24
|
+
# @return [String] 3 caracteres numéricos.
|
25
|
+
def banco
|
26
|
+
"341"
|
27
|
+
end
|
28
|
+
|
29
|
+
# Número do convênio/contrato do cliente junto ao banco.
|
30
|
+
# @return [String] 5 caracteres numéricos.
|
31
|
+
def convenio=(valor)
|
32
|
+
@convenio = valor.to_s.rjust(5,'0') unless valor.nil?
|
33
|
+
end
|
34
|
+
|
35
|
+
# Conta corrente
|
36
|
+
# @return [String] 5 caracteres numéricos.
|
37
|
+
def conta_corrente=(valor)
|
38
|
+
@conta_corrente = valor.to_s.rjust(5,'0') unless valor.nil?
|
39
|
+
end
|
40
|
+
|
41
|
+
# Número seqüencial utilizado para identificar o boleto.
|
42
|
+
# @return [String] 8 caracteres numéricos.
|
43
|
+
def numero_documento=(valor)
|
44
|
+
@numero_documento = valor.to_s.rjust(8,'0') unless valor.nil?
|
45
|
+
end
|
46
|
+
|
47
|
+
# Número seqüencial utilizado para identificar o boleto.
|
48
|
+
# @return [String] 7 caracteres numéricos.
|
49
|
+
def seu_numero=(valor)
|
50
|
+
@seu_numero = valor.to_s.rjust(7,'0') unless valor.nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
# Dígito verificador do nosso número.
|
54
|
+
#
|
55
|
+
# Para a grande maioria das carteiras, são considerados para a obtenção do DAC/DV, os dados
|
56
|
+
# "AGENCIA(sem DAC/DV)/CONTA(sem DAC/DV)/CARTEIRA/NOSSO NUMERO", calculado pelo criterio do Modulo 10.<br/>
|
57
|
+
# A excecao, estão as carteiras 112, 126, 131, 146, 150 e 168 cuja obtenção esta baseada apenas nos
|
58
|
+
# dados "CARTEIRA/NOSSO NUMERO".
|
59
|
+
#
|
60
|
+
# @return [String] 1 caracteres numéricos.
|
61
|
+
def nosso_numero_dv
|
62
|
+
if %w(112 126 131 146 150 168).include?(self.carteira)
|
63
|
+
"#{self.carteira}#{self.numero_documento}".modulo10
|
64
|
+
else
|
65
|
+
"#{self.agencia}#{self.conta_corrente}#{self.carteira}#{self.numero_documento}".modulo10
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Calcula o dígito verificador para conta corrente do Itau.
|
70
|
+
# Retorna apenas o dígito verificador da conta ou nil caso seja impossível calcular.
|
71
|
+
def agencia_conta_corrente_dv
|
72
|
+
"#{self.agencia}#{self.conta_corrente}".modulo10
|
73
|
+
end
|
74
|
+
|
75
|
+
# Nosso número para exibir no boleto.
|
76
|
+
# @return [String]
|
77
|
+
# @example
|
78
|
+
# boleto.nosso_numero_boleto #=> "175/12345678-4"
|
79
|
+
def nosso_numero_boleto
|
80
|
+
"#{self.carteira}/#{self.numero_documento}-#{self.nosso_numero_dv}"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Agência + conta corrente do cliente para exibir no boleto.
|
84
|
+
# @return [String]
|
85
|
+
# @example
|
86
|
+
# boleto.agencia_conta_boleto #=> "0811 / 53678-8"
|
87
|
+
def agencia_conta_boleto
|
88
|
+
"#{self.agencia} / #{self.conta_corrente}-#{self.agencia_conta_corrente_dv}"
|
89
|
+
end
|
90
|
+
|
91
|
+
# Segunda parte do código de barras.
|
92
|
+
#
|
93
|
+
# CARTEIRAS 198, 106, 107,122, 142, 143, 195 e 196<br/>
|
94
|
+
# 01 a 03 | 03 | 9(3) | Código do Banco na Câmara de Compensação = ‘341’<br/>
|
95
|
+
# 04 a 04 | 01 | 9(1) | Código da Moeda = '9'<br/>
|
96
|
+
# 05 a 05 | 01 | 9(1) | DAC do Código de Barras MOD 11-2a9<br/>
|
97
|
+
# 06 a 09 | 04 | 9(04) | Fator de Vencimento<br/>
|
98
|
+
# 10 a 19 | 10 | 9(08) | V(2) Valor<br/>
|
99
|
+
# 20 a 22 | 03 | 9(3) | Carteira<br/>
|
100
|
+
# 23 a 30 | 08 | 9(8) | Nosso Número<br/>
|
101
|
+
# 31 a 37 | 07 | 9(7) | Seu Número (Número do Documento)<br/>
|
102
|
+
# 38 a 42 | 05 | 9(5) | Código do Cliente (fornecido pelo Banco)<br/>
|
103
|
+
# 43 a 43 | 01 | 9(1) | DAC dos campos acima (posições 20 a 42) MOD 10<br/>
|
104
|
+
# 44 a 44 | 01 | 9(1) | Zero<br/>
|
105
|
+
#
|
106
|
+
# DEMAIS CARTEIRAS<br/>
|
107
|
+
# 01 a 03 | 03 | 9(03) | Código do Banco na Câmara de Compensação = '341'<br/>
|
108
|
+
# 04 a 04 | 01 | 9(01) | Código da Moeda = '9'<br/>
|
109
|
+
# 05 a 05 | 01 | 9(01) | DAC código de Barras MOD 11-2a9<br/>
|
110
|
+
# 06 a 09 | 04 | 9(04) | Fator de Vencimento<br/>
|
111
|
+
# 10 a 19 | 10 | 9(08)V(2) | Valor<br/>
|
112
|
+
# 20 a 22 | 03 | 9(03) | Carteira<br/>
|
113
|
+
# 23 a 30 | 08 | 9(08) | Nosso Número<br/>
|
114
|
+
# 31 a 31 | 01 | 9(01) | DAC [Agência /Conta/Carteira/Nosso Número] MOD 10<br/>
|
115
|
+
# 32 a 35 | 04 | 9(04) | N.º da Agência cedente<br/>
|
116
|
+
# 36 a 40 | 05 | 9(05) | N.º da Conta Corrente<br/>
|
117
|
+
# 41 a 41 | 01 | 9(01) | DAC [Agência/Conta Corrente] MOD 10<br/>
|
118
|
+
# 42 a 44 | 03 | 9(03) | Zeros<br/>
|
119
|
+
#
|
120
|
+
# @return [String] 25 caracteres numéricos.
|
121
|
+
def codigo_barras_segunda_parte
|
122
|
+
case self.carteira.to_i
|
123
|
+
when 198, 106, 107, 122, 142, 143, 195, 196
|
124
|
+
dv = "#{self.carteira}#{numero_documento}#{self.seu_numero}#{self.convenio}".modulo10
|
125
|
+
"#{self.carteira}#{self.numero_documento}#{self.seu_numero}#{self.convenio}#{dv}0"
|
126
|
+
else
|
127
|
+
"#{self.carteira}#{self.numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|