bbrcobranca 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1 -0
  3. data/LICENSE +20 -0
  4. data/README.md +12 -0
  5. data/Rakefile +13 -0
  6. data/lib/bbrcobranca.rb +196 -0
  7. data/lib/bbrcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  8. data/lib/bbrcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  9. data/lib/bbrcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  10. data/lib/bbrcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  11. data/lib/bbrcobranca/arquivos/logos/banconordeste.eps +0 -0
  12. data/lib/bbrcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  13. data/lib/bbrcobranca/arquivos/logos/banestes.eps +5198 -0
  14. data/lib/bbrcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  15. data/lib/bbrcobranca/arquivos/logos/banrisul.eps +121 -0
  16. data/lib/bbrcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  17. data/lib/bbrcobranca/arquivos/logos/bradesco.eps +5210 -0
  18. data/lib/bbrcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  19. data/lib/bbrcobranca/arquivos/logos/caixa.eps +5111 -0
  20. data/lib/bbrcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  21. data/lib/bbrcobranca/arquivos/logos/cecred.eps +0 -0
  22. data/lib/bbrcobranca/arquivos/logos/cecred_carne.eps +0 -0
  23. data/lib/bbrcobranca/arquivos/logos/credisis.eps +0 -0
  24. data/lib/bbrcobranca/arquivos/logos/credisis_carne.eps +0 -0
  25. data/lib/bbrcobranca/arquivos/logos/hsbc.eps +5124 -0
  26. data/lib/bbrcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  27. data/lib/bbrcobranca/arquivos/logos/itau.eps +5318 -0
  28. data/lib/bbrcobranca/arquivos/logos/itau_carne.eps +5322 -0
  29. data/lib/bbrcobranca/arquivos/logos/santander.eps +5305 -0
  30. data/lib/bbrcobranca/arquivos/logos/santander_carne.eps +5313 -0
  31. data/lib/bbrcobranca/arquivos/logos/sicoob.eps +5375 -0
  32. data/lib/bbrcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  33. data/lib/bbrcobranca/arquivos/logos/sicredi.eps +5379 -0
  34. data/lib/bbrcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  35. data/lib/bbrcobranca/arquivos/logos/unicred.eps +0 -0
  36. data/lib/bbrcobranca/arquivos/logos/unicred_carne.eps +0 -0
  37. data/lib/bbrcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  38. data/lib/bbrcobranca/arquivos/templates/modelo_generico.eps +0 -0
  39. data/lib/bbrcobranca/boleto/banco_brasil.rb +157 -0
  40. data/lib/bbrcobranca/boleto/banco_brasilia.rb +102 -0
  41. data/lib/bbrcobranca/boleto/banco_nordeste.rb +79 -0
  42. data/lib/bbrcobranca/boleto/banestes.rb +85 -0
  43. data/lib/bbrcobranca/boleto/banrisul.rb +94 -0
  44. data/lib/bbrcobranca/boleto/base.rb +256 -0
  45. data/lib/bbrcobranca/boleto/bradesco.rb +99 -0
  46. data/lib/bbrcobranca/boleto/bradesco_grb.rb +85 -0
  47. data/lib/bbrcobranca/boleto/caixa.rb +121 -0
  48. data/lib/bbrcobranca/boleto/cecred.rb +86 -0
  49. data/lib/bbrcobranca/boleto/credisis.rb +116 -0
  50. data/lib/bbrcobranca/boleto/hsbc.rb +94 -0
  51. data/lib/bbrcobranca/boleto/itau.rb +138 -0
  52. data/lib/bbrcobranca/boleto/itau_adimplere.rb +159 -0
  53. data/lib/bbrcobranca/boleto/santander.rb +84 -0
  54. data/lib/bbrcobranca/boleto/santander_adimplere.rb +73 -0
  55. data/lib/bbrcobranca/boleto/sicoob.rb +119 -0
  56. data/lib/bbrcobranca/boleto/sicredi.rb +142 -0
  57. data/lib/bbrcobranca/boleto/template/base.rb +25 -0
  58. data/lib/bbrcobranca/boleto/template/rghost.rb +315 -0
  59. data/lib/bbrcobranca/boleto/template/rghost_carne.rb +317 -0
  60. data/lib/bbrcobranca/boleto/unicred.rb +141 -0
  61. data/lib/bbrcobranca/calculo.rb +115 -0
  62. data/lib/bbrcobranca/calculo_data.rb +62 -0
  63. data/lib/bbrcobranca/currency.rb +69 -0
  64. data/lib/bbrcobranca/formatacao.rb +103 -0
  65. data/lib/bbrcobranca/formatacao_string.rb +35 -0
  66. data/lib/bbrcobranca/limpeza.rb +20 -0
  67. data/lib/bbrcobranca/remessa/base.rb +76 -0
  68. data/lib/bbrcobranca/remessa/cnab240/banco_brasil.rb +246 -0
  69. data/lib/bbrcobranca/remessa/cnab240/base.rb +512 -0
  70. data/lib/bbrcobranca/remessa/cnab240/base_correspondente.rb +299 -0
  71. data/lib/bbrcobranca/remessa/cnab240/caixa.rb +163 -0
  72. data/lib/bbrcobranca/remessa/cnab240/cecred.rb +151 -0
  73. data/lib/bbrcobranca/remessa/cnab240/sicoob.rb +226 -0
  74. data/lib/bbrcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
  75. data/lib/bbrcobranca/remessa/cnab240/sicredi.rb +177 -0
  76. data/lib/bbrcobranca/remessa/cnab240/unicred.rb +9 -0
  77. data/lib/bbrcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  78. data/lib/bbrcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
  79. data/lib/bbrcobranca/remessa/cnab400/banco_nordeste.rb +160 -0
  80. data/lib/bbrcobranca/remessa/cnab400/banrisul.rb +155 -0
  81. data/lib/bbrcobranca/remessa/cnab400/base.rb +119 -0
  82. data/lib/bbrcobranca/remessa/cnab400/bradesco.rb +130 -0
  83. data/lib/bbrcobranca/remessa/cnab400/citibank.rb +138 -0
  84. data/lib/bbrcobranca/remessa/cnab400/credisis.rb +128 -0
  85. data/lib/bbrcobranca/remessa/cnab400/itau.rb +157 -0
  86. data/lib/bbrcobranca/remessa/cnab400/santander.rb +231 -0
  87. data/lib/bbrcobranca/remessa/cnab400/sicoob.rb +308 -0
  88. data/lib/bbrcobranca/remessa/cnab400/unicred.rb +143 -0
  89. data/lib/bbrcobranca/remessa/pagamento.rb +288 -0
  90. data/lib/bbrcobranca/retorno/base.rb +49 -0
  91. data/lib/bbrcobranca/retorno/cnab240/base.rb +42 -0
  92. data/lib/bbrcobranca/retorno/cnab240/caixa.rb +48 -0
  93. data/lib/bbrcobranca/retorno/cnab240/cecred.rb +102 -0
  94. data/lib/bbrcobranca/retorno/cnab240/santander.rb +95 -0
  95. data/lib/bbrcobranca/retorno/cnab240/sicoob.rb +99 -0
  96. data/lib/bbrcobranca/retorno/cnab240/sicredi.rb +79 -0
  97. data/lib/bbrcobranca/retorno/cnab400/banco_brasil.rb +127 -0
  98. data/lib/bbrcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
  99. data/lib/bbrcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
  100. data/lib/bbrcobranca/retorno/cnab400/banrisul.rb +42 -0
  101. data/lib/bbrcobranca/retorno/cnab400/base.rb +50 -0
  102. data/lib/bbrcobranca/retorno/cnab400/bradesco.rb +124 -0
  103. data/lib/bbrcobranca/retorno/cnab400/credisis.rb +115 -0
  104. data/lib/bbrcobranca/retorno/cnab400/itau.rb +143 -0
  105. data/lib/bbrcobranca/retorno/cnab400/santander.rb +57 -0
  106. data/lib/bbrcobranca/retorno/cnab400/unicred.rb +118 -0
  107. data/lib/bbrcobranca/retorno/retorno_cbr643.rb +49 -0
  108. data/lib/bbrcobranca/retorno/retorno_cnab240.rb +97 -0
  109. data/lib/bbrcobranca/retorno/retorno_cnab400.rb +70 -0
  110. data/lib/bbrcobranca/util/date.rb +20 -0
  111. data/lib/bbrcobranca/util/empresa.rb +28 -0
  112. data/lib/bbrcobranca/util/errors.rb +76 -0
  113. data/lib/bbrcobranca/validations.rb +232 -0
  114. data/lib/bbrcobranca/version.rb +6 -0
  115. data/spec/arquivos/CBR64310.RET +28 -0
  116. data/spec/arquivos/CNAB240.RET +74 -0
  117. data/spec/arquivos/CNAB240CECRED.RET +10 -0
  118. data/spec/arquivos/CNAB240SANTANDER.RET +8 -0
  119. data/spec/arquivos/CNAB240SICOOB.RET +10 -0
  120. data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
  121. data/spec/arquivos/CNAB400.RET +54 -0
  122. data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
  123. data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
  124. data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
  125. data/spec/arquivos/CNAB400BRADESCO.RET +8 -0
  126. data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
  127. data/spec/arquivos/CNAB400ITAU.RET +54 -0
  128. data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
  129. data/spec/arquivos/CNAB400UNICRED.RET +3 -0
  130. data/spec/bbrcobranca_spec.rb +34 -0
  131. data/spec/brcobranca/base_spec.rb +170 -0
  132. data/spec/brcobranca/boleto/banco_brasil_spec.rb +334 -0
  133. data/spec/brcobranca/boleto/banco_brasilia_spec.rb +152 -0
  134. data/spec/brcobranca/boleto/banco_nordeste_spec.rb +161 -0
  135. data/spec/brcobranca/boleto/banestes_spec.rb +194 -0
  136. data/spec/brcobranca/boleto/banrisul_spec.rb +182 -0
  137. data/spec/brcobranca/boleto/bradesco_spec.rb +211 -0
  138. data/spec/brcobranca/boleto/caixa_spec.rb +161 -0
  139. data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
  140. data/spec/brcobranca/boleto/credisis_spec.rb +159 -0
  141. data/spec/brcobranca/boleto/hsbc_spec.rb +172 -0
  142. data/spec/brcobranca/boleto/itau_spec.rb +262 -0
  143. data/spec/brcobranca/boleto/santander_spec.rb +143 -0
  144. data/spec/brcobranca/boleto/sicoob_spec.rb +193 -0
  145. data/spec/brcobranca/boleto/sicredi_spec.rb +190 -0
  146. data/spec/brcobranca/boleto/unicred_spec.rb +149 -0
  147. data/spec/brcobranca/boletos_em_lote_spec.rb +38 -0
  148. data/spec/brcobranca/calculo_data_spec.rb +33 -0
  149. data/spec/brcobranca/calculo_spec.rb +185 -0
  150. data/spec/brcobranca/currency_spec.rb +79 -0
  151. data/spec/brcobranca/formatacao_spec.rb +46 -0
  152. data/spec/brcobranca/formatacao_string_spec.rb +24 -0
  153. data/spec/brcobranca/limpeza_spec.rb +10 -0
  154. data/spec/brcobranca/remessa/base_spec.rb +67 -0
  155. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +217 -0
  156. data/spec/brcobranca/remessa/cnab240/base_spec.rb +91 -0
  157. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +163 -0
  158. data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
  159. data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
  160. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +198 -0
  161. data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
  162. data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
  163. data/spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb +187 -0
  164. data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
  165. data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +187 -0
  166. data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
  167. data/spec/brcobranca/remessa/cnab400/base_spec.rb +53 -0
  168. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +201 -0
  169. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +126 -0
  170. data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
  171. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +190 -0
  172. data/spec/brcobranca/remessa/cnab400/santander_spec.rb +152 -0
  173. data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +217 -0
  174. data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
  175. data/spec/brcobranca/remessa/pagamento_spec.rb +227 -0
  176. data/spec/brcobranca/retorno/cnab240/base_spec.rb +23 -0
  177. data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
  178. data/spec/brcobranca/retorno/cnab240/santander_spec.rb +50 -0
  179. data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +50 -0
  180. data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
  181. data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
  182. data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
  183. data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
  184. data/spec/brcobranca/retorno/cnab400/base_spec.rb +57 -0
  185. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +58 -0
  186. data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
  187. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +58 -0
  188. data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
  189. data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
  190. data/spec/brcobranca/retorno/retorno_cbr643_spec.rb +69 -0
  191. data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +57 -0
  192. data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +52 -0
  193. data/spec/brcobranca/rghost_spec.rb +29 -0
  194. data/spec/brcobranca/util/empresa_spec.rb +36 -0
  195. data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +3 -0
  196. data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
  197. data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +3 -0
  198. data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +7 -0
  199. data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +7 -0
  200. data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
  201. data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +3 -0
  202. data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +7 -0
  203. data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
  204. data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +3 -0
  205. data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
  206. data/spec/fixtures/remessa/remessa-itau-cnab400.rem +4 -0
  207. data/spec/fixtures/remessa/remessa-santander-cnab400.rem +3 -0
  208. data/spec/fixtures/remessa/remessa-sicoob-cnab400.rem +3 -0
  209. data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
  210. data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
  211. data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
  212. data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
  213. data/spec/spec.opts +8 -0
  214. data/spec/spec_helper.rb +38 -0
  215. data/spec/support/remessa_helpers.rb +13 -0
  216. data/spec/support/shared_examples/busca_logotipo.rb +15 -0
  217. data/spec/support/shared_examples/cnab240.rb +259 -0
  218. data/spec/support/shared_examples/cnab400.rb +180 -0
  219. data/spec/support/shared_examples/formatos_validos.rb +36 -0
  220. metadata +422 -0
@@ -0,0 +1,141 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ module Bbrcobranca
4
+ module Boleto
5
+ class Unicred < Base # Banco Unicred
6
+ # <b>REQUERIDO</b>: Código do posto da cooperativa de crédito
7
+ attr_accessor :posto
8
+
9
+ # <b>REQUERIDO</b>: Byte de identificação do cedente do bloqueto utilizado para compor o nosso número.
10
+ attr_accessor :byte_idt
11
+
12
+ validates_length_of :agencia, maximum: 4, message: 'deve ser menor ou igual a 4 dígitos.'
13
+ validates_length_of :nosso_numero, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.'
14
+ validates_length_of :conta_corrente, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.'
15
+ # Carteira
16
+ # 1 – Com Registro
17
+ # 3 – Sem Registro
18
+ # Obs.: O Unicred não validará este campo.
19
+ validates_length_of :carteira, maximum: 1, message: 'deve ser menor ou igual a 1 dígitos.'
20
+ validates_length_of :posto, maximum: 2, message: 'deve ser menor ou igual a 2 dígitos.'
21
+ validates_length_of :byte_idt, is: 1, message: 'deve ser 1 se o numero foi gerado pela agencia ou 2-9 se foi gerado pelo beneficiário'
22
+ validates_length_of :convenio, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.'
23
+
24
+ # Nova instancia do Unicred
25
+ # @param (see Bbrcobranca::Boleto::Base#initialize)
26
+ def initialize(campos = {})
27
+ campos = { carteira: '3',
28
+ especie_documento: 'DM',
29
+ local_pagamento: 'PAGÁVEL PREFERENCIALMENTE NAS AGÊNCIAS DA UNICRED'
30
+ }.merge!(campos)
31
+ super(campos)
32
+ end
33
+
34
+ # Codigo do banco emissor (3 dígitos sempre)
35
+ #
36
+ # @return [String] 3 caracteres numéricos.
37
+ def banco
38
+ '748'
39
+ end
40
+
41
+ # Carteira
42
+ #
43
+ # @return [String] 2 caracteres numéricos.
44
+ def carteira=(valor)
45
+ @carteira = valor.to_s.rjust(1, '0') if valor
46
+ end
47
+
48
+ # Posto
49
+ #
50
+ # @return [String] 2 caracteres numéricos.
51
+ def posto=(valor)
52
+ @posto = valor.to_s.rjust(2, '0') if valor
53
+ end
54
+
55
+ # Número da conta corrente
56
+ # @return [String] 5 caracteres numéricos.
57
+ def conta_corrente=(valor)
58
+ @conta_corrente = valor.to_s.rjust(5, '0') if valor
59
+ end
60
+
61
+ # Código Beneficiário
62
+ # @return [String] 5 caracteres numéricos.
63
+ def convenio=(valor)
64
+ @convenio = valor.to_s.rjust(5, '0') if valor
65
+ end
66
+
67
+ # Dígito verificador do banco
68
+ # @return [String] 1 caractere.
69
+ def banco_dv
70
+ 'X'
71
+ end
72
+
73
+ # Nosso número para exibir no boleto.
74
+ # O campo Nosso Número deve ser apresentado no formato AA/BXXXXX-D, onde:
75
+ # AA = Ano atual
76
+ # B = Byte que pode ser de 2 a 9. Somente será 1 se forem boletos pré-impressos.
77
+ # XXXXX = número sequencial
78
+ # D = dígito verificador calculado
79
+ # @return [String]
80
+ # @example
81
+ # boleto.nosso_numero_boleto #=> "14/200022-5"
82
+ def nosso_numero_boleto
83
+ "#{nosso_numero_with_byte_idt[0..1]}/#{nosso_numero_with_byte_idt[2..-1]}-#{nosso_numero_dv}"
84
+ end
85
+
86
+ def nosso_numero_codigo_barra
87
+ nosso_numero_boleto.gsub(/\D/, '')
88
+ end
89
+
90
+ def nosso_numero_with_byte_idt
91
+ "#{data_processamento.strftime('%y')}#{byte_idt}#{nosso_numero}"
92
+ end
93
+
94
+ # Número seqüencial utilizado para identificar o boleto.
95
+ # @return [String] 5 caracteres numéricos.
96
+ def nosso_numero=(valor)
97
+ @nosso_numero = valor.to_s.rjust(5, '0') if valor
98
+ end
99
+
100
+ # Dígito verificador do nosso número
101
+ # @return [Integer] 1 caracteres numéricos.
102
+ def nosso_numero_dv
103
+ "#{agencia_posto_conta}#{nosso_numero_with_byte_idt}"
104
+ .modulo11(mapeamento: mapeamento_para_modulo_11)
105
+ end
106
+
107
+ def agencia_conta_boleto
108
+ "#{agencia}.#{posto}.#{convenio}"
109
+ end
110
+
111
+ def agencia_posto_conta
112
+ "#{agencia}#{posto}#{convenio}"
113
+ end
114
+
115
+ # Segunda parte do código de barras.
116
+ # Posição Tamanho Conteúdo
117
+ # 20 – 20 01 Código numérico correspondente ao tipo de cobrança: “1” – Com Registro “3 – Sem Registro”. Obs.: O SICREDI não validará este campo.
118
+ # 21 – 21 01 Código numérico correspondente ao tipo de carteira: “1” - carteira simples
119
+ # 22 – 30 09 Nosso número
120
+ # 31 – 34 # 04 # Cooperativa de crédito/agência beneficiária
121
+ # 35 – 36 # 02 # Posto da cooperativa de crédito/agência beneficiária
122
+ # 37 – 41 # 05 # Código do beneficiário
123
+ # 42 – 42 # 01 # Será 1 (um) quando houver valor expresso no campo “valor do documento”
124
+ # 43 – 43 # 01 # Filler – zeros “0”
125
+ # 44 – 44 # 01 # DV do campo livre calculado por módulo 11 com aproveitamento total (resto igual a 0 ou 1 DV cai para 0)
126
+ def codigo_barras_segunda_parte
127
+ campo_livre = "#{carteira}1#{nosso_numero_codigo_barra}#{agencia_posto_conta}10"
128
+ campo_livre + campo_livre.modulo11(mapeamento: mapeamento_para_modulo_11).to_s
129
+ end
130
+
131
+ private
132
+
133
+ def mapeamento_para_modulo_11
134
+ {
135
+ 10 => 0,
136
+ 11 => 0
137
+ }
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,115 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # @author Kivanio Barbosa
4
+ module Bbrcobranca
5
+ # Métodos auxiliares de cálculos
6
+ module Calculo
7
+ # Calcula módulo 10 segundo a BACEN.
8
+ #
9
+ # @return [Integer]
10
+ # @raise [ArgumentError] Caso não seja um número inteiro.
11
+ def modulo10
12
+ raise ArgumentError, 'Número inválido' unless is_number?
13
+
14
+ total = 0
15
+ multiplicador = 2
16
+
17
+ to_s.split(//).reverse!.each do |caracter|
18
+ total += (caracter.to_i * multiplicador).soma_digitos
19
+ multiplicador = multiplicador == 2 ? 1 : 2
20
+ end
21
+
22
+ valor = (10 - (total % 10))
23
+ valor == 10 ? 0 : valor
24
+ end
25
+
26
+ # Calcula o módulo 11 segundo a BACEN
27
+ #
28
+ # @return [Integer]
29
+ # @raise [ArgumentError] Caso não seja um número inteiro.
30
+ # @param [Hash] options Opções para o cálculo do módulo
31
+ # @option options [Hash] :mapeamento Mapeamento do valor final. Ex: { 10 => "X" }. Padrão: {}
32
+ # @option options [Array] :multiplicador Números a serem utilizados na multiplicação da direita para a esquerda. Padrão: [9 até 2]
33
+ def modulo11(options = {}, &_block)
34
+ options[:mapeamento] ||= {}
35
+ options[:multiplicador] ||= [9, 8, 7, 6, 5, 4, 3, 2]
36
+
37
+ total = multiplicador(fatores: options[:multiplicador], reverse: options[:reverse])
38
+ valor = block_given? ? yield(total) : (total % 11)
39
+
40
+ options[:mapeamento][valor] || valor
41
+ end
42
+
43
+ # Verifica se String só contem caracteres numéricos.
44
+ #
45
+ # @return [Boolean]
46
+ def is_number?
47
+ to_s.empty? ? false : (to_s =~ /\D/).nil?
48
+ end
49
+
50
+ # Soma dígitos de números inteiros positivos com 2 dígitos ou mais.
51
+ #
52
+ # @return [Integer]
53
+ # @example
54
+ # 1 #=> 1
55
+ # 11 (-9 ) #=> 2
56
+ # 13 (-9 ) #=> 4
57
+ # 18 (-9 ) #=> 9
58
+ def soma_digitos
59
+ total = self.to_i
60
+ total = total - 9 if total > 9
61
+ total
62
+ end
63
+
64
+ # Faz a multiplicação de um número pelos fatores passados como parâmetro.
65
+ #
66
+ # @param [Array]
67
+ # @return [Integer]
68
+ # @raise [ArgumentError] Caso não seja um número inteiro.
69
+ def multiplicador(options = {}, &_block)
70
+ raise ArgumentError, 'Número inválido' unless is_number?
71
+ raise ArgumentError, 'Fatores não podem estar em branco' unless options[:fatores]
72
+
73
+ total = 0
74
+ multiplicador_posicao = 0
75
+ fatores = options[:fatores]
76
+ numeros = options[:reverse].nil? ? to_s.split(//).reverse! : to_s.split(//)
77
+
78
+ numeros.each do |caracter|
79
+ fator = fatores[multiplicador_posicao]
80
+ total += block_given? ? yield(caracter, fator) : (caracter.to_i * fator)
81
+ multiplicador_posicao = multiplicador_posicao < (fatores.size - 1) ? (multiplicador_posicao + 1) : 0
82
+ end
83
+ total
84
+ end
85
+
86
+ # Calcula duplo dígito com modulo 10 e 11
87
+ #
88
+ # @return [String]
89
+ # @raise [ArgumentError] Caso não seja um número inteiro.
90
+ def duplo_digito
91
+ raise ArgumentError, 'Número inválido' unless is_number?
92
+
93
+ digito_1 = modulo10
94
+ digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }
95
+
96
+ while digito_2 == 1
97
+ digito_1 = if digito_1 == 9
98
+ 0
99
+ else
100
+ digito_1 + 1
101
+ end
102
+
103
+ digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }
104
+ end
105
+
106
+ digito_2 = 11 - digito_2 if digito_2 != 0
107
+
108
+ "#{digito_1}#{digito_2}"
109
+ end
110
+ end
111
+ end
112
+
113
+ [String, Numeric].each do |klass|
114
+ klass.class_eval { include Bbrcobranca::Calculo }
115
+ end
@@ -0,0 +1,62 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # @author Kivanio Barbosa
4
+
5
+ require 'date'
6
+
7
+ module Bbrcobranca
8
+ # Métodos auxiliares de cálculos envolvendo Datas.
9
+ module CalculoData
10
+ # 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.
11
+ # A partir de 22.02.2025, o fator retorna para '1000' adicionando- se '1' a cada dia subsequente a este fator
12
+ # até que chegue a 9999 novamente onde deve ser usada nova data base começando de 1000.
13
+ #
14
+ # Somente serão considerados válidos para pagamento os boletos com 3.000 fatores de vencimento anteriores
15
+ # e 5.500 fatores futuros, ambos em relação a data atual.
16
+ # Boletos fora deste controle não serão considerados validos para pagamento na rede bancária.
17
+ # Ex. Hoje é 13/03/2014 (fator 6.001)
18
+ # Limite para emissão ou pagamento de boletos vencido: 24/12/2005 (fator 3.000)
19
+ # Limite para emissão ou pagamento de boletos à vencer: 03/04/2029 (fator 2.501)
20
+ #
21
+ # @return [String] Contendo 4 dígitos
22
+ # @example
23
+ # Date.parse(2000-07-04).fator_vencimento #=> 1001
24
+ def fator_vencimento
25
+ data_base = Date.parse '1997-10-07'
26
+ fator_vencimento = Integer(self - data_base)
27
+ while fator_vencimento > 9999
28
+ data_base = data_base + 10000
29
+ fator_vencimento = Integer(self - data_base) + 1000
30
+ end
31
+ fator_vencimento.to_s
32
+ end
33
+
34
+ # Mostra a data em formato <b>dia/mês/ano</b>
35
+ # @return [String]
36
+ # @example
37
+ # Date.current.to_s_br #=> 20/01/2010
38
+ def to_s_br
39
+ strftime('%d/%m/%Y')
40
+ end
41
+
42
+ # Calcula número de dias julianos.
43
+ #
44
+ # O cálculo é feito subtraindo-se a data atual, pelo último dia válido do ano anterior,
45
+ # acrescentando-se o último algarismo do ano atual na quarta posição.
46
+ #
47
+ # @return [String] contendo 4 dígitos
48
+ #
49
+ # @example
50
+ # Date.parse(2009-02-11).to_juliano #=> "0429"
51
+ def to_juliano
52
+ ultima_data = Date.parse("#{year - 1}-12-31")
53
+ ultimo_digito_ano = to_s[3..3]
54
+ dias = Integer(self - ultima_data)
55
+ (dias.to_s + ultimo_digito_ano).rjust(4, '0')
56
+ end
57
+ end
58
+ end
59
+
60
+ [Date].each do |klass|
61
+ klass.class_eval { include Bbrcobranca::CalculoData }
62
+ end
@@ -0,0 +1,69 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+
4
+ # @author Fernando Vieira do http://simplesideias.com.br
5
+ module Bbrcobranca #:nodoc:[all]
6
+ module Currency #:nodoc:[all]
7
+ # Implementação feita por Fernando Vieira do http://simplesideias.com.br
8
+ # post http://simplesideias.com.br/usando-number_to_currency-em-modelos-no-rails
9
+ BRL = { delimiter: '.', separator: ',', unit: 'R$', precision: 2, position: 'before' }.freeze
10
+ USD = { delimiter: ',', separator: '.', unit: 'US$', precision: 2, position: 'before' }.freeze
11
+ DEFAULT = BRL.merge(unit: '')
12
+
13
+ module String #:nodoc:[all]
14
+ def to_number(_options = {})
15
+ return tr(',', '.').to_f if numeric?
16
+ nil
17
+ end
18
+
19
+ def numeric?
20
+ self =~ /^(\+|-)?[0-9]+((\.|,)[0-9]+)?$/ ? true : false
21
+ end
22
+ end
23
+
24
+ module Number #:nodoc:[all]
25
+ def to_currency(options = {})
26
+ number = self
27
+ default = Bbrcobranca::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 > 0 ? 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
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
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 Bbrcobranca::Currency::Number }
65
+ end
66
+
67
+ [String].each do |klass|
68
+ klass.class_eval { include Bbrcobranca::Currency::String }
69
+ end
@@ -0,0 +1,103 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # @author Kivanio Barbosa
4
+ module Bbrcobranca
5
+ # Métodos auxiliares de formatação
6
+ module Formatacao
7
+ # Formata como CPF
8
+ #
9
+ # @return [String]
10
+ # @example
11
+ # "12345678901".to_br_cpf #=> 123.456.789-01
12
+ def to_br_cpf
13
+ somente_numeros.gsub(/^(.{3})(.{3})(.{3})(.{2})$/, '\1.\2.\3-\4')
14
+ end
15
+
16
+ # Formata como CEP
17
+ #
18
+ # @return [String]
19
+ # @example
20
+ # "85253100".to_br_cep #=> "85253-100"
21
+ # 85253100.to_br_cep #=> "85253-100"
22
+ def to_br_cep
23
+ somente_numeros.gsub(/^(.{5})(.{3})$/, '\1-\2')
24
+ end
25
+
26
+ # Formata como CNPJ
27
+ #
28
+ # @return [String]
29
+ # @example
30
+ # "12345678000901".to_br_cnpj #=> 12.345.678/0009-01
31
+ def to_br_cnpj
32
+ somente_numeros.gsub(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/, '\1.\2.\3/\4-\5')
33
+ end
34
+
35
+ # Gera formatação automática do documento baseado no tamanho do campo.
36
+ #
37
+ # @return [String] Retorna a mesma caso não encontre o formato adequado.
38
+ # @example
39
+ # "12345678000901".formata_documento #=> 12.345.678/0009-01
40
+ # "85253100".formata_documento #=> "85253-100"
41
+ # "12345678901".formata_documento #=> 123.456.789-01
42
+ # "12345".formata_documento #=> 12345
43
+ def formata_documento
44
+ case somente_numeros.size
45
+ when 8 then to_br_cep
46
+ when 11 then to_br_cpf
47
+ when 14 then to_br_cnpj
48
+ else
49
+ self
50
+ end
51
+ end
52
+
53
+ # Remove caracteres que não sejam numéricos.
54
+ #
55
+ # @return [String]
56
+ # @example
57
+ # 1a23e45+".somente_numeros #=> 12345
58
+ def somente_numeros
59
+ to_s.gsub(/\D/, '')
60
+ end
61
+
62
+ # Monta a linha digitável padrão para todos os bancos segundo a BACEN.
63
+ #
64
+ # A linha digitável será composta por cinco campos:<br/>
65
+ # <b>1º campo</b>: <br/>
66
+ # Composto pelo código de Banco, código da moeda, as cinco primeiras posições do campo livre
67
+ # e o dígito verificador deste campo.<br/>
68
+ # <b>2º campo</b>: <br/>
69
+ # Composto pelas posições 6ª a 15ª do campo livre e o dígito verificador deste campo.<br/>
70
+ # <b>3º campo</b>: <br/>
71
+ # Composto pelas posições 16ª a 25ª do campo livre e o dígito verificador deste campo.<br/>
72
+ # <b>4º campo</b>: <br/>
73
+ # Composto pelo dígito verificador do código de barras, ou seja, a 5ª posição do código de barras.<br/>
74
+ # <b>5º campo</b>: <br/>
75
+ # Composto pelo fator de vencimento com 4(quatro) caracteres e o valor do documento com
76
+ # 10(dez) caracteres, sem separadores e sem edição.<br/>
77
+ #
78
+ # @return [String]
79
+ # @raise [ArgumentError] Caso não seja um número de 44 dígitos.
80
+ # @example
81
+ # "00192376900000135000000001238798777770016818".linha_digitavel #=> "00190.00009 01238.798779 77700.168188 2 37690000013500"
82
+ def linha_digitavel
83
+ if self =~ /^(\d{4})(\d{1})(\d{14})(\d{5})(\d{10})(\d{10})$/
84
+ linha = Regexp.last_match[1]
85
+ linha << Regexp.last_match[4]
86
+ linha << linha.modulo10.to_s
87
+ linha << Regexp.last_match[5]
88
+ linha << Regexp.last_match[5].modulo10.to_s
89
+ linha << Regexp.last_match[6]
90
+ linha << Regexp.last_match[6].modulo10.to_s
91
+ linha << Regexp.last_match[2]
92
+ linha << Regexp.last_match[3]
93
+ linha.gsub(/^(.{5})(.{5})(.{5})(.{6})(.{5})(.{6})(.{1})(.{14})$/, '\1.\2 \3.\4 \5.\6 \7 \8')
94
+ else
95
+ raise ArgumentError, "#{self} Precisa conter 44 caracteres numéricos."
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ [String, Numeric].each do |klass|
102
+ klass.class_eval { include Bbrcobranca::Formatacao }
103
+ end