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