Class: CpfCnpjPlus::Validator::Cnpj

Inherits:
Object
  • Object
show all
Defined in:
lib/cpf_cnpj_plus/validator/cnpj.rb

Overview

Responsável por validar, formatar e manipular números de CNPJ. Inclui métodos para checagem de validade, geração e formatação.

Class Method Summary collapse

Class Method Details

.calculate_cnpj_digits(base) ⇒ Object



36
37
38
39
40
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 36

def self.calculate_cnpj_digits(base)
  first_digit = calculate_digit(base, fator_index_1d)
  second_digit = calculate_digit(base + [first_digit], fator_index_2d)
  "#{first_digit}#{second_digit}"
end

.calculate_digit(base, fator_index) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 50

def self.calculate_digit(base, fator_index)
  soma = 0
  fator_index.each_with_index do |fator, index|
    soma += base[index] * fator
  end
  digit = (soma * 10) % 11
  digit = 0 if digit == 10
  digit
end

.char_to_value(char) ⇒ Object



32
33
34
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 32

def self.char_to_value(char)
  char.ord - 48
end

.cnpj_not_valid?(cnpj) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 60

def self.cnpj_not_valid?(cnpj)
  cnpj = cnpj.to_s.gsub(/[^0-9]/, "")
  %w[00000000000000 11111111111111 22222222222222 33333333333333
     44444444444444 55555555555555 66666666666666 77777777777777
     88888888888888 99999999999999].include?(cnpj)
end

.fator_index_1dObject



42
43
44
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 42

def self.fator_index_1d
  [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
end

.fator_index_2dObject



46
47
48
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 46

def self.fator_index_2d
  [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
end

.normalize(cnpj) ⇒ Object



20
21
22
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 20

def self.normalize(cnpj)
  cnpj.to_s.upcase.gsub(/[^A-Z0-9]/, "")
end

.valid?(cnpj) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
11
12
13
14
15
16
17
18
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 8

def self.valid?(cnpj)
  cnpj = normalize(cnpj)
  return false unless valid_length?(cnpj)
  return false if cnpj_not_valid?(cnpj)
  return false unless valid_structure?(cnpj)

  base = cnpj[0..11].chars.map { |c| char_to_value(c) }
  dv = cnpj[12..13]

  dv == calculate_cnpj_digits(base)
end

.valid_length?(cnpj) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 24

def self.valid_length?(cnpj)
  cnpj.length == 14
end

.valid_structure?(cnpj) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/cpf_cnpj_plus/validator/cnpj.rb', line 28

def self.valid_structure?(cnpj)
  cnpj[0..11] =~ /^[A-Z0-9]{12}$/ && cnpj[12..13] =~ /^[0-9]{2}$/
end