class PersonPin::Cnp

Simple random CNP generator for romanian sitizens

Public Class Methods

calculate_check_sum(cnp) click to toggle source
# File lib/person_pin/cnp.rb, line 33
def self.calculate_check_sum(cnp)
  weights = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9]
  sum = 0
  cnp.split('').each_with_index do |digit, index|
    sum += digit.to_i * weights[index]
  end
  control_digit = sum % 11
  control_digit == 10 ? 1 : control_digit
end
daily(gender, year, month, day, county_code) click to toggle source
# File lib/person_pin/cnp.rb, line 17
def self.daily(gender, year, month, day, county_code)
  gender_s = gender.to_s
  year_s = (year % 100).to_s.rjust(2, '0')
  month_s = month.to_s.rjust(2, '0')
  day_s = day.to_s.rjust(2, '0')
  county_code_s = (county_code % 100).to_s.rjust(2, '0')
  base = gender_s + year_s + month_s + day_s + county_code_s
  results = []
  1000.times do |sequence|
    cnp = base + sequence.to_s.rjust(3, '0')
    cnp[12] = calculate_check_sum(cnp).to_s
    results << cnp
  end
  results
end
random() click to toggle source
# File lib/person_pin/cnp.rb, line 8
def self.random
  gender = rand(1..2)
  year = rand(1800..(Time.now.year - 18))
  month = rand(1..12)
  day = rand(1..28)
  county_code = rand(1..52)
  daily(gender, year, month, day, county_code)[rand(0..999)]
end
valid?(cnp) click to toggle source
# File lib/person_pin/cnp.rb, line 4
def self.valid?(cnp)
  (cnp.length == 13) && (calculate_check_sum(cnp[0..11]) == cnp[12].to_i)
end