brcobranca 2.0.6 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +30 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +48 -0
- data/History.txt +13 -1
- data/LICENSE +20 -0
- data/README.rdoc +12 -5
- data/Rakefile +33 -37
- data/VERSION +1 -0
- data/brcobranca.gemspec +26 -35
- data/lib/brcobranca/arquivos/logos/{bb.jpg → bancobrasil.jpg} +0 -0
- data/lib/brcobranca/arquivos/logos/banespa.jpg +0 -0
- data/lib/brcobranca/arquivos/logos/caixa.jpg +0 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +150 -77
- data/lib/brcobranca/boleto/base.rb +146 -75
- data/lib/brcobranca/boleto/bradesco.rb +69 -0
- data/lib/brcobranca/boleto/caixa.rb +100 -0
- data/lib/brcobranca/boleto/hsbc.rb +95 -0
- data/lib/brcobranca/boleto/itau.rb +133 -0
- data/lib/brcobranca/boleto/real.rb +74 -0
- data/lib/brcobranca/boleto/template/base.rb +13 -0
- data/lib/brcobranca/boleto/template/rghost.rb +136 -62
- data/lib/brcobranca/boleto/unibanco.rb +115 -0
- data/lib/brcobranca/calculo.rb +132 -0
- data/lib/brcobranca/calculo_data.rb +42 -0
- data/lib/brcobranca/currency.rb +3 -4
- data/lib/brcobranca/formatacao.rb +102 -0
- data/lib/brcobranca/limpeza.rb +19 -0
- data/lib/brcobranca/retorno/base.rb +1 -2
- data/lib/brcobranca/retorno/retorno_cbr643.rb +42 -40
- data/lib/brcobranca/version.rb +3 -0
- data/lib/brcobranca.rb +93 -16
- data/spec/brcobranca/banco_bradesco_spec.rb +63 -50
- data/spec/brcobranca/banco_brasil_spec.rb +102 -136
- data/spec/brcobranca/banco_caixa_spec.rb +166 -0
- data/spec/brcobranca/banco_hsbc_spec.rb +83 -76
- data/spec/brcobranca/banco_real_spec.rb +54 -37
- data/spec/brcobranca/banco_unibanco_spec.rb +69 -52
- data/spec/brcobranca/base_spec.rb +24 -79
- data/spec/brcobranca/boletos_em_lote_spec.rb +46 -0
- data/spec/brcobranca/core_ext_spec.rb +24 -114
- data/spec/brcobranca/currency_spec.rb +1 -0
- data/spec/brcobranca/{banco_itau_spec.rb → itau_spec.rb} +112 -67
- data/spec/brcobranca/retorno_cbr643_spec.rb +13 -12
- data/spec/brcobranca/rghost_spec.rb +8 -7
- data/spec/brcobranca_spec.rb +16 -6
- data/spec/spec_helper.rb +11 -8
- metadata +107 -58
- data/Manifest.txt +0 -51
- data/PostInstall.txt +0 -4
- data/lib/brcobranca/boleto/banco_banespa.rb +0 -85
- data/lib/brcobranca/boleto/banco_bradesco.rb +0 -44
- data/lib/brcobranca/boleto/banco_hsbc.rb +0 -77
- data/lib/brcobranca/boleto/banco_itau.rb +0 -115
- data/lib/brcobranca/boleto/banco_real.rb +0 -70
- data/lib/brcobranca/boleto/banco_unibanco.rb +0 -79
- data/lib/brcobranca/boleto/template/util.rb +0 -32
- data/lib/brcobranca/config.rb +0 -9
- data/lib/brcobranca/core_ext.rb +0 -279
- data/spec/brcobranca/banco_banespa_spec.rb +0 -195
- data/spec/brcobranca/template/rghost_spec.rb +0 -65
- data/spec/brcobranca/template/util_spec.rb +0 -42
- data/spec/rcov.opts +0 -2
- data/spec/spec.opts +0 -6
- data/tasks/rcov.rake +0 -12
- data/tasks/rspec.rake +0 -21
@@ -1,70 +0,0 @@
|
|
1
|
-
# Banco REAL
|
2
|
-
class BancoReal < Brcobranca::Boleto::Base
|
3
|
-
# Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoReal
|
4
|
-
def initialize(campos={})
|
5
|
-
padrao={:carteira => "57", :banco => "356"}
|
6
|
-
campos = padrao.merge!(campos)
|
7
|
-
super(campos)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Campo usado apenas na exibição no boleto
|
11
|
-
# Deverá ser sobreescrito para cada banco
|
12
|
-
def nosso_numero_boleto
|
13
|
-
"#{self.numero_documento}-#{self.nosso_numero_dv}"
|
14
|
-
end
|
15
|
-
|
16
|
-
# Campo usado apenas na exibição no boleto
|
17
|
-
# Deverá ser sobreescrito para cada banco
|
18
|
-
def agencia_conta_boleto
|
19
|
-
"#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
|
20
|
-
end
|
21
|
-
|
22
|
-
# CALCULO DO DIGITO:
|
23
|
-
# APLICA-SE OS PESOS 2,1,2,1,.... AOS ALGARISMOS DO NUMERO COMPOSTO POR:
|
24
|
-
# NUMERO DO BANCO : COM 7 DIGITOS P/ COBRANCA REGISTRADA
|
25
|
-
# ATE 15 DIGITOS P/ COBRANCA SEM REGISTRO
|
26
|
-
# CODIGO DA AGENCIA: 4 DIGITOS
|
27
|
-
# NUMERO DA CONTA : 7 DIGITOS
|
28
|
-
def agencia_conta_corrente_nosso_numero_dv
|
29
|
-
case self.carteira.to_i
|
30
|
-
when 57
|
31
|
-
#agencia é 4 digitos
|
32
|
-
agencia = self.agencia.zeros_esquerda(:tamanho => 4)
|
33
|
-
#conta é 7 digitos
|
34
|
-
conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
|
35
|
-
#nosso número com maximo de 13 digitos
|
36
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
|
37
|
-
"#{numero_documento}#{agencia}#{conta}".modulo10
|
38
|
-
else
|
39
|
-
#agencia é 4 digitos
|
40
|
-
agencia = self.agencia.zeros_esquerda(:tamanho => 4)
|
41
|
-
#conta é 7 digitos
|
42
|
-
conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
|
43
|
-
#nosso número com maximo de 13 digitos
|
44
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
|
45
|
-
"#{numero_documento}#{agencia}#{conta}".modulo10
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
|
50
|
-
def monta_codigo_43_digitos
|
51
|
-
banco = self.banco.zeros_esquerda(:tamanho => 3)
|
52
|
-
valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
|
53
|
-
conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
|
54
|
-
agencia = self.agencia.zeros_esquerda(:tamanho => 4)
|
55
|
-
fator = self.data_vencimento.fator_vencimento
|
56
|
-
# Montagem é baseada no tipo de carteira, com registro e sem registro
|
57
|
-
case self.carteira.to_i
|
58
|
-
# Carteira sem registro
|
59
|
-
when 57
|
60
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
|
61
|
-
codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
|
62
|
-
codigo.size == 43 ? codigo : nil
|
63
|
-
else
|
64
|
-
# TODO verificar com o banco, pois não consta na documentação
|
65
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
|
66
|
-
codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
|
67
|
-
codigo.size == 43 ? codigo : nil
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# Banco UNIBANCO
|
2
|
-
class BancoUnibanco < Brcobranca::Boleto::Base
|
3
|
-
# Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoUnibanco
|
4
|
-
# Com Registro 4
|
5
|
-
# Sem Registro 5
|
6
|
-
def initialize(campos={})
|
7
|
-
padrao={:carteira => "5", :banco => "409"}
|
8
|
-
campos = padrao.merge!(campos)
|
9
|
-
super(campos)
|
10
|
-
end
|
11
|
-
|
12
|
-
def nosso_numero_dv
|
13
|
-
self.numero_documento.modulo11_2to9
|
14
|
-
end
|
15
|
-
|
16
|
-
# Campo usado apenas na exibição no boleto
|
17
|
-
# Deverá ser sobreescrito para cada banco
|
18
|
-
def nosso_numero_boleto
|
19
|
-
"#{self.numero_documento.zeros_esquerda(:tamanho => 14)}-#{self.nosso_numero_dv}"
|
20
|
-
end
|
21
|
-
|
22
|
-
# Campo usado apenas na exibição no boleto
|
23
|
-
# Deverá ser sobreescrito para cada banco
|
24
|
-
def agencia_conta_boleto
|
25
|
-
"#{self.agencia} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
|
29
|
-
def monta_codigo_43_digitos
|
30
|
-
banco = self.banco.zeros_esquerda(:tamanho => 3)
|
31
|
-
fator = self.data_vencimento.fator_vencimento
|
32
|
-
valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
|
33
|
-
carteira = self.carteira.zeros_esquerda(:tamanho => 1)
|
34
|
-
|
35
|
-
case carteira.to_i
|
36
|
-
when 5
|
37
|
-
|
38
|
-
# Cobrança sem registro (CÓDIGO DE BARRAS)
|
39
|
-
# Posição Tamanho Descrição
|
40
|
-
# 1 a 3 3 número de identificação do Unibanco: 409 (número FIXO)
|
41
|
-
# 4 1 código da moeda. Real (R$)=9 (número FIXO)
|
42
|
-
# 5 1 dígito verificador do CÓDIGO DE BARRAS
|
43
|
-
# 6 a 9 4 fator de vencimento
|
44
|
-
# 10 a 19 10 valor do título com zeros à esquerda
|
45
|
-
# 20 1 código para transação CVT: 5 (número FIXO)(5=7744-5)
|
46
|
-
# 21 a 27 7 número do cliente no CÓDIGO DE BARRAS + dígito verificador
|
47
|
-
# 28 a 29 2 vago. Usar 00 (número FIXO)
|
48
|
-
# 30 a 43 14 Número de referência do cliente
|
49
|
-
# 44 1 Dígito verificador
|
50
|
-
|
51
|
-
convenio = self.convenio.zeros_esquerda(:tamanho => 6)
|
52
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 14)
|
53
|
-
codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{carteira}#{convenio}00#{numero_documento}#{self.nosso_numero_dv}"
|
54
|
-
codigo.size == 43 ? codigo : nil
|
55
|
-
when 4
|
56
|
-
|
57
|
-
# Cobrança com registro (CÓDIGO DE BARRAS)
|
58
|
-
# Posição Tamanho Descrição
|
59
|
-
# 1 a 3 3 Número de identificação do Unibanco: 409 (número FIXO)
|
60
|
-
# 4 1 Código da moeda. Real (R$)=9 (número FIXO)
|
61
|
-
# 5 1 dígito verificador do CÓDIGO DE BARRAS
|
62
|
-
# 6 a 9 4 fator de vencimento em 4 algarismos, conforme tabela da página 14
|
63
|
-
# 10 a 19 10 valor do título com zeros à esquerda
|
64
|
-
# 20 a 21 2 Código para transação CVT: 04 (número FIXO) (04=5539-5)
|
65
|
-
# 22 a 27 6 data de vencimento (AAMMDD)
|
66
|
-
# 28 a 32 5 Código da agência + dígito verificador
|
67
|
-
# 33 a 43 11 “Nosso Número” (NNNNNNNNNNN)
|
68
|
-
# 44 1 Super dígito do “Nosso Número” (calculado com o MÓDULO 11 (de 2 a 9))
|
69
|
-
|
70
|
-
data = self.data_vencimento.strftime('%y%m%d')
|
71
|
-
agencia = self.agencia.zeros_esquerda(:tamanho => 4)
|
72
|
-
numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 11)
|
73
|
-
codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}0#{carteira}#{data}#{agencia}#{self.agencia_dv}#{numero_documento}#{self.nosso_numero_dv}"
|
74
|
-
codigo.size == 43 ? codigo : nil
|
75
|
-
else
|
76
|
-
nil
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Brcobranca
|
2
|
-
module Boleto
|
3
|
-
module Template
|
4
|
-
# Métodos auxiliares de montagem de template
|
5
|
-
module Util
|
6
|
-
# Responsável por definir a logotipo usada no template genérico,
|
7
|
-
# retorna o caminho para o <b>logotipo</b> ou <b>false</b> caso nao consiga encontrar o logotipo.
|
8
|
-
def monta_logo
|
9
|
-
case self.class.to_s
|
10
|
-
when "BancoBrasil"
|
11
|
-
imagem = 'bb.jpg'
|
12
|
-
when "BancoItau"
|
13
|
-
imagem = 'itau.jpg'
|
14
|
-
when "BancoHsbc"
|
15
|
-
imagem = 'hsbc.jpg'
|
16
|
-
when "BancoReal"
|
17
|
-
imagem = 'real.jpg'
|
18
|
-
when "BancoBradesco"
|
19
|
-
imagem = 'bradesco.jpg'
|
20
|
-
when "BancoUnibanco"
|
21
|
-
imagem = 'unibanco.jpg'
|
22
|
-
when "BancoBanespa"
|
23
|
-
imagem = 'banespa.jpg'
|
24
|
-
else
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
File.join(File.dirname(__FILE__),'..','..','arquivos','logos',imagem)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/brcobranca/config.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
module Brcobranca
|
2
|
-
# Módulo de configuração.
|
3
|
-
module Config
|
4
|
-
# Opções disponíveis:
|
5
|
-
# Brcobranca::Config::OPCOES[:tipo] - Pode ser pdf, jpg e ps.
|
6
|
-
# Brcobranca::Config::OPCOES[:gerador] - Somente rghost até o momento
|
7
|
-
OPCOES = {:tipo => 'pdf', :gerador => 'rghost'}
|
8
|
-
end
|
9
|
-
end
|
data/lib/brcobranca/core_ext.rb
DELETED
@@ -1,279 +0,0 @@
|
|
1
|
-
module Brcobranca
|
2
|
-
# Métodos auxiliares de formatação
|
3
|
-
module Formatacao
|
4
|
-
# Formata como CPF
|
5
|
-
def to_br_cpf
|
6
|
-
(self.kind_of?(String) ? self : self.to_s).gsub(/^(.{3})(.{3})(.{3})(.{2})$/,'\1.\2.\3-\4')
|
7
|
-
end
|
8
|
-
|
9
|
-
# Formata como CEP
|
10
|
-
def to_br_cep
|
11
|
-
(self.kind_of?(String) ? self : self.to_s).gsub(/^(.{5})(.{3})$/,'\1-\2')
|
12
|
-
end
|
13
|
-
|
14
|
-
# Formata como CNPJ
|
15
|
-
def to_br_cnpj
|
16
|
-
(self.kind_of?(String) ? self : self.to_s).gsub(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/,'\1.\2.\3/\4-\5')
|
17
|
-
end
|
18
|
-
|
19
|
-
# Gera formatação automatica do documento baseado no tamanho do campo.
|
20
|
-
def formata_documento
|
21
|
-
case (self.kind_of?(String) ? self : self.to_s).size
|
22
|
-
when 8 then self.to_br_cep
|
23
|
-
when 11 then self.to_br_cpf
|
24
|
-
when 14 then self.to_br_cnpj
|
25
|
-
else
|
26
|
-
self
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Remove caracteres que não sejam numéricos do tipo MOEDA
|
31
|
-
def limpa_valor_moeda
|
32
|
-
return self unless self.kind_of?(String) && self.moeda?
|
33
|
-
self.somente_numeros
|
34
|
-
end
|
35
|
-
|
36
|
-
# Remove caracteres que não sejam numéricos
|
37
|
-
def somente_numeros
|
38
|
-
return self unless self.kind_of?(String)
|
39
|
-
self.gsub(/\D/,'')
|
40
|
-
end
|
41
|
-
|
42
|
-
# Completa zeros a esquerda.
|
43
|
-
# Ex. numero="123" :tamanho=>3 | numero="123"
|
44
|
-
# Ex. numero="123" :tamanho=>4 | numero="0123"
|
45
|
-
# Ex. numero="123" :tamanho=>5 | numero="00123"
|
46
|
-
def zeros_esquerda(options={})
|
47
|
-
valor_inicial = self.kind_of?(String) ? self : self.to_s
|
48
|
-
return valor_inicial if (valor_inicial !~ /\S/)
|
49
|
-
digitos = options[:tamanho] || valor_inicial.size
|
50
|
-
|
51
|
-
diferenca = (digitos - valor_inicial.size)
|
52
|
-
|
53
|
-
return valor_inicial if (diferenca <= 0)
|
54
|
-
return (("0" * diferenca) + valor_inicial )
|
55
|
-
end
|
56
|
-
|
57
|
-
# Monta a linha digitável padrão para todos os bancos segundo a BACEN.
|
58
|
-
# Retorna + nil + para Codigo de Barras em branco,
|
59
|
-
# Codigo de Barras com tamanho diferente de 44 dígitos e
|
60
|
-
# Codigo de Barras que não tenham somente caracteres numéricos.
|
61
|
-
# A linha digitável será composta por cinco campos:
|
62
|
-
# 1º campo
|
63
|
-
# Composto pelo código de Banco, código da moeda, as cinco primeiras posições do campo livre
|
64
|
-
# e o dígito verificador deste campo;
|
65
|
-
# 2º campo
|
66
|
-
# Composto pelas posições 6ª a 15ª do campo livre e o dígito verificador deste campo;
|
67
|
-
# 3º campo
|
68
|
-
# Composto pelas posições 16ª a 25ª do campo livre e o dígito verificador deste campo;
|
69
|
-
# 4º campo
|
70
|
-
# Composto pelo dígito verificador do código de barras, ou seja, a 5ª posição do código de
|
71
|
-
# barras;
|
72
|
-
# 5º campo
|
73
|
-
# Composto pelo fator de vencimento com 4(quatro) caracteres e o valor do documento com
|
74
|
-
# 10(dez) caracteres, sem separadores e sem edição.
|
75
|
-
# Entre cada campo deverá haver espaço equivalente a 2 (duas) posições, sendo a 1ª
|
76
|
-
# interpretada por um ponto (.) e a 2ª por um espaço em branco.
|
77
|
-
def linha_digitavel
|
78
|
-
valor_inicial = self.kind_of?(String) ? self : self.to_s
|
79
|
-
raise ArgumentError, "Número em branco" if valor_inicial.nil?
|
80
|
-
raise ArgumentError, "Somente números" unless valor_inicial.numeric?
|
81
|
-
raise ArgumentError, "Precisa conter 44 caracteres e você passou um valor com #{valor_inicial.size} caracteres" if valor_inicial.size != 44
|
82
|
-
|
83
|
-
dv_1 = ("#{valor_inicial[0..3]}#{valor_inicial[19..23]}").modulo10
|
84
|
-
campo_1_dv = "#{valor_inicial[0..3]}#{valor_inicial[19..23]}#{dv_1}"
|
85
|
-
campo_linha_1 = "#{campo_1_dv[0..4]}.#{campo_1_dv[5..9]}"
|
86
|
-
|
87
|
-
dv_2 = "#{valor_inicial[24..33]}".modulo10
|
88
|
-
campo_2_dv = "#{valor_inicial[24..33]}#{dv_2}"
|
89
|
-
campo_linha_2 = "#{campo_2_dv[0..4]}.#{campo_2_dv[5..10]}"
|
90
|
-
|
91
|
-
dv_3 = "#{valor_inicial[34..43]}".modulo10
|
92
|
-
campo_3_dv = "#{valor_inicial[34..43]}#{dv_3}"
|
93
|
-
campo_linha_3 = "#{campo_3_dv[0..4]}.#{campo_3_dv[5..10]}"
|
94
|
-
|
95
|
-
campo_linha_4 = "#{valor_inicial[4..4]}"
|
96
|
-
|
97
|
-
campo_linha_5 = "#{valor_inicial[5..18]}"
|
98
|
-
|
99
|
-
"#{campo_linha_1} #{campo_linha_2} #{campo_linha_3} #{campo_linha_4} #{campo_linha_5}"
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# métodos auxiliares de cálculos
|
104
|
-
module Calculo
|
105
|
-
# Método padrão para cálculo de módulo 10 segundo a BACEN.
|
106
|
-
def modulo10
|
107
|
-
valor_inicial = self.kind_of?(String) ? self : self.to_s
|
108
|
-
raise ArgumentError, "Somente números" unless valor_inicial.numeric?
|
109
|
-
|
110
|
-
total = 0
|
111
|
-
multiplicador = 2
|
112
|
-
|
113
|
-
valor_inicial.split(//).reverse!.each do |caracter|
|
114
|
-
total += (caracter.to_i * multiplicador).soma_digitos
|
115
|
-
multiplicador = multiplicador == 2 ? 1 : 2
|
116
|
-
end
|
117
|
-
|
118
|
-
valor = (10 - (total % 10))
|
119
|
-
valor == 10 ? 0 : valor
|
120
|
-
end
|
121
|
-
|
122
|
-
# Método padrão para cálculo de módulo 11 com multiplicaroes de 9 a 2 segundo a BACEN.
|
123
|
-
# Usado no DV do Nosso Numero, Agência e Cedente.
|
124
|
-
# Retorna + nil + para todos os parametros que nao forem String
|
125
|
-
# Retorna + nil + para String em branco
|
126
|
-
def modulo11_9to2
|
127
|
-
total = self.multiplicador([9,8,7,6,5,4,3,2])
|
128
|
-
|
129
|
-
return (total % 11 )
|
130
|
-
end
|
131
|
-
|
132
|
-
# Método padrão para cálculo de módulo 11 com multiplicaroes de 2 a 9 segundo a BACEN.
|
133
|
-
# Usado no DV do Código de Barras.
|
134
|
-
# Retorna + nil + para todos os parametros que não forem String
|
135
|
-
# Retorna + nil + para String em branco
|
136
|
-
def modulo11_2to9
|
137
|
-
total = self.multiplicador([2,3,4,5,6,7,8,9])
|
138
|
-
|
139
|
-
valor = (11 - (total % 11))
|
140
|
-
return [0,10,11].include?(valor) ? 1 : valor
|
141
|
-
end
|
142
|
-
|
143
|
-
def modulo_10_banespa
|
144
|
-
valor_inicial = self.kind_of?(String) ? self : self.to_s
|
145
|
-
raise ArgumentError, "Somente números" unless valor_inicial.numeric?
|
146
|
-
|
147
|
-
fatores = [7,3,1,9,7,3,1,9,7,3]
|
148
|
-
total = 0
|
149
|
-
posicao = 0
|
150
|
-
valor_inicial.split(//).each do |digito|
|
151
|
-
total += (digito.to_i * fatores[posicao]).to_s.split(//)[-1].to_i
|
152
|
-
posicao = (posicao < (fatores.size - 1)) ? (posicao + 1) : 0
|
153
|
-
end
|
154
|
-
dv = 10 - total.to_s.split(//)[-1].to_i
|
155
|
-
dv == 10 ? 0 : dv
|
156
|
-
end
|
157
|
-
|
158
|
-
# Retorna o dígito verificador de <b>modulo 11(9-2)</b> trocando retorno <b>10 por X</b>.
|
159
|
-
# Usado por alguns bancos.
|
160
|
-
def modulo11_9to2_10_como_x
|
161
|
-
valor = self.modulo11_9to2
|
162
|
-
valor == 10 ? "X" : valor
|
163
|
-
end
|
164
|
-
|
165
|
-
# Retorna o dígito verificador de <b>modulo 11(9-2)</b> trocando retorno <b>10 por 0</b>.
|
166
|
-
# Usado por alguns bancos.
|
167
|
-
def modulo11_9to2_10_como_zero
|
168
|
-
valor = self.modulo11_9to2
|
169
|
-
valor == 10 ? 0 : valor
|
170
|
-
end
|
171
|
-
|
172
|
-
# Soma números inteiros positivos com 2 dígitos ou mais
|
173
|
-
# Retorna <b>0(zero)</b> caso seja impossível.
|
174
|
-
# Ex. 1 = 1
|
175
|
-
# Ex. 11 = (1+1) = 2
|
176
|
-
# Ex. 13 = (1+3) = 4
|
177
|
-
def soma_digitos
|
178
|
-
valor_inicial = self.kind_of?(Fixnum) ? self : self.to_i
|
179
|
-
return 0 if valor_inicial == 0
|
180
|
-
return valor_inicial if valor_inicial <= 9
|
181
|
-
|
182
|
-
valor_inicial = valor_inicial.to_s
|
183
|
-
total = 0
|
184
|
-
|
185
|
-
0.upto(valor_inicial.size-1) {|digito| total += valor_inicial[digito,1].to_i }
|
186
|
-
|
187
|
-
return total
|
188
|
-
end
|
189
|
-
|
190
|
-
def multiplicador(fatores)
|
191
|
-
valor_inicial = self.kind_of?(String) ? self : self.to_s
|
192
|
-
raise ArgumentError, "Somente números" unless valor_inicial.numeric?
|
193
|
-
|
194
|
-
total = 0
|
195
|
-
multiplicador_posicao = 0
|
196
|
-
|
197
|
-
valor_inicial.split(//).reverse!.each do |caracter|
|
198
|
-
total += (caracter.to_i * fatores[multiplicador_posicao])
|
199
|
-
multiplicador_posicao = (multiplicador_posicao < (fatores.size - 1)) ? (multiplicador_posicao + 1) : 0
|
200
|
-
end
|
201
|
-
total.to_i
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
# Métodos auxiliares de verificação e validação.
|
206
|
-
module Validacao
|
207
|
-
# Verifica se o valor é moeda.
|
208
|
-
# Ex. +1.232.33
|
209
|
-
# Ex. -1.232.33
|
210
|
-
# Ex. 1.232.33
|
211
|
-
def moeda?
|
212
|
-
value = self.kind_of?(String) ? self : self.to_s
|
213
|
-
value =~ /^(\+|-)?\d+((\.|,)\d{3}*)*((\.|,)\d{2}*)$/ ? true : false
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
# Métodos auxiliares de limpeza.
|
218
|
-
module Limpeza
|
219
|
-
# Retorna uma String contendo exatamente o valor FLOAT
|
220
|
-
def limpa_valor_moeda
|
221
|
-
valor_inicial = self.to_s
|
222
|
-
(valor_inicial + ("0" * (2 - valor_inicial.split(/\./).last.size ))).somente_numeros
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
# Métodos auxiliares de cálculos envolvendo <b>Datas</b>.
|
227
|
-
module CalculoData
|
228
|
-
# 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> desejado:
|
229
|
-
# VENCIMENTO 04/07/2000
|
230
|
-
# DATA BASE - 07/10/1997
|
231
|
-
# FATOR DE VENCIMENTO 1001
|
232
|
-
def fator_vencimento
|
233
|
-
data_base = Date.parse "1997-10-07"
|
234
|
-
(self - data_base).to_i
|
235
|
-
end
|
236
|
-
|
237
|
-
# Mostra a data em formato <b>dia/mês/ano</b>
|
238
|
-
def to_s_br
|
239
|
-
self.strftime('%d/%m/%Y')
|
240
|
-
end
|
241
|
-
# Retorna string contendo número de dias julianos:
|
242
|
-
# O cálculo é feito subtraindo-se a data atual, pelo último dia válido do ano anterior,
|
243
|
-
# acrescentando-se o último algarismo do ano atual na quarta posição.
|
244
|
-
# Deve retornar string com 4 digitos.
|
245
|
-
# Ex. Data atual = 11/02/2009
|
246
|
-
# Data válida ano anterior = 31/12/2008
|
247
|
-
# (Data atual - Data válida ano anterior) = 42
|
248
|
-
# último algarismo do ano atual = 9
|
249
|
-
# String atual 42+9 = 429
|
250
|
-
# Completa zero esquerda para formar 4 digitos = "0429"
|
251
|
-
def to_juliano
|
252
|
-
ultima_data = Date.parse("#{self.year - 1}-12-31")
|
253
|
-
ultimo_digito_ano = self.to_s[3..3]
|
254
|
-
dias = (self - ultima_data)
|
255
|
-
(dias.to_s + ultimo_digito_ano).zeros_esquerda(:tamanho => 4)
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
# NEW AND COOL
|
261
|
-
[ String, Numeric ].each do |klass|
|
262
|
-
klass.class_eval { include Brcobranca::Formatacao }
|
263
|
-
end
|
264
|
-
|
265
|
-
[ String, Numeric ].each do |klass|
|
266
|
-
klass.class_eval { include Brcobranca::Validacao }
|
267
|
-
end
|
268
|
-
|
269
|
-
[ String, Numeric ].each do |klass|
|
270
|
-
klass.class_eval { include Brcobranca::Calculo }
|
271
|
-
end
|
272
|
-
|
273
|
-
[ Float ].each do |klass|
|
274
|
-
klass.class_eval { include Brcobranca::Limpeza }
|
275
|
-
end
|
276
|
-
|
277
|
-
[ Date ].each do |klass|
|
278
|
-
klass.class_eval { include Brcobranca::CalculoData }
|
279
|
-
end
|
@@ -1,195 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe BancoBanespa do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@valid_attributes = {
|
7
|
-
:especie_documento => "DM",
|
8
|
-
:moeda => "9",
|
9
|
-
:banco => "033",
|
10
|
-
:data_documento => Date.today,
|
11
|
-
:dias_vencimento => 1,
|
12
|
-
:aceite => "S",
|
13
|
-
:quantidade => 1,
|
14
|
-
:valor => 0.0,
|
15
|
-
:local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO",
|
16
|
-
:cedente => "Kivanio Barbosa",
|
17
|
-
:documento_cedente => "12345678912",
|
18
|
-
:sacado => "Claudio Pozzebom",
|
19
|
-
:sacado_documento => "12345678900",
|
20
|
-
:agencia => "400",
|
21
|
-
:conta_corrente => "61900",
|
22
|
-
:convenio => 12387989,
|
23
|
-
:numero_documento => "777700168"
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should create a new default instance" do
|
28
|
-
boleto_novo = BancoBanespa.new
|
29
|
-
boleto_novo.banco.should eql("033")
|
30
|
-
boleto_novo.especie_documento.should eql("DM")
|
31
|
-
boleto_novo.especie.should eql("R$")
|
32
|
-
boleto_novo.moeda.should eql("9")
|
33
|
-
boleto_novo.data_documento.should eql(Date.today)
|
34
|
-
boleto_novo.dias_vencimento.should eql(1)
|
35
|
-
boleto_novo.data_vencimento.should eql(Date.today + 1)
|
36
|
-
boleto_novo.aceite.should eql("S")
|
37
|
-
boleto_novo.quantidade.should eql(1)
|
38
|
-
boleto_novo.valor.should eql(0.0)
|
39
|
-
boleto_novo.valor_documento.should eql(0.0)
|
40
|
-
boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
|
41
|
-
boleto_novo.carteira.should eql("COB")
|
42
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should create a new instance given valid attributes" do
|
46
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
47
|
-
boleto_novo.banco.should eql("033")
|
48
|
-
boleto_novo.especie_documento.should eql("DM")
|
49
|
-
boleto_novo.especie.should eql("R$")
|
50
|
-
boleto_novo.moeda.should eql("9")
|
51
|
-
boleto_novo.data_documento.should eql(Date.today)
|
52
|
-
boleto_novo.dias_vencimento.should eql(1)
|
53
|
-
boleto_novo.data_vencimento.should eql(Date.today + 1)
|
54
|
-
boleto_novo.aceite.should eql("S")
|
55
|
-
boleto_novo.quantidade.should eql(1)
|
56
|
-
boleto_novo.valor.should eql(0.0)
|
57
|
-
boleto_novo.valor_documento.should eql(0.0)
|
58
|
-
boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
|
59
|
-
boleto_novo.cedente.should eql("Kivanio Barbosa")
|
60
|
-
boleto_novo.documento_cedente.should eql("12345678912")
|
61
|
-
boleto_novo.sacado.should eql("Claudio Pozzebom")
|
62
|
-
boleto_novo.sacado_documento.should eql("12345678900")
|
63
|
-
boleto_novo.conta_corrente.should eql("61900")
|
64
|
-
boleto_novo.agencia.should eql("400")
|
65
|
-
boleto_novo.convenio.should eql(12387989)
|
66
|
-
boleto_novo.numero_documento.should eql("777700168")
|
67
|
-
boleto_novo.carteira.should eql("COB")
|
68
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
69
|
-
end
|
70
|
-
|
71
|
-
# TODO - should give exception
|
72
|
-
it "should return nil when attributes are nil" do
|
73
|
-
@valid_attributes[:valor] = 0
|
74
|
-
@valid_attributes[:data_documento] = Date.parse("2008-02-01")
|
75
|
-
@valid_attributes[:dias_vencimento] = 0
|
76
|
-
@valid_attributes[:numero_documento] = ""
|
77
|
-
@valid_attributes[:banco] = ""
|
78
|
-
@valid_attributes[:carteira] = ""
|
79
|
-
@valid_attributes[:moeda] = ""
|
80
|
-
@valid_attributes[:convenio] = ""
|
81
|
-
|
82
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
83
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
84
|
-
boleto_novo.monta_codigo_43_digitos.should be_nil
|
85
|
-
boleto_novo.codigo_barras.should be_nil
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should mount a valid bank invoice" do
|
89
|
-
@valid_attributes[:valor] = 103.58
|
90
|
-
@valid_attributes[:data_documento] = Date.parse("2001-08-01")
|
91
|
-
@valid_attributes[:dias_vencimento] = 0
|
92
|
-
@valid_attributes[:convenio] = 14813026478
|
93
|
-
@valid_attributes[:numero_documento] = "0004952"
|
94
|
-
@valid_attributes[:conta_corrente] = "0403005"
|
95
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
96
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
97
|
-
boleto_novo.conta_corrente_dv.should eql(2)
|
98
|
-
boleto_novo.monta_codigo_43_digitos.should eql("0339139400000103581481302647800049520003306")
|
99
|
-
boleto_novo.codigo_barras.should eql("03398139400000103581481302647800049520003306")
|
100
|
-
boleto_novo.codigo_barras.linha_digitavel.should eql("03391.48132 02647.800040 95200.033066 8 13940000010358")
|
101
|
-
|
102
|
-
@valid_attributes[:valor] = 2952.95
|
103
|
-
@valid_attributes[:data_documento] = Date.parse("2009-08-14")
|
104
|
-
@valid_attributes[:dias_vencimento] = 5
|
105
|
-
@valid_attributes[:convenio] = 40013012168
|
106
|
-
@valid_attributes[:numero_documento] = "1234567"
|
107
|
-
@valid_attributes[:conta_corrente] = "0403005"
|
108
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
109
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
110
|
-
boleto_novo.conta_corrente_dv.should eql(2)
|
111
|
-
boleto_novo.monta_codigo_43_digitos.should eql("0339433400002952954001301216812345670003361")
|
112
|
-
boleto_novo.codigo_barras.should eql("03398433400002952954001301216812345670003361")
|
113
|
-
boleto_novo.codigo_barras.linha_digitavel.should eql("03394.00137 01216.812345 56700.033618 8 43340000295295")
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should mount a valid campo_livre_com_dv1_e_dv2" do
|
117
|
-
@valid_attributes[:convenio] = "40013012168"
|
118
|
-
@valid_attributes[:numero_documento] = "7469108"
|
119
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
120
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
121
|
-
boleto_novo.campo_livre_com_dv1_e_dv2.should eql("4001301216874691080003384")
|
122
|
-
|
123
|
-
@valid_attributes[:convenio] = "40013012168"
|
124
|
-
@valid_attributes[:numero_documento] = "1234567"
|
125
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
126
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
127
|
-
boleto_novo.campo_livre_com_dv1_e_dv2.should eql("4001301216812345670003361")
|
128
|
-
end
|
129
|
-
|
130
|
-
it "should mount a valid nosso_numero and nosso_numero_dv" do
|
131
|
-
@valid_attributes[:numero_documento] = "0403005"
|
132
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
133
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
134
|
-
boleto_novo.nosso_numero.should eql("4000403005")
|
135
|
-
boleto_novo.nosso_numero_dv.should eql(6)
|
136
|
-
boleto_novo.nosso_numero_boleto.should eql("400 0403005 6")
|
137
|
-
|
138
|
-
@valid_attributes[:numero_documento] = "403005"
|
139
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
140
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
141
|
-
boleto_novo.nosso_numero.should eql("4000403005")
|
142
|
-
boleto_novo.nosso_numero_dv.should eql(6)
|
143
|
-
boleto_novo.nosso_numero_boleto.should eql("400 0403005 6")
|
144
|
-
|
145
|
-
@valid_attributes[:numero_documento] = "1234567"
|
146
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
147
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
148
|
-
boleto_novo.nosso_numero.should eql("4001234567")
|
149
|
-
boleto_novo.nosso_numero_dv.should eql(8)
|
150
|
-
boleto_novo.nosso_numero_boleto.should eql("400 1234567 8")
|
151
|
-
|
152
|
-
@valid_attributes[:agencia] = "123"
|
153
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
154
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
155
|
-
boleto_novo.nosso_numero.should eql("1231234567")
|
156
|
-
boleto_novo.nosso_numero_dv.should eql(0)
|
157
|
-
boleto_novo.nosso_numero_boleto.should eql("123 1234567 0")
|
158
|
-
|
159
|
-
@valid_attributes[:agencia] = "123"
|
160
|
-
@valid_attributes[:numero_documento] = "7469108"
|
161
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
162
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
163
|
-
boleto_novo.nosso_numero.should eql("1237469108")
|
164
|
-
boleto_novo.nosso_numero_dv.should eql(3)
|
165
|
-
boleto_novo.nosso_numero_boleto.should eql("123 7469108 3")
|
166
|
-
end
|
167
|
-
|
168
|
-
it "should mount a valid agencia_conta_dv" do
|
169
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
170
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
171
|
-
boleto_novo.agencia_conta_boleto.should eql("000 12 38798 9")
|
172
|
-
end
|
173
|
-
|
174
|
-
it "should test outputs" do
|
175
|
-
@valid_attributes[:valor] = 2952.95
|
176
|
-
@valid_attributes[:data_documento] = Date.parse("2009-08-14")
|
177
|
-
@valid_attributes[:dias_vencimento] = 5
|
178
|
-
@valid_attributes[:convenio] = 40013012168
|
179
|
-
@valid_attributes[:numero_documento] = "1234567"
|
180
|
-
@valid_attributes[:conta_corrente] = "0403005"
|
181
|
-
boleto_novo = BancoBanespa.new(@valid_attributes)
|
182
|
-
boleto_novo.should be_instance_of(BancoBanespa)
|
183
|
-
%w| pdf jpg tif png ps |.each do |format|
|
184
|
-
file_body=boleto_novo.to(format.to_sym)
|
185
|
-
tmp_file=Tempfile.new("foobar." << format)
|
186
|
-
tmp_file.puts file_body
|
187
|
-
tmp_file.close
|
188
|
-
File.exist?(tmp_file.path).should be_true
|
189
|
-
File.stat(tmp_file.path).zero?.should be_false
|
190
|
-
File.delete(tmp_file.path).should eql(1)
|
191
|
-
File.exist?(tmp_file.path).should be_false
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|