module SsnValidation::Ssn

Constants

DIGITS
DIGITS_EX0
VALID_ITIN_GROUPS

Public Class Methods

ascending?(ssn) click to toggle source
# File lib/ssn_validation/ssn.rb, line 39
def self.ascending?(ssn)
  return true if ssn.chars == DIGITS.rotate(ssn[0].to_i)[0..8]
  return true if ssn.chars == DIGITS_EX0.rotate(ssn[0].to_i - 1)

  false
end
descending?(ssn) click to toggle source
# File lib/ssn_validation/ssn.rb, line 46
def self.descending?(ssn)
  return true if ssn.chars == DIGITS.reverse.rotate(-(ssn[0].to_i + 1))[0..8]
  return true if ssn.chars == DIGITS_EX0.reverse.rotate(-ssn[0].to_i)

  false
end
enable_ascending?() click to toggle source
# File lib/ssn_validation/ssn.rb, line 63
def self.enable_ascending?
  SsnValidation.config.enable_ascending
end
invalid_itin?(ssn) click to toggle source
# File lib/ssn_validation/ssn.rb, line 53
def self.invalid_itin?(ssn)
  return false unless ssn[0] == "9" 
  group = ssn[3..4].to_i
  !VALID_ITIN_GROUPS.include?(group)
end
test_ssn?(ssn) click to toggle source
# File lib/ssn_validation/ssn.rb, line 59
def self.test_ssn?(ssn)
  SsnValidation.config.test_ssns.any? {|p| p.match(ssn)}
end
validate(ssn) click to toggle source

returns a hash of 0..n key/value pairs for ssn validation error codes and a default message for each

# File lib/ssn_validation/ssn.rb, line 8
def self.validate(ssn)
  ssn    = ssn.to_s
  errors = {}
  return errors if test_ssn?(ssn)

  (ssn.length != 9) && errors[:nine_digits]        = "SSN value is not 9 digits"
  (ssn.chars - DIGITS).any? && errors[:non_digits] = "SSN value contains non-digits"
  return errors if errors.any?  # return if basic conditions fail

  (ssn[0..2] == "666") && errors[:excluded_666]       = "SSN value contains excluded area 666-xx-xxxx"
  (ssn.chars - [ssn[0]]).empty? && errors[:repeating] = "SSN value contains repeating digits"
  (ssn[0..2] == "000") && errors[:zero_area]          = "SSN value contains zeros in area number 000-xx-xxxx"
  (ssn[3..4] == "00") && errors[:zero_group]          = "SSN value contains zeros in group number xxx-00-xxxx"
  (ssn[5..8] == "0000") && errors[:zero_serial]       = "SSN value contains zeros in serial number xxx-xx-0000"
  return errors if errors.any?  # return if ssn conditions fail

  # check valid ITIN format last
  invalid_itin?(ssn) && errors[:invalid_itin] = "SSN value contains invalid ITIN format 9xx-[x]x-xxxx"

  # check extra validations for possible fake ssns if enabled
  errors.merge!(validate_ascending_descending(ssn)) if enable_ascending?
  errors
end
validate_ascending_descending(ssn) click to toggle source
# File lib/ssn_validation/ssn.rb, line 32
def self.validate_ascending_descending(ssn)
  errors = {}
  ascending?(ssn) && errors[:ascending]               = "SSN value contains all ASCENDING digits"
  descending?(ssn) && errors[:descending]             = "SSN value contains all DESCENDING digits"
  return errors 
end