class PortugueseValidators::PortugueseNifValidator

Validates Portuguese NIF’s.

The portuguese NIF is composed by 9 digits and it must start with 1, 2, 5, 6, 7, 8 or 9. The last digit is the control digit.

Public Instance Methods

is_valid?(number) click to toggle source
# File lib/portuguese_validators/nif.rb, line 12
def is_valid?(number)
  return false unless number

  nif = number.to_s
  looks_like_nif?(nif) && valid_nif?(nif)
end
validate_each(record, attribute, value) click to toggle source
# File lib/portuguese_validators/nif.rb, line 7
def validate_each(record, attribute, value)
  return if value.blank?
  record.errors.add(attribute, options[:message] || :invalid) unless is_valid?(value)
end

Private Instance Methods

looks_like_nif?(number) click to toggle source
# File lib/portuguese_validators/nif.rb, line 35
def looks_like_nif?(number)
  return false unless number
  number.match(/^\d{9}$/) && number.match(/^[1256789]/) ? true : false
end
valid_nif?(number) click to toggle source
# File lib/portuguese_validators/nif.rb, line 21
def valid_nif?(number)
  control = number.split('').map { |digit| digit.to_i }

  sum = 0
  9.downto(2) do |num|
    sum += num * control.shift
  end

  expected = 11 - sum % 11
  expected = 0 if expected > 9 # when the value is greater than 9 then we assume 0

  expected == control.last
end