class NationalIdentificationNumber::Finnish

Constants

CHECKSUMS

Attributes

date[R]

Private Class Methods

calculate_checksum(number) click to toggle source
# File lib/national_identification_number/finnish.rb, line 50
def self.calculate_checksum(number)
  CHECKSUMS[number.to_i % 31]
end

Protected Instance Methods

repair() click to toggle source
# File lib/national_identification_number/finnish.rb, line 12
def repair
  super
  if @number.match(/(\d{6})(\-{0,1})(\d{3})([#{CHECKSUMS.join('')}]{1})/)
    @number = "#{$1}-#{$3}#{$4}"
  else
    @number.gsub!(/[^#{CHECKSUMS.join('')}\-\+]/, '')
  end
end
validate() click to toggle source
# File lib/national_identification_number/finnish.rb, line 21
def validate
  if @number.match(/(\d{2})(\d{2})(\d{2})([\-\+A]{0,1})(\d{3})([#{CHECKSUMS.join('')}]{1})/)
    checksum = self.class.calculate_checksum("#{$1}#{$2}#{$3}#{$5}")
    if checksum == $6

      day     = $1.to_i
      month   = $2.to_i
      year    = $3.to_i
      divider ||= $4 ||'-'
      serial  = $5.to_i

      century = case divider
      when '+' then 1800
      when 'A' then 2000
      else          1900
      end

      begin
        @date = Date.parse("#{century+year}-#{month}-#{day}")
        @valid = true
        @number = ("#{$1}#{$2}#{$3}#{divider}#{$5}#{checksum}")
      rescue ArgumentError
      end
    end
  end
end