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,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