/** * National Personal Identity number (personnummer) * @link https://no.wikipedia.org/wiki/Personnummer * @param \DateTime $birthdate * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE * @return string on format DDMMYY##### */ public function personalIdentityNumber(\DateTime $birthdate = null, $gender = null) { if (!$birthdate) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('dmy'); /** * @todo These number should be random based on birth year * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $randomDigits = (string) static::numerify('##'); switch ($gender) { case static::GENDER_MALE: $genderDigit = static::randomElement(array(1, 3, 5, 7, 9)); break; case static::GENDER_FEMALE: $genderDigit = static::randomElement(array(0, 2, 4, 6, 8)); break; default: $genderDigit = (string) static::numerify('#'); } $digits = $datePart . $randomDigits . $genderDigit; /** * @todo Calculate modulo 11 of $digits * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $checksum = (string) static::numerify('##'); return $digits . $checksum; }
/** * PESEL - Universal Electronic System for Registration of the Population * @link http://en.wikipedia.org/wiki/PESEL * @param DateTime $birthdate * @param string $sex M for male or F for female * @return string 11 digit number, like 44051401358 */ public static function pesel($birthdate = null, $sex = null) { if ($birthdate === null) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $weights = array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3); $length = count($weights); $fullYear = (int) $birthdate->format('Y'); $year = (int) $birthdate->format('y'); $month = $birthdate->format('m') + ((int) ($fullYear / 100) - 14) % 5 * 20; $day = $birthdate->format('d'); $result = array((int) ($year / 10), $year % 10, (int) ($month / 10), $month % 10, (int) ($day / 10), $day % 10); for ($i = 6; $i < $length; $i++) { $result[$i] = static::randomDigit(); } if ($sex == "M") { $result[$length - 1] |= 1; } elseif ($sex == "F") { $result[$length - 1] ^= 1; } $checksum = 0; for ($i = 0; $i < $length; $i++) { $checksum += $weights[$i] * $result[$i]; } $checksum = (10 - $checksum % 10) % 10; $result[] = $checksum; return implode('', $result); }
/** * National Personal Identity number (personas kods) * @link https://en.wikipedia.org/wiki/National_identification_number#Latvia * @param \DateTime $birthdate * @return string on format XXXXXX-XXXXX */ public function personalIdentityNumber(\DateTime $birthdate = null) { if (!$birthdate) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('dmy'); $randomDigits = (string) static::numerify('####'); $checksum = Luhn::computeCheckDigit($datePart . $randomDigits); return $datePart . '-' . $randomDigits . $checksum; }
/** * National Personal Identity number (personnummer) * @link http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden) * @param \DateTime $birthdate * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE * @return string on format XXXXXX-XXXX */ public function personalIdentityNumber(\DateTime $birthdate = null, $gender = null) { if (!$birthdate) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('ymd'); if ($gender && $gender == static::GENDER_MALE) { $randomDigits = (string) static::numerify('##') . static::randomElement(array(1, 3, 5, 7, 9)); } elseif ($gender && $gender == static::GENDER_FEMALE) { $randomDigits = (string) static::numerify('##') . static::randomElement(array(0, 2, 4, 6, 8)); } else { $randomDigits = (string) static::numerify('###'); } $checksum = Luhn::computeCheckDigit($datePart . $randomDigits); return $datePart . '-' . $randomDigits . $checksum; }
/** * National Personal Identity Number (Henkilötunnus) * @link http://www.finlex.fi/fi/laki/ajantasa/2010/20100128 * @param \DateTime $birthdate * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE * @return string on format DDMMYYCZZZQ, where DDMMYY is the date of birth, C the century sign, ZZZ the individual number and Q the control character (checksum) */ public function personalIdentityNumber(\DateTime $birthdate = null, $gender = null) { $checksumCharacters = '0123456789ABCDEFHJKLMNPRSTUVWXY'; if (!$birthdate) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('dmy'); switch ((int) ($birthdate->format('Y') / 100)) { case 18: $centurySign = '+'; break; case 19: $centurySign = '-'; break; case 20: $centurySign = 'A'; break; default: throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.'); } $randomDigits = self::numberBetween(0, 89); if ($gender && $gender == static::GENDER_MALE) { if ($randomDigits === 0) { $randomDigits .= static::randomElement(array(3, 5, 7, 9)); } else { $randomDigits .= static::randomElement(array(1, 3, 5, 7, 9)); } } elseif ($gender && $gender == static::GENDER_FEMALE) { if ($randomDigits === 0) { $randomDigits .= static::randomElement(array(2, 4, 6, 8)); } else { $randomDigits .= static::randomElement(array(0, 2, 4, 6, 8)); } } else { if ($randomDigits === 0) { $randomDigits .= self::numberBetween(2, 9); } else { $randomDigits .= (string) static::numerify('#'); } } $randomDigits = str_pad($randomDigits, 3, '0', STR_PAD_LEFT); $checksum = $checksumCharacters[(int) ($datePart . $randomDigits) % strlen($checksumCharacters)]; return $datePart . $centurySign . $randomDigits . $checksum; }
/** * National Personal Identity number (asmens kodas) * @link https://en.wikipedia.org/wiki/National_identification_number#Lithuania * @link https://lt.wikipedia.org/wiki/Asmens_kodas * @param string [male|female] * @param \DateTime $birthdate * @param string $randomNumber three integers * @return string on format XXXXXXXXXXX */ public function personalIdentityNumber($gender = 'male', \DateTime $birthdate = null, $randomNumber = '') { if (!$birthdate) { $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $genderNumber = $gender == 'male' ? (int) 1 : (int) 0; $firstNumber = (int) floor($birthdate->format('Y') / 100) * 2 - 34 - $genderNumber; $datePart = $birthdate->format('ymd'); $randomDigits = (string) (!$randomNumber || strlen($randomNumber < 3)) ? static::numerify('###') : substr($randomNumber, 0, 3); $partOfPerosnalCode = $firstNumber . $datePart . $randomDigits; $sum = self::calculateSum($partOfPerosnalCode, 1); $liekana = $sum % 11; if ($liekana !== 10) { $lastNumber = $liekana; return $firstNumber . $datePart . $randomDigits . $lastNumber; } $sum = self::calculateSum($partOfPerosnalCode, 2); $liekana = (int) $sum % 11; $lastNumber = $liekana !== 10 ? $liekana : 0; return $firstNumber . $datePart . $randomDigits . $lastNumber; }
public function testFixedSeedWithMaximumTimestamp() { $max = '2018-03-01 12:00:00'; mt_srand(1); $unixTime = DateTimeProvider::unixTime($max); $datetimeAD = DateTimeProvider::dateTimeAD($max); $dateTime1 = DateTimeProvider::dateTime($max); $dateTimeBetween = DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max); $date = DateTimeProvider::date('Y-m-d', $max); $time = DateTimeProvider::time('H:i:s', $max); $iso8601 = DateTimeProvider::iso8601($max); $dateTimeThisCentury = DateTimeProvider::dateTimeThisCentury($max); $dateTimeThisDecade = DateTimeProvider::dateTimeThisDecade($max); $dateTimeThisMonth = DateTimeProvider::dateTimeThisMonth($max); $amPm = DateTimeProvider::amPm($max); $dayOfMonth = DateTimeProvider::dayOfMonth($max); $dayOfWeek = DateTimeProvider::dayOfWeek($max); $month = DateTimeProvider::month($max); $monthName = DateTimeProvider::monthName($max); $year = DateTimeProvider::year($max); $dateTimeThisYear = DateTimeProvider::dateTimeThisYear($max); mt_srand(); //regenerate Random Date with same seed and same maximum end timestamp mt_srand(1); $this->assertEquals($unixTime, DateTimeProvider::unixTime($max)); $this->assertEquals($datetimeAD, DateTimeProvider::dateTimeAD($max)); $this->assertEquals($dateTime1, DateTimeProvider::dateTime($max)); $this->assertEquals($dateTimeBetween, DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max)); $this->assertEquals($date, DateTimeProvider::date('Y-m-d', $max)); $this->assertEquals($time, DateTimeProvider::time('H:i:s', $max)); $this->assertEquals($iso8601, DateTimeProvider::iso8601($max)); $this->assertEquals($dateTimeThisCentury, DateTimeProvider::dateTimeThisCentury($max)); $this->assertEquals($dateTimeThisDecade, DateTimeProvider::dateTimeThisDecade($max)); $this->assertEquals($dateTimeThisMonth, DateTimeProvider::dateTimeThisMonth($max)); $this->assertEquals($amPm, DateTimeProvider::amPm($max)); $this->assertEquals($dayOfMonth, DateTimeProvider::dayOfMonth($max)); $this->assertEquals($dayOfWeek, DateTimeProvider::dayOfWeek($max)); $this->assertEquals($month, DateTimeProvider::month($max)); $this->assertEquals($monthName, DateTimeProvider::monthName($max)); $this->assertEquals($year, DateTimeProvider::year($max)); $this->assertEquals($dateTimeThisYear, DateTimeProvider::dateTimeThisYear($max)); mt_srand(); }