kivanio-brcobranca 2.0.5 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/History.txt +5 -1
  2. data/Manifest.txt +24 -0
  3. data/PostInstall.txt +4 -0
  4. data/README.rdoc +4 -4
  5. data/Rakefile +9 -6
  6. data/brcobranca.gemspec +9 -9
  7. data/lib/brcobranca.rb +10 -2
  8. data/lib/brcobranca/arquivos/logos/banespa.jpg +0 -0
  9. data/lib/brcobranca/boleto/banco_banespa.rb +85 -0
  10. data/lib/brcobranca/boleto/banco_bradesco.rb +14 -1
  11. data/lib/brcobranca/boleto/banco_brasil.rb +18 -9
  12. data/lib/brcobranca/boleto/banco_hsbc.rb +22 -8
  13. data/lib/brcobranca/boleto/banco_itau.rb +20 -10
  14. data/lib/brcobranca/boleto/banco_real.rb +16 -2
  15. data/lib/brcobranca/boleto/banco_unibanco.rb +19 -5
  16. data/lib/brcobranca/boleto/base.rb +21 -15
  17. data/lib/brcobranca/boleto/template/rghost.rb +18 -16
  18. data/lib/brcobranca/boleto/template/util.rb +2 -0
  19. data/lib/brcobranca/core_ext.rb +57 -47
  20. data/lib/brcobranca/currency.rb +7 -10
  21. data/spec/arquivos/CBR64310.RET +28 -0
  22. data/spec/brcobranca/banco_banespa_spec.rb +195 -0
  23. data/spec/brcobranca/banco_bradesco_spec.rb +179 -0
  24. data/spec/brcobranca/banco_brasil_spec.rb +353 -0
  25. data/spec/brcobranca/banco_hsbc_spec.rb +216 -0
  26. data/spec/brcobranca/banco_itau_spec.rb +202 -0
  27. data/spec/brcobranca/banco_real_spec.rb +145 -0
  28. data/spec/brcobranca/banco_unibanco_spec.rb +193 -0
  29. data/spec/brcobranca/base_spec.rb +240 -0
  30. data/spec/brcobranca/core_ext_spec.rb +275 -0
  31. data/spec/brcobranca/currency_spec.rb +81 -0
  32. data/spec/brcobranca/retorno_cbr643_spec.rb +69 -0
  33. data/spec/brcobranca/rghost_spec.rb +36 -0
  34. data/spec/brcobranca/template/rghost_spec.rb +65 -0
  35. data/spec/brcobranca/template/util_spec.rb +42 -0
  36. data/spec/brcobranca_spec.rb +8 -0
  37. data/spec/rcov.opts +2 -0
  38. data/spec/spec.opts +6 -0
  39. data/spec/spec_helper.rb +10 -0
  40. data/tasks/rcov.rake +12 -0
  41. data/tasks/rspec.rake +21 -0
  42. metadata +34 -31
  43. data/test/test_banco_bradesco.rb +0 -87
  44. data/test/test_banco_brasil.rb +0 -276
  45. data/test/test_banco_hsbc.rb +0 -81
  46. data/test/test_banco_itau.rb +0 -103
  47. data/test/test_banco_real.rb +0 -112
  48. data/test/test_banco_unibanco.rb +0 -92
  49. data/test/test_base.rb +0 -162
  50. data/test/test_core_ext.rb +0 -227
  51. data/test/test_currency.rb +0 -51
  52. data/test/test_helper.rb +0 -5
  53. data/test/test_retorno_cbr643.rb +0 -66
  54. data/test/test_rghost.rb +0 -49
@@ -10,10 +10,10 @@ class BancoItau < Brcobranca::Boleto::Base
10
10
  super(campos)
11
11
  end
12
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
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
17
  # dados "CARTEIRA/NOSSO NUMERO".
18
18
  def nosso_numero_dv
19
19
  if %w(126 131 146 150 168).include?(self.carteira)
@@ -24,16 +24,23 @@ class BancoItau < Brcobranca::Boleto::Base
24
24
  end
25
25
  end
26
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.
27
+ # Calcula o dígito verificador para conta corrente do Itau.
33
28
  # Retorna apenas o dígito verificador da conta ou nil caso seja impossível calcular.
34
29
  def agencia_conta_corrente_dv
35
30
  "#{self.agencia}#{self.conta_corrente}".modulo10
36
31
  end
32
+
33
+ # Campo usado apenas na exibição no boleto
34
+ # Deverá ser sobreescrito para cada banco
35
+ def nosso_numero_boleto
36
+ "#{self.carteira}/#{self.numero_documento}-#{self.nosso_numero_dv}"
37
+ end
38
+
39
+ # Campo usado apenas na exibição no boleto
40
+ # Deverá ser sobreescrito para cada banco
41
+ def agencia_conta_boleto
42
+ "#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
43
+ end
37
44
 
38
45
  # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras.
39
46
  def monta_codigo_43_digitos
@@ -61,6 +68,7 @@ class BancoItau < Brcobranca::Boleto::Base
61
68
  codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
62
69
  codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
63
70
  codigo
71
+ codigo.size == 43 ? codigo : nil
64
72
  when 198, 106, 107, 122, 142, 143, 195, 196
65
73
  # CARTEIRAS 198, 106, 107,122, 142, 143, 195 e 196
66
74
  # 01 a 03 03 9(3) Código do Banco na Câmara de Compensação = ‘341’
@@ -83,6 +91,7 @@ class BancoItau < Brcobranca::Boleto::Base
83
91
  codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
84
92
  codigo << "#{numero_documento}#{seu_numero}#{convenio}#{dv}0"
85
93
  codigo
94
+ codigo.size == 43 ? codigo : nil
86
95
  else
87
96
  # DEMAIS CARTEIRAS
88
97
  # 01 a 03 03 9(03) Código do Banco na Câmara de Compensação = '341'
@@ -100,6 +109,7 @@ class BancoItau < Brcobranca::Boleto::Base
100
109
  codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
101
110
  codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
102
111
  codigo
112
+ codigo.size == 43 ? codigo : nil
103
113
  end
104
114
  end
105
115
  end
@@ -6,7 +6,19 @@ class BancoReal < Brcobranca::Boleto::Base
6
6
  campos = padrao.merge!(campos)
7
7
  super(campos)
8
8
  end
9
+
10
+ # Campo usado apenas na exibição no boleto
11
+ # Deverá ser sobreescrito para cada banco
12
+ def nosso_numero_boleto
13
+ "#{self.numero_documento}-#{self.nosso_numero_dv}"
14
+ end
9
15
 
16
+ # Campo usado apenas na exibição no boleto
17
+ # Deverá ser sobreescrito para cada banco
18
+ def agencia_conta_boleto
19
+ "#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
20
+ end
21
+
10
22
  # CALCULO DO DIGITO:
11
23
  # APLICA-SE OS PESOS 2,1,2,1,.... AOS ALGARISMOS DO NUMERO COMPOSTO POR:
12
24
  # NUMERO DO BANCO : COM 7 DIGITOS P/ COBRANCA REGISTRADA
@@ -46,11 +58,13 @@ class BancoReal < Brcobranca::Boleto::Base
46
58
  # Carteira sem registro
47
59
  when 57
48
60
  numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
49
- "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
61
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
62
+ codigo.size == 43 ? codigo : nil
50
63
  else
51
64
  # TODO verificar com o banco, pois não consta na documentação
52
65
  numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
53
- "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
66
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
67
+ codigo.size == 43 ? codigo : nil
54
68
  end
55
69
  end
56
70
  end
@@ -10,7 +10,19 @@ class BancoUnibanco < Brcobranca::Boleto::Base
10
10
  end
11
11
 
12
12
  def nosso_numero_dv
13
- self.numero_documento.zeros_esquerda(:tamanho => 11).modulo11_2to9
13
+ self.numero_documento.modulo11_2to9
14
+ end
15
+
16
+ # Campo usado apenas na exibição no boleto
17
+ # Deverá ser sobreescrito para cada banco
18
+ def nosso_numero_boleto
19
+ "#{self.numero_documento.zeros_esquerda(:tamanho => 14)}-#{self.nosso_numero_dv}"
20
+ end
21
+
22
+ # Campo usado apenas na exibição no boleto
23
+ # Deverá ser sobreescrito para cada banco
24
+ def agencia_conta_boleto
25
+ "#{self.agencia} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
14
26
  end
15
27
 
16
28
  # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
@@ -34,11 +46,12 @@ class BancoUnibanco < Brcobranca::Boleto::Base
34
46
  # 21 a 27 7 número do cliente no CÓDIGO DE BARRAS + dígito verificador
35
47
  # 28 a 29 2 vago. Usar 00 (número FIXO)
36
48
  # 30 a 43 14 Número de referência do cliente
37
- # 44 1 Dígito verificador
49
+ # 44 1 Dígito verificador
38
50
 
39
51
  convenio = self.convenio.zeros_esquerda(:tamanho => 6)
40
52
  numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 14)
41
- "#{banco}#{self.moeda}#{fator}#{valor_documento}#{carteira}#{convenio}00#{numero_documento}#{self.nosso_numero_dv}"
53
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{carteira}#{convenio}00#{numero_documento}#{self.nosso_numero_dv}"
54
+ codigo.size == 43 ? codigo : nil
42
55
  when 4
43
56
 
44
57
  # Cobrança com registro (CÓDIGO DE BARRAS)
@@ -46,7 +59,7 @@ class BancoUnibanco < Brcobranca::Boleto::Base
46
59
  # 1 a 3 3 Número de identificação do Unibanco: 409 (número FIXO)
47
60
  # 4 1 Código da moeda. Real (R$)=9 (número FIXO)
48
61
  # 5 1 dígito verificador do CÓDIGO DE BARRAS
49
- # 6 a 9 4 fator de vencimento em 4 algarismos, conforme tabela da página 14
62
+ # 6 a 9 4 fator de vencimento em 4 algarismos, conforme tabela da página 14
50
63
  # 10 a 19 10 valor do título com zeros à esquerda
51
64
  # 20 a 21 2 Código para transação CVT: 04 (número FIXO) (04=5539-5)
52
65
  # 22 a 27 6 data de vencimento (AAMMDD)
@@ -57,7 +70,8 @@ class BancoUnibanco < Brcobranca::Boleto::Base
57
70
  data = self.data_vencimento.strftime('%y%m%d')
58
71
  agencia = self.agencia.zeros_esquerda(:tamanho => 4)
59
72
  numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 11)
60
- "#{banco}#{self.moeda}#{fator}#{valor_documento}0#{carteira}#{data}#{agencia}#{self.agencia_dv}#{numero_documento}#{self.nosso_numero_dv}"
73
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}0#{carteira}#{data}#{agencia}#{self.agencia_dv}#{numero_documento}#{self.nosso_numero_dv}"
74
+ codigo.size == 43 ? codigo : nil
61
75
  else
62
76
  nil
63
77
  end
@@ -66,7 +66,7 @@ module Brcobranca
66
66
  # Responsável por definir dados iniciais quando se cria uma nova intância da classe Base.
67
67
  def initialize(campos={})
68
68
  padrao = { :moeda => "9", :data_documento => Date.today, :dias_vencimento => 1, :quantidade => 1,
69
- :especie_documento => "DM", :especie => "R$", :aceite => "S", :valor => 0.0,
69
+ :especie_documento => "DM", :especie => "R$", :aceite => "S", :valor => 0.0,
70
70
  :local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO"}
71
71
 
72
72
  campos = padrao.merge!(campos)
@@ -100,23 +100,28 @@ module Brcobranca
100
100
  self.numero_documento
101
101
  end
102
102
 
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
108
+
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
114
+
103
115
  # Retorna o valor total do documento: <b>quantidate * valor</b> ou <b>zero(0)</b> caso não consiga efetuar o cálculo.
104
116
  def valor_documento
105
- begin
106
- self.quantidade * self.valor.to_f
107
- rescue
108
- 0
109
- end
117
+ return 0 unless self.quantidade.kind_of?(Numeric) && self.valor.kind_of?(Numeric)
118
+ self.quantidade * self.valor.to_f
110
119
  end
111
120
 
112
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.
113
122
  def data_vencimento
114
- begin
115
- return false unless self.data_documento.kind_of?(Date)
116
- (self.data_documento + self.dias_vencimento.to_i)
117
- rescue
118
- false
119
- end
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)
120
125
  end
121
126
 
122
127
  # Retorna uma String com 44 caracteres representando o codigo de barras do boleto
@@ -131,18 +136,19 @@ module Brcobranca
131
136
  # As posições do campo livre ficam a critério de cada Banco arrecadador.
132
137
  def codigo_barras
133
138
  codigo = monta_codigo_43_digitos
134
- return nil unless codigo
135
- return nil if codigo.size != 43
139
+ return unless codigo
140
+ return if codigo.size != 43
136
141
  codigo_dv = codigo.modulo11_2to9
137
142
 
138
143
  "#{codigo[0..3]}#{codigo_dv}#{codigo[4..42]}"
139
144
  end
140
145
 
141
146
  # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
142
- # Este metodo precisa ser reescrito para cada classe de boleto a ser criada.
147
+ # Este metodo precisa ser reescrito para cada classe de boleto a ser criada.
143
148
  def monta_codigo_43_digitos
144
149
  "Sobreescreva este método na classe referente ao banco que você esta criando"
145
150
  end
151
+
146
152
  end
147
153
  end
148
154
  end
@@ -1,12 +1,17 @@
1
1
  begin
2
- require 'rghost'
2
+ require 'rghost'
3
3
  rescue LoadError
4
- puts 'Por favor execute `sudo gem install rghost` para usar o brcobranca'
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rghost'
6
+ require 'rghost'
5
7
  end
8
+
6
9
  begin
7
- require 'rghost_barcode'
10
+ require 'rghost_barcode'
8
11
  rescue LoadError
9
- puts 'Por favor execute `sudo gem install rghost_barcode` para usar o brcobranca'
12
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
13
+ gem 'rghost_barcode'
14
+ require 'rghost_barcode'
10
15
  end
11
16
 
12
17
  module Brcobranca
@@ -15,13 +20,14 @@ module Brcobranca
15
20
  # Templates para usar com Rghost
16
21
  module Rghost
17
22
  include RGhost unless self.include?(RGhost)
18
-
23
+
19
24
  # Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
20
25
  # Veja mais formatos na documentação do rghost: http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats
21
- def to(formato)
26
+ # TODO - Usar define_method para criar um metodo em tempo real to_{pdf,jpg}
27
+ def to(formato=Brcobranca::Config::OPCOES[:tipo])
22
28
  modelo_generico(:tipo => formato)
23
29
  end
24
-
30
+
25
31
  # Responsável por setar os valores necessários no template genérico
26
32
  # Retorna um stream pronto para gravaçào
27
33
  #
@@ -43,7 +49,7 @@ module Brcobranca
43
49
  doc.define_tags do
44
50
  tag :grande, :size => 13
45
51
  end
46
-
52
+
47
53
  # Busca logo automaticamente
48
54
  logo = monta_logo
49
55
 
@@ -58,7 +64,7 @@ module Brcobranca
58
64
  doc.moveto :x => '0.7 cm' , :y => '23 cm'
59
65
  doc.show self.cedente
60
66
  doc.moveto :x => '11 cm' , :y => '23 cm'
61
- doc.show "#{self.agencia}-#{self.agencia_dv}/#{self.conta_corrente}-#{self.conta_corrente_dv}"
67
+ doc.show self.agencia_conta_boleto
62
68
  doc.moveto :x => '14.2 cm' , :y => '23 cm'
63
69
  doc.show self.especie
64
70
  doc.moveto :x => '15.7 cm' , :y => '23 cm'
@@ -70,7 +76,7 @@ module Brcobranca
70
76
  doc.moveto :x => '12 cm' , :y => '22.2 cm'
71
77
  doc.show self.data_vencimento.to_s_br
72
78
  doc.moveto :x => '16.5 cm' , :y => '23 cm'
73
- doc.show self.nosso_numero
79
+ doc.show self.nosso_numero_boleto
74
80
  doc.moveto :x => '16.5 cm' , :y => '22.2 cm'
75
81
  doc.show self.valor_documento.to_currency
76
82
  doc.moveto :x => '1.4 cm' , :y => '20.9 cm'
@@ -93,7 +99,7 @@ module Brcobranca
93
99
  doc.moveto :x => '0.7 cm' , :y => '15.2 cm'
94
100
  doc.show self.cedente if self.cedente
95
101
  doc.moveto :x => '16.5 cm' , :y => '15.2 cm'
96
- doc.show "#{self.agencia}-#{self.agencia_dv}/#{self.conta_corrente}-#{self.conta_corrente_dv}"
102
+ doc.show self.agencia_conta_boleto
97
103
  doc.moveto :x => '0.7 cm' , :y => '14.4 cm'
98
104
  doc.show self.data_documento.to_s_br if self.data_documento
99
105
  doc.moveto :x => '4.2 cm' , :y => '14.4 cm'
@@ -105,7 +111,7 @@ module Brcobranca
105
111
  doc.moveto :x => '13 cm' , :y => '14.4 cm'
106
112
  doc.show self.data_processamento.to_s_br if self.data_processamento
107
113
  doc.moveto :x => '16.5 cm' , :y => '14.4 cm'
108
- doc.show self.nosso_numero
114
+ doc.show self.nosso_numero_boleto
109
115
  doc.moveto :x => '4.4 cm' , :y => '13.5 cm'
110
116
  doc.show self.carteira if self.carteira
111
117
  doc.moveto :x => '6.4 cm' , :y => '13.5 cm'
@@ -138,10 +144,6 @@ module Brcobranca
138
144
  doc.barcode_interleaved2of5(self.codigo_barras, :width => '10.3 cm', :height => '1.3 cm', :x => '0.7 cm', :y => '5.8 cm' ) if self.codigo_barras
139
145
 
140
146
  # Gerando stream
141
- unless options[:tipo]
142
- options[:tipo] = Brcobranca::Config::OPCOES[:tipo]
143
- end
144
-
145
147
  options[:tipo] = options[:tipo].to_sym unless options[:tipo].kind_of?(Symbol)
146
148
  doc.render_stream(options[:tipo])
147
149
  end
@@ -19,6 +19,8 @@ module Brcobranca
19
19
  imagem = 'bradesco.jpg'
20
20
  when "BancoUnibanco"
21
21
  imagem = 'unibanco.jpg'
22
+ when "BancoBanespa"
23
+ imagem = 'banespa.jpg'
22
24
  else
23
25
  return false
24
26
  end
@@ -24,7 +24,7 @@ module Brcobranca
24
24
  when 14 then self.to_br_cnpj
25
25
  else
26
26
  self
27
- end
27
+ end
28
28
  end
29
29
 
30
30
  # Remove caracteres que não sejam numéricos do tipo MOEDA
@@ -54,9 +54,9 @@ module Brcobranca
54
54
  return (("0" * diferenca) + valor_inicial )
55
55
  end
56
56
 
57
- # Monta a linha digitável padrão para todos os bancos segundo a BACEN.
58
- # Retorna + nil + para Codigo de Barras em branco,
59
- # Codigo de Barras com tamanho diferente de 44 dígitos e
57
+ # Monta a linha digitável padrão para todos os bancos segundo a BACEN.
58
+ # Retorna + nil + para Codigo de Barras em branco,
59
+ # Codigo de Barras com tamanho diferente de 44 dígitos e
60
60
  # Codigo de Barras que não tenham somente caracteres numéricos.
61
61
  # A linha digitável será composta por cinco campos:
62
62
  # 1º campo
@@ -76,7 +76,9 @@ module Brcobranca
76
76
  # interpretada por um ponto (.) e a 2ª por um espaço em branco.
77
77
  def linha_digitavel
78
78
  valor_inicial = self.kind_of?(String) ? self : self.to_s
79
- return nil if (valor_inicial !~ /\S/) || valor_inicial.size != 44 || (!valor_inicial.scan(/\D/).empty?)
79
+ raise ArgumentError, "Número em branco" if valor_inicial.nil?
80
+ raise ArgumentError, "Somente números" unless valor_inicial.numeric?
81
+ raise ArgumentError, "Precisa conter 44 caracteres e você passou um valor com #{valor_inicial.size} caracteres" if valor_inicial.size != 44
80
82
 
81
83
  dv_1 = ("#{valor_inicial[0..3]}#{valor_inicial[19..23]}").modulo10
82
84
  campo_1_dv = "#{valor_inicial[0..3]}#{valor_inicial[19..23]}#{dv_1}"
@@ -103,7 +105,7 @@ module Brcobranca
103
105
  # Método padrão para cálculo de módulo 10 segundo a BACEN.
104
106
  def modulo10
105
107
  valor_inicial = self.kind_of?(String) ? self : self.to_s
106
- return nil if (valor_inicial !~ /\S/)
108
+ raise ArgumentError, "Somente números" unless valor_inicial.numeric?
107
109
 
108
110
  total = 0
109
111
  multiplicador = 2
@@ -117,47 +119,40 @@ module Brcobranca
117
119
  valor == 10 ? 0 : valor
118
120
  end
119
121
 
120
- # Método padrão para cálculo de módulo 11 com multiplicaroes de 9 a 2 segundo a BACEN.
122
+ # Método padrão para cálculo de módulo 11 com multiplicaroes de 9 a 2 segundo a BACEN.
121
123
  # Usado no DV do Nosso Numero, Agência e Cedente.
122
124
  # Retorna + nil + para todos os parametros que nao forem String
123
125
  # Retorna + nil + para String em branco
124
126
  def modulo11_9to2
125
- valor_inicial = self.kind_of?(String) ? self : self.to_s
126
- return nil if (valor_inicial !~ /\S/)
127
-
128
- multiplicadores = [9,8,7,6,5,4,3,2]
129
- total = 0
130
- multiplicador_posicao = 0
131
-
132
- valor_inicial.split(//).reverse!.each do |caracter|
133
- multiplicador_posicao = 0 if (multiplicador_posicao == 8)
134
- total += (caracter.to_i * multiplicadores[multiplicador_posicao])
135
- multiplicador_posicao += 1
136
- end
127
+ total = self.multiplicador([9,8,7,6,5,4,3,2])
137
128
 
138
129
  return (total % 11 )
139
130
  end
140
131
 
141
- # Método padrão para cálculo de módulo 11 com multiplicaroes de 2 a 9 segundo a BACEN.
132
+ # Método padrão para cálculo de módulo 11 com multiplicaroes de 2 a 9 segundo a BACEN.
142
133
  # Usado no DV do Código de Barras.
143
134
  # Retorna + nil + para todos os parametros que não forem String
144
135
  # Retorna + nil + para String em branco
145
136
  def modulo11_2to9
137
+ total = self.multiplicador([2,3,4,5,6,7,8,9])
138
+
139
+ valor = (11 - (total % 11))
140
+ return [0,10,11].include?(valor) ? 1 : valor
141
+ end
142
+
143
+ def modulo_10_banespa
146
144
  valor_inicial = self.kind_of?(String) ? self : self.to_s
147
- return nil if (valor_inicial !~ /\S/)
145
+ raise ArgumentError, "Somente números" unless valor_inicial.numeric?
148
146
 
149
- multiplicadores = [2,3,4,5,6,7,8,9]
147
+ fatores = [7,3,1,9,7,3,1,9,7,3]
150
148
  total = 0
151
- multiplicador_posicao = 0
152
-
153
- valor_inicial.split(//).reverse!.each do |caracter|
154
- multiplicador_posicao = 0 if (multiplicador_posicao == 8)
155
- total += (caracter.to_i * multiplicadores[multiplicador_posicao])
156
- multiplicador_posicao += 1
149
+ posicao = 0
150
+ valor_inicial.split(//).each do |digito|
151
+ total += (digito.to_i * fatores[posicao]).to_s.split(//)[-1].to_i
152
+ posicao = (posicao < (fatores.size - 1)) ? (posicao + 1) : 0
157
153
  end
158
-
159
- valor = (11 - (total % 11))
160
- return [0,10,11].include?(valor) ? 1 : valor
154
+ dv = 10 - total.to_s.split(//)[-1].to_i
155
+ dv == 10 ? 0 : dv
161
156
  end
162
157
 
163
158
  # Retorna o dígito verificador de <b>modulo 11(9-2)</b> trocando retorno <b>10 por X</b>.
@@ -174,7 +169,7 @@ module Brcobranca
174
169
  valor == 10 ? 0 : valor
175
170
  end
176
171
 
177
- # Soma números inteiros positivos com 2 dígitos ou mais
172
+ # Soma números inteiros positivos com 2 dígitos ou mais
178
173
  # Retorna <b>0(zero)</b> caso seja impossível.
179
174
  # Ex. 1 = 1
180
175
  # Ex. 11 = (1+1) = 2
@@ -191,6 +186,20 @@ module Brcobranca
191
186
 
192
187
  return total
193
188
  end
189
+
190
+ def multiplicador(fatores)
191
+ valor_inicial = self.kind_of?(String) ? self : self.to_s
192
+ raise ArgumentError, "Somente números" unless valor_inicial.numeric?
193
+
194
+ total = 0
195
+ multiplicador_posicao = 0
196
+
197
+ valor_inicial.split(//).reverse!.each do |caracter|
198
+ total += (caracter.to_i * fatores[multiplicador_posicao])
199
+ multiplicador_posicao = (multiplicador_posicao < (fatores.size - 1)) ? (multiplicador_posicao + 1) : 0
200
+ end
201
+ total.to_i
202
+ end
194
203
  end
195
204
 
196
205
  # Métodos auxiliares de verificação e validação.
@@ -200,8 +209,8 @@ module Brcobranca
200
209
  # Ex. -1.232.33
201
210
  # Ex. 1.232.33
202
211
  def moeda?
203
- return false unless self.kind_of?(String)
204
- self =~ /^(\+|-)?\d+((\.|,)\d{3}*)*((\.|,)\d{2}*)$/ ? true : false
212
+ value = self.kind_of?(String) ? self : self.to_s
213
+ value =~ /^(\+|-)?\d+((\.|,)\d{3}*)*((\.|,)\d{2}*)$/ ? true : false
205
214
  end
206
215
  end
207
216
 
@@ -209,7 +218,6 @@ module Brcobranca
209
218
  module Limpeza
210
219
  # Retorna uma String contendo exatamente o valor FLOAT
211
220
  def limpa_valor_moeda
212
- return self unless self.kind_of?(Float)
213
221
  valor_inicial = self.to_s
214
222
  (valor_inicial + ("0" * (2 - valor_inicial.split(/\./).last.size ))).somente_numeros
215
223
  end
@@ -231,7 +239,7 @@ module Brcobranca
231
239
  self.strftime('%d/%m/%Y')
232
240
  end
233
241
  # Retorna string contendo número de dias julianos:
234
- # O cálculo é feito subtraindo-se a data atual, pelo último dia válido do ano anterior,
242
+ # O cálculo é feito subtraindo-se a data atual, pelo último dia válido do ano anterior,
235
243
  # acrescentando-se o último algarismo do ano atual na quarta posição.
236
244
  # Deve retornar string com 4 digitos.
237
245
  # Ex. Data atual = 11/02/2009
@@ -249,21 +257,23 @@ module Brcobranca
249
257
  end
250
258
  end
251
259
 
252
- class String #:nodoc:[all]
253
- include Brcobranca::Formatacao
254
- include Brcobranca::Validacao
255
- include Brcobranca::Calculo
260
+ # NEW AND COOL
261
+ [ String, Numeric ].each do |klass|
262
+ klass.class_eval { include Brcobranca::Formatacao }
263
+ end
264
+
265
+ [ String, Numeric ].each do |klass|
266
+ klass.class_eval { include Brcobranca::Validacao }
256
267
  end
257
268
 
258
- class Integer #:nodoc:[all]
259
- include Brcobranca::Formatacao
260
- include Brcobranca::Calculo
269
+ [ String, Numeric ].each do |klass|
270
+ klass.class_eval { include Brcobranca::Calculo }
261
271
  end
262
272
 
263
- class Float #:nodoc:[all]
264
- include Brcobranca::Limpeza
273
+ [ Float ].each do |klass|
274
+ klass.class_eval { include Brcobranca::Limpeza }
265
275
  end
266
276
 
267
- class Date #:nodoc:[all]
268
- include Brcobranca::CalculoData
277
+ [ Date ].each do |klass|
278
+ klass.class_eval { include Brcobranca::CalculoData }
269
279
  end