Sha256: ac718f108d39dee459ff49079553dac45865963d1f8e9f7cb496921f4938d849

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

module SsnValidator
  class Ssn

    attr_reader :ssn,:area,:group,:serial_number
    attr_reader :errors


    def initialize(ssn)
      @errors = []
      ssn = ssn.to_s
      if ssn =~ /-/ && ssn !~ /\d\d\d-\d\d-\d\d\d\d/
        @errors << 'Hyphen misplaced.'
      end

      ssn.gsub!('-','')
      if ssn.to_s.size != 9
        @errors <<  'SSN not 9 digits long.'
      end

      if ssn =~ /\D/
        @errors << 'Non-digit found.'
      end

      #known dummy numbers
      if ["078051120","111111111","123456789","219099999","999999999"].include? ssn || (ssn >= "987654320" and ssn <= "987654329")
        @errors << "Known dummy SSN."
      end
      #known invalid area, group and serial numbers
      if ssn =~ /\d{3}00\d{4}|0000\Z/
        @errors << "Invalid group or serial number."
      end

      @ssn = ssn
      @area = ssn.first(3)
      @group = ssn[3,2]
      @serial_number = ssn.last(4)

      if @errors.empty?
        @ssn_high_group_code = SsnHighGroupCode.find_by_area(@area, :order => 'as_of desc')
        if @ssn_high_group_code.nil?
          @errors << "Area '#{@area}' has not been assigned."
        else

          define_group_ranks
          
          if @group_ranks[@group] > @group_ranks[@ssn_high_group_code.group]
            @errors << "Group '#{@group}' has not been assigned yet for area '#{@area}'"
          end
        end
      end


    end

    def valid?
      @errors.empty?
    end


    private

    def define_group_ranks
      @group_ranks = {}
      rank = 0
      (1..9).step(2) do |group|
        @group_ranks.merge!("0#{group.to_s}" => rank += 1)
      end
      (10..98).step(2) do |group|
        @group_ranks.merge!(group.to_s => rank += 1)
      end
      (2..8).step(2) do |group|
        @group_ranks.merge!("0#{group.to_s}" => rank += 1)
      end
      (11..99).step(2) do |group|
        @group_ranks.merge!(group.to_s => rank += 1)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kevintyll-ssn_validator-0.1.1 lib/ssn_validator/models/ssn_validator.rb