brcobranca 10.0.0 → 10.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -21
  3. data/README.md +5 -0
  4. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  5. data/lib/brcobranca/boleto/banco_brasil.rb +5 -1
  6. data/lib/brcobranca/boleto/base.rb +2 -0
  7. data/lib/brcobranca/boleto/template/base.rb +4 -0
  8. data/lib/brcobranca/boleto/template/rghost2.rb +255 -0
  9. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +279 -0
  10. data/lib/brcobranca/remessa/pagamento.rb +13 -11
  11. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +3 -0
  12. data/lib/brcobranca/retorno/cnab400/base.rb +1 -1
  13. data/lib/brcobranca/version.rb +1 -1
  14. data/lib/brcobranca.rb +2 -0
  15. metadata +8 -139
  16. data/spec/brcobranca/base_spec.rb +0 -179
  17. data/spec/brcobranca/boleto/ailos_spec.rb +0 -148
  18. data/spec/brcobranca/boleto/banco_brasil_spec.rb +0 -336
  19. data/spec/brcobranca/boleto/banco_brasilia_spec.rb +0 -153
  20. data/spec/brcobranca/boleto/banco_nordeste_spec.rb +0 -160
  21. data/spec/brcobranca/boleto/banestes_spec.rb +0 -193
  22. data/spec/brcobranca/boleto/banrisul_spec.rb +0 -180
  23. data/spec/brcobranca/boleto/bradesco_spec.rb +0 -214
  24. data/spec/brcobranca/boleto/caixa_spec.rb +0 -160
  25. data/spec/brcobranca/boleto/citibank_spec.rb +0 -195
  26. data/spec/brcobranca/boleto/credisis_spec.rb +0 -160
  27. data/spec/brcobranca/boleto/hsbc_spec.rb +0 -171
  28. data/spec/brcobranca/boleto/itau_spec.rb +0 -261
  29. data/spec/brcobranca/boleto/safra_spec.rb +0 -171
  30. data/spec/brcobranca/boleto/santander_spec.rb +0 -142
  31. data/spec/brcobranca/boleto/sicoob_spec.rb +0 -192
  32. data/spec/brcobranca/boleto/sicredi_spec.rb +0 -194
  33. data/spec/brcobranca/boleto/unicred_spec.rb +0 -139
  34. data/spec/brcobranca/boletos_em_lote_spec.rb +0 -38
  35. data/spec/brcobranca/calculo_data_spec.rb +0 -33
  36. data/spec/brcobranca/calculo_spec.rb +0 -187
  37. data/spec/brcobranca/currency_spec.rb +0 -79
  38. data/spec/brcobranca/formatacao_spec.rb +0 -46
  39. data/spec/brcobranca/formatacao_string_spec.rb +0 -31
  40. data/spec/brcobranca/limpeza_spec.rb +0 -10
  41. data/spec/brcobranca/remessa/base_spec.rb +0 -66
  42. data/spec/brcobranca/remessa/cnab240/ailos_spec.rb +0 -165
  43. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +0 -222
  44. data/spec/brcobranca/remessa/cnab240/base_spec.rb +0 -114
  45. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +0 -165
  46. data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +0 -272
  47. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +0 -200
  48. data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +0 -203
  49. data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +0 -195
  50. data/spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb +0 -190
  51. data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +0 -188
  52. data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +0 -192
  53. data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +0 -192
  54. data/spec/brcobranca/remessa/cnab400/base_spec.rb +0 -68
  55. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +0 -203
  56. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +0 -128
  57. data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +0 -190
  58. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +0 -192
  59. data/spec/brcobranca/remessa/cnab400/santander_spec.rb +0 -154
  60. data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +0 -217
  61. data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +0 -186
  62. data/spec/brcobranca/remessa/pagamento_spec.rb +0 -228
  63. data/spec/brcobranca/retorno/cnab240/base_spec.rb +0 -24
  64. data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +0 -52
  65. data/spec/brcobranca/retorno/cnab240/santander_spec.rb +0 -52
  66. data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +0 -52
  67. data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +0 -33
  68. data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +0 -37
  69. data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +0 -40
  70. data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +0 -42
  71. data/spec/brcobranca/retorno/cnab400/base_spec.rb +0 -57
  72. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +0 -59
  73. data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +0 -26
  74. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +0 -60
  75. data/spec/brcobranca/retorno/cnab400/santander_spec.rb +0 -40
  76. data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +0 -38
  77. data/spec/brcobranca/retorno/retorno_cbr643_spec.rb +0 -69
  78. data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +0 -58
  79. data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +0 -53
  80. data/spec/brcobranca/rghost_spec.rb +0 -29
  81. data/spec/brcobranca/util/empresa_spec.rb +0 -35
  82. 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 = { carteira: '18', codigo_servico: false }.merge!(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(value, tamanho)
314
- raise ValorInvalido, 'Deve ser um Float' unless /\./.match?(value.to_s)
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
-
2
+ require 'active_support/core_ext/object/blank'
3
3
  require 'parseline'
4
4
 
5
5
  module Brcobranca
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Brcobranca
4
- VERSION = '10.0.0'
4
+ VERSION = '10.1.0'
5
5
  end