class PeselInspector

Fetch birth date, sex and series number from PESEL number

Constants

CENTURIES
ERROR_MESSAGE
PESEL_LENGTH
PeselError

Attributes

birth_date[R]
pesel[R]
series_number[R]
sex[R]

Public Class Methods

new(pes) click to toggle source
# File lib/pesel_inspector.rb, line 18
def initialize(pes)
  pesel = pes.to_s
  validate(pesel)
  @pesel = pesel
  @birth_date = parse_birth_date
  @sex = pesel[9].to_i.even? ? 'female' : 'male'
  @series_number = pesel[6..9]
end

Private Instance Methods

day() click to toggle source
# File lib/pesel_inspector.rb, line 42
def day
  pesel[4..5]
end
month() click to toggle source
# File lib/pesel_inspector.rb, line 46
def month
  pesel[2..3].to_i % 20
end
parse_birth_date() click to toggle source
# File lib/pesel_inspector.rb, line 29
def parse_birth_date
  begin
    date = Date.parse [day, month, year].join('/')
  rescue ArgumentError
    raise PeselError, ERROR_MESSAGE
  end
  date
end
validate(p) click to toggle source

rubocop:disable AbcSize

# File lib/pesel_inspector.rb, line 51
def validate(p)
  raise PeselError, ERROR_MESSAGE unless p.size == PESEL_LENGTH
  p = p.split('').map(&:to_i)
  primo   = p[0] + 3 * p[1] + 7 * p[2] + 9 * p[3]
  secondo = p[4] + 3 * p[5] + 7 * p[6] + 9 * p[7] + p[8] + 3 * p[9] + p[10]
  raise PeselError, ERROR_MESSAGE unless (primo + secondo) % 10 == 0
end
year() click to toggle source
# File lib/pesel_inspector.rb, line 38
def year
  CENTURIES[pesel[2]] + pesel[0..1]
end