class ValidatesCnpj::Cnpj

Attributes

number[R]

Public Class Methods

new(number) click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 5
def initialize(number)
  number =~ %r{^(\d{2}\.?\d{3}\.?\d{3}/?\d{4})-?(\d{2})$}
  @number = number
  @pure_number = Regexp.last_match(1)
  @result = Regexp.last_match(2)
  @cleaned_number = @pure_number.nil? ? nil : @number.gsub(%r{[\./-]}, '')
  format_number! if @pure_number
end

Public Instance Methods

valid?() click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 14
def valid?
  return true if @number.blank?
  return false unless @pure_number

  check_cnpj
end

Private Instance Methods

check_cnpj() click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 25
def check_cnpj
  return false if (@cleaned_number.length != 14) || (@cleaned_number.scan(/\d/).uniq.length == 1)

  @result == first_digit_verifier + second_digit_verifier
end
digit_verifier(rest) click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 47
def digit_verifier(rest)
  rest < 2 ? 0 : 11 - rest
end
first_digit_verifier() click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 31
def first_digit_verifier
  sum = multiply_and_sum([5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2], @pure_number)
  digit_verifier(sum % 11).to_s
end
format_number!() click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 51
def format_number!
  @cleaned_number =~ /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/

  match1 = Regexp.last_match(1)
  match2 = Regexp.last_match(2)
  match3 = Regexp.last_match(3)
  match4 = Regexp.last_match(4)
  match5 = Regexp.last_match(5)

  @number = "#{match1}.#{match2}.#{match3}/#{match4}-#{match5}"
end
multiply_and_sum(array, number) click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 41
def multiply_and_sum(array, number)
  multiplied = []
  number.scan(/\d{1}/).each_with_index { |e, i| multiplied[i] = e.to_i * array[i] }
  multiplied.inject { |s, e| s + e }
end
second_digit_verifier() click to toggle source
# File lib/validates_cnpj/cnpj.rb, line 36
def second_digit_verifier
  sum = multiply_and_sum([6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2], @pure_number + first_digit_verifier)
  digit_verifier(sum % 11).to_s
end