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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +8 -0
- data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
- data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
- data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
- data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
- data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
- data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
- data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
- data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
- data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
- data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
- data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
- data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
- data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
- data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
- data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
- data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
- data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
- data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
- data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
- data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
- data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
- data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
- data/lib/brcobranca/boleto/ailos.rb +89 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
- data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
- data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
- data/lib/brcobranca/boleto/banestes.rb +86 -0
- data/lib/brcobranca/boleto/banrisul.rb +95 -0
- data/lib/brcobranca/boleto/base.rb +256 -0
- data/lib/brcobranca/boleto/bradesco.rb +100 -0
- data/lib/brcobranca/boleto/caixa.rb +123 -0
- data/lib/brcobranca/boleto/citibank.rb +97 -0
- data/lib/brcobranca/boleto/credisis.rb +118 -0
- data/lib/brcobranca/boleto/hsbc.rb +96 -0
- data/lib/brcobranca/boleto/itau.rb +138 -0
- data/lib/brcobranca/boleto/safra.rb +152 -0
- data/lib/brcobranca/boleto/santander.rb +86 -0
- data/lib/brcobranca/boleto/sicoob.rb +120 -0
- data/lib/brcobranca/boleto/sicredi.rb +145 -0
- data/lib/brcobranca/boleto/template/base.rb +28 -0
- data/lib/brcobranca/boleto/template/rghost.rb +308 -0
- data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
- data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
- data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
- data/lib/brcobranca/boleto/unicred.rb +99 -0
- data/lib/brcobranca/calculo.rb +120 -0
- data/lib/brcobranca/calculo_data.rb +63 -0
- data/lib/brcobranca/currency.rb +69 -0
- data/lib/brcobranca/formatacao.rb +104 -0
- data/lib/brcobranca/formatacao_string.rb +37 -0
- data/lib/brcobranca/limpeza.rb +20 -0
- data/lib/brcobranca/remessa/base.rb +72 -0
- data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
- data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
- data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
- data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
- data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
- data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
- data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
- data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
- data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
- data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
- data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
- data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
- data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
- data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
- data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
- data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
- data/lib/brcobranca/remessa/pagamento.rb +320 -0
- data/lib/brcobranca/retorno/base.rb +11 -0
- data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
- data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
- data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
- data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
- data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
- data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
- data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
- data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
- data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
- data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
- data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
- data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
- data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
- data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
- data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
- data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
- data/lib/brcobranca/util/date.rb +21 -0
- data/lib/brcobranca/util/empresa.rb +29 -0
- data/lib/brcobranca/util/errors.rb +76 -0
- data/lib/brcobranca/validations.rb +208 -0
- data/lib/brcobranca/version.rb +5 -0
- data/lib/brcobranca.rb +200 -0
- metadata +225 -0
@@ -0,0 +1,319 @@
|
|
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 RghostCarne
|
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_carne Recebe os mesmos parâmetros do Rghost#modelo_carne.
|
34
|
+
def to_carne(formato, options = {})
|
35
|
+
modelo_carne(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_carne Recebe os mesmos parâmetros do Rghost#modelo_carne.
|
43
|
+
def lote_carne(boletos, options = {})
|
44
|
+
modelo_carne_multipage(boletos, options)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Cria o métodos dinâmicos (to_pdf, to_gif e etc) com todos os fomátos válidos.
|
48
|
+
#
|
49
|
+
# @return [Stream]
|
50
|
+
# @see Rghost#modelo_carne Recebe os mesmos parâmetros do Rghost#modelo_carne.
|
51
|
+
# @example
|
52
|
+
# @boleto.to_pdf #=> boleto gerado no formato pdf
|
53
|
+
def method_missing(m, *args)
|
54
|
+
method = m.to_s
|
55
|
+
if method.start_with?('to_')
|
56
|
+
modelo_carne(self, (args.first || {}).merge!(formato: method[3..]))
|
57
|
+
else
|
58
|
+
super
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Retorna um stream pronto para gravação em arquivo.
|
65
|
+
#
|
66
|
+
# @return [Stream]
|
67
|
+
# @param [Boleto] Instância de uma classe de boleto.
|
68
|
+
# @param [Hash] options Opção para a criação do boleto.
|
69
|
+
# @option options [Symbol] :resolucao Resolução em pixels.
|
70
|
+
# @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
71
|
+
def modelo_carne(boleto, options = {})
|
72
|
+
doc = Document.new paper: [21, 9]
|
73
|
+
|
74
|
+
colunas = calc_colunas 1
|
75
|
+
linhas = calc_linhas 0
|
76
|
+
|
77
|
+
modelo_carne_load_background(doc, 0)
|
78
|
+
|
79
|
+
modelo_carne_define_tags(doc)
|
80
|
+
|
81
|
+
modelo_carne_build_data_left(doc, boleto, colunas, linhas)
|
82
|
+
modelo_carne_build_data_right(doc, boleto, colunas, linhas)
|
83
|
+
|
84
|
+
# Gerando stream
|
85
|
+
formato = options.delete(:formato) || Brcobranca.configuration.formato
|
86
|
+
resolucao = options.delete(:resolucao) || Brcobranca.configuration.resolucao
|
87
|
+
doc.render_stream(formato.to_sym, resolution: resolucao)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Retorna um stream para multiplos boletos pronto para gravação em arquivo.
|
91
|
+
#
|
92
|
+
# @return [Stream]
|
93
|
+
# @param [Array] Instâncias de classes de boleto.
|
94
|
+
# @param [Hash] options Opção para a criação do boleto.
|
95
|
+
# @option options [Symbol] :resolucao Resolução em pixels.
|
96
|
+
# @option options [Symbol] :formato Formato desejado [:pdf, :jpg, :tif, :png, :ps, :laserjet, ... etc]
|
97
|
+
def modelo_carne_multipage(boletos, options = {})
|
98
|
+
doc = Document.new paper: :A4
|
99
|
+
|
100
|
+
max_per_page = 3
|
101
|
+
curr_page_position = 0
|
102
|
+
heigth_template = 9 # altura do template é de 9 cm
|
103
|
+
initial_margin_bottom = 1.4 # margin inicial abaixo
|
104
|
+
|
105
|
+
modelo_carne_define_tags(doc)
|
106
|
+
|
107
|
+
boletos.each_with_index do |boleto, index|
|
108
|
+
curr_page_position += 1
|
109
|
+
|
110
|
+
margin_bottom = initial_margin_bottom + (heigth_template * (max_per_page - curr_page_position)) # onde o boleto sera impresso na pagina A4
|
111
|
+
|
112
|
+
modelo_carne_load_background doc, margin_bottom
|
113
|
+
|
114
|
+
colunas = calc_colunas 1
|
115
|
+
linhas = calc_linhas margin_bottom
|
116
|
+
|
117
|
+
modelo_carne_build_data_left(doc, boleto, colunas, linhas)
|
118
|
+
modelo_carne_build_data_right(doc, boleto, colunas, linhas)
|
119
|
+
|
120
|
+
next unless curr_page_position >= max_per_page # maximo 3 boletos por pagina
|
121
|
+
|
122
|
+
# Cria nova página se não for o último boleto
|
123
|
+
doc.next_page unless index == boletos.length - 1
|
124
|
+
|
125
|
+
curr_page_position = 0 # reinicia contador por página
|
126
|
+
end
|
127
|
+
|
128
|
+
# Gerando stream
|
129
|
+
formato = options.delete(:formato) || Brcobranca.configuration.formato
|
130
|
+
resolucao = options.delete(:resolucao) || Brcobranca.configuration.resolucao
|
131
|
+
|
132
|
+
doc.render_stream(formato.to_sym, resolution: resolucao)
|
133
|
+
end
|
134
|
+
|
135
|
+
# carrega background do boleto
|
136
|
+
def modelo_carne_load_background(doc, margin_bottom)
|
137
|
+
template_path = File.join(File.dirname(__FILE__), '..', '..', 'arquivos', 'templates', 'modelo_carne.eps')
|
138
|
+
raise 'Não foi possível encontrar o template. Verifique o caminho' unless File.exist?(template_path)
|
139
|
+
|
140
|
+
doc.image template_path, x: 1, y: margin_bottom
|
141
|
+
end
|
142
|
+
|
143
|
+
# define os tamanhos
|
144
|
+
def modelo_carne_define_tags(doc)
|
145
|
+
doc.define_tags do
|
146
|
+
tag :grande, size: 13
|
147
|
+
tag :media, size: 10
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# define as colunas do documento, conforme margem lateral esquerda
|
152
|
+
def calc_colunas(margin_left)
|
153
|
+
colunas = [0.1, 3.4, 4.5, 7.1, 7.8, 8.5, 9.1, 9.7, 11, 12.4, 13.3, 15]
|
154
|
+
|
155
|
+
colunas.each_with_index do |v, i|
|
156
|
+
colunas[i] = v + margin_left
|
157
|
+
end
|
158
|
+
|
159
|
+
colunas
|
160
|
+
end
|
161
|
+
|
162
|
+
# define as linhas do documento conforme margem inferior
|
163
|
+
def calc_linhas(margin_bottom)
|
164
|
+
linhas = [8.2, 7.5, 6.92, 6.34, 5.74, 5.1, 4.7, 4.3, 3.9, 3.5, 3.1, 2.32, 1.92, 1.69, 0.1]
|
165
|
+
|
166
|
+
linhas.each_with_index do |v, i|
|
167
|
+
linhas[i] = v + margin_bottom
|
168
|
+
end
|
169
|
+
|
170
|
+
linhas
|
171
|
+
end
|
172
|
+
|
173
|
+
# aplica dados do lado esquerdo
|
174
|
+
def modelo_carne_build_data_left(doc, boleto, colunas, linhas)
|
175
|
+
# LOGOTIPO do BANCO
|
176
|
+
doc.image boleto.logotipo, x: (colunas[0] - 0.11), y: linhas[0]
|
177
|
+
|
178
|
+
# Dados
|
179
|
+
|
180
|
+
# Numero do banco
|
181
|
+
doc.moveto x: colunas[1], y: linhas[0]
|
182
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}"
|
183
|
+
|
184
|
+
# vencimento
|
185
|
+
doc.moveto x: colunas[0], y: linhas[1]
|
186
|
+
doc.show boleto.data_vencimento.to_s_br
|
187
|
+
|
188
|
+
# agencia/codigo cedente
|
189
|
+
doc.moveto x: colunas[0], y: linhas[2]
|
190
|
+
doc.show boleto.agencia_conta_boleto
|
191
|
+
|
192
|
+
# nosso numero
|
193
|
+
doc.moveto x: colunas[0], y: linhas[3]
|
194
|
+
doc.show boleto.nosso_numero_boleto
|
195
|
+
|
196
|
+
# valor do documento
|
197
|
+
doc.moveto x: colunas[0], y: linhas[4]
|
198
|
+
doc.show boleto.valor_documento.to_currency
|
199
|
+
|
200
|
+
# numero documento
|
201
|
+
doc.moveto x: colunas[0], y: linhas[11]
|
202
|
+
doc.show boleto.documento_numero
|
203
|
+
|
204
|
+
# sacado
|
205
|
+
doc.moveto x: colunas[0], y: linhas[13]
|
206
|
+
doc.show boleto.sacado.to_s
|
207
|
+
end
|
208
|
+
|
209
|
+
# aplica dados do lado direito
|
210
|
+
def modelo_carne_build_data_right(doc, boleto, colunas, linhas)
|
211
|
+
# LOGOTIPO do BANCO
|
212
|
+
doc.image boleto.logotipo, x: (colunas[2] - 0.11), y: linhas[0]
|
213
|
+
|
214
|
+
# Numero do banco
|
215
|
+
doc.moveto x: colunas[4], y: linhas[0]
|
216
|
+
doc.show "#{boleto.banco}-#{boleto.banco_dv}", tag: :grande
|
217
|
+
|
218
|
+
# linha digitavel
|
219
|
+
doc.moveto x: colunas[6], y: linhas[0]
|
220
|
+
doc.show boleto.codigo_barras.linha_digitavel, tag: :media
|
221
|
+
|
222
|
+
# local de pagamento
|
223
|
+
doc.moveto x: colunas[2], y: linhas[1]
|
224
|
+
doc.show boleto.local_pagamento
|
225
|
+
|
226
|
+
# vencimento
|
227
|
+
doc.moveto x: colunas[11], y: linhas[1]
|
228
|
+
doc.show boleto.data_vencimento.to_s_br
|
229
|
+
|
230
|
+
# cedente
|
231
|
+
doc.moveto x: colunas[2], y: linhas[2]
|
232
|
+
doc.show boleto.cedente
|
233
|
+
|
234
|
+
# agencia/codigo cedente
|
235
|
+
doc.moveto x: colunas[11], y: linhas[2]
|
236
|
+
doc.show boleto.agencia_conta_boleto
|
237
|
+
|
238
|
+
# data do documento
|
239
|
+
doc.moveto x: colunas[2], y: linhas[3]
|
240
|
+
doc.show boleto.data_documento.to_s_br if boleto.data_documento
|
241
|
+
|
242
|
+
# numero documento
|
243
|
+
doc.moveto x: colunas[3], y: linhas[3]
|
244
|
+
doc.show boleto.documento_numero
|
245
|
+
|
246
|
+
# especie doc.
|
247
|
+
doc.moveto x: colunas[8], y: linhas[3]
|
248
|
+
doc.show boleto.especie_documento
|
249
|
+
|
250
|
+
# aceite
|
251
|
+
doc.moveto x: colunas[9], y: linhas[3]
|
252
|
+
doc.show boleto.aceite
|
253
|
+
|
254
|
+
# dt processamento
|
255
|
+
doc.moveto x: colunas[10], y: linhas[3]
|
256
|
+
doc.show boleto.data_processamento.to_s_br if boleto.data_processamento
|
257
|
+
|
258
|
+
# nosso numero
|
259
|
+
doc.moveto x: colunas[11], y: linhas[3]
|
260
|
+
doc.show boleto.nosso_numero_boleto
|
261
|
+
|
262
|
+
# uso do banco
|
263
|
+
## nada...
|
264
|
+
|
265
|
+
# carteira
|
266
|
+
doc.moveto x: colunas[3], y: linhas[4]
|
267
|
+
doc.show boleto.carteira
|
268
|
+
|
269
|
+
# especie
|
270
|
+
doc.moveto x: colunas[5], y: linhas[4]
|
271
|
+
doc.show boleto.especie
|
272
|
+
|
273
|
+
# quantidade
|
274
|
+
doc.moveto x: colunas[7], y: linhas[4]
|
275
|
+
doc.show boleto.quantidade
|
276
|
+
|
277
|
+
# valor documento
|
278
|
+
doc.moveto x: colunas[8], y: linhas[4]
|
279
|
+
doc.show boleto.valor_documento.to_currency
|
280
|
+
|
281
|
+
# valor do documento
|
282
|
+
doc.moveto x: colunas[11], y: linhas[4]
|
283
|
+
doc.show boleto.valor_documento.to_currency
|
284
|
+
|
285
|
+
# Instruções
|
286
|
+
doc.moveto x: colunas[2], y: linhas[5]
|
287
|
+
doc.show boleto.instrucao1
|
288
|
+
doc.moveto x: colunas[2], y: linhas[6]
|
289
|
+
doc.show boleto.instrucao2
|
290
|
+
doc.moveto x: colunas[2], y: linhas[7]
|
291
|
+
doc.show boleto.instrucao3
|
292
|
+
doc.moveto x: colunas[2], y: linhas[8]
|
293
|
+
doc.show boleto.instrucao4
|
294
|
+
doc.moveto x: colunas[2], y: linhas[9]
|
295
|
+
doc.show boleto.instrucao5
|
296
|
+
doc.moveto x: colunas[2], y: linhas[10]
|
297
|
+
doc.show boleto.instrucao6
|
298
|
+
|
299
|
+
# Sacado
|
300
|
+
doc.moveto x: colunas[2], y: linhas[11]
|
301
|
+
if boleto.sacado && boleto.sacado_documento
|
302
|
+
doc.show "#{boleto.sacado} - #{boleto.sacado_documento.formata_documento}"
|
303
|
+
end
|
304
|
+
|
305
|
+
# Sacado endereço
|
306
|
+
doc.moveto x: colunas[2], y: linhas[12]
|
307
|
+
doc.show boleto.sacado_endereco.to_s
|
308
|
+
|
309
|
+
# codigo de barras
|
310
|
+
# Gerando codigo de barra com rghost_barcode
|
311
|
+
return unless boleto.codigo_barras
|
312
|
+
|
313
|
+
doc.barcode_interleaved2of5(boleto.codigo_barras, width: '10.3 cm', height: '1.2 cm', x: colunas[2],
|
314
|
+
y: linhas[14])
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Boleto
|
5
|
+
# Banco Unicred
|
6
|
+
class Unicred < Base
|
7
|
+
attr_accessor :conta_corrente_dv
|
8
|
+
|
9
|
+
validates_length_of :agencia, maximum: 4, message:
|
10
|
+
'deve ser menor ou igual a 4 dígitos.'
|
11
|
+
validates_length_of :nosso_numero, maximum: 10, message:
|
12
|
+
'deve ser menor ou igual a 10 dígitos.'
|
13
|
+
validates_length_of :conta_corrente, maximum: 9, message:
|
14
|
+
'deve ser menor ou igual a 9 dígitos.'
|
15
|
+
# Carteira com 2(dois) caracteres ( SEMPRE 21 )
|
16
|
+
validates_length_of :carteira, maximum: 2, message:
|
17
|
+
'deve ser menor ou igual a 2 dígitos.'
|
18
|
+
validates_length_of :conta_corrente_dv, maximum: 1, message:
|
19
|
+
'deve ser menor ou igual a 1 dígitos.'
|
20
|
+
|
21
|
+
# Nova instancia do Unicred
|
22
|
+
# @param (see Brcobranca::Boleto::Base#initialize)
|
23
|
+
def initialize(campos = {})
|
24
|
+
campos = {
|
25
|
+
carteira: '21',
|
26
|
+
local_pagamento: 'PAGÁVEL PREFERENCIALMENTE NAS AGÊNCIAS DA UNICRED',
|
27
|
+
aceite: 'N'
|
28
|
+
}.merge!(campos)
|
29
|
+
super(campos)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Codigo do banco emissor 3 digitos sempre
|
33
|
+
#
|
34
|
+
# @return [String] 3 caracteres numericos.
|
35
|
+
def banco
|
36
|
+
'136'
|
37
|
+
end
|
38
|
+
|
39
|
+
# Agência do cliente junto ao banco.
|
40
|
+
# @return [String] 4 caracteres numéricos.
|
41
|
+
def agencia=(valor)
|
42
|
+
@agencia = valor.to_s.rjust(4, '0') if valor
|
43
|
+
end
|
44
|
+
|
45
|
+
# Conta corrente
|
46
|
+
# @return [String] 9 caracteres numéricos.
|
47
|
+
def conta_corrente=(valor)
|
48
|
+
@conta_corrente = valor.to_s.rjust(9, '0') if valor
|
49
|
+
end
|
50
|
+
|
51
|
+
# Número seqüencial utilizado para identificar o boleto.
|
52
|
+
# @return [String] 10 caracteres numéricos.
|
53
|
+
def nosso_numero=(valor)
|
54
|
+
@nosso_numero = valor.to_s.rjust(10, '0') if valor
|
55
|
+
end
|
56
|
+
|
57
|
+
# Dígito verificador do nosso número.
|
58
|
+
#
|
59
|
+
# @return [String] 1 caracteres numéricos.
|
60
|
+
def nosso_numero_dv
|
61
|
+
nosso_numero.to_s.modulo11(mapeamento: {
|
62
|
+
10 => 0,
|
63
|
+
11 => 0
|
64
|
+
})
|
65
|
+
end
|
66
|
+
|
67
|
+
# Nosso número para exibir no boleto.
|
68
|
+
# @return [String]
|
69
|
+
# @example
|
70
|
+
# boleto.nosso_numero_boleto #=> "12345678-4"
|
71
|
+
def nosso_numero_boleto
|
72
|
+
"#{nosso_numero}-#{nosso_numero_dv}"
|
73
|
+
end
|
74
|
+
|
75
|
+
# Agência + conta corrente do cliente para exibir no boleto.
|
76
|
+
# @return [String]
|
77
|
+
# @example
|
78
|
+
# boleto.agencia_conta_boleto #=> "08111 / 536788-8"
|
79
|
+
def agencia_conta_boleto
|
80
|
+
"#{agencia} / #{conta_corrente}-#{conta_corrente_dv}"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Segunda parte do código de barras.
|
84
|
+
# Posição | Tamanho | Picture | Conteúdo
|
85
|
+
# 01-03 | 3 | 9(3) | Identificação da instituição financeira - 136
|
86
|
+
# 04-04 | 1 | 9 | Código moeda (9 – Real)
|
87
|
+
# 05-05 | 1 | 9 | Dígito verificador do código de barras (DV)
|
88
|
+
# 06-19 | 14 | 9(4) | Posições 06 a 09 – fator de vencimento
|
89
|
+
# | | 9(8)v99 | Posições 10 a 19 – valor nominal do título
|
90
|
+
# 20-23 | 4 | 4 | Agência BENEFICIÁRIO (Sem o dígito verificador)
|
91
|
+
# 24-33 | 10 | 10 | Conta do BENEFICIÁRIO (Com o dígito verificador)
|
92
|
+
# 34–44 | 11 | 11 | Nosso Número (Com o dígito verificador)
|
93
|
+
# @return [String] 25 caracteres numéricos.
|
94
|
+
def codigo_barras_segunda_parte
|
95
|
+
"#{agencia}#{conta_corrente}#{conta_corrente_dv}#{nosso_numero}#{nosso_numero_dv}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author Kivanio Barbosa
|
5
|
+
module Brcobranca
|
6
|
+
# Métodos auxiliares de cálculos
|
7
|
+
module Calculo
|
8
|
+
# Calcula módulo 10 segundo a BACEN.
|
9
|
+
#
|
10
|
+
# @return [Integer]
|
11
|
+
# @raise [ArgumentError] Caso não seja um número inteiro.
|
12
|
+
def modulo10
|
13
|
+
raise ArgumentError, 'Número inválido' unless is_number?
|
14
|
+
|
15
|
+
total = 0
|
16
|
+
multiplicador = 2
|
17
|
+
|
18
|
+
to_s.chars.reverse!.each do |caracter|
|
19
|
+
total += (caracter.to_i * multiplicador).soma_digitos
|
20
|
+
multiplicador = multiplicador == 2 ? 1 : 2
|
21
|
+
end
|
22
|
+
|
23
|
+
valor = (10 - (total % 10))
|
24
|
+
valor == 10 ? 0 : valor
|
25
|
+
end
|
26
|
+
|
27
|
+
# Calcula o módulo 11 segundo a BACEN
|
28
|
+
#
|
29
|
+
# @return [Integer]
|
30
|
+
# @raise [ArgumentError] Caso não seja um número inteiro.
|
31
|
+
# @param [Hash] options Opções para o cálculo do módulo
|
32
|
+
# @option options [Hash] :mapeamento Mapeamento do valor final. Ex: { 10 => "X" }. Padrão: {}
|
33
|
+
# @option options [Array] :multiplicador Números a serem utilizados na multiplicação da direita para a esquerda. Padrão: [9 até 2]
|
34
|
+
def modulo11(options = {}, &_block)
|
35
|
+
options[:mapeamento] ||= {}
|
36
|
+
options[:multiplicador] ||= [9, 8, 7, 6, 5, 4, 3, 2]
|
37
|
+
|
38
|
+
total = multiplicador(fatores: options[:multiplicador], reverse: options[:reverse])
|
39
|
+
valor = _block ? yield(total) : (total % 11)
|
40
|
+
|
41
|
+
options[:mapeamento][valor] || valor
|
42
|
+
end
|
43
|
+
|
44
|
+
# Verifica se String só contem caracteres numéricos.
|
45
|
+
#
|
46
|
+
# @return [Boolean]
|
47
|
+
def is_number?
|
48
|
+
to_s.empty? ? false : (to_s =~ /\D/).nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
# Soma dígitos de números inteiros positivos com 2 dígitos ou mais.
|
52
|
+
#
|
53
|
+
# @return [Integer]
|
54
|
+
# @example
|
55
|
+
# 1 #=> 1
|
56
|
+
# 11 (-9 ) #=> 2
|
57
|
+
# 13 (-9 ) #=> 4
|
58
|
+
# 18 (-9 ) #=> 9
|
59
|
+
def soma_digitos
|
60
|
+
total = to_i
|
61
|
+
total -= 9 if total > 9
|
62
|
+
total
|
63
|
+
end
|
64
|
+
|
65
|
+
# Faz a multiplicação de um número pelos fatores passados como parâmetro.
|
66
|
+
#
|
67
|
+
# @param [Array]
|
68
|
+
# @return [Integer]
|
69
|
+
# @raise [ArgumentError] Caso não seja um número inteiro.
|
70
|
+
def multiplicador(options = {}, &_block)
|
71
|
+
raise ArgumentError, 'Número inválido' unless is_number?
|
72
|
+
raise ArgumentError, 'Fatores não podem estar em branco' unless options[:fatores]
|
73
|
+
|
74
|
+
total = 0
|
75
|
+
multiplicador_posicao = 0
|
76
|
+
fatores = options[:fatores]
|
77
|
+
numeros = options[:reverse].nil? ? to_s.chars.reverse! : to_s.chars
|
78
|
+
|
79
|
+
numeros.each do |caracter|
|
80
|
+
fator = fatores[multiplicador_posicao]
|
81
|
+
total += _block ? yield(caracter, fator) : (caracter.to_i * fator)
|
82
|
+
multiplicador_posicao = multiplicador_posicao < (fatores.size - 1) ? (multiplicador_posicao + 1) : 0
|
83
|
+
end
|
84
|
+
total
|
85
|
+
end
|
86
|
+
|
87
|
+
# Calcula duplo dígito com modulo 10 e 11
|
88
|
+
#
|
89
|
+
# @return [String]
|
90
|
+
# @raise [ArgumentError] Caso não seja um número inteiro.
|
91
|
+
def duplo_digito
|
92
|
+
raise ArgumentError, 'Número inválido' unless is_number?
|
93
|
+
|
94
|
+
digito_1 = modulo10
|
95
|
+
digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) do |total|
|
96
|
+
(total < 11 ? total : total % 11)
|
97
|
+
end
|
98
|
+
|
99
|
+
while digito_2 == 1
|
100
|
+
digito_1 = if digito_1 == 9
|
101
|
+
0
|
102
|
+
else
|
103
|
+
digito_1 + 1
|
104
|
+
end
|
105
|
+
|
106
|
+
digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) do |total|
|
107
|
+
(total < 11 ? total : total % 11)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
digito_2 = 11 - digito_2 if digito_2 != 0
|
112
|
+
|
113
|
+
"#{digito_1}#{digito_2}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
[String, Numeric].each do |klass|
|
119
|
+
klass.class_eval { include Brcobranca::Calculo }
|
120
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author Kivanio Barbosa
|
5
|
+
|
6
|
+
require 'date'
|
7
|
+
|
8
|
+
module Brcobranca
|
9
|
+
# Métodos auxiliares de cálculos envolvendo Datas.
|
10
|
+
module CalculoData
|
11
|
+
# Calcula o número de dias corridos entre a <b>data base ("Fixada" em 07.10.1997)</b> e a <b>data de vencimento</b> desejada.
|
12
|
+
# A partir de 22.02.2025, o fator retorna para '1000' adicionando- se '1' a cada dia subsequente a este fator
|
13
|
+
# até que chegue a 9999 novamente onde deve ser usada nova data base começando de 1000.
|
14
|
+
#
|
15
|
+
# Somente serão considerados válidos para pagamento os boletos com 3.000 fatores de vencimento anteriores
|
16
|
+
# e 5.500 fatores futuros, ambos em relação a data atual.
|
17
|
+
# Boletos fora deste controle não serão considerados validos para pagamento na rede bancária.
|
18
|
+
# Ex. Hoje é 13/03/2014 (fator 6.001)
|
19
|
+
# Limite para emissão ou pagamento de boletos vencido: 24/12/2005 (fator 3.000)
|
20
|
+
# Limite para emissão ou pagamento de boletos à vencer: 03/04/2029 (fator 2.501)
|
21
|
+
#
|
22
|
+
# @return [String] Contendo 4 dígitos
|
23
|
+
# @example
|
24
|
+
# Date.parse(2000-07-04).fator_vencimento #=> 1001
|
25
|
+
def fator_vencimento
|
26
|
+
data_base = Date.parse '1997-10-07'
|
27
|
+
fator_vencimento = Integer(self - data_base)
|
28
|
+
while fator_vencimento > 9999
|
29
|
+
data_base += 10_000
|
30
|
+
fator_vencimento = Integer(self - data_base) + 1000
|
31
|
+
end
|
32
|
+
fator_vencimento.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
# Mostra a data em formato <b>dia/mês/ano</b>
|
36
|
+
# @return [String]
|
37
|
+
# @example
|
38
|
+
# Date.current.to_s_br #=> 20/01/2010
|
39
|
+
def to_s_br
|
40
|
+
strftime('%d/%m/%Y')
|
41
|
+
end
|
42
|
+
|
43
|
+
# Calcula número de dias julianos.
|
44
|
+
#
|
45
|
+
# O cálculo é feito subtraindo-se a data atual, pelo último dia válido do ano anterior,
|
46
|
+
# acrescentando-se o último algarismo do ano atual na quarta posição.
|
47
|
+
#
|
48
|
+
# @return [String] contendo 4 dígitos
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# Date.parse(2009-02-11).to_juliano #=> "0429"
|
52
|
+
def to_juliano
|
53
|
+
ultima_data = Date.parse("#{year - 1}-12-31")
|
54
|
+
ultimo_digito_ano = to_s[3..3]
|
55
|
+
dias = Integer(self - ultima_data)
|
56
|
+
(dias.to_s + ultimo_digito_ano).rjust(4, '0')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
[Date].each do |klass|
|
62
|
+
klass.class_eval { include Brcobranca::CalculoData }
|
63
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @author Fernando Vieira do http://simplesideias.com.br
|
4
|
+
module Brcobranca # :nodoc:[all]
|
5
|
+
module Currency # :nodoc:[all]
|
6
|
+
# Implementação feita por Fernando Vieira do http://simplesideias.com.br
|
7
|
+
# post http://simplesideias.com.br/usando-number_to_currency-em-modelos-no-rails
|
8
|
+
BRL = { delimiter: '.', separator: ',', unit: 'R$', precision: 2, position: 'before' }.freeze
|
9
|
+
USD = { delimiter: ',', separator: '.', unit: 'US$', precision: 2, position: 'before' }.freeze
|
10
|
+
DEFAULT = BRL.merge(unit: '')
|
11
|
+
|
12
|
+
module String # :nodoc:[all]
|
13
|
+
def to_number(_options = {})
|
14
|
+
return tr(',', '.').to_f if numeric?
|
15
|
+
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def numeric?
|
20
|
+
/^(\+|-)?[0-9]+((\.|,)[0-9]+)?$/.match?(self)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module Number # :nodoc:[all]
|
25
|
+
def to_currency(options = {})
|
26
|
+
number = self
|
27
|
+
default = Brcobranca::Currency::DEFAULT
|
28
|
+
options = default.merge(options)
|
29
|
+
precision = options[:precision] || default[:precision]
|
30
|
+
unit = options[:unit] || default[:unit]
|
31
|
+
position = options[:position] || default[:position]
|
32
|
+
separator = precision.positive? ? options[:separator] || default[:separator] : ''
|
33
|
+
delimiter = options[:delimiter] || default[:delimiter]
|
34
|
+
|
35
|
+
begin
|
36
|
+
parts = number.with_precision(precision).split('.')
|
37
|
+
number = parts[0].to_i.with_delimiter(delimiter) + separator + parts[1].to_s
|
38
|
+
position == 'before' ? unit + number : number + unit
|
39
|
+
rescue StandardError
|
40
|
+
number
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def with_delimiter(delimiter = ',', separator = '.')
|
45
|
+
number = self
|
46
|
+
begin
|
47
|
+
parts = number.to_s.split(separator)
|
48
|
+
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
49
|
+
parts.join separator
|
50
|
+
rescue StandardError
|
51
|
+
self
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def with_precision(precision = 3)
|
56
|
+
number = self
|
57
|
+
"%01.#{precision}f" % number
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
[Numeric, String].each do |klass|
|
64
|
+
klass.class_eval { include Brcobranca::Currency::Number }
|
65
|
+
end
|
66
|
+
|
67
|
+
[String].each do |klass|
|
68
|
+
klass.class_eval { include Brcobranca::Currency::String }
|
69
|
+
end
|