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.

Metoda Typ zwracany Opis
getRaw() string Oryginalny numer, bez zmian.
getNormalized() string Cyfry po usunięciu białych znaków.
__toString() string To samo co getNormalized().
Metoda Typ zwracany Opis
getBirthDate() DateTimeImmutable Data urodzenia zdekodowana z PESEL.
getGender() Gender Gender::Male lub Gender::Female.
getOrdinalNumber() int Numer porządkowy (cyfry 7–10).
getCentury() int Stulecie urodzenia jako rok bazowy, np. 1900, 2000, 2100.
Metoda Typ zwracany Opis
isMale() bool Skrót dla getGender() === Gender::Male.
isFemale() bool Skrót dla getGender() === Gender::Female.
getAge() int Pełne lata od daty urodzenia do dzisiaj.
isAdult() bool true 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ęcy Rzeczywisty miesiąc Stulecie urodzenia
01–12 01–12 1900–1999
21–32 01–12 2000–2099
41–52 01–12 2100–2199
61–72 01–12 2200–2299
81–92 01–12 1800–1899
Powód Wartość Warunek
InvalidLength invalid_length Numer nie ma dokładnie 11 cyfr po normalizacji.
InvalidCharacters invalid_characters Po usunięciu białych znaków pozostały znaki niebędące cyframi.
InvalidMonth invalid_month Kodowanie miesiąca nie odpowiada żadnemu ze znanych zakresów stulecia.
InvalidDate invalid_date Zdekodowana data nie jest prawidłową datą kalendarzową.
FutureDate future_date Zdekodowana data urodzenia jest w przyszłości — tylko w trybie ścisłym.
InvalidChecksum invalid_checksum Cyfra kontrolna nie zgadza się z obliczoną wartością.
AllSameDigit all_same_digit Wszystkie 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