brcobranca 2.0.6 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/.document +5 -0
  2. data/.gitignore +30 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.lock +48 -0
  5. data/History.txt +13 -1
  6. data/LICENSE +20 -0
  7. data/README.rdoc +12 -5
  8. data/Rakefile +33 -37
  9. data/VERSION +1 -0
  10. data/brcobranca.gemspec +26 -35
  11. data/lib/brcobranca/arquivos/logos/{bb.jpg → bancobrasil.jpg} +0 -0
  12. data/lib/brcobranca/arquivos/logos/banespa.jpg +0 -0
  13. data/lib/brcobranca/arquivos/logos/caixa.jpg +0 -0
  14. data/lib/brcobranca/boleto/banco_brasil.rb +150 -77
  15. data/lib/brcobranca/boleto/base.rb +146 -75
  16. data/lib/brcobranca/boleto/bradesco.rb +69 -0
  17. data/lib/brcobranca/boleto/caixa.rb +100 -0
  18. data/lib/brcobranca/boleto/hsbc.rb +95 -0
  19. data/lib/brcobranca/boleto/itau.rb +133 -0
  20. data/lib/brcobranca/boleto/real.rb +74 -0
  21. data/lib/brcobranca/boleto/template/base.rb +13 -0
  22. data/lib/brcobranca/boleto/template/rghost.rb +136 -62
  23. data/lib/brcobranca/boleto/unibanco.rb +115 -0
  24. data/lib/brcobranca/calculo.rb +132 -0
  25. data/lib/brcobranca/calculo_data.rb +42 -0
  26. data/lib/brcobranca/currency.rb +3 -4
  27. data/lib/brcobranca/formatacao.rb +102 -0
  28. data/lib/brcobranca/limpeza.rb +19 -0
  29. data/lib/brcobranca/retorno/base.rb +1 -2
  30. data/lib/brcobranca/retorno/retorno_cbr643.rb +42 -40
  31. data/lib/brcobranca/version.rb +3 -0
  32. data/lib/brcobranca.rb +93 -16
  33. data/spec/brcobranca/banco_bradesco_spec.rb +63 -50
  34. data/spec/brcobranca/banco_brasil_spec.rb +102 -136
  35. data/spec/brcobranca/banco_caixa_spec.rb +166 -0
  36. data/spec/brcobranca/banco_hsbc_spec.rb +83 -76
  37. data/spec/brcobranca/banco_real_spec.rb +54 -37
  38. data/spec/brcobranca/banco_unibanco_spec.rb +69 -52
  39. data/spec/brcobranca/base_spec.rb +24 -79
  40. data/spec/brcobranca/boletos_em_lote_spec.rb +46 -0
  41. data/spec/brcobranca/core_ext_spec.rb +24 -114
  42. data/spec/brcobranca/currency_spec.rb +1 -0
  43. data/spec/brcobranca/{banco_itau_spec.rb → itau_spec.rb} +112 -67
  44. data/spec/brcobranca/retorno_cbr643_spec.rb +13 -12
  45. data/spec/brcobranca/rghost_spec.rb +8 -7
  46. data/spec/brcobranca_spec.rb +16 -6
  47. data/spec/spec_helper.rb +11 -8
  48. metadata +107 -58
  49. data/Manifest.txt +0 -51
  50. data/PostInstall.txt +0 -4
  51. data/lib/brcobranca/boleto/banco_banespa.rb +0 -85
  52. data/lib/brcobranca/boleto/banco_bradesco.rb +0 -44
  53. data/lib/brcobranca/boleto/banco_hsbc.rb +0 -77
  54. data/lib/brcobranca/boleto/banco_itau.rb +0 -115
  55. data/lib/brcobranca/boleto/banco_real.rb +0 -70
  56. data/lib/brcobranca/boleto/banco_unibanco.rb +0 -79
  57. data/lib/brcobranca/boleto/template/util.rb +0 -32
  58. data/lib/brcobranca/config.rb +0 -9
  59. data/lib/brcobranca/core_ext.rb +0 -279
  60. data/spec/brcobranca/banco_banespa_spec.rb +0 -195
  61. data/spec/brcobranca/template/rghost_spec.rb +0 -65
  62. data/spec/brcobranca/template/util_spec.rb +0 -42
  63. data/spec/rcov.opts +0 -2
  64. data/spec/spec.opts +0 -6
  65. data/tasks/rcov.rake +0 -12
  66. 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
- # <b>REQUERIDO</b>: Codigo do banco emissor (3 dígitos sempre)
6
- attr_accessor :banco
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
- # Responsável por definir dados iniciais quando se cria uma nova intância da classe Base.
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 = { :moeda => "9", :data_documento => Date.today, :dias_vencimento => 1, :quantidade => 1,
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
- campos = padrao.merge!(campos)
73
- campos.each do |campo, valor|
74
- instance_variable_set "@#{campo}", valor if self.respond_to?(campo)
75
- end
88
+ campos = padrao.merge!(campos)
89
+ campos.each do |campo, valor|
90
+ send "#{campo}=", valor
76
91
  end
77
92
 
78
- # Retorna dígito verificador do banco, calculado com modulo11 de 9 para 2
79
- def banco_dv
80
- self.banco.modulo11_9to2
81
- end
93
+ yield self if block_given?
94
+ end
82
95
 
83
- # Retorna dígito verificador da agência, calculado com modulo11 de 9 para 2
84
- def agencia_dv
85
- self.agencia.modulo11_9to2
86
- end
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
- # Retorna dígito verificador da conta corrente, calculado com modulo11 de 9 para 2
89
- def conta_corrente_dv
90
- self.conta_corrente.modulo11_9to2
91
- end
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
- # Retorna dígito verificador do nosso número, calculado com modulo11 de 9 para 2
94
- def nosso_numero_dv
95
- self.numero_documento.modulo11_9to2
96
- end
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
- # Número sequencial utilizado para distinguir os boletos na agência
99
- def nosso_numero
100
- self.numero_documento
101
- end
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
- # Campo usado apenas na exibição no boleto
104
- # Deverá ser sobreescrito para cada banco
105
- def nosso_numero_boleto
106
- "Sobreescreva este método na classe referente ao banco que você esta criando"
107
- end
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
- # Campo usado apenas na exibição no boleto
110
- # Deverá ser sobreescrito para cada banco
111
- def agencia_conta_boleto
112
- "Sobreescreva este método na classe referente ao banco que você esta criando"
113
- end
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
- # Retorna o valor total do documento: <b>quantidate * valor</b> ou <b>zero(0)</b> caso não consiga efetuar o cálculo.
116
- def valor_documento
117
- return 0 unless self.quantidade.kind_of?(Numeric) && self.valor.kind_of?(Numeric)
118
- self.quantidade * self.valor.to_f
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
- # Retorna data de vencimento baseado na <b>data_documento + dias_vencimento</b> ou <b>false</b> caso não consiga efetuar o cálculo.
122
- def data_vencimento
123
- return nil unless self.data_documento.kind_of?(Date) && self.dias_vencimento.kind_of?(Numeric)
124
- (self.data_documento + self.dias_vencimento.to_i)
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
- # Retorna uma String com 44 caracteres representando o codigo de barras do boleto
128
- # O código de barra para cobrança contém 44 posições dispostas da seguinte forma:
129
- # Posição Tamanho Conteúdo
130
- # 01 a 03 3 Identificação do Banco
131
- # 04 a 04 1 Código da Moeda (Real = 9, Outras=0)
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
- "#{codigo[0..3]}#{codigo_dv}#{codigo[4..42]}"
144
- end
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
- # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
147
- # Este metodo precisa ser reescrito para cada classe de boleto a ser criada.
148
- def monta_codigo_43_digitos
149
- "Sobreescreva este método na classe referente ao banco que você esta criando"
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