brcpfcnpj 3.0.4 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/lib/brcpfcnpj/cnpj.rb +5 -5
- data/lib/brcpfcnpj/cpf.rb +5 -5
- data/lib/brcpfcnpj/cpf_cnpj.rb +35 -35
- data/lib/brcpfcnpj/cpf_cnpj_activerecord.rb +9 -9
- data/lib/brcpfcnpj/version.rb +1 -1
- metadata +32 -8
data/Rakefile
CHANGED
data/lib/brcpfcnpj/cnpj.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# Como usar a classe Cnpj no seu ActiveRecord:
|
11
11
|
#
|
12
12
|
# Suponha que temos um model Empresa, com um atributo 'cnpj'
|
13
|
-
# que voce quer usar como um numero de documento para cnpj. Basta usar o
|
13
|
+
# que voce quer usar como um numero de documento para cnpj. Basta usar o
|
14
14
|
# metodo <tt>usar_como_cnpj</tt>, assim:
|
15
15
|
#
|
16
16
|
# class Empresa < ActiveRecord::Base
|
@@ -24,10 +24,10 @@
|
|
24
24
|
# puts e.cnpj # ==> 69.103.604/0001-60
|
25
25
|
# e.cnpj.valido? # ==> true
|
26
26
|
# e.cnpj_valido? # ==> true
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# e = Empresa.new(:cnpj => "69.103.604/0001-60")
|
29
29
|
# puts e.cnpj # ==> 69.103.604/0001-60
|
30
|
-
#
|
30
|
+
#
|
31
31
|
# e = Empresa.new
|
32
32
|
# e.cnpj = Cnpj.new("691036040001-60")
|
33
33
|
# puts e.cnpj # ==> 69.103.604/0001-60
|
@@ -37,10 +37,10 @@
|
|
37
37
|
# puts e.valid? # ==> false
|
38
38
|
# e.save # ==> false
|
39
39
|
# e.errors.on(:cnpj) # ==> 'número inválido'
|
40
|
-
#
|
40
|
+
#
|
41
41
|
# c = Cnpj.new("69103604000160")
|
42
42
|
# e.cnpj = "69.103.604/0001-60"
|
43
|
-
# c == e.cnpj # ==> true
|
43
|
+
# c == e.cnpj # ==> true
|
44
44
|
class Cnpj
|
45
45
|
include CpfCnpj
|
46
46
|
end
|
data/lib/brcpfcnpj/cpf.rb
CHANGED
@@ -11,17 +11,17 @@
|
|
11
11
|
# Como usar a classe Cpf no seu ActiveRecord:
|
12
12
|
#
|
13
13
|
# Suponha que temos um model Pessoa, com um atributo 'cpf'
|
14
|
-
# que voce quer usar como um numero de documento para cpf. Basta usar o
|
14
|
+
# que voce quer usar como um numero de documento para cpf. Basta usar o
|
15
15
|
# metodo <tt>usar_como_cpf</tt>, assim:
|
16
16
|
#
|
17
17
|
# class Pessoa < ActiveRecord::Base
|
18
18
|
# usar_como_cpf :cpf
|
19
19
|
# end
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# O atributo que sera usado como cpf pode ter qualquer nome e nao apenas 'cpf'
|
22
22
|
#
|
23
23
|
# Agora voce pode usar o atributo para cpf da seguinte forma:
|
24
|
-
#
|
24
|
+
#
|
25
25
|
# p = Pessoa.new
|
26
26
|
# p.cpf = "11144477735"
|
27
27
|
# puts p.cpf # ==> 111.444.777-35
|
@@ -44,8 +44,8 @@
|
|
44
44
|
# c = Cpf.new("11144477735")
|
45
45
|
# p.cpf = "111.444.777-35"
|
46
46
|
# c == p.cpf # ==> true
|
47
|
-
#
|
48
|
-
class Cpf
|
47
|
+
#
|
48
|
+
class Cpf
|
49
49
|
include CpfCnpj
|
50
50
|
end
|
51
51
|
|
data/lib/brcpfcnpj/cpf_cnpj.rb
CHANGED
@@ -1,90 +1,90 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
module CpfCnpj
|
3
3
|
attr_reader :numero
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(numero)
|
6
|
-
@numero = numero
|
6
|
+
@numero = numero
|
7
7
|
@match = self.instance_of?(Cpf) ? @numero =~ CPF_REGEX : @numero =~ CNPJ_REGEX
|
8
8
|
@numero_puro = $1
|
9
9
|
@para_verificacao = $2
|
10
10
|
@numero = (@match ? format_number! : nil)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def to_s
|
14
14
|
@numero || ""
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def ==(outro_doc)
|
18
18
|
self.numero == outro_doc.numero
|
19
19
|
end
|
20
|
-
|
21
|
-
# Verifica se o numero possui o formato correto e se
|
20
|
+
|
21
|
+
# Verifica se o numero possui o formato correto e se
|
22
22
|
# constitui um numero de documento valido, dependendo do seu
|
23
23
|
# tipo (Cpf ou Cnpj).
|
24
|
-
def valido?
|
25
|
-
return false unless @match
|
24
|
+
def valido?
|
25
|
+
return false unless @match
|
26
26
|
verifica_numero
|
27
|
-
end
|
28
|
-
|
27
|
+
end
|
28
|
+
|
29
29
|
private
|
30
30
|
DIVISOR = 11
|
31
|
-
|
31
|
+
|
32
32
|
CPF_LENGTH = 11
|
33
33
|
CPF_REGEX = /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/
|
34
34
|
CPF_ALGS_1 = [10, 9, 8, 7, 6, 5, 4, 3, 2]
|
35
|
-
CPF_ALGS_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
|
36
|
-
|
37
|
-
CNPJ_LENGTH = 14
|
35
|
+
CPF_ALGS_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
|
36
|
+
|
37
|
+
CNPJ_LENGTH = 14
|
38
38
|
CNPJ_REGEX = /^(\d{2}\.?\d{3}\.?\d{3}\/?\d{4})-?(\d{2})$/ # <= 11.222.333/0001-XX
|
39
39
|
CNPJ_ALGS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
40
|
-
CNPJ_ALGS_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
41
|
-
|
42
|
-
|
43
|
-
def verifica_numero
|
40
|
+
CNPJ_ALGS_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
41
|
+
|
42
|
+
|
43
|
+
def verifica_numero
|
44
44
|
limpo = @numero.gsub(/[\.\/-]/, "")
|
45
45
|
if self.instance_of? Cpf
|
46
46
|
return false if limpo.length != 11
|
47
47
|
elsif self.instance_of? Cnpj
|
48
48
|
return false if limpo.length != 14
|
49
|
-
end
|
49
|
+
end
|
50
50
|
return false if limpo.scan(/\d/).uniq.length == 1
|
51
51
|
primeiro_verificador = primeiro_digito_verificador
|
52
52
|
segundo_verificador = segundo_digito_verificador(primeiro_verificador)
|
53
53
|
verif = primeiro_verificador + segundo_verificador
|
54
54
|
verif == @para_verificacao
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def multiplica_e_soma(algs, numero_str)
|
58
58
|
multiplicados = []
|
59
|
-
numero_str.scan(/\d{1}/).each_with_index { |e, i| multiplicados[i] = e.to_i * algs[i] }
|
60
|
-
multiplicados.inject { |s,e| s + e }
|
59
|
+
numero_str.scan(/\d{1}/).each_with_index { |e, i| multiplicados[i] = e.to_i * algs[i] }
|
60
|
+
multiplicados.inject { |s,e| s + e }
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def digito_verificador(resto)
|
64
64
|
resto < 2 ? 0 : DIVISOR - resto
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def primeiro_digito_verificador
|
68
|
-
array = self.instance_of?(Cpf) ? CPF_ALGS_1 : CNPJ_ALGS_1
|
69
|
-
soma = multiplica_e_soma(array, @numero_puro)
|
68
|
+
array = self.instance_of?(Cpf) ? CPF_ALGS_1 : CNPJ_ALGS_1
|
69
|
+
soma = multiplica_e_soma(array, @numero_puro)
|
70
70
|
digito_verificador(soma%DIVISOR).to_s
|
71
71
|
end
|
72
72
|
|
73
|
-
def segundo_digito_verificador(primeiro_verificador)
|
74
|
-
array = self.instance_of?(Cpf) ? CPF_ALGS_2 : CNPJ_ALGS_2
|
75
|
-
soma = multiplica_e_soma(array, @numero_puro + primeiro_verificador)
|
73
|
+
def segundo_digito_verificador(primeiro_verificador)
|
74
|
+
array = self.instance_of?(Cpf) ? CPF_ALGS_2 : CNPJ_ALGS_2
|
75
|
+
soma = multiplica_e_soma(array, @numero_puro + primeiro_verificador)
|
76
76
|
digito_verificador(soma%DIVISOR).to_s
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def format_number!
|
80
80
|
if self.instance_of? Cpf
|
81
81
|
@numero =~ /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/
|
82
82
|
@numero = "#{$1}.#{$2}.#{$3}-#{$4}"
|
83
83
|
else
|
84
|
-
@numero =~ /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/
|
85
|
-
@numero = "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
84
|
+
@numero =~ /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/
|
85
|
+
@numero = "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
89
|
end
|
90
90
|
|
@@ -7,7 +7,7 @@ module CpfCnpjActiveRecord #:nodoc:
|
|
7
7
|
def usar_como_cpf(*args) #:nodoc:
|
8
8
|
init(args, 'Cpf')
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def usar_como_cnpj(*args) #:nodoc:
|
12
12
|
init(args, 'Cnpj')
|
13
13
|
end
|
@@ -18,16 +18,16 @@ module CpfCnpjActiveRecord #:nodoc:
|
|
18
18
|
add_composed_class(name, klass)
|
19
19
|
module_eval create_code(name.to_s, klass)
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def add_composed_class(name, klass)
|
25
25
|
options = {:class_name => klass, :mapping => [name.to_s, "numero"], :allow_nil => true}
|
26
26
|
constructor = Proc.new { |numero| eval(klass).new(numero) }
|
27
27
|
converter = Proc.new { |value| eval(klass).new(value) }
|
28
|
-
begin
|
28
|
+
begin
|
29
29
|
composed_of name, options.merge( { :constructor => constructor, :converter => converter } )
|
30
|
-
rescue Exception
|
30
|
+
rescue Exception
|
31
31
|
composed_of name, options { eval(klass).new(name[:numero]) }
|
32
32
|
end
|
33
33
|
end
|
@@ -42,15 +42,15 @@ module CpfCnpjActiveRecord #:nodoc:
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
def #{name}=(value)
|
45
|
-
if value.blank?
|
45
|
+
if value.blank?
|
46
46
|
write_attribute('#{name}', nil)
|
47
|
-
elsif value.kind_of?(#{eval(klass)})
|
47
|
+
elsif value.kind_of?(#{eval(klass)})
|
48
48
|
write_attribute('#{name}', value.numero)
|
49
49
|
else
|
50
|
-
begin
|
50
|
+
begin
|
51
51
|
c = #{eval(klass)}.new(value)
|
52
|
-
c.valido? ? write_attribute('#{name}', c.numero) : write_attribute('#{name}', value)
|
53
|
-
rescue
|
52
|
+
c.valido? ? write_attribute('#{name}', c.numero) : write_attribute('#{name}', value)
|
53
|
+
rescue
|
54
54
|
@#{name} = value
|
55
55
|
end
|
56
56
|
end
|
data/lib/brcpfcnpj/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brcpfcnpj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 3
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
version: 3.0.5
|
6
10
|
platform: ruby
|
7
11
|
authors:
|
8
12
|
- "Marcos Tapaj\xC3\xB3s"
|
@@ -16,52 +20,66 @@ autorequire:
|
|
16
20
|
bindir: bin
|
17
21
|
cert_chain: []
|
18
22
|
|
19
|
-
date:
|
23
|
+
date: 2012-01-02 00:00:00 -02:00
|
20
24
|
default_executable:
|
21
25
|
dependencies:
|
22
26
|
- !ruby/object:Gem::Dependency
|
23
27
|
name: actionpack
|
24
|
-
prerelease: false
|
25
28
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
29
|
none: false
|
27
30
|
requirements:
|
28
31
|
- - ">="
|
29
32
|
- !ruby/object:Gem::Version
|
33
|
+
segments:
|
34
|
+
- 3
|
35
|
+
- 0
|
36
|
+
- 0
|
30
37
|
version: 3.0.0
|
31
38
|
type: :runtime
|
39
|
+
prerelease: false
|
32
40
|
version_requirements: *id001
|
33
41
|
- !ruby/object:Gem::Dependency
|
34
42
|
name: activesupport
|
35
|
-
prerelease: false
|
36
43
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
44
|
none: false
|
38
45
|
requirements:
|
39
46
|
- - ">="
|
40
47
|
- !ruby/object:Gem::Version
|
48
|
+
segments:
|
49
|
+
- 3
|
50
|
+
- 0
|
51
|
+
- 0
|
41
52
|
version: 3.0.0
|
42
53
|
type: :runtime
|
54
|
+
prerelease: false
|
43
55
|
version_requirements: *id002
|
44
56
|
- !ruby/object:Gem::Dependency
|
45
57
|
name: rake
|
46
|
-
prerelease: false
|
47
58
|
requirement: &id003 !ruby/object:Gem::Requirement
|
48
59
|
none: false
|
49
60
|
requirements:
|
50
61
|
- - ">="
|
51
62
|
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
52
65
|
version: "0"
|
53
66
|
type: :development
|
67
|
+
prerelease: false
|
54
68
|
version_requirements: *id003
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rspec
|
57
|
-
prerelease: false
|
58
71
|
requirement: &id004 !ruby/object:Gem::Requirement
|
59
72
|
none: false
|
60
73
|
requirements:
|
61
74
|
- - ">="
|
62
75
|
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 2
|
78
|
+
- 0
|
79
|
+
- 0
|
63
80
|
version: 2.0.0
|
64
81
|
type: :development
|
82
|
+
prerelease: false
|
65
83
|
version_requirements: *id004
|
66
84
|
description: "brcpfcnpj \xC3\xA9 uma das gems que compoem o Brazilian Rails"
|
67
85
|
email:
|
@@ -103,17 +121,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
121
|
requirements:
|
104
122
|
- - ">="
|
105
123
|
- !ruby/object:Gem::Version
|
124
|
+
hash: 3608075777574979284
|
125
|
+
segments:
|
126
|
+
- 0
|
106
127
|
version: "0"
|
107
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
129
|
none: false
|
109
130
|
requirements:
|
110
131
|
- - ">="
|
111
132
|
- !ruby/object:Gem::Version
|
133
|
+
hash: 3608075777574979284
|
134
|
+
segments:
|
135
|
+
- 0
|
112
136
|
version: "0"
|
113
137
|
requirements:
|
114
138
|
- none
|
115
139
|
rubyforge_project: brcpfcnpj
|
116
|
-
rubygems_version: 1.
|
140
|
+
rubygems_version: 1.3.7
|
117
141
|
signing_key:
|
118
142
|
specification_version: 3
|
119
143
|
summary: "brcpfcnpj \xC3\xA9 uma das gems que compoem o Brazilian Rails"
|