Przejdź do głównej zawartości

PESEL

PESEL (Powszechny Elektroniczny System Ewidencji Ludności) to 11-cyfrowy numer ewidencyjny obywateli Polski. Koduje datę urodzenia, stulecie, płeć i numer porządkowy.

use SlashLab\Numerik\Numerik;
// Szybkie sprawdzenie
Numerik::pesel()->isValid('92060512186'); // true
// Pełny obiekt z danymi
$result = Numerik::pesel()->validate('92060512186');
$result->isValid; // true
// Parsowanie do obiektu z danymi
$pesel = Numerik::pesel()->parse('92060512186');
// Null zamiast wyjątku
$pesel = Numerik::pesel()->tryParse('zły-numer'); // null

parse() i tryParse() zwracają instancję SlashLab\Numerik\ValueObjects\Pesel.

MetodaTyp zwracanyOpis
getRaw()stringOryginalny numer, bez zmian.
getNormalized()stringCyfry po usunięciu białych znaków.
__toString()stringTo samo co getNormalized().
MetodaTyp zwracanyOpis
getBirthDate()DateTimeImmutableData urodzenia zdekodowana z PESEL.
getGender()GenderGender::Male lub Gender::Female.
getOrdinalNumber()intNumer porządkowy (cyfry 7–10).
getCentury()intStulecie urodzenia jako rok bazowy, np. 1900, 2000, 2100.
MetodaTyp zwracanyOpis
isMale()boolSkrót dla getGender() === Gender::Male.
isFemale()boolSkrót dla getGender() === Gender::Female.
getAge()intPełne lata od daty urodzenia do dzisiaj.
isAdult()booltrue gdy getAge() >= 18.
$pesel = Numerik::pesel()->parse('92060512186');
$pesel->getRaw(); // '92060512186'
$pesel->getNormalized(); // '92060512186'
$pesel->getBirthDate()->format('Y-m-d'); // '1992-06-05'
$pesel->getGender(); // Gender::Female
$pesel->isFemale(); // true
$pesel->getOrdinalNumber(); // 1218 (cyfry 7–10)
$pesel->getCentury(); // 1900
$pesel->getAge(); // obliczony od dzisiaj
$pesel->isAdult(); // true

Cyfry miesiąca w numerze PESEL kodują zarówno rzeczywisty miesiąc, jak i stulecie urodzenia:

Zapisany zakres miesięcyRzeczywisty miesiącStulecie urodzenia
01–1201–121900–1999
21–3201–122000–2099
41–5201–122100–2199
61–7201–122200–2299
81–9201–121800–1899
PowódWartośćWarunek
InvalidLengthinvalid_lengthNumer nie ma dokładnie 11 cyfr po normalizacji.
InvalidCharactersinvalid_charactersPo usunięciu białych znaków pozostały znaki niebędące cyframi.
InvalidMonthinvalid_monthKodowanie miesiąca nie odpowiada żadnemu ze znanych zakresów stulecia.
InvalidDateinvalid_dateZdekodowana data nie jest prawidłową datą kalendarzową.
FutureDatefuture_dateZdekodowana data urodzenia jest w przyszłości — tylko w trybie ścisłym.
InvalidChecksuminvalid_checksumCyfra kontrolna nie zgadza się z obliczoną wartością.
AllSameDigitall_same_digitWszystkie 11 cyfr jest identycznych — tylko w trybie ścisłym.

Wagi: 1, 3, 7, 9, 1, 3, 7, 9, 1, 3

  1. Usuń białe znaki. Odrzuć numery dłuższe niż 32 znaki. Wymagaj dokładnie 11 cyfr — inaczej błąd InvalidLength.
  2. Zdekoduj datę urodzenia według powyższej tabeli. Sprawdź, czy data jest prawidłowa. W trybie ścisłym: odrzuć również przyszłe daty.
  3. Oblicz sumę kontrolną: pomnóż każdą z pierwszych 10 cyfr przez jej wagę i zsumuj. Następnie: mod 1010 minus wynikmod 10. Wynik musi zgadzać się z 11. cyfrą — inaczej błąd InvalidChecksum.
  4. W trybie ścisłym: jeśli wszystkie 11 cyfr jest identycznych — błąd AllSameDigit.

Pełna dokumentacja w sekcji Algorytmy.

If this saved you time → ☕ Buy me a coffee