tulios-brcobranca-rails2 2.0.8 → 2.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,6 +1,8 @@
1
- == 2.0.7 22-12-2010
1
+ == 2.0.9 29-12-2010
2
2
 
3
3
  * Incluindo boleto para banco Caixa - Túlio Ornelas
4
+ * Adicionando algumas funcionalidades da versão 3
5
+ * Impressão de multiboleto (copiado da versão 3)
4
6
 
5
7
  == 2.0.6 16-08-2009
6
8
 
@@ -19,135 +19,218 @@ module Brcobranca
19
19
  module Template
20
20
  # Templates para usar com Rghost
21
21
  module Rghost
22
+ extend self
22
23
  include RGhost unless self.include?(RGhost)
23
24
 
24
25
  # Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
25
- # Veja mais formatos na documentação do rghost: http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats
26
- # TODO - Usar define_method para criar um metodo em tempo real to_{pdf,jpg}
27
- def to(formato=Brcobranca::Config::OPCOES[:tipo])
28
- modelo_generico(:tipo => formato)
26
+ #
27
+ # @return [Stream]
28
+ # @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
29
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
30
+ def to(formato = Brcobranca::Config::OPCOES[:tipo], options={})
31
+
32
+ # Adicionando :formato apenas para garantir a compatibilidade com o codigo da versao 3
33
+ options = Brcobranca::Config::OPCOES.merge(options)
34
+
35
+ modelo_generico(self, options.merge!({:formato => formato}))
36
+ end
37
+
38
+ # Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
39
+ #
40
+ # @return [Stream]
41
+ # @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
42
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
43
+ def imprimir_lista(boletos, options={})
44
+
45
+ # Adicionando :formato apenas para garantir a compatibilidade com o codigo da versao 3
46
+ options = Brcobranca::Config::OPCOES.merge({
47
+ :formato => Brcobranca::Config::OPCOES[:tipo]
48
+ }).merge(options)
49
+
50
+ modelo_generico_multipage(boletos, options)
29
51
  end
30
52
 
31
- # Responsável por setar os valores necessários no template genérico
32
- # Retorna um stream pronto para gravaçào
53
+ # Cria o métodos dinâmicos (to_pdf, to_gif e etc) com todos os fomátos válidos.
33
54
  #
34
- # O tipo do arquivo gerado pode ser modificado incluindo a configuração a baixo dentro da sua aplicação:
35
- # Brcobranca::Config::OPCOES[:tipo] = 'pdf'
55
+ # @return [Stream]
56
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
57
+ # @example
58
+ # @boleto.to_pdf #=> boleto gerado no formato pdf
59
+ def method_missing(m, *args)
60
+ method = m.to_s
61
+ if method.start_with?("to_")
62
+ modelo_generico(self, (args.first || {}).merge!({:formato => method[3..-1]}))
63
+ else
64
+ super
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ # Retorna um stream pronto para gravação em arquivo.
36
71
  #
37
- # Ou pode ser passado como paramentro:
38
- # :tipo => 'pdf'
39
- def modelo_generico(options={})
72
+ # @return [Stream]
73
+ # @param [Boleto] Instância de uma classe de boleto.
74
+ # @param [Hash] options Opção para a criação do boleto.
75
+ # @option options [Symbol] :resolucao Resolução em pixels.
76
+ # @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
77
+ def modelo_generico(boleto, options={})
40
78
  doc=Document.new :paper => :A4 # 210x297
41
79
 
42
80
  template_path = File.join(File.dirname(__FILE__),'..','..','arquivos','templates','modelo_generico.eps')
43
81
 
44
82
  raise "Não foi possível encontrar o template. Verifique o caminho" unless File.exist?(template_path)
45
83
 
84
+ modelo_generico_template(doc, boleto, template_path)
85
+ modelo_generico_cabecalho(doc, boleto)
86
+ modelo_generico_rodape(doc, boleto)
87
+
88
+ #Gerando codigo de barra com rghost_barcode
89
+ doc.barcode_interleaved2of5(boleto.codigo_barras, :width => '10.3 cm', :height => '1.3 cm', :x => '0.7 cm', :y => '5.8 cm' ) if boleto.codigo_barras
90
+
91
+ # Gerando stream
92
+ formato = options.delete(:formato)
93
+ resolucao = options.delete(:resolucao)
94
+ doc.render_stream(formato.to_sym, :resolution => resolucao)
95
+ end
96
+
97
+ # Retorna um stream para multiplos boletos pronto para gravação em arquivo.
98
+ #
99
+ # @return [Stream]
100
+ # @param [Array] Instâncias de classes de boleto.
101
+ # @param [Hash] options Opção para a criação do boleto.
102
+ # @option options [Symbol] :resolucao Resolução em pixels.
103
+ # @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
104
+ def modelo_generico_multipage(boletos, options={})
105
+ doc=Document.new :paper => :A4 # 210x297
106
+
107
+ template_path = File.join(File.dirname(__FILE__),'..','..','arquivos','templates','modelo_generico.eps')
108
+
109
+ raise "Não foi possível encontrar o template. Verifique o caminho" unless File.exist?(template_path)
110
+
111
+ boletos.each_with_index do |boleto, index|
112
+
113
+ modelo_generico_template(doc, boleto, template_path)
114
+ modelo_generico_cabecalho(doc, boleto)
115
+ modelo_generico_rodape(doc, boleto)
116
+
117
+ #Gerando codigo de barra com rghost_barcode
118
+ doc.barcode_interleaved2of5(boleto.codigo_barras, :width => '10.3 cm', :height => '1.3 cm', :x => '0.7 cm', :y => '5.8 cm' ) if boleto.codigo_barras
119
+ #Cria nova página se não for o último boleto
120
+ doc.next_page unless index == boletos.length-1
121
+
122
+ end
123
+
124
+ # Gerando stream
125
+ formato = options.delete(:formato)
126
+ resolucao = options.delete(:resolucao)
127
+ doc.render_stream(formato.to_sym, :resolution => resolucao)
128
+ end
129
+
130
+ # Define o template a ser usado no boleto
131
+ def modelo_generico_template(doc, boleto, template_path)
46
132
  doc.define_template(:template, template_path, :x => '0.3 cm', :y => "0 cm")
47
133
  doc.use_template :template
48
134
 
49
135
  doc.define_tags do
50
136
  tag :grande, :size => 13
51
137
  end
138
+ end
52
139
 
53
- # Busca logo automaticamente
54
- logo = monta_logo
55
-
140
+ # Monta o cabeçalho do layout do boleto
141
+ def modelo_generico_cabecalho(doc, boleto)
56
142
  #INICIO Primeira parte do BOLETO
57
143
  # LOGOTIPO do BANCO
58
- doc.image(logo, :x => '0.5 cm', :y => '23.85 cm', :zoom => 80) if logo
144
+ doc.image(boleto.monta_logo, :x => '0.5 cm', :y => '23.85 cm', :zoom => 80)
59
145
  # Dados
60
146
  doc.moveto :x => '5.2 cm' , :y => '23.85 cm'
61
- doc.show "#{self.banco}-#{self.banco_dv}", :tag => :grande
147
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", :tag => :grande
62
148
  doc.moveto :x => '7.5 cm' , :y => '23.85 cm'
63
- doc.show self.codigo_barras.linha_digitavel, :tag => :grande
149
+ doc.show boleto.codigo_barras.linha_digitavel, :tag => :grande
64
150
  doc.moveto :x => '0.7 cm' , :y => '23 cm'
65
- doc.show self.cedente
151
+ doc.show boleto.cedente
66
152
  doc.moveto :x => '11 cm' , :y => '23 cm'
67
- doc.show self.agencia_conta_boleto
153
+ doc.show boleto.agencia_conta_boleto
68
154
  doc.moveto :x => '14.2 cm' , :y => '23 cm'
69
- doc.show self.especie
155
+ doc.show boleto.especie
70
156
  doc.moveto :x => '15.7 cm' , :y => '23 cm'
71
- doc.show self.quantidade
157
+ doc.show boleto.quantidade
72
158
  doc.moveto :x => '0.7 cm' , :y => '22.2 cm'
73
- doc.show self.numero_documento
159
+ doc.show boleto.numero_documento
74
160
  doc.moveto :x => '7 cm' , :y => '22.2 cm'
75
- doc.show "#{self.documento_cedente.formata_documento}"
161
+ doc.show "#{boleto.documento_cedente.formata_documento}"
76
162
  doc.moveto :x => '12 cm' , :y => '22.2 cm'
77
- doc.show self.data_vencimento.to_s_br
163
+ doc.show boleto.data_vencimento.to_s_br
78
164
  doc.moveto :x => '16.5 cm' , :y => '23 cm'
79
- doc.show self.nosso_numero_boleto
165
+ doc.show boleto.nosso_numero_boleto
80
166
  doc.moveto :x => '16.5 cm' , :y => '22.2 cm'
81
- doc.show self.valor_documento.to_currency
167
+ doc.show boleto.valor_documento.to_currency
82
168
  doc.moveto :x => '1.4 cm' , :y => '20.9 cm'
83
- doc.show "#{self.sacado} - #{self.sacado_documento.formata_documento}"
169
+ doc.show "#{boleto.sacado} - #{boleto.sacado_documento.formata_documento}"
84
170
  doc.moveto :x => '1.4 cm' , :y => '20.6 cm'
85
- doc.show "#{self.sacado_endereco}"
171
+ doc.show "#{boleto.sacado_endereco}"
86
172
  #FIM Primeira parte do BOLETO
173
+ end
87
174
 
175
+ # Monta o corpo e rodapé do layout do boleto
176
+ def modelo_generico_rodape(doc, boleto)
88
177
  #INICIO Segunda parte do BOLETO BB
89
178
  # LOGOTIPO do BANCO
90
- doc.image(logo, :x => '0.5 cm', :y => '16.8 cm', :zoom => 80) if logo
179
+ doc.image(boleto.monta_logo, :x => '0.5 cm', :y => '16.8 cm', :zoom => 80)
91
180
  doc.moveto :x => '5.2 cm' , :y => '16.8 cm'
92
- doc.show "#{self.banco}-#{self.banco_dv}", :tag => :grande if self.banco && self.banco_dv
181
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", :tag => :grande
93
182
  doc.moveto :x => '7.5 cm' , :y => '16.8 cm'
94
- doc.show self.codigo_barras.linha_digitavel, :tag => :grande if self.codigo_barras && self.codigo_barras.linha_digitavel
183
+ doc.show boleto.codigo_barras.linha_digitavel, :tag => :grande
95
184
  doc.moveto :x => '0.7 cm' , :y => '16 cm'
96
- doc.show self.local_pagamento if self.local_pagamento
185
+ doc.show boleto.local_pagamento
97
186
  doc.moveto :x => '16.5 cm' , :y => '16 cm'
98
- doc.show self.data_vencimento.to_s_br if self.data_vencimento
187
+ doc.show boleto.data_vencimento.to_s_br if boleto.data_vencimento
99
188
  doc.moveto :x => '0.7 cm' , :y => '15.2 cm'
100
- doc.show self.cedente if self.cedente
189
+ doc.show boleto.cedente
101
190
  doc.moveto :x => '16.5 cm' , :y => '15.2 cm'
102
- doc.show self.agencia_conta_boleto
191
+ doc.show boleto.agencia_conta_boleto
103
192
  doc.moveto :x => '0.7 cm' , :y => '14.4 cm'
104
- doc.show self.data_documento.to_s_br if self.data_documento
193
+ doc.show boleto.data_documento.to_s_br if boleto.data_documento
105
194
  doc.moveto :x => '4.2 cm' , :y => '14.4 cm'
106
- doc.show self.numero_documento if self.numero_documento
195
+ doc.show boleto.numero_documento
107
196
  doc.moveto :x => '10 cm' , :y => '14.4 cm'
108
- doc.show self.especie if self.especie
197
+ doc.show boleto.especie
109
198
  doc.moveto :x => '11.7 cm' , :y => '14.4 cm'
110
- doc.show self.aceite if self.aceite
199
+ doc.show boleto.aceite
111
200
  doc.moveto :x => '13 cm' , :y => '14.4 cm'
112
- doc.show self.data_processamento.to_s_br if self.data_processamento
201
+ doc.show boleto.data_processamento.to_s_br if boleto.data_processamento
113
202
  doc.moveto :x => '16.5 cm' , :y => '14.4 cm'
114
- doc.show self.nosso_numero_boleto
203
+ doc.show boleto.nosso_numero_boleto
115
204
  doc.moveto :x => '4.4 cm' , :y => '13.5 cm'
116
- doc.show self.carteira if self.carteira
205
+ doc.show boleto.carteira
117
206
  doc.moveto :x => '6.4 cm' , :y => '13.5 cm'
118
- doc.show self.moeda if self.moeda
207
+ doc.show boleto.moeda
119
208
  doc.moveto :x => '8 cm' , :y => '13.5 cm'
120
- doc.show self.quantidade if self.quantidade
209
+ doc.show boleto.quantidade
121
210
  doc.moveto :x => '11 cm' , :y => '13.5 cm'
122
- doc.show self.valor.to_currency if self.valor
211
+ doc.show boleto.valor.to_currency
123
212
  doc.moveto :x => '16.5 cm' , :y => '13.5 cm'
124
- doc.show self.valor_documento.to_currency if self.valor_documento
213
+ doc.show boleto.valor_documento.to_currency
125
214
  doc.moveto :x => '0.7 cm' , :y => '12.7 cm'
126
- doc.show self.instrucao1 if self.instrucao1
215
+ doc.show boleto.instrucao1
127
216
  doc.moveto :x => '0.7 cm' , :y => '12.3 cm'
128
- doc.show self.instrucao2 if self.instrucao2
217
+ doc.show boleto.instrucao2
129
218
  doc.moveto :x => '0.7 cm' , :y => '11.9 cm'
130
- doc.show self.instrucao3 if self.instrucao3
219
+ doc.show boleto.instrucao3
131
220
  doc.moveto :x => '0.7 cm' , :y => '11.5 cm'
132
- doc.show self.instrucao4 if self.instrucao4
221
+ doc.show boleto.instrucao4
133
222
  doc.moveto :x => '0.7 cm' , :y => '11.1 cm'
134
- doc.show self.instrucao5 if self.instrucao5
223
+ doc.show boleto.instrucao5
135
224
  doc.moveto :x => '0.7 cm' , :y => '10.7 cm'
136
- doc.show self.instrucao6 if self.instrucao6
225
+ doc.show boleto.instrucao6
137
226
  doc.moveto :x => '1.2 cm' , :y => '8.8 cm'
138
- doc.show "#{self.sacado} - #{self.sacado_documento.formata_documento}" if self.sacado && self.sacado_documento
227
+ doc.show "#{boleto.sacado} - #{boleto.sacado_documento.formata_documento}" if boleto.sacado && boleto.sacado_documento
139
228
  doc.moveto :x => '1.2 cm' , :y => '8.4 cm'
140
- doc.show "#{self.sacado_endereco}" if self.sacado_endereco
229
+ doc.show "#{boleto.sacado_endereco}"
141
230
  #FIM Segunda parte do BOLETO
142
-
143
- #Gerando codigo de barra com rghost_barcode
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
145
-
146
- # Gerando stream
147
- options[:tipo] = options[:tipo].to_sym unless options[:tipo].kind_of?(Symbol)
148
- doc.render_stream(options[:tipo])
149
231
  end
150
- end
232
+
233
+ end #Base
151
234
  end
152
235
  end
153
- end
236
+ end
@@ -4,6 +4,6 @@ module Brcobranca
4
4
  # Opções disponíveis:
5
5
  # Brcobranca::Config::OPCOES[:tipo] - Pode ser pdf, jpg e ps.
6
6
  # Brcobranca::Config::OPCOES[:gerador] - Somente rghost até o momento
7
- OPCOES = {:tipo => 'pdf', :gerador => 'rghost'}
7
+ OPCOES = {:tipo => 'pdf', :gerador => 'rghost', :resolucao => 150}
8
8
  end
9
9
  end
data/lib/brcobranca.rb CHANGED
@@ -24,6 +24,7 @@ when 'rghost'
24
24
  module Brcobranca::Boleto
25
25
  Base.class_eval do
26
26
  include Brcobranca::Boleto::Template::Rghost
27
+ extend Brcobranca::Boleto::Template::Rghost
27
28
  include Brcobranca::Boleto::Template::Util
28
29
  end
29
30
  end
@@ -33,7 +34,7 @@ else
33
34
  end
34
35
 
35
36
  module Brcobranca
36
- VERSION = '2.0.8'
37
+ VERSION = '2.0.9'
37
38
 
38
39
  class NaoImplementado < NotImplementedError
39
40
  end
@@ -152,6 +152,25 @@ describe BancoCaixa do #:nodoc:[all]
152
152
  File.exist?(tmp_file.path).should be_false
153
153
  end
154
154
  end
155
+
156
+ it 'deveria gerar um lote de boletos' do
157
+ @valid_attributes[:valor] = 135.00
158
+ @valid_attributes[:data_documento] = Date.parse("2008-02-01")
159
+ @valid_attributes[:dias_vencimento] = 2
160
+ @valid_attributes[:numero_documento] = "77700168"
161
+ boletos = []
162
+ boletos << BancoCaixa.new(@valid_attributes)
163
+ boletos << BancoCaixa.new(@valid_attributes)
164
+
165
+ file_body = Brcobranca::Boleto::Base.imprimir_lista(boletos)
166
+ tmp_file=Tempfile.new("foobar.pdf")
167
+ tmp_file.puts file_body
168
+ tmp_file.close
169
+ File.exist?(tmp_file.path).should be_true
170
+ File.stat(tmp_file.path).zero?.should be_false
171
+ File.delete(tmp_file.path).should eql(1)
172
+ File.exist?(tmp_file.path).should be_false
173
+ end
155
174
 
156
175
  it 'deveria possuir o campo livre igual a segunda parte do codigo de barras' do
157
176
  boleto_novo = BancoCaixa.new(@valid_attributes)
@@ -234,6 +234,11 @@ module Brcobranca #:nodoc:[all]
234
234
  boleto_novo.class.included_modules.include?(Brcobranca::Boleto::Template::Rghost).should be_true
235
235
  boleto_novo.class.included_modules.include?(Brcobranca::Boleto::Template::Util).should be_true
236
236
  end
237
+
238
+ it "Incluir módulos de template na classe" do
239
+ Brcobranca::Boleto::Base.respond_to?(:imprimir_lista).should be_true
240
+ Brcobranca::Boleto::Base.respond_to?(:to).should be_true
241
+ end
237
242
 
238
243
  end
239
244
  end
@@ -39,25 +39,25 @@ module Brcobranca
39
39
  boleto_novo.codigo_barras.should eql("00193377100000135000000001238798777770016818")
40
40
  boleto_novo.codigo_barras.linha_digitavel.should eql("00190.00009 01238.798779 77700.168188 3 37710000013500")
41
41
  boleto_novo.conta_corrente_dv.should eql(0)
42
- #
43
- # %w| pdf jpg tif png ps |.each do |format|
44
- # file_body=boleto_novo.to(format.to_sym)
45
- # tmp_file=Tempfile.new("foobar." << format)
46
- # tmp_file.puts file_body
47
- # tmp_file.close
48
- # File.exist?(tmp_file.path).should be_true
49
- # File.stat(tmp_file.path).zero?.should be_false
50
- # File.delete(tmp_file.path).should eql(1)
51
- # File.exist?(tmp_file.path).should be_false
52
- # end
53
- # file_body=boleto_novo.to
54
- # tmp_file=Tempfile.new("foobar.")
55
- # tmp_file.puts file_body
56
- # tmp_file.close
57
- # File.exist?(tmp_file.path).should be_true
58
- # File.stat(tmp_file.path).zero?.should be_false
59
- # File.delete(tmp_file.path).should eql(1)
60
- # File.exist?(tmp_file.path).should be_false
42
+
43
+ %w| pdf jpg tif png ps |.each do |format|
44
+ file_body=boleto_novo.to(format.to_sym)
45
+ tmp_file=Tempfile.new("foobar." << format)
46
+ tmp_file.puts file_body
47
+ tmp_file.close
48
+ File.exist?(tmp_file.path).should be_true
49
+ File.stat(tmp_file.path).zero?.should be_false
50
+ File.delete(tmp_file.path).should eql(1)
51
+ File.exist?(tmp_file.path).should be_false
52
+ end
53
+ file_body=boleto_novo.to
54
+ tmp_file=Tempfile.new("foobar.")
55
+ tmp_file.puts file_body
56
+ tmp_file.close
57
+ File.exist?(tmp_file.path).should be_true
58
+ File.stat(tmp_file.path).zero?.should be_false
59
+ File.delete(tmp_file.path).should eql(1)
60
+ File.exist?(tmp_file.path).should be_false
61
61
  end
62
62
  end
63
63
  end
@@ -33,6 +33,10 @@ module Brcobranca
33
33
  File.exist?(boleto_novo.monta_logo).should be_true
34
34
  File.stat(boleto_novo.monta_logo).zero?.should be_false
35
35
 
36
+ boleto_novo = BancoCaixa.new
37
+ File.exist?(boleto_novo.monta_logo).should be_true
38
+ File.stat(boleto_novo.monta_logo).zero?.should be_false
39
+
36
40
  boleto_novo = Brcobranca::Boleto::Base.new
37
41
  boleto_novo.monta_logo.should be_false
38
42
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tulios-brcobranca-rails2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
- - 8
10
- version: 2.0.8
9
+ - 9
10
+ version: 2.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kivanio Barbosa
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-22 00:00:00 -02:00
18
+ date: 2010-12-29 00:00:00 -02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency