brcobranca 10.0.0 → 10.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -21
- data/README.md +5 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +5 -1
- data/lib/brcobranca/boleto/base.rb +2 -0
- data/lib/brcobranca/boleto/template/base.rb +4 -0
- data/lib/brcobranca/boleto/template/rghost2.rb +255 -0
- data/lib/brcobranca/boleto/template/rghost_bolepix.rb +279 -0
- data/lib/brcobranca/remessa/pagamento.rb +13 -11
- data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +3 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +1 -1
- data/lib/brcobranca/version.rb +1 -1
- data/lib/brcobranca.rb +2 -0
- metadata +8 -139
- data/spec/brcobranca/base_spec.rb +0 -179
- data/spec/brcobranca/boleto/ailos_spec.rb +0 -148
- data/spec/brcobranca/boleto/banco_brasil_spec.rb +0 -336
- data/spec/brcobranca/boleto/banco_brasilia_spec.rb +0 -153
- data/spec/brcobranca/boleto/banco_nordeste_spec.rb +0 -160
- data/spec/brcobranca/boleto/banestes_spec.rb +0 -193
- data/spec/brcobranca/boleto/banrisul_spec.rb +0 -180
- data/spec/brcobranca/boleto/bradesco_spec.rb +0 -214
- data/spec/brcobranca/boleto/caixa_spec.rb +0 -160
- data/spec/brcobranca/boleto/citibank_spec.rb +0 -195
- data/spec/brcobranca/boleto/credisis_spec.rb +0 -160
- data/spec/brcobranca/boleto/hsbc_spec.rb +0 -171
- data/spec/brcobranca/boleto/itau_spec.rb +0 -261
- data/spec/brcobranca/boleto/safra_spec.rb +0 -171
- data/spec/brcobranca/boleto/santander_spec.rb +0 -142
- data/spec/brcobranca/boleto/sicoob_spec.rb +0 -192
- data/spec/brcobranca/boleto/sicredi_spec.rb +0 -194
- data/spec/brcobranca/boleto/unicred_spec.rb +0 -139
- data/spec/brcobranca/boletos_em_lote_spec.rb +0 -38
- data/spec/brcobranca/calculo_data_spec.rb +0 -33
- data/spec/brcobranca/calculo_spec.rb +0 -187
- data/spec/brcobranca/currency_spec.rb +0 -79
- data/spec/brcobranca/formatacao_spec.rb +0 -46
- data/spec/brcobranca/formatacao_string_spec.rb +0 -31
- data/spec/brcobranca/limpeza_spec.rb +0 -10
- data/spec/brcobranca/remessa/base_spec.rb +0 -66
- data/spec/brcobranca/remessa/cnab240/ailos_spec.rb +0 -165
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +0 -222
- data/spec/brcobranca/remessa/cnab240/base_spec.rb +0 -114
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +0 -165
- data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +0 -272
- data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +0 -200
- data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +0 -203
- data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +0 -195
- data/spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb +0 -190
- data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +0 -188
- data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +0 -192
- data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +0 -192
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +0 -68
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +0 -203
- data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +0 -128
- data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +0 -190
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +0 -192
- data/spec/brcobranca/remessa/cnab400/santander_spec.rb +0 -154
- data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +0 -217
- data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +0 -186
- data/spec/brcobranca/remessa/pagamento_spec.rb +0 -228
- data/spec/brcobranca/retorno/cnab240/base_spec.rb +0 -24
- data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +0 -52
- data/spec/brcobranca/retorno/cnab240/santander_spec.rb +0 -52
- data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +0 -52
- data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +0 -33
- data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +0 -37
- data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +0 -40
- data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +0 -42
- data/spec/brcobranca/retorno/cnab400/base_spec.rb +0 -57
- data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +0 -59
- data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +0 -26
- data/spec/brcobranca/retorno/cnab400/itau_spec.rb +0 -60
- data/spec/brcobranca/retorno/cnab400/santander_spec.rb +0 -40
- data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +0 -38
- data/spec/brcobranca/retorno/retorno_cbr643_spec.rb +0 -69
- data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +0 -58
- data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +0 -53
- data/spec/brcobranca/rghost_spec.rb +0 -29
- data/spec/brcobranca/util/empresa_spec.rb +0 -35
- data/spec/brcobranca_spec.rb +0 -33
@@ -29,7 +29,11 @@ module Brcobranca
|
|
29
29
|
# Nova instancia do BancoBrasil
|
30
30
|
# @param (see Brcobranca::Boleto::Base#initialize)
|
31
31
|
def initialize(campos = {})
|
32
|
-
campos = {
|
32
|
+
campos = {
|
33
|
+
carteira: '18',
|
34
|
+
codigo_servico: false,
|
35
|
+
local_pagamento: 'PAGÁVEL EM QUALQUER BANCO.'
|
36
|
+
}.merge!(campos)
|
33
37
|
super(campos)
|
34
38
|
end
|
35
39
|
|
@@ -89,6 +89,8 @@ module Brcobranca
|
|
89
89
|
attr_accessor :avalista_documento
|
90
90
|
# <b>OPCIONAL</b>: Endereço do beneficiário
|
91
91
|
attr_accessor :cedente_endereco
|
92
|
+
# <b>OPCIONAL</b>: EMV para gerar QRCode para pagamento via PIX
|
93
|
+
attr_accessor :emv
|
92
94
|
|
93
95
|
# Validações
|
94
96
|
validates_presence_of :agencia, :conta_corrente, :moeda, :especie_documento, :especie, :aceite, :nosso_numero,
|
@@ -12,6 +12,10 @@ module Brcobranca
|
|
12
12
|
[Brcobranca::Boleto::Template::Rghost]
|
13
13
|
when :rghost_carne
|
14
14
|
[Brcobranca::Boleto::Template::RghostCarne]
|
15
|
+
when :rghost_bolepix
|
16
|
+
[Brcobranca::Boleto::Template::RghostBolepix]
|
17
|
+
when :rghost2
|
18
|
+
[Brcobranca::Boleto::Template::Rghost2]
|
15
19
|
when :both
|
16
20
|
[Brcobranca::Boleto::Template::Rghost, Brcobranca::Boleto::Template::RghostCarne]
|
17
21
|
else
|
@@ -0,0 +1,255 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rghost'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
7
|
+
gem 'rghost'
|
8
|
+
require 'rghost'
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rghost_barcode'
|
13
|
+
rescue LoadError
|
14
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
15
|
+
gem 'rghost_barcode'
|
16
|
+
require 'rghost_barcode'
|
17
|
+
end
|
18
|
+
|
19
|
+
module Brcobranca
|
20
|
+
module Boleto
|
21
|
+
module Template
|
22
|
+
# Templates para usar com Rghost
|
23
|
+
module Rghost2
|
24
|
+
extend self
|
25
|
+
include RGhost unless include?(RGhost)
|
26
|
+
RGhost::Config::GS[:external_encoding] = Brcobranca.configuration.external_encoding
|
27
|
+
RGhost::Config::GS[:default_params] << '-dNOSAFER'
|
28
|
+
RGhost::Config::GS[:unit]=Units::Cm
|
29
|
+
|
30
|
+
|
31
|
+
# Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
32
|
+
#
|
33
|
+
# @return [Stream]
|
34
|
+
# @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
|
35
|
+
# @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
|
36
|
+
def to(formato, options = {})
|
37
|
+
modelo_generico(self, options.merge!(formato: formato))
|
38
|
+
end
|
39
|
+
|
40
|
+
# Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
41
|
+
#
|
42
|
+
# @return [Stream]
|
43
|
+
# @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
|
44
|
+
# @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
|
45
|
+
def lote(boletos, options = {})
|
46
|
+
modelo_generico_multipage(boletos, options)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Cria o métodos dinâmicos (to_pdf, to_gif e etc) com todos os fomátos válidos.
|
50
|
+
#
|
51
|
+
# @return [Stream]
|
52
|
+
# @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
|
53
|
+
# @example
|
54
|
+
# @boleto.to_pdf #=> boleto gerado no formato pdf
|
55
|
+
def method_missing(m, *args)
|
56
|
+
method = m.to_s
|
57
|
+
if method.start_with?('to_')
|
58
|
+
modelo_generico(self, (args.first || {}).merge!(formato: method[3..-1]))
|
59
|
+
else
|
60
|
+
super
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
# Retorna um stream pronto para gravação em arquivo.
|
67
|
+
#
|
68
|
+
# @return [Stream]
|
69
|
+
# @param [Boleto] Instância de uma classe de boleto.
|
70
|
+
# @param [Hash] options Opção para a criação do boleto.
|
71
|
+
# @option options [Symbol] :resolucao Resolução em pixels.
|
72
|
+
# @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
73
|
+
def modelo_generico(boleto, options = {})
|
74
|
+
doc = Document.new paper: [21,29.7] # A4
|
75
|
+
template_path = File.join(File.dirname(__FILE__), '..', '..', 'arquivos', 'templates', 'modelo_generico2.eps')
|
76
|
+
raise 'Não foi possível encontrar o template. Verifique o caminho' unless File.exist?(template_path)
|
77
|
+
modelo_recibo_beneficiario(doc, boleto)
|
78
|
+
modelo_generico_template(doc, boleto, template_path)
|
79
|
+
modelo_generico_cabecalho(doc, boleto)
|
80
|
+
modelo_generico_rodape(doc, boleto)
|
81
|
+
# Gerando stream
|
82
|
+
formato = (options.delete(:formato) || Brcobranca.configuration.formato)
|
83
|
+
resolucao = (options.delete(:resolucao) || Brcobranca.configuration.resolucao)
|
84
|
+
doc.render_stream(formato.to_sym, resolution: resolucao)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Retorna um stream para multiplos boletos pronto para gravação em arquivo.
|
88
|
+
#
|
89
|
+
# @return [Stream]
|
90
|
+
# @param [Array] Instâncias de classes de boleto.
|
91
|
+
# @param [Hash] options Opção para a criação do boleto.
|
92
|
+
# @option options [Symbol] :resolucao Resolução em pixels.
|
93
|
+
# @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
94
|
+
def modelo_generico_multipage(boletos, options = {})
|
95
|
+
doc = Document.new paper: [21,29.7] # A4
|
96
|
+
template_path = File.join(File.dirname(__FILE__), '..', '..', 'arquivos', 'templates', 'modelo_generico2.eps')
|
97
|
+
raise 'Não foi possível encontrar o template. Verifique o caminho' unless File.exist?(template_path)
|
98
|
+
boletos.each_with_index do |boleto, index|
|
99
|
+
modelo_generico_template(doc, boleto, template_path)
|
100
|
+
modelo_recibo_beneficiario(doc, boleto)
|
101
|
+
modelo_generico_cabecalho(doc, boleto)
|
102
|
+
modelo_generico_rodape(doc, boleto)
|
103
|
+
# Cria nova página se não for o último boleto
|
104
|
+
doc.next_page unless index == boletos.length - 1
|
105
|
+
end
|
106
|
+
# Gerando stream
|
107
|
+
formato = (options.delete(:formato) || Brcobranca.configuration.formato)
|
108
|
+
resolucao = (options.delete(:resolucao) || Brcobranca.configuration.resolucao)
|
109
|
+
doc.render_stream(formato.to_sym, resolution: resolucao)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Define o template a ser usado no boleto
|
113
|
+
def modelo_generico_template(doc, _boleto, template_path)
|
114
|
+
doc.define_template(:template, template_path, x: '0.732 cm', y: '3.48 cm')
|
115
|
+
doc.use_template :template
|
116
|
+
|
117
|
+
doc.define_tags do
|
118
|
+
tag :menor, name: "LiberationMono", size: 8
|
119
|
+
tag :menor2, name: "LiberationMono", size: 6
|
120
|
+
tag :menor_bold, name: "Helvetica-Bold", size: 8
|
121
|
+
tag :medio, name: "Helvetica-Bold", size: 12
|
122
|
+
tag :maior, name: "Helvetica-Bold", size: 13.5
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Monta Recibo do Beneficiário
|
127
|
+
def modelo_recibo_beneficiario(doc, boleto)
|
128
|
+
doc.moveto x: 4.28, y: 26.87
|
129
|
+
doc.show truncar(boleto.cedente, 90), tag: :menor
|
130
|
+
doc.moveto x: 4.28, y: 26.33
|
131
|
+
doc.show truncar(boleto.sacado, 90), tag: :menor
|
132
|
+
doc.moveto x: 4.28, y: 25.76
|
133
|
+
doc.show boleto.documento_numero, tag: :menor
|
134
|
+
doc.moveto x: 4.28, y: 25.20
|
135
|
+
doc.show boleto.nosso_numero_boleto, tag: :menor
|
136
|
+
doc.moveto x: 4.28, y: 24.63
|
137
|
+
doc.show boleto.data_vencimento.to_s_br, tag: :menor
|
138
|
+
doc.moveto x: 4.28, y: 24.070
|
139
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :menor
|
140
|
+
doc.moveto x: 4.28, y: 23.49
|
141
|
+
doc.show boleto.agencia_conta_boleto, tag: :menor
|
142
|
+
doc.moveto x: 4.28, y: 22.95
|
143
|
+
doc.show boleto.valor_documento.to_currency, tag: :menor
|
144
|
+
end
|
145
|
+
|
146
|
+
# Monta Recibo do Pagador boleto
|
147
|
+
def modelo_generico_cabecalho(doc, boleto)
|
148
|
+
monta_logotipo(doc, boleto, 0.782, 19.717, 0.85)
|
149
|
+
doc.moveto x: 4.813, y: 19.801
|
150
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :medio
|
151
|
+
doc.moveto x: 0.823, y: 20.942
|
152
|
+
doc.show boleto.codigo_barras.linha_digitavel, tag: :menor_bold
|
153
|
+
doc.moveto x: 1.121, y: 18.924
|
154
|
+
doc.show truncar(boleto.cedente, 47), tag: :menor
|
155
|
+
doc.moveto x: 9.9, y: 18.924
|
156
|
+
doc.show boleto.agencia_conta_boleto.tr(' ', ''), tag: :menor
|
157
|
+
doc.moveto x: 16.423, y: 18.924
|
158
|
+
doc.show boleto.nosso_numero_boleto, tag: :menor
|
159
|
+
doc.moveto x: 1.121, y: 17.984
|
160
|
+
doc.show boleto.documento_numero, tag: :menor
|
161
|
+
doc.moveto x: 14.139, y: 18.924
|
162
|
+
doc.show boleto.quantidade, tag: :menor
|
163
|
+
doc.moveto x: 7.0, y: 17.984
|
164
|
+
doc.show boleto.documento_cedente.formata_documento.to_s, tag: :menor
|
165
|
+
doc.moveto x: 10.602, y: 17.984
|
166
|
+
doc.show boleto.data_vencimento.to_s_br, tag: :menor
|
167
|
+
doc.text_area "<menor>#{boleto.valor_documento.to_currency}</menor>", width: 5.78, text_align: :right, x: 14.12, y: 17.984, tag: :menor
|
168
|
+
doc.moveto x: 1.109, y: 17.089
|
169
|
+
doc.show truncar(boleto.sacado, 109), tag: :menor
|
170
|
+
end
|
171
|
+
|
172
|
+
# Monta o corpo e rodapé do layout do boleto
|
173
|
+
def modelo_generico_rodape(doc, boleto)
|
174
|
+
monta_logotipo(doc, boleto, 0.782, 13.9, 0.85)
|
175
|
+
doc.text_area "<menor_bold>#{boleto.data_vencimento.to_s_br if boleto.data_vencimento}</menor_bold>", width: 5.786, text_align: :center, x: 14.47271, y: 13.11587
|
176
|
+
doc.text_area "<menor>#{boleto.agencia_conta_boleto}</menor>", width: 5.786, text_align: :center, x: 14.47271, y: 12.26921
|
177
|
+
doc.text_area "<menor>#{boleto.nosso_numero_boleto}</menor>", width: 5.786, text_align: :center, x: 14.47271, y: 11.42254
|
178
|
+
doc.text_area "<menor_bold>#{boleto.valor_documento.to_currency}</menor_bold>", width: 5.5, text_align: :right, x: 14.47271, y: 10.56926
|
179
|
+
doc.moveto x: 4.813, y: 13.977
|
180
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :medio
|
181
|
+
doc.moveto x: 6.815, y: 13.990
|
182
|
+
doc.show boleto.codigo_barras.linha_digitavel, tag: :maior
|
183
|
+
doc.moveto x: 1.121, y: 13.2
|
184
|
+
doc.show boleto.local_pagamento, tag: :menor
|
185
|
+
doc.moveto x: 1.121, y: 12.295
|
186
|
+
doc.show truncar(boleto.cedente,54), tag: :menor
|
187
|
+
doc.moveto x: 11.307, y: 12.295
|
188
|
+
doc.show boleto.documento_cedente.formata_documento.to_s, tag: :menor
|
189
|
+
doc.moveto x: 1.112, y: 11.42
|
190
|
+
doc.show (boleto.data_documento.to_s_br if boleto.data_documento), tag: :menor
|
191
|
+
doc.moveto x: 4.268, y: 11.42
|
192
|
+
doc.show boleto.documento_numero, tag: :menor
|
193
|
+
doc.moveto x: 7.471, y: 11.42
|
194
|
+
doc.show boleto.especie_documento, tag: :menor
|
195
|
+
doc.moveto x: 9.588, y: 11.42
|
196
|
+
doc.show boleto.aceite, tag: :menor
|
197
|
+
doc.moveto x: 11.660, y: 11.42
|
198
|
+
doc.show (boleto.data_processamento.to_s_br if boleto.data_processamento), tag: :menor
|
199
|
+
doc.moveto x: 4.62056, y: 10.56058
|
200
|
+
if boleto.variacao
|
201
|
+
doc.show "#{boleto.carteira}-#{boleto.variacao}"
|
202
|
+
else
|
203
|
+
doc.show boleto.carteira
|
204
|
+
end
|
205
|
+
doc.moveto x: 7.26640, y: 10.56058
|
206
|
+
doc.show boleto.especie
|
207
|
+
monta_instrucoes(doc, boleto, 0.8, 9.8)
|
208
|
+
pagador = "<menor>#{truncar(boleto.sacado,75)} - CPF/CNPJ: #{boleto.sacado_documento.formata_documento}</menor>"
|
209
|
+
pagador += "\n<menor>#{boleto.sacado_endereco.to_s}</menor>" if boleto.sacado_endereco
|
210
|
+
doc.text_area pagador, width: 18, text_align: :left, x: 2.04611, y: 5.8, row_height: '0.4 cm'
|
211
|
+
avalista = "#{truncar(boleto.avalista,46)} - CPF/CNPJ: #{boleto.avalista_documento.formata_documento.to_s}" if boleto.avalista && boleto.avalista_documento
|
212
|
+
if avalista
|
213
|
+
doc.text_area "<menor2>#{avalista}</menor2>", width: 12.312, text_align: :left, x: 2.04611, y: 4.3, row_height: '0.4 cm'
|
214
|
+
end
|
215
|
+
# Gerando codigo de barra com rghost_barcode
|
216
|
+
if boleto.codigo_barras
|
217
|
+
doc.barcode_interleaved2of5(boleto.codigo_barras, width: '10.3 cm', height: '1.3 cm', x: 1.06, y: 2.12)
|
218
|
+
end
|
219
|
+
# FIM Segunda parte do BOLETO
|
220
|
+
end
|
221
|
+
|
222
|
+
def truncar(string, limite)
|
223
|
+
if string.length > limite
|
224
|
+
string = string[0...limite].upcase + "..."
|
225
|
+
end
|
226
|
+
string
|
227
|
+
end
|
228
|
+
|
229
|
+
def monta_instrucoes(doc, boleto, x, y)
|
230
|
+
lista_instrucoes = Array[
|
231
|
+
boleto.instrucoes,
|
232
|
+
boleto.instrucao1,
|
233
|
+
boleto.instrucao2,
|
234
|
+
boleto.instrucao3,
|
235
|
+
boleto.instrucao4,
|
236
|
+
boleto.instrucao5,
|
237
|
+
boleto.instrucao6,
|
238
|
+
].reject(&:blank?)
|
239
|
+
lista_instrucoes = lista_instrucoes.map { |i| "<menor>#{i}</menor>" }
|
240
|
+
texto_instrucoes = lista_instrucoes.join("\n")
|
241
|
+
doc.text_area texto_instrucoes, width: 13.547, text_align: :left, x: x, y: y, row_height: '0.4 cm'
|
242
|
+
end
|
243
|
+
|
244
|
+
def monta_logotipo(doc, boleto, x, y, scale)
|
245
|
+
doc.graphic do |g|
|
246
|
+
g.scale(scale, scale)
|
247
|
+
fator = 1/scale
|
248
|
+
g.image boleto.logotipo, x: (x*fator), y: (y*fator)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
@@ -0,0 +1,279 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rghost'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
7
|
+
gem 'rghost'
|
8
|
+
require 'rghost'
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rghost_barcode'
|
13
|
+
rescue LoadError
|
14
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
15
|
+
gem 'rghost_barcode'
|
16
|
+
require 'rghost_barcode'
|
17
|
+
end
|
18
|
+
|
19
|
+
module Brcobranca
|
20
|
+
module Boleto
|
21
|
+
module Template
|
22
|
+
# Templates para usar com Rghost
|
23
|
+
module RghostBolepix
|
24
|
+
extend self
|
25
|
+
include RGhost unless include?(RGhost)
|
26
|
+
RGhost::Config::GS[:external_encoding] = Brcobranca.configuration.external_encoding
|
27
|
+
RGhost::Config::GS[:default_params] << '-dNOSAFER'
|
28
|
+
|
29
|
+
# Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
30
|
+
#
|
31
|
+
# @return [Stream]
|
32
|
+
# @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
|
33
|
+
# @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
|
34
|
+
def to(formato, options = {})
|
35
|
+
modelo_generico(self, options.merge!(formato: formato))
|
36
|
+
end
|
37
|
+
|
38
|
+
# Cria o métodos dinâmicos (to_pdf, to_gif e etc) com todos os fomátos válidos.
|
39
|
+
#
|
40
|
+
# @return [Stream]
|
41
|
+
# @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
|
42
|
+
# @example
|
43
|
+
# @boleto.to_pdf #=> boleto gerado no formato pdf
|
44
|
+
def method_missing(m, *args)
|
45
|
+
method = m.to_s
|
46
|
+
if method.start_with?('to_')
|
47
|
+
modelo_generico(self, (args.first || {}).merge!(formato: method[3..]))
|
48
|
+
else
|
49
|
+
super
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Retorna um stream pronto para gravação em arquivo.
|
56
|
+
#
|
57
|
+
# @return [Stream]
|
58
|
+
# @param [Boleto] Instância de uma classe de boleto.
|
59
|
+
# @param [Hash] options Opção para a criação do boleto.
|
60
|
+
# @option options [Symbol] :resolucao Resolução em pixels.
|
61
|
+
# @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
62
|
+
def modelo_generico(boleto, options = {})
|
63
|
+
doc = Document.new paper: :A4 # 210x297
|
64
|
+
|
65
|
+
template_path = File.join(File.dirname(__FILE__), '..', '..', 'arquivos', 'templates', 'modelo_generico.eps')
|
66
|
+
|
67
|
+
raise 'Não foi possível encontrar o template. Verifique o caminho' unless File.exist?(template_path)
|
68
|
+
|
69
|
+
modelo_generico_template(doc, boleto, template_path)
|
70
|
+
modelo_generico_cabecalho(doc, boleto)
|
71
|
+
modelo_generico_rodape(doc, boleto)
|
72
|
+
|
73
|
+
# Gerando codigo de barra com rghost_barcode
|
74
|
+
if boleto.codigo_barras
|
75
|
+
doc.barcode_interleaved2of5(boleto.codigo_barras, width: '10.3 cm', height: '1.3 cm', x: "#{@x - 1.7} cm",
|
76
|
+
y: "#{@y - 1.67} cm")
|
77
|
+
end
|
78
|
+
|
79
|
+
# Gerando QRCode a partir de um emv
|
80
|
+
if boleto.emv
|
81
|
+
doc.barcode_qrcode(boleto.emv, width: '2.5 cm',
|
82
|
+
height: '2.5 cm',
|
83
|
+
eclevel: 'H',
|
84
|
+
x: "#{@x + 12.9} cm",
|
85
|
+
y: "#{@y - 2.50} cm")
|
86
|
+
move_more(doc, @x + 12.9, @y - 3.70)
|
87
|
+
doc.show 'Pague com PIX'
|
88
|
+
end
|
89
|
+
|
90
|
+
# Gerando stream
|
91
|
+
formato = (options.delete(:formato) || Brcobranca.configuration.formato)
|
92
|
+
resolucao = (options.delete(:resolucao) || Brcobranca.configuration.resolucao)
|
93
|
+
doc.render_stream(formato.to_sym, resolution: resolucao)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Define o template a ser usado no boleto
|
97
|
+
def modelo_generico_template(doc, _boleto, template_path)
|
98
|
+
doc.define_template(:template, template_path, x: '0.5 cm', y: '2.7 cm')
|
99
|
+
doc.use_template :template
|
100
|
+
|
101
|
+
doc.define_tags do
|
102
|
+
tag :grande, size: 13
|
103
|
+
tag :maior, size: 15
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def move_more(doc, x, y)
|
108
|
+
@x += x
|
109
|
+
@y += y
|
110
|
+
doc.moveto x: "#{@x} cm", y: "#{@y} cm"
|
111
|
+
end
|
112
|
+
|
113
|
+
# Monta o cabeçalho do layout do boleto
|
114
|
+
def modelo_generico_cabecalho(doc, boleto)
|
115
|
+
# INICIO Primeira parte do BOLETO
|
116
|
+
# Pontos iniciais em x e y
|
117
|
+
@x = 0.50
|
118
|
+
@y = 27.42
|
119
|
+
# LOGOTIPO do BANCO
|
120
|
+
doc.image boleto.logotipo, x: "#{@x} cm", y: "#{@y} cm"
|
121
|
+
# Dados
|
122
|
+
|
123
|
+
move_more(doc, 4.84, 0.02)
|
124
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :maior
|
125
|
+
move_more(doc, 2, 0)
|
126
|
+
doc.show boleto.codigo_barras.linha_digitavel, tag: :grande
|
127
|
+
move_more(doc, -6.5, -0.83)
|
128
|
+
|
129
|
+
doc.show boleto.cedente
|
130
|
+
|
131
|
+
move_more(doc, 15.8, 0)
|
132
|
+
doc.show boleto.agencia_conta_boleto
|
133
|
+
|
134
|
+
move_more(doc, -15.8, -0.9)
|
135
|
+
doc.show boleto.cedente_endereco
|
136
|
+
|
137
|
+
move_more(doc, 15.8, 0)
|
138
|
+
doc.show boleto.nosso_numero_boleto
|
139
|
+
|
140
|
+
move_more(doc, -15.8, -0.8)
|
141
|
+
doc.show boleto.documento_numero
|
142
|
+
|
143
|
+
move_more(doc, 3.5, 0)
|
144
|
+
doc.show boleto.especie
|
145
|
+
|
146
|
+
move_more(doc, 1.5, 0)
|
147
|
+
doc.show boleto.quantidade
|
148
|
+
|
149
|
+
move_more(doc, 2, 0)
|
150
|
+
doc.show boleto.documento_cedente.formata_documento.to_s
|
151
|
+
|
152
|
+
move_more(doc, 3.8, 0)
|
153
|
+
doc.show boleto.data_vencimento.to_s_br
|
154
|
+
|
155
|
+
move_more(doc, 5, 0)
|
156
|
+
doc.show boleto.valor_documento.to_currency
|
157
|
+
|
158
|
+
move_more(doc, -15, -1.3)
|
159
|
+
doc.show "#{boleto.sacado} - #{boleto.sacado_documento.formata_documento}"
|
160
|
+
|
161
|
+
move_more(doc, 0, -0.3)
|
162
|
+
doc.show boleto.sacado_endereco.to_s
|
163
|
+
return unless boleto.demonstrativo
|
164
|
+
|
165
|
+
doc.text_area boleto.demonstrativo, width: '18.5 cm', text_align: :left, x: "#{@x - 0.8} cm",
|
166
|
+
y: "#{@y - 0.9} cm", row_height: '0.4 cm'
|
167
|
+
|
168
|
+
# FIM Primeira parte do BOLETO
|
169
|
+
end
|
170
|
+
|
171
|
+
# Monta o corpo e rodapé do layout do boleto
|
172
|
+
def modelo_generico_rodape(doc, boleto)
|
173
|
+
# INICIO Segunda parte do BOLETO BB
|
174
|
+
# Pontos iniciais em x e y
|
175
|
+
@x = 0.50
|
176
|
+
@y = 12.22
|
177
|
+
# LOGOTIPO do BANCO
|
178
|
+
doc.image boleto.logotipo, x: "#{@x} cm", y: "#{@y} cm"
|
179
|
+
|
180
|
+
move_more(doc, 4.84, 0.01)
|
181
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :maior
|
182
|
+
|
183
|
+
move_more(doc, 2, 0)
|
184
|
+
doc.show boleto.codigo_barras.linha_digitavel, tag: :grande
|
185
|
+
|
186
|
+
move_more(doc, -6.5, -0.9)
|
187
|
+
doc.show boleto.local_pagamento
|
188
|
+
|
189
|
+
move_more(doc, 15.8, 0)
|
190
|
+
doc.show boleto.data_vencimento.to_s_br if boleto.data_vencimento
|
191
|
+
|
192
|
+
move_more(doc, -15.8, -0.8)
|
193
|
+
if boleto.cedente_endereco
|
194
|
+
doc.show boleto.cedente_endereco
|
195
|
+
move_more(doc, 1.2, 0.3)
|
196
|
+
doc.show boleto.cedente
|
197
|
+
move_more(doc, -1.2, -0.3)
|
198
|
+
else
|
199
|
+
doc.show boleto.cedente
|
200
|
+
end
|
201
|
+
|
202
|
+
move_more(doc, 15.8, 0)
|
203
|
+
doc.show boleto.agencia_conta_boleto
|
204
|
+
|
205
|
+
move_more(doc, -15.8, -0.9)
|
206
|
+
doc.show boleto.data_documento.to_s_br if boleto.data_documento
|
207
|
+
|
208
|
+
move_more(doc, 3.5, 0)
|
209
|
+
doc.show boleto.documento_numero
|
210
|
+
|
211
|
+
move_more(doc, 5.8, 0)
|
212
|
+
doc.show boleto.especie_documento
|
213
|
+
|
214
|
+
move_more(doc, 1.7, 0)
|
215
|
+
doc.show boleto.aceite
|
216
|
+
|
217
|
+
move_more(doc, 1.3, 0)
|
218
|
+
|
219
|
+
doc.show boleto.data_processamento.to_s_br if boleto.data_processamento
|
220
|
+
|
221
|
+
move_more(doc, 3.5, 0)
|
222
|
+
doc.show boleto.nosso_numero_boleto
|
223
|
+
|
224
|
+
move_more(doc, -12.1, -0.8)
|
225
|
+
if boleto.variacao
|
226
|
+
doc.show "#{boleto.carteira}-#{boleto.variacao}"
|
227
|
+
else
|
228
|
+
doc.show boleto.carteira
|
229
|
+
end
|
230
|
+
|
231
|
+
move_more(doc, 2, 0)
|
232
|
+
doc.show boleto.especie
|
233
|
+
|
234
|
+
move_more(doc, 10.1, 0)
|
235
|
+
doc.show boleto.valor_documento.to_currency
|
236
|
+
|
237
|
+
if boleto.instrucoes
|
238
|
+
doc.text_area boleto.instrucoes, width: '14 cm',
|
239
|
+
text_align: :left, x: "#{@x -= 15.8} cm",
|
240
|
+
y: "#{@y -= 0.9} cm",
|
241
|
+
row_height: '0.4 cm'
|
242
|
+
move_more(doc, 0, -2)
|
243
|
+
else
|
244
|
+
move_more(doc, -15.8, -0.9)
|
245
|
+
doc.show boleto.instrucao1
|
246
|
+
|
247
|
+
move_more(doc, 0, -0.4)
|
248
|
+
doc.show boleto.instrucao2
|
249
|
+
|
250
|
+
move_more(doc, 0, -0.4)
|
251
|
+
doc.show boleto.instrucao3
|
252
|
+
|
253
|
+
move_more(doc, 0, -0.4)
|
254
|
+
doc.show boleto.instrucao4
|
255
|
+
|
256
|
+
move_more(doc, 0, -0.4)
|
257
|
+
doc.show boleto.instrucao5
|
258
|
+
|
259
|
+
move_more(doc, 0, -0.4)
|
260
|
+
doc.show boleto.instrucao6
|
261
|
+
end
|
262
|
+
|
263
|
+
move_more(doc, 0.5, -1.9)
|
264
|
+
if boleto.sacado && boleto.sacado_documento
|
265
|
+
sacado_info = "#{boleto.sacado} - CPF/CNPJ: #{boleto.sacado_documento.formata_documento}"
|
266
|
+
doc.show sacado_info
|
267
|
+
end
|
268
|
+
|
269
|
+
move_more(doc, 0, -0.4)
|
270
|
+
doc.show boleto.sacado_endereco.to_s
|
271
|
+
|
272
|
+
move_more(doc, 1.2, -0.93)
|
273
|
+
doc.show "#{boleto.avalista} - #{boleto.avalista_documento}" if boleto.avalista && boleto.avalista_documento
|
274
|
+
# FIM Segunda parte do BOLETO
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
@@ -190,7 +190,7 @@ module Brcobranca
|
|
190
190
|
# @return [String]
|
191
191
|
#
|
192
192
|
def formata_percentual_multa(tamanho = 4)
|
193
|
-
format_value(percentual_multa, tamanho)
|
193
|
+
format_value(:percentual_multa, tamanho)
|
194
194
|
end
|
195
195
|
|
196
196
|
# Formata a data de cobrança da multa
|
@@ -215,7 +215,7 @@ module Brcobranca
|
|
215
215
|
# quantidade de caracteres a ser retornado
|
216
216
|
#
|
217
217
|
def formata_valor(tamanho = 13)
|
218
|
-
format_value(valor, tamanho)
|
218
|
+
format_value(:valor, tamanho)
|
219
219
|
end
|
220
220
|
|
221
221
|
def documento_ou_numero
|
@@ -233,7 +233,7 @@ module Brcobranca
|
|
233
233
|
# quantidade de caracteres a ser retornado
|
234
234
|
#
|
235
235
|
def formata_valor_mora(tamanho = 13)
|
236
|
-
format_value(valor_mora, tamanho)
|
236
|
+
format_value(:valor_mora, tamanho)
|
237
237
|
end
|
238
238
|
|
239
239
|
# Formata o campo valor da multa
|
@@ -242,7 +242,7 @@ module Brcobranca
|
|
242
242
|
# quantidade de caracteres a ser retornado
|
243
243
|
#
|
244
244
|
def formata_valor_multa(tamanho = 6)
|
245
|
-
format_value(percentual_multa, tamanho)
|
245
|
+
format_value(:percentual_multa, tamanho)
|
246
246
|
end
|
247
247
|
|
248
248
|
# Formata o campo valor do desconto
|
@@ -251,7 +251,7 @@ module Brcobranca
|
|
251
251
|
# quantidade de caracteres a ser retornado
|
252
252
|
#
|
253
253
|
def formata_valor_desconto(tamanho = 13)
|
254
|
-
format_value(valor_desconto, tamanho)
|
254
|
+
format_value(:valor_desconto, tamanho)
|
255
255
|
end
|
256
256
|
|
257
257
|
# Formata o campo valor do segundo desconto
|
@@ -260,7 +260,7 @@ module Brcobranca
|
|
260
260
|
# quantidade de caracteres a ser retornado
|
261
261
|
#
|
262
262
|
def formata_valor_segundo_desconto(tamanho = 13)
|
263
|
-
format_value(valor_segundo_desconto, tamanho)
|
263
|
+
format_value(:valor_segundo_desconto, tamanho)
|
264
264
|
end
|
265
265
|
|
266
266
|
# Formata o campo valor do terceiro desconto
|
@@ -269,7 +269,7 @@ module Brcobranca
|
|
269
269
|
# quantidade de caracteres a ser retornado
|
270
270
|
#
|
271
271
|
def formata_valor_terceiro_desconto(tamanho = 13)
|
272
|
-
format_value(valor_terceiro_desconto, tamanho)
|
272
|
+
format_value(:valor_terceiro_desconto, tamanho)
|
273
273
|
end
|
274
274
|
|
275
275
|
# Formata o campo valor do IOF
|
@@ -278,7 +278,7 @@ module Brcobranca
|
|
278
278
|
# quantidade de caracteres a ser retornado
|
279
279
|
#
|
280
280
|
def formata_valor_iof(tamanho = 13)
|
281
|
-
format_value(valor_iof, tamanho)
|
281
|
+
format_value(:valor_iof, tamanho)
|
282
282
|
end
|
283
283
|
|
284
284
|
# Formata o campo valor do IOF
|
@@ -287,7 +287,7 @@ module Brcobranca
|
|
287
287
|
# quantidade de caracteres a ser retornado
|
288
288
|
#
|
289
289
|
def formata_valor_abatimento(tamanho = 13)
|
290
|
-
format_value(valor_abatimento, tamanho)
|
290
|
+
format_value(:valor_abatimento, tamanho)
|
291
291
|
end
|
292
292
|
|
293
293
|
# Retorna a identificacao do pagador
|
@@ -310,8 +310,10 @@ module Brcobranca
|
|
310
310
|
|
311
311
|
private
|
312
312
|
|
313
|
-
def format_value(
|
314
|
-
|
313
|
+
def format_value(attribute, tamanho)
|
314
|
+
value = send(attribute)
|
315
|
+
|
316
|
+
raise ValorInvalido, "Pagamento##{attribute}: Deve ser um Float" unless /\./.match?(value.to_s)
|
315
317
|
|
316
318
|
format('%.2f', value).delete('.').rjust(tamanho, '0')
|
317
319
|
end
|
@@ -23,6 +23,9 @@ module Brcobranca
|
|
23
23
|
# :zeros, 1..2 # zeros
|
24
24
|
# :zeros, 3..16 #zeros
|
25
25
|
|
26
|
+
# :codigo_registro, 0..0 #identificação do registro
|
27
|
+
parse.field :codigo_registro, 0..0
|
28
|
+
|
26
29
|
# :agencia, 17..21 #agencia mantenedora da conta com digito
|
27
30
|
parse.field :agencia_com_dv, 17..21
|
28
31
|
|
data/lib/brcobranca/version.rb
CHANGED