Sha256: 899c6c65920a7cf4cdd5255d5f728b0f01531bc6ea1b8879e62920ca3a6f3802

Contents?: true

Size: 1.28 KB

Versions: 9

Compression:

Stored size: 1.28 KB

Contents

class CNPJ
  def initialize(number)
    number =~ /^(\d{2}\.?\d{3}\.?\d{3}\/?\d{4})-?(\d{2})$/
    @number = number
    @pure_number = $1
    @result = $2
    @cleaned_number = @pure_number.nil? ? nil : @number.gsub(/[\.\/-]/, "")
    format_number! if @pure_number
  end

  def valid?
    return true if @number.nil?
    return false unless @pure_number
    check_cnpj
  end

  def number
    @number
  end

  private

  def check_cnpj
    return false if @cleaned_number.length != 14 or @cleaned_number.scan(/\d/).uniq.length == 1
    @result == first_digit_verifier + second_digit_verifier
  end

  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

  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

  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

  def digit_verifier(rest)
    rest < 2 ? 0 : 11 - rest
  end

  def format_number!
    @cleaned_number =~ /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/
    @number = "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
validates_cnpj-1.1.3 lib/validates_cnpj/cnpj.rb
validates_cnpj-1.1.2 lib/validates_cnpj/cnpj.rb
validates_cnpj-1.1.1 lib/validates_cnpj/cnpj.rb
validates_cnpj-1.1.0 lib/validates_cnpj/cnpj.rb
validates_cnpj-1.0.0 lib/validates_cnpj/cnpj.rb
validates_cnpj-0.1.2 lib/validates_cnpj/cnpj.rb
validates_cnpj-0.1.1 lib/validates_cnpj/cnpj.rb
validates_cnpj-0.1.0 lib/validates_cnpj/cnpj.rb
validates_cnpj-0.0.1 lib/validates_cnpj/cnpj.rb