bbrcobranca 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1 -0
- data/LICENSE +20 -0
- data/README.md +12 -0
- data/Rakefile +13 -0
- data/lib/bbrcobranca.rb +196 -0
- data/lib/bbrcobranca/arquivos/logos/bancobrasil.eps +5402 -0
- data/lib/bbrcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
- data/lib/bbrcobranca/arquivos/logos/bancobrasilia.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/banconordeste.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/banestes.eps +5198 -0
- data/lib/bbrcobranca/arquivos/logos/banestes_carne.eps +5206 -0
- data/lib/bbrcobranca/arquivos/logos/banrisul.eps +121 -0
- data/lib/bbrcobranca/arquivos/logos/banrisul_carne.eps +121 -0
- data/lib/bbrcobranca/arquivos/logos/bradesco.eps +5210 -0
- data/lib/bbrcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
- data/lib/bbrcobranca/arquivos/logos/caixa.eps +5111 -0
- data/lib/bbrcobranca/arquivos/logos/caixa_carne.eps +5115 -0
- data/lib/bbrcobranca/arquivos/logos/cecred.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/cecred_carne.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/credisis.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/credisis_carne.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/hsbc.eps +5124 -0
- data/lib/bbrcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
- data/lib/bbrcobranca/arquivos/logos/itau.eps +5318 -0
- data/lib/bbrcobranca/arquivos/logos/itau_carne.eps +5322 -0
- data/lib/bbrcobranca/arquivos/logos/santander.eps +5305 -0
- data/lib/bbrcobranca/arquivos/logos/santander_carne.eps +5313 -0
- data/lib/bbrcobranca/arquivos/logos/sicoob.eps +5375 -0
- data/lib/bbrcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
- data/lib/bbrcobranca/arquivos/logos/sicredi.eps +5379 -0
- data/lib/bbrcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
- data/lib/bbrcobranca/arquivos/logos/unicred.eps +0 -0
- data/lib/bbrcobranca/arquivos/logos/unicred_carne.eps +0 -0
- data/lib/bbrcobranca/arquivos/templates/modelo_carne.eps +1112 -0
- data/lib/bbrcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/bbrcobranca/boleto/banco_brasil.rb +157 -0
- data/lib/bbrcobranca/boleto/banco_brasilia.rb +102 -0
- data/lib/bbrcobranca/boleto/banco_nordeste.rb +79 -0
- data/lib/bbrcobranca/boleto/banestes.rb +85 -0
- data/lib/bbrcobranca/boleto/banrisul.rb +94 -0
- data/lib/bbrcobranca/boleto/base.rb +256 -0
- data/lib/bbrcobranca/boleto/bradesco.rb +99 -0
- data/lib/bbrcobranca/boleto/bradesco_grb.rb +85 -0
- data/lib/bbrcobranca/boleto/caixa.rb +121 -0
- data/lib/bbrcobranca/boleto/cecred.rb +86 -0
- data/lib/bbrcobranca/boleto/credisis.rb +116 -0
- data/lib/bbrcobranca/boleto/hsbc.rb +94 -0
- data/lib/bbrcobranca/boleto/itau.rb +138 -0
- data/lib/bbrcobranca/boleto/itau_adimplere.rb +159 -0
- data/lib/bbrcobranca/boleto/santander.rb +84 -0
- data/lib/bbrcobranca/boleto/santander_adimplere.rb +73 -0
- data/lib/bbrcobranca/boleto/sicoob.rb +119 -0
- data/lib/bbrcobranca/boleto/sicredi.rb +142 -0
- data/lib/bbrcobranca/boleto/template/base.rb +25 -0
- data/lib/bbrcobranca/boleto/template/rghost.rb +315 -0
- data/lib/bbrcobranca/boleto/template/rghost_carne.rb +317 -0
- data/lib/bbrcobranca/boleto/unicred.rb +141 -0
- data/lib/bbrcobranca/calculo.rb +115 -0
- data/lib/bbrcobranca/calculo_data.rb +62 -0
- data/lib/bbrcobranca/currency.rb +69 -0
- data/lib/bbrcobranca/formatacao.rb +103 -0
- data/lib/bbrcobranca/formatacao_string.rb +35 -0
- data/lib/bbrcobranca/limpeza.rb +20 -0
- data/lib/bbrcobranca/remessa/base.rb +76 -0
- data/lib/bbrcobranca/remessa/cnab240/banco_brasil.rb +246 -0
- data/lib/bbrcobranca/remessa/cnab240/base.rb +512 -0
- data/lib/bbrcobranca/remessa/cnab240/base_correspondente.rb +299 -0
- data/lib/bbrcobranca/remessa/cnab240/caixa.rb +163 -0
- data/lib/bbrcobranca/remessa/cnab240/cecred.rb +151 -0
- data/lib/bbrcobranca/remessa/cnab240/sicoob.rb +226 -0
- data/lib/bbrcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
- data/lib/bbrcobranca/remessa/cnab240/sicredi.rb +177 -0
- data/lib/bbrcobranca/remessa/cnab240/unicred.rb +9 -0
- data/lib/bbrcobranca/remessa/cnab400/banco_brasil.rb +169 -0
- data/lib/bbrcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
- data/lib/bbrcobranca/remessa/cnab400/banco_nordeste.rb +160 -0
- data/lib/bbrcobranca/remessa/cnab400/banrisul.rb +155 -0
- data/lib/bbrcobranca/remessa/cnab400/base.rb +119 -0
- data/lib/bbrcobranca/remessa/cnab400/bradesco.rb +130 -0
- data/lib/bbrcobranca/remessa/cnab400/citibank.rb +138 -0
- data/lib/bbrcobranca/remessa/cnab400/credisis.rb +128 -0
- data/lib/bbrcobranca/remessa/cnab400/itau.rb +157 -0
- data/lib/bbrcobranca/remessa/cnab400/santander.rb +231 -0
- data/lib/bbrcobranca/remessa/cnab400/sicoob.rb +308 -0
- data/lib/bbrcobranca/remessa/cnab400/unicred.rb +143 -0
- data/lib/bbrcobranca/remessa/pagamento.rb +288 -0
- data/lib/bbrcobranca/retorno/base.rb +49 -0
- data/lib/bbrcobranca/retorno/cnab240/base.rb +42 -0
- data/lib/bbrcobranca/retorno/cnab240/caixa.rb +48 -0
- data/lib/bbrcobranca/retorno/cnab240/cecred.rb +102 -0
- data/lib/bbrcobranca/retorno/cnab240/santander.rb +95 -0
- data/lib/bbrcobranca/retorno/cnab240/sicoob.rb +99 -0
- data/lib/bbrcobranca/retorno/cnab240/sicredi.rb +79 -0
- data/lib/bbrcobranca/retorno/cnab400/banco_brasil.rb +127 -0
- data/lib/bbrcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
- data/lib/bbrcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
- data/lib/bbrcobranca/retorno/cnab400/banrisul.rb +42 -0
- data/lib/bbrcobranca/retorno/cnab400/base.rb +50 -0
- data/lib/bbrcobranca/retorno/cnab400/bradesco.rb +124 -0
- data/lib/bbrcobranca/retorno/cnab400/credisis.rb +115 -0
- data/lib/bbrcobranca/retorno/cnab400/itau.rb +143 -0
- data/lib/bbrcobranca/retorno/cnab400/santander.rb +57 -0
- data/lib/bbrcobranca/retorno/cnab400/unicred.rb +118 -0
- data/lib/bbrcobranca/retorno/retorno_cbr643.rb +49 -0
- data/lib/bbrcobranca/retorno/retorno_cnab240.rb +97 -0
- data/lib/bbrcobranca/retorno/retorno_cnab400.rb +70 -0
- data/lib/bbrcobranca/util/date.rb +20 -0
- data/lib/bbrcobranca/util/empresa.rb +28 -0
- data/lib/bbrcobranca/util/errors.rb +76 -0
- data/lib/bbrcobranca/validations.rb +232 -0
- data/lib/bbrcobranca/version.rb +6 -0
- data/spec/arquivos/CBR64310.RET +28 -0
- data/spec/arquivos/CNAB240.RET +74 -0
- data/spec/arquivos/CNAB240CECRED.RET +10 -0
- data/spec/arquivos/CNAB240SANTANDER.RET +8 -0
- data/spec/arquivos/CNAB240SICOOB.RET +10 -0
- data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
- data/spec/arquivos/CNAB400.RET +54 -0
- data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
- data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
- data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
- data/spec/arquivos/CNAB400BRADESCO.RET +8 -0
- data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
- data/spec/arquivos/CNAB400ITAU.RET +54 -0
- data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
- data/spec/arquivos/CNAB400UNICRED.RET +3 -0
- data/spec/bbrcobranca_spec.rb +34 -0
- data/spec/brcobranca/base_spec.rb +170 -0
- data/spec/brcobranca/boleto/banco_brasil_spec.rb +334 -0
- data/spec/brcobranca/boleto/banco_brasilia_spec.rb +152 -0
- data/spec/brcobranca/boleto/banco_nordeste_spec.rb +161 -0
- data/spec/brcobranca/boleto/banestes_spec.rb +194 -0
- data/spec/brcobranca/boleto/banrisul_spec.rb +182 -0
- data/spec/brcobranca/boleto/bradesco_spec.rb +211 -0
- data/spec/brcobranca/boleto/caixa_spec.rb +161 -0
- data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
- data/spec/brcobranca/boleto/credisis_spec.rb +159 -0
- data/spec/brcobranca/boleto/hsbc_spec.rb +172 -0
- data/spec/brcobranca/boleto/itau_spec.rb +262 -0
- data/spec/brcobranca/boleto/santander_spec.rb +143 -0
- data/spec/brcobranca/boleto/sicoob_spec.rb +193 -0
- data/spec/brcobranca/boleto/sicredi_spec.rb +190 -0
- data/spec/brcobranca/boleto/unicred_spec.rb +149 -0
- data/spec/brcobranca/boletos_em_lote_spec.rb +38 -0
- data/spec/brcobranca/calculo_data_spec.rb +33 -0
- data/spec/brcobranca/calculo_spec.rb +185 -0
- data/spec/brcobranca/currency_spec.rb +79 -0
- data/spec/brcobranca/formatacao_spec.rb +46 -0
- data/spec/brcobranca/formatacao_string_spec.rb +24 -0
- data/spec/brcobranca/limpeza_spec.rb +10 -0
- data/spec/brcobranca/remessa/base_spec.rb +67 -0
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +217 -0
- data/spec/brcobranca/remessa/cnab240/base_spec.rb +91 -0
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +163 -0
- data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
- data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
- data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +198 -0
- data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
- data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
- data/spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb +187 -0
- data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
- data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +187 -0
- data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +53 -0
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +201 -0
- data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +126 -0
- data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +190 -0
- data/spec/brcobranca/remessa/cnab400/santander_spec.rb +152 -0
- data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +217 -0
- data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
- data/spec/brcobranca/remessa/pagamento_spec.rb +227 -0
- data/spec/brcobranca/retorno/cnab240/base_spec.rb +23 -0
- data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
- data/spec/brcobranca/retorno/cnab240/santander_spec.rb +50 -0
- data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +50 -0
- data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
- data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
- data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
- data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
- data/spec/brcobranca/retorno/cnab400/base_spec.rb +57 -0
- data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +58 -0
- data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
- data/spec/brcobranca/retorno/cnab400/itau_spec.rb +58 -0
- data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
- data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
- data/spec/brcobranca/retorno/retorno_cbr643_spec.rb +69 -0
- data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +57 -0
- data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +52 -0
- data/spec/brcobranca/rghost_spec.rb +29 -0
- data/spec/brcobranca/util/empresa_spec.rb +36 -0
- data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-itau-cnab400.rem +4 -0
- data/spec/fixtures/remessa/remessa-santander-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-sicoob-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
- data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
- data/spec/spec.opts +8 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/remessa_helpers.rb +13 -0
- data/spec/support/shared_examples/busca_logotipo.rb +15 -0
- data/spec/support/shared_examples/cnab240.rb +259 -0
- data/spec/support/shared_examples/cnab400.rb +180 -0
- data/spec/support/shared_examples/formatos_validos.rb +36 -0
- 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
|