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 +4 -0
  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/arquivos/logos/banespa.jpg +0 -0
  8. data/lib/brcobranca/boleto/banco_banespa.rb +85 -0
  9. data/lib/brcobranca/boleto/banco_bradesco.rb +14 -1
  10. data/lib/brcobranca/boleto/banco_brasil.rb +18 -9
  11. data/lib/brcobranca/boleto/banco_hsbc.rb +22 -8
  12. data/lib/brcobranca/boleto/banco_itau.rb +20 -10
  13. data/lib/brcobranca/boleto/banco_real.rb +16 -2
  14. data/lib/brcobranca/boleto/banco_unibanco.rb +19 -5
  15. data/lib/brcobranca/boleto/base.rb +21 -15
  16. data/lib/brcobranca/boleto/template/rghost.rb +18 -16
  17. data/lib/brcobranca/boleto/template/util.rb +2 -0
  18. data/lib/brcobranca/core_ext.rb +57 -47
  19. data/lib/brcobranca/currency.rb +7 -10
  20. data/lib/brcobranca.rb +10 -2
  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 +32 -18
  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
@@ -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
@@ -56,15 +56,12 @@ module Brcobranca #:nodoc:[all]
56
56
  end
57
57
  end
58
58
 
59
- class Fixnum #:nodoc:[all]
60
- include Brcobranca::Currency::Number
59
+ # TODO - porque não incluir somente na Numeric?
60
+ # [ Fixnum, Bignum, Float ].each do |klass|
61
+ [ Numeric].each do |klass|
62
+ klass.class_eval { include Brcobranca::Currency::Number }
61
63
  end
62
- class Bignum #:nodoc:[all]
63
- include Brcobranca::Currency::Number
64
- end
65
- class Float #:nodoc:[all]
66
- include Brcobranca::Currency::Number
67
- end
68
- class String #:nodoc:[all]
69
- include Brcobranca::Currency::String
64
+
65
+ [ String ].each do |klass|
66
+ klass.class_eval { include Brcobranca::Currency::String }
70
67
  end
data/lib/brcobranca.rb CHANGED
@@ -1,8 +1,16 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
2
 
3
+ begin
4
+ require 'date'
5
+ rescue LoadError
6
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
7
+ gem 'date'
8
+ require 'date'
9
+ end
10
+
3
11
  %w(core_ext currency config).each {|req| require File.join(File.dirname(__FILE__),"brcobranca",req) }
4
12
 
5
- %w(base banco_brasil banco_itau banco_hsbc banco_real banco_bradesco banco_unibanco).each {|req| require File.join(File.dirname(__FILE__),"brcobranca","boleto",req) }
13
+ %w(base banco_brasil banco_itau banco_hsbc banco_real banco_bradesco banco_unibanco banco_banespa).each {|req| require File.join(File.dirname(__FILE__),"brcobranca","boleto",req) }
6
14
 
7
15
  %w(util rghost).each {|req| require File.join(File.dirname(__FILE__),"brcobranca","boleto","template",req) }
8
16
 
@@ -23,5 +31,5 @@ else
23
31
  end
24
32
 
25
33
  module Brcobranca
26
- VERSION = '2.0.5'
34
+ VERSION = '2.0.6'
27
35
  end
@@ -0,0 +1,28 @@
1
+ 02RETORNO01COBRANCA 33251000289353000000INSTITUTO MATO-GROSSENSE DO AL001BANCO DO BRASIL2001090000007 000000009703754590 1622420 000001
2
+ 70000000000000000332510002893531622420 1622420000000000310000001 01900000000000 1806200109 000000000000000906400114923002201090000500000000000000000000000000000000000000000000000000000000000000000000000000009064000000000000000000000000000000000000000000000000856420000000000000 0000000000000000000000000000000000000000000000000004000002
3
+ 70000000000000000332510002893531622420 1622420000000003010000001 01900000000000 1806200109 000000000000002235239909430002201090000500000000000000000000000000000000000000000000000000000000000000000000000000022352000000000000000000000000000000000000000000000002185220000000000000 0000000000000000000000000000000000000000000000000010000003
4
+ 70000000000000000332510002893531622420 1622420000000003110000001 01900000000000 1806200109 00000000000000165330012970X002201090000500000000000000000000000000000000000000000000000000000000000000000000000000016533000000000000000000000000000000000000000000000001603320000000000000 0000000000000000000000000000000000000000000000000002000004
5
+ 70000000000000000332510002893531622420 1622420000000003210000001 01900000000000 1806200109 00000000000000157740012970X002201090000500000000000000000000000000000000000000000000000000000000000000000000000000015774000000000000000000000000000000000000000000000001527420000000000000 0000000000000000000000000000000000000000000000000002000005
6
+ 70000000000000000332510002893531622420 1622420000000003310000001 01900000000000 1806200109 00000000000000414440012970X002201090000500000000000000000000000000000000000000000000000000000000000000000000000000041444000000000000000000000000000000000000000000000004094420000000000000 0000000000000000000000000000000000000000000000000002000006
7
+ 70000000000000000332510002893531622420 1622420000000003410000001 01900000000000 1806200109 00000000000000610280012970X002201090000500000000000000000000000000000000000000000000000000000000000000000000000000061028000000000000000000000000000000000000000000000006052820000000000000 0000000000000000000000000000000000000000000000000002000007
8
+ 70000000000000000332510002893531622420 1622420000000003510000001 01900000000000 1806200109 00000000000000608040012970X002201090000500000000000000000000000000000000000000000000000000000000000000000000000000060804000000000000000000000000000000000000000000000006030420000000000000 0000000000000000000000000000000000000000000000000002000008
9
+ 70000000000000000332510002893531622420 1622420000000003610000001 01900000000000 1806200109 000000000000005610074808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000010000009
10
+ 70000000000000000332510002893531622420 1622420000000003710000001 01900000000000 1806200109 000000000000000565474808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000005654000000000000000000000000000000000000000000000000515420000000000000 0000000000000000000000000000000000000000000000000010000010
11
+ 70000000000000000332510002893531622420 1622420000000003810000001 01900000000000 1806200109 000000000000005610074808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000010000011
12
+ 70000000000000000332510002893531622420 1622420000000003910000001 01900000000000 1806200109 000000000000000528074808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000005280000000000000000000000000000000000000000000000000478020000000000000 0000000000000000000000000000000000000000000000000010000012
13
+ 70000000000000000332510002893531622420 1622420000000004010000001 01900000000000 1806200109 000000000000005610074808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000010000013
14
+ 70000000000000000332510002893531622420 1622420000000004110000001 01900000000000 1806200109 000000000000000528074808110002201090000500000000000000000000000000000000000000000000000000000000000000000000000000005280000000000000000000000000000000000000000000000000478020000000000000 0000000000000000000000000000000000000000000000000010000014
15
+ 70000000000000000332510002893531622420 1622420000000004210000001 01900000000000 1806200109 000000000000005610000136439002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000004000015
16
+ 70000000000000000332510002893531622420 1622420000000004310000001 01900000000000 1806200109 000000000000001672000136439002201090000500000000000000000000000000000000000000000000000000000000000000000000000000016720000000000000000000000000000000000000000000000001622020000000000000 0000000000000000000000000000000000000000000000000004000016
17
+ 70000000000000000332510002893531622420 1622420000000004410000001 01900000000000 1806200109 000000000000000535300136439002201090000500000000000000000000000000000000000000000000000000000000000000000000000000005353000000000000000000000000000000000000000000000000485320000000000000 0000000000000000000000000000000000000000000000000004000017
18
+ 70000000000000000332510002893531622420 1622420000000004510000001 01900000000000 1806200109 000000000000005210700130376002201090000500000000000000000000000000000000000000000000000000000000000000000000000000052107000000000000000000000000000000000000000000000005160720000000000000 0000000000000000000000000000000000000000000000000008000018
19
+ 70000000000000000332510002893531622420 1622420000000004610000001 01900000000000 1806200109 000000000000006043600114923002201090000500000000000000000000000000000000000000000000000000000000000000000000000000060436000000000000000000000000000000000000000000000005993620000000000000 0000000000000000000000000000000000000000000000000002000019
20
+ 70000000000000000332510002893531622420 1622420000000004710000001 01900000000000 1806200109 000000000000005610000136439002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000004000020
21
+ 70000000000000000332510002893531622420 1622420000000004810000001 01900000000000 1806200109 000000000000000495000136439002201090000500000000000000000000000000000000000000000000000000000000000000000000000000004950000000000000000000000000000000000000000000000000445020000000000000 0000000000000000000000000000000000000000000000000004000021
22
+ 70000000000000000332510002893531622420 1622420000000005010000001 01900000000000 1806200109 000000000000005707000114923002201090000500000000000000000000000000000000000000000000000000000000000000000000000000057070000000000000000000000000000000000000000000000005657020000000000000 0000000000000000000000000000000000000000000000000002000022
23
+ 70000000000000000332510002893531622420 1622420000000005110000001 01900000000000 1806200109 000000000000005638600106599002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056386000000000000000000000000000000000000000000000005588620000000000000 0000000000000000000000000000000000000000000000000002000023
24
+ 70000000000000000332510002893531622420 1622420000000005210000001 01900000000000 1806200109 000000000000005610000106599002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056100000000000000000000000000000000000000000000000005560020000000000000 0000000000000000000000000000000000000000000000000002000024
25
+ 70000000000000000332510002893531622420 1622420000000005310000001 01900000000000 1806200109 000000000000005856400106599002201090000500000000000000000000000000000000000000000000000000000000000000000000000000058564000000000000000000000000000000000000000000000005806420000000000000 0000000000000000000000000000000000000000000000000002000025
26
+ 70000000000000000332510002893531622420 1622420000000005410000001 01900000000000 1806200109 000000000000005704600106599002201090000500000000000000000000000000000000000000000000000000000000000000000000000000057046000000000000000000000000000000000000000000000005654620000000000000 0000000000000000000000000000000000000000000000000002000026
27
+ 70000000000000000332510002893531622420 1622420000000005510000001 01900000000000 1806200109 000000000000005673800106599002201090000500000000000000000000000000000000000000000000000000000000000000000000000000056738000000000000000000000000000000000000000000000005623820000000000000 0000000000000000000000000000000000000000000000000002000027
28
+ 9201001 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000028
@@ -0,0 +1,195 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe BancoBanespa do
4
+
5
+ before(:each) do
6
+ @valid_attributes = {
7
+ :especie_documento => "DM",
8
+ :moeda => "9",
9
+ :banco => "033",
10
+ :data_documento => Date.today,
11
+ :dias_vencimento => 1,
12
+ :aceite => "S",
13
+ :quantidade => 1,
14
+ :valor => 0.0,
15
+ :local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO",
16
+ :cedente => "Kivanio Barbosa",
17
+ :documento_cedente => "12345678912",
18
+ :sacado => "Claudio Pozzebom",
19
+ :sacado_documento => "12345678900",
20
+ :agencia => "400",
21
+ :conta_corrente => "61900",
22
+ :convenio => 12387989,
23
+ :numero_documento => "777700168"
24
+ }
25
+ end
26
+
27
+ it "should create a new default instance" do
28
+ boleto_novo = BancoBanespa.new
29
+ boleto_novo.banco.should eql("033")
30
+ boleto_novo.especie_documento.should eql("DM")
31
+ boleto_novo.especie.should eql("R$")
32
+ boleto_novo.moeda.should eql("9")
33
+ boleto_novo.data_documento.should eql(Date.today)
34
+ boleto_novo.dias_vencimento.should eql(1)
35
+ boleto_novo.data_vencimento.should eql(Date.today + 1)
36
+ boleto_novo.aceite.should eql("S")
37
+ boleto_novo.quantidade.should eql(1)
38
+ boleto_novo.valor.should eql(0.0)
39
+ boleto_novo.valor_documento.should eql(0.0)
40
+ boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
41
+ boleto_novo.carteira.should eql("COB")
42
+ boleto_novo.should be_instance_of(BancoBanespa)
43
+ end
44
+
45
+ it "should create a new instance given valid attributes" do
46
+ boleto_novo = BancoBanespa.new(@valid_attributes)
47
+ boleto_novo.banco.should eql("033")
48
+ boleto_novo.especie_documento.should eql("DM")
49
+ boleto_novo.especie.should eql("R$")
50
+ boleto_novo.moeda.should eql("9")
51
+ boleto_novo.data_documento.should eql(Date.today)
52
+ boleto_novo.dias_vencimento.should eql(1)
53
+ boleto_novo.data_vencimento.should eql(Date.today + 1)
54
+ boleto_novo.aceite.should eql("S")
55
+ boleto_novo.quantidade.should eql(1)
56
+ boleto_novo.valor.should eql(0.0)
57
+ boleto_novo.valor_documento.should eql(0.0)
58
+ boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
59
+ boleto_novo.cedente.should eql("Kivanio Barbosa")
60
+ boleto_novo.documento_cedente.should eql("12345678912")
61
+ boleto_novo.sacado.should eql("Claudio Pozzebom")
62
+ boleto_novo.sacado_documento.should eql("12345678900")
63
+ boleto_novo.conta_corrente.should eql("61900")
64
+ boleto_novo.agencia.should eql("400")
65
+ boleto_novo.convenio.should eql(12387989)
66
+ boleto_novo.numero_documento.should eql("777700168")
67
+ boleto_novo.carteira.should eql("COB")
68
+ boleto_novo.should be_instance_of(BancoBanespa)
69
+ end
70
+
71
+ # TODO - should give exception
72
+ it "should return nil when attributes are nil" do
73
+ @valid_attributes[:valor] = 0
74
+ @valid_attributes[:data_documento] = Date.parse("2008-02-01")
75
+ @valid_attributes[:dias_vencimento] = 0
76
+ @valid_attributes[:numero_documento] = ""
77
+ @valid_attributes[:banco] = ""
78
+ @valid_attributes[:carteira] = ""
79
+ @valid_attributes[:moeda] = ""
80
+ @valid_attributes[:convenio] = ""
81
+
82
+ boleto_novo = BancoBanespa.new(@valid_attributes)
83
+ boleto_novo.should be_instance_of(BancoBanespa)
84
+ boleto_novo.monta_codigo_43_digitos.should be_nil
85
+ boleto_novo.codigo_barras.should be_nil
86
+ end
87
+
88
+ it "should mount a valid bank invoice" do
89
+ @valid_attributes[:valor] = 103.58
90
+ @valid_attributes[:data_documento] = Date.parse("2001-08-01")
91
+ @valid_attributes[:dias_vencimento] = 0
92
+ @valid_attributes[:convenio] = 14813026478
93
+ @valid_attributes[:numero_documento] = "0004952"
94
+ @valid_attributes[:conta_corrente] = "0403005"
95
+ boleto_novo = BancoBanespa.new(@valid_attributes)
96
+ boleto_novo.should be_instance_of(BancoBanespa)
97
+ boleto_novo.conta_corrente_dv.should eql(2)
98
+ boleto_novo.monta_codigo_43_digitos.should eql("0339139400000103581481302647800049520003306")
99
+ boleto_novo.codigo_barras.should eql("03398139400000103581481302647800049520003306")
100
+ boleto_novo.codigo_barras.linha_digitavel.should eql("03391.48132 02647.800040 95200.033066 8 13940000010358")
101
+
102
+ @valid_attributes[:valor] = 2952.95
103
+ @valid_attributes[:data_documento] = Date.parse("2009-08-14")
104
+ @valid_attributes[:dias_vencimento] = 5
105
+ @valid_attributes[:convenio] = 40013012168
106
+ @valid_attributes[:numero_documento] = "1234567"
107
+ @valid_attributes[:conta_corrente] = "0403005"
108
+ boleto_novo = BancoBanespa.new(@valid_attributes)
109
+ boleto_novo.should be_instance_of(BancoBanespa)
110
+ boleto_novo.conta_corrente_dv.should eql(2)
111
+ boleto_novo.monta_codigo_43_digitos.should eql("0339433400002952954001301216812345670003361")
112
+ boleto_novo.codigo_barras.should eql("03398433400002952954001301216812345670003361")
113
+ boleto_novo.codigo_barras.linha_digitavel.should eql("03394.00137 01216.812345 56700.033618 8 43340000295295")
114
+ end
115
+
116
+ it "should mount a valid campo_livre_com_dv1_e_dv2" do
117
+ @valid_attributes[:convenio] = "40013012168"
118
+ @valid_attributes[:numero_documento] = "7469108"
119
+ boleto_novo = BancoBanespa.new(@valid_attributes)
120
+ boleto_novo.should be_instance_of(BancoBanespa)
121
+ boleto_novo.campo_livre_com_dv1_e_dv2.should eql("4001301216874691080003384")
122
+
123
+ @valid_attributes[:convenio] = "40013012168"
124
+ @valid_attributes[:numero_documento] = "1234567"
125
+ boleto_novo = BancoBanespa.new(@valid_attributes)
126
+ boleto_novo.should be_instance_of(BancoBanespa)
127
+ boleto_novo.campo_livre_com_dv1_e_dv2.should eql("4001301216812345670003361")
128
+ end
129
+
130
+ it "should mount a valid nosso_numero and nosso_numero_dv" do
131
+ @valid_attributes[:numero_documento] = "0403005"
132
+ boleto_novo = BancoBanespa.new(@valid_attributes)
133
+ boleto_novo.should be_instance_of(BancoBanespa)
134
+ boleto_novo.nosso_numero.should eql("4000403005")
135
+ boleto_novo.nosso_numero_dv.should eql(6)
136
+ boleto_novo.nosso_numero_boleto.should eql("400 0403005 6")
137
+
138
+ @valid_attributes[:numero_documento] = "403005"
139
+ boleto_novo = BancoBanespa.new(@valid_attributes)
140
+ boleto_novo.should be_instance_of(BancoBanespa)
141
+ boleto_novo.nosso_numero.should eql("4000403005")
142
+ boleto_novo.nosso_numero_dv.should eql(6)
143
+ boleto_novo.nosso_numero_boleto.should eql("400 0403005 6")
144
+
145
+ @valid_attributes[:numero_documento] = "1234567"
146
+ boleto_novo = BancoBanespa.new(@valid_attributes)
147
+ boleto_novo.should be_instance_of(BancoBanespa)
148
+ boleto_novo.nosso_numero.should eql("4001234567")
149
+ boleto_novo.nosso_numero_dv.should eql(8)
150
+ boleto_novo.nosso_numero_boleto.should eql("400 1234567 8")
151
+
152
+ @valid_attributes[:agencia] = "123"
153
+ boleto_novo = BancoBanespa.new(@valid_attributes)
154
+ boleto_novo.should be_instance_of(BancoBanespa)
155
+ boleto_novo.nosso_numero.should eql("1231234567")
156
+ boleto_novo.nosso_numero_dv.should eql(0)
157
+ boleto_novo.nosso_numero_boleto.should eql("123 1234567 0")
158
+
159
+ @valid_attributes[:agencia] = "123"
160
+ @valid_attributes[:numero_documento] = "7469108"
161
+ boleto_novo = BancoBanespa.new(@valid_attributes)
162
+ boleto_novo.should be_instance_of(BancoBanespa)
163
+ boleto_novo.nosso_numero.should eql("1237469108")
164
+ boleto_novo.nosso_numero_dv.should eql(3)
165
+ boleto_novo.nosso_numero_boleto.should eql("123 7469108 3")
166
+ end
167
+
168
+ it "should mount a valid agencia_conta_dv" do
169
+ boleto_novo = BancoBanespa.new(@valid_attributes)
170
+ boleto_novo.should be_instance_of(BancoBanespa)
171
+ boleto_novo.agencia_conta_boleto.should eql("000 12 38798 9")
172
+ end
173
+
174
+ it "should test outputs" do
175
+ @valid_attributes[:valor] = 2952.95
176
+ @valid_attributes[:data_documento] = Date.parse("2009-08-14")
177
+ @valid_attributes[:dias_vencimento] = 5
178
+ @valid_attributes[:convenio] = 40013012168
179
+ @valid_attributes[:numero_documento] = "1234567"
180
+ @valid_attributes[:conta_corrente] = "0403005"
181
+ boleto_novo = BancoBanespa.new(@valid_attributes)
182
+ boleto_novo.should be_instance_of(BancoBanespa)
183
+ %w| pdf jpg tif png ps |.each do |format|
184
+ file_body=boleto_novo.to(format.to_sym)
185
+ tmp_file=Tempfile.new("foobar." << format)
186
+ tmp_file.puts file_body
187
+ tmp_file.close
188
+ File.exist?(tmp_file.path).should be_true
189
+ File.stat(tmp_file.path).zero?.should be_false
190
+ File.delete(tmp_file.path).should eql(1)
191
+ File.exist?(tmp_file.path).should be_false
192
+ end
193
+ end
194
+
195
+ end