class SocialSecurityNumber::Se

SocialSecurityNumber::Se validates Sweden Personal Identity Number (personnummer) en.wikipedia.org/wiki/National_identification_number#Sweden

Constants

CONTROLCIPHERS
DATE_REGEXP
MODULUS
REGEXP
YEAR_REGEXP

Public Instance Methods

validate() click to toggle source
# File lib/social_security_number/country/se.rb, line 5
def validate
  @error = if !check_by_regexp(REGEXP)
             'bad number format'
           elsif !birth_date
             'number birth date is invalid'
           elsif !check_control_digit
             'number control sum invalid'
           end
end
year() click to toggle source
# File lib/social_security_number/country/se.rb, line 15
def year
  if @parsed_civil_number
    @year = base + @parsed_civil_number[:year].to_i
  else
    0
  end
end

Private Instance Methods

base() click to toggle source
# File lib/social_security_number/country/se.rb, line 52
def base
  case @parsed_civil_number[:year].to_i
  when 0..40 then 2000
  when 40..99 then 1900
  else
    0
  end
end
check_control_digit() click to toggle source
# File lib/social_security_number/country/se.rb, line 33
def check_control_digit
  sum = checksum(:even)
  control_number = (sum % 10 != 0) ? 10 - (sum % 10) : 0
  return true if @control_number.to_s.empty?
  control_number.to_i == @control_number.to_i
end
checksum(operation) click to toggle source
# File lib/social_security_number/country/se.rb, line 40
def checksum(operation)
  i = 0
  compare_method = operation == :even ? :== : :>
  numer = @civil_number.gsub(/\-|\+/, '').to_s.length == 10 ? digit_number[0..8] : digit_number[2..10]
  numer.reverse.split('').reduce(0) do |sum, c|
    n = c.to_i
    weight = (i % 2).send(compare_method, 0) ? n * 2 : n
    i += 1
    sum += weight < 10 ? weight : weight - 9
  end
end