brcobranca_sicredi_400 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +91 -0
  5. data/Rakefile +8 -0
  6. data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
  7. data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
  8. data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  9. data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
  13. data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  14. data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
  15. data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  16. data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
  17. data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  18. data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
  19. data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  20. data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
  21. data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  22. data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
  23. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
  24. data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
  25. data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
  26. data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
  27. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
  28. data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
  29. data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  30. data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
  31. data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
  32. data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
  33. data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
  34. data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
  35. data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
  36. data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
  37. data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  38. data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
  39. data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  40. data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
  41. data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
  42. data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  43. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  44. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  45. data/lib/brcobranca/boleto/ailos.rb +89 -0
  46. data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
  47. data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
  48. data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
  49. data/lib/brcobranca/boleto/banestes.rb +86 -0
  50. data/lib/brcobranca/boleto/banrisul.rb +95 -0
  51. data/lib/brcobranca/boleto/base.rb +256 -0
  52. data/lib/brcobranca/boleto/bradesco.rb +100 -0
  53. data/lib/brcobranca/boleto/caixa.rb +123 -0
  54. data/lib/brcobranca/boleto/citibank.rb +97 -0
  55. data/lib/brcobranca/boleto/credisis.rb +118 -0
  56. data/lib/brcobranca/boleto/hsbc.rb +96 -0
  57. data/lib/brcobranca/boleto/itau.rb +138 -0
  58. data/lib/brcobranca/boleto/safra.rb +152 -0
  59. data/lib/brcobranca/boleto/santander.rb +86 -0
  60. data/lib/brcobranca/boleto/sicoob.rb +120 -0
  61. data/lib/brcobranca/boleto/sicredi.rb +145 -0
  62. data/lib/brcobranca/boleto/template/base.rb +28 -0
  63. data/lib/brcobranca/boleto/template/rghost.rb +308 -0
  64. data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
  65. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
  66. data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
  67. data/lib/brcobranca/boleto/unicred.rb +99 -0
  68. data/lib/brcobranca/calculo.rb +120 -0
  69. data/lib/brcobranca/calculo_data.rb +63 -0
  70. data/lib/brcobranca/currency.rb +69 -0
  71. data/lib/brcobranca/formatacao.rb +104 -0
  72. data/lib/brcobranca/formatacao_string.rb +37 -0
  73. data/lib/brcobranca/limpeza.rb +20 -0
  74. data/lib/brcobranca/remessa/base.rb +72 -0
  75. data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
  76. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
  77. data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
  78. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
  79. data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
  80. data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
  81. data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
  82. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
  83. data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
  84. data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
  85. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  86. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
  87. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
  88. data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
  89. data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
  90. data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
  91. data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
  92. data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
  93. data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
  94. data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
  95. data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
  96. data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
  97. data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
  98. data/lib/brcobranca/remessa/pagamento.rb +320 -0
  99. data/lib/brcobranca/retorno/base.rb +11 -0
  100. data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
  101. data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
  102. data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
  103. data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
  104. data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
  105. data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
  106. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
  107. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
  108. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
  109. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  110. data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
  111. data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
  112. data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
  113. data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
  114. data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
  115. data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
  116. data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
  117. data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
  118. data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
  119. data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
  120. data/lib/brcobranca/util/date.rb +21 -0
  121. data/lib/brcobranca/util/empresa.rb +29 -0
  122. data/lib/brcobranca/util/errors.rb +76 -0
  123. data/lib/brcobranca/validations.rb +208 -0
  124. data/lib/brcobranca/version.rb +5 -0
  125. data/lib/brcobranca.rb +200 -0
  126. metadata +225 -0
@@ -0,0 +1,264 @@
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
+ # Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
31
+ #
32
+ # @return [Stream]
33
+ # @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
34
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
35
+ def to(formato, options = {})
36
+ modelo_generico(self, options.merge!(formato: formato))
37
+ end
38
+
39
+ # Gera o boleto em usando o formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
40
+ #
41
+ # @return [Stream]
42
+ # @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
43
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
44
+ def lote(boletos, options = {})
45
+ modelo_generico_multipage(boletos, options)
46
+ end
47
+
48
+ # Cria o métodos dinâmicos (to_pdf, to_gif e etc) com todos os fomátos válidos.
49
+ #
50
+ # @return [Stream]
51
+ # @see Rghost#modelo_generico Recebe os mesmos parâmetros do Rghost#modelo_generico.
52
+ # @example
53
+ # @boleto.to_pdf #=> boleto gerado no formato pdf
54
+ def method_missing(m, *args)
55
+ method = m.to_s
56
+ if method.start_with?('to_')
57
+ modelo_generico(self, (args.first || {}).merge!(formato: method[3..]))
58
+ else
59
+ super
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ # Retorna um stream pronto para gravação em arquivo.
66
+ #
67
+ # @return [Stream]
68
+ # @param [Boleto] Instância de uma classe de boleto.
69
+ # @param [Hash] options Opção para a criação do boleto.
70
+ # @option options [Symbol] :resolucao Resolução em pixels.
71
+ # @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
72
+ def modelo_generico(boleto, options = {})
73
+ doc = Document.new paper: [21, 29.7] # A4
74
+ template_path = File.join(File.dirname(__FILE__), '..', '..', 'arquivos', 'templates', 'modelo_generico2.eps')
75
+ raise 'Não foi possível encontrar o template. Verifique o caminho' unless File.exist?(template_path)
76
+
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
+
99
+ boletos.each_with_index do |boleto, index|
100
+ modelo_generico_template(doc, boleto, template_path)
101
+ modelo_recibo_beneficiario(doc, boleto)
102
+ modelo_generico_cabecalho(doc, boleto)
103
+ modelo_generico_rodape(doc, boleto)
104
+ # Cria nova página se não for o último boleto
105
+ doc.next_page unless index == boletos.length - 1
106
+ end
107
+ # Gerando stream
108
+ formato = options.delete(:formato) || Brcobranca.configuration.formato
109
+ resolucao = options.delete(:resolucao) || Brcobranca.configuration.resolucao
110
+ doc.render_stream(formato.to_sym, resolution: resolucao)
111
+ end
112
+
113
+ # Define o template a ser usado no boleto
114
+ def modelo_generico_template(doc, _boleto, template_path)
115
+ doc.define_template(:template, template_path, x: '0.732 cm', y: '3.48 cm')
116
+ doc.use_template :template
117
+
118
+ doc.define_tags do
119
+ tag :menor, name: 'LiberationMono', size: 8
120
+ tag :menor2, name: 'LiberationMono', size: 6
121
+ tag :menor_bold, name: 'Helvetica-Bold', size: 8
122
+ tag :medio, name: 'Helvetica-Bold', size: 12
123
+ tag :maior, name: 'Helvetica-Bold', size: 13.5
124
+ end
125
+ end
126
+
127
+ # Monta Recibo do Beneficiário
128
+ def modelo_recibo_beneficiario(doc, boleto)
129
+ monta_logotipo(doc, boleto, 14.500, 26.850, 1.00)
130
+ doc.moveto x: 4.28, y: 26.87
131
+ doc.show truncar(boleto.cedente, 90), tag: :menor
132
+ doc.moveto x: 4.28, y: 26.33
133
+ doc.show truncar(boleto.sacado, 90), tag: :menor
134
+ doc.moveto x: 4.28, y: 25.76
135
+ doc.show boleto.documento_numero, tag: :menor
136
+ doc.moveto x: 4.28, y: 25.20
137
+ doc.show boleto.nosso_numero_boleto, tag: :menor
138
+ doc.moveto x: 4.28, y: 24.63
139
+ doc.show boleto.data_vencimento.to_s_br, tag: :menor
140
+ doc.moveto x: 4.28, y: 24.070
141
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :menor
142
+ doc.moveto x: 4.28, y: 23.49
143
+ doc.show boleto.agencia_conta_boleto, tag: :menor
144
+ doc.moveto x: 4.28, y: 22.95
145
+ doc.show boleto.valor_documento.to_currency, tag: :menor
146
+ end
147
+
148
+ # Monta Recibo do Pagador boleto
149
+ def modelo_generico_cabecalho(doc, boleto)
150
+ monta_logotipo(doc, boleto, 0.782, 19.717, 0.85)
151
+ doc.moveto x: 4.813, y: 19.801
152
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :medio
153
+ doc.moveto x: 0.823, y: 20.942
154
+ doc.show boleto.codigo_barras.linha_digitavel, tag: :menor_bold
155
+ doc.moveto x: 1.121, y: 18.924
156
+ doc.show truncar(boleto.cedente, 47), tag: :menor
157
+ doc.moveto x: 9.9, y: 18.924
158
+ doc.show boleto.agencia_conta_boleto.tr(' ', ''), tag: :menor
159
+ doc.moveto x: 16.423, y: 18.924
160
+ doc.show boleto.nosso_numero_boleto, tag: :menor
161
+ doc.moveto x: 1.121, y: 17.984
162
+ doc.show boleto.documento_numero, tag: :menor
163
+ doc.moveto x: 14.139, y: 18.924
164
+ doc.show boleto.quantidade, tag: :menor
165
+ doc.moveto x: 7.0, y: 17.984
166
+ doc.show boleto.documento_cedente.formata_documento.to_s, tag: :menor
167
+ doc.moveto x: 10.602, y: 17.984
168
+ doc.show boleto.data_vencimento.to_s_br, tag: :menor
169
+ doc.text_area "<menor>#{boleto.valor_documento.to_currency}</menor>", width: 5.78, text_align: :right,
170
+ x: 14.12, y: 17.984, tag: :menor
171
+ doc.moveto x: 1.109, y: 17.089
172
+ doc.show truncar(boleto.sacado, 109), tag: :menor
173
+ end
174
+
175
+ # Monta o corpo e rodapé do layout do boleto
176
+ def modelo_generico_rodape(doc, boleto)
177
+ monta_logotipo(doc, boleto, 0.782, 13.9, 0.85)
178
+ doc.text_area "<menor_bold>#{boleto.data_vencimento&.to_s_br}</menor_bold>",
179
+ width: 5.786, text_align: :center, x: 14.47271, y: 13.11587
180
+ doc.text_area "<menor>#{boleto.agencia_conta_boleto}</menor>", width: 5.786, text_align: :center, x: 14.47271,
181
+ y: 12.26921
182
+ doc.text_area "<menor>#{boleto.nosso_numero_boleto}</menor>", width: 5.786, text_align: :center, x: 14.47271,
183
+ y: 11.42254
184
+ doc.text_area "<menor_bold>#{boleto.valor_documento.to_currency}</menor_bold>", width: 5.5, text_align: :right,
185
+ x: 14.47271, y: 10.56926
186
+ doc.moveto x: 4.813, y: 13.977
187
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :medio
188
+ doc.moveto x: 6.815, y: 13.990
189
+ doc.show boleto.codigo_barras.linha_digitavel, tag: :maior
190
+ doc.moveto x: 1.121, y: 13.2
191
+ doc.show boleto.local_pagamento, tag: :menor
192
+ doc.moveto x: 1.121, y: 12.295
193
+ doc.show truncar(boleto.cedente, 54), tag: :menor
194
+ doc.moveto x: 11.307, y: 12.295
195
+ doc.show boleto.documento_cedente.formata_documento.to_s, tag: :menor
196
+ doc.moveto x: 1.112, y: 11.42
197
+ doc.show boleto.data_documento&.to_s_br, tag: :menor
198
+ doc.moveto x: 4.268, y: 11.42
199
+ doc.show boleto.documento_numero, tag: :menor
200
+ doc.moveto x: 7.471, y: 11.42
201
+ doc.show boleto.especie_documento, tag: :menor
202
+ doc.moveto x: 9.588, y: 11.42
203
+ doc.show boleto.aceite, tag: :menor
204
+ doc.moveto x: 11.660, y: 11.42
205
+ doc.show boleto.data_processamento&.to_s_br, tag: :menor
206
+ doc.moveto x: 4.62056, y: 10.56058
207
+ if boleto.variacao
208
+ doc.show "#{boleto.carteira}-#{boleto.variacao}"
209
+ else
210
+ doc.show boleto.carteira
211
+ end
212
+ doc.moveto x: 7.26640, y: 10.56058
213
+ doc.show boleto.especie
214
+ monta_instrucoes(doc, boleto, 0.8, 9.8)
215
+ pagador = "<menor>#{truncar(boleto.sacado, 75)} - CPF/CNPJ: #{boleto.sacado_documento.formata_documento}</menor>"
216
+ pagador += "\n<menor>#{boleto.sacado_endereco}</menor>" if boleto.sacado_endereco
217
+ doc.text_area pagador, width: 18, text_align: :left, x: 2.04611, y: 5.8, row_height: '0.4 cm'
218
+ if boleto.avalista && boleto.avalista_documento
219
+ avalista = "#{truncar(boleto.avalista,
220
+ 46)} - CPF/CNPJ: #{boleto.avalista_documento.formata_documento}"
221
+ end
222
+ if avalista
223
+ doc.text_area "<menor2>#{avalista}</menor2>", width: 12.312, text_align: :left, x: 2.04611, y: 4.3,
224
+ row_height: '0.4 cm'
225
+ end
226
+ # Gerando codigo de barra com rghost_barcode
227
+ return unless boleto.codigo_barras
228
+
229
+ doc.barcode_interleaved2of5(boleto.codigo_barras, width: '10.3 cm', height: '1.3 cm', x: 1.06, y: 2.12)
230
+
231
+ # FIM Segunda parte do BOLETO
232
+ end
233
+
234
+ def truncar(string, limite)
235
+ string = "#{string[0...limite].upcase}..." if string.length > limite
236
+ string
237
+ end
238
+
239
+ def monta_instrucoes(doc, boleto, x, y)
240
+ lista_instrucoes = [
241
+ boleto.instrucoes,
242
+ boleto.instrucao1,
243
+ boleto.instrucao2,
244
+ boleto.instrucao3,
245
+ boleto.instrucao4,
246
+ boleto.instrucao5,
247
+ boleto.instrucao6
248
+ ].reject(&:blank?)
249
+ lista_instrucoes = lista_instrucoes.map { |i| "<menor>#{i}</menor>" }
250
+ texto_instrucoes = lista_instrucoes.join("\n")
251
+ doc.text_area texto_instrucoes, width: 13.547, text_align: :left, x: x, y: y, row_height: '0.4 cm'
252
+ end
253
+
254
+ def monta_logotipo(doc, boleto, x, y, scale)
255
+ doc.graphic do |g|
256
+ g.scale(scale, scale)
257
+ fator = 1 / scale
258
+ g.image boleto.logotipo, x: (x * fator), y: (y * fator)
259
+ end
260
+ end
261
+ end
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,286 @@
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.8, -0.75)
159
+ doc.show boleto.descontos_e_abatimentos&.to_currency
160
+
161
+ move_more(doc, 0.8, -0.55)
162
+ doc.show "#{boleto.sacado} - #{boleto.sacado_documento.formata_documento}"
163
+
164
+ move_more(doc, 0, -0.3)
165
+ doc.show boleto.sacado_endereco.to_s
166
+ return unless boleto.demonstrativo
167
+
168
+ doc.text_area boleto.demonstrativo, width: '18.5 cm', text_align: :left, x: "#{@x - 0.8} cm",
169
+ y: "#{@y - 0.9} cm", row_height: '0.4 cm'
170
+
171
+ # FIM Primeira parte do BOLETO
172
+ end
173
+
174
+ # Monta o corpo e rodapé do layout do boleto
175
+ def modelo_generico_rodape(doc, boleto)
176
+ # INICIO Segunda parte do BOLETO BB
177
+ # Pontos iniciais em x e y
178
+ @x = 0.50
179
+ @y = 12.22
180
+ # LOGOTIPO do BANCO
181
+ doc.image boleto.logotipo, x: "#{@x} cm", y: "#{@y} cm"
182
+
183
+ move_more(doc, 4.84, 0.01)
184
+ doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :maior
185
+
186
+ move_more(doc, 2, 0)
187
+ doc.show boleto.codigo_barras.linha_digitavel, tag: :grande
188
+
189
+ move_more(doc, -6.5, -0.9)
190
+ doc.show boleto.local_pagamento
191
+
192
+ move_more(doc, 15.8, 0)
193
+ doc.show boleto.data_vencimento.to_s_br if boleto.data_vencimento
194
+
195
+ move_more(doc, -15.8, -0.8)
196
+ if boleto.cedente_endereco
197
+ doc.show boleto.cedente_endereco
198
+ move_more(doc, 1.2, 0.3)
199
+ doc.show boleto.cedente
200
+ move_more(doc, -1.2, -0.3)
201
+ else
202
+ doc.show boleto.cedente
203
+ end
204
+
205
+ move_more(doc, 15.8, 0)
206
+ doc.show boleto.agencia_conta_boleto
207
+
208
+ move_more(doc, -15.8, -0.9)
209
+ doc.show boleto.data_documento.to_s_br if boleto.data_documento
210
+
211
+ move_more(doc, 3.5, 0)
212
+ doc.show boleto.documento_numero
213
+
214
+ move_more(doc, 5.8, 0)
215
+ doc.show boleto.especie_documento
216
+
217
+ move_more(doc, 1.7, 0)
218
+ doc.show boleto.aceite
219
+
220
+ move_more(doc, 1.3, 0)
221
+
222
+ doc.show boleto.data_processamento.to_s_br if boleto.data_processamento
223
+
224
+ move_more(doc, 3.5, 0)
225
+ doc.show boleto.nosso_numero_boleto
226
+
227
+ move_more(doc, -12.1, -0.8)
228
+ if boleto.variacao
229
+ doc.show "#{boleto.carteira}-#{boleto.variacao}"
230
+ else
231
+ doc.show boleto.carteira
232
+ end
233
+
234
+ move_more(doc, 2, 0)
235
+ doc.show boleto.especie
236
+
237
+ move_more(doc, 10.1, 0)
238
+ doc.show boleto.valor_documento.to_currency
239
+
240
+ move_more(doc, 0, -0.8)
241
+ doc.show boleto.descontos_e_abatimentos&.to_currency
242
+
243
+ move_more(doc, 0, 0.8)
244
+ if boleto.instrucoes
245
+ doc.text_area boleto.instrucoes, width: '14 cm',
246
+ text_align: :left, x: "#{@x -= 15.8} cm",
247
+ y: "#{@y -= 0.9} cm",
248
+ row_height: '0.4 cm'
249
+ move_more(doc, 0, -2)
250
+ else
251
+ move_more(doc, -15.8, -0.9)
252
+ doc.show boleto.instrucao1
253
+
254
+ move_more(doc, 0, -0.4)
255
+ doc.show boleto.instrucao2
256
+
257
+ move_more(doc, 0, -0.4)
258
+ doc.show boleto.instrucao3
259
+
260
+ move_more(doc, 0, -0.4)
261
+ doc.show boleto.instrucao4
262
+
263
+ move_more(doc, 0, -0.4)
264
+ doc.show boleto.instrucao5
265
+
266
+ move_more(doc, 0, -0.4)
267
+ doc.show boleto.instrucao6
268
+ end
269
+
270
+ move_more(doc, 0.5, -1.9)
271
+ if boleto.sacado && boleto.sacado_documento
272
+ sacado_info = "#{boleto.sacado} - CPF/CNPJ: #{boleto.sacado_documento.formata_documento}"
273
+ doc.show sacado_info
274
+ end
275
+
276
+ move_more(doc, 0, -0.4)
277
+ doc.show boleto.sacado_endereco.to_s
278
+
279
+ move_more(doc, 1.2, -0.93)
280
+ doc.show "#{boleto.avalista} - #{boleto.avalista_documento}" if boleto.avalista && boleto.avalista_documento
281
+ # FIM Segunda parte do BOLETO
282
+ end
283
+ end
284
+ end
285
+ end
286
+ end