Przejdź do głównej zawartości

🆔 Generator numeru PESEL

Stworzysz Generator i walidator PESEL - aplikacje umozliwiajaca sprawdzanie poprawnosci struktury numeru PESEL oraz generowanie przykładowych numerow zgodnych że specyfikacja. Użytkownik może wprowadzić numer do walidacji lub wygenerowac losowy PESEL na podstawie daty urodzenia i płci. Historia operacji jest zapisywana do pliku JSON.

Czego się nauczysz?

  • Implementacji algorytmu sumy kontrolnej (modulo, wagi)
  • Walidacji złożonych danych wejsciowych
  • Generowania danych według specyfikacji
  • Pracy z datami i konwersja formatow

W prawdziwej pracy...

Walidacja numerow identyfikacyjnych (PESEL, NIP, REGON, numery kart kredytowych) to codziennosc w systemach finansowych, HR i e-commerce. Algorytmy sum kontrolnych (Luhn, modulo 10/11) sa używane wszedzie - od bankow po systemy rzadowe. Umiejetnosc implementacji takich algorytmow to cenna kompetencja programisty.

  1. Tryb walidacji Użytkownik wprowadza numer PESEL, a system sprawdza jego poprawnosc (długość, cyfry, suma kontrolna) i wyświetla szczegółowy komunikat.

  2. Tryb generowania Użytkownik podaje date urodzenia i płeć, a system generuje przykładowy numer PESEL zgodny że specyfikacja.

  3. Zapis historii Każda operacja (walidacja lub generowanie) jest zapisywana do pliku JSON wraz z wynikiem i data.

Przykładowa struktura pliku JSON:

{
"operations": [
{
"id": 1,
"mode": "validate",
"pesel": "02270803628",
"is_valid": true,
"details": {
"birth_date": "2002-07-08",
"gender": "female"
},
"created_at": "2026-02-13 10:30:00"
},
{
"id": 2,
"mode": "validate",
"pesel": "12345678901",
"is_valid": false,
"error": "Niepoprawna suma kontrolna",
"created_at": "2026-02-13 11:00:00"
},
{
"id": 3,
"mode": "generate",
"input": {
"birth_date": "1990-05-15",
"gender": "małe"
},
"pesel": "90051512357",
"created_at": "2026-02-13 11:30:00"
}
]
}

Wymagane funkcje:

  • Formularz walidacji: pole na numer PESEL
  • Sprawdzenie długości (11 cyfr)
  • Sprawdzenie czy wszystkie znaki to cyfry
  • Wyświetlenie wyniku: poprawny / niepoprawny
  • Prosty interfejs CSS

Przykładowy scenariusz:

Użytkownik wchodzi na strone i widzi formularz walidacji. Wpisuje “02270803628” i klika “Sprawdz”. System wyświetla: “PESEL ma poprawna długość i składa się z cyfr”. Przy wpisaniu “1234” widzi: “PESEL musi mieć dokładnie 11 cyfr”.

Ocena: 3.0
PESEL: RRMMDDPPPPK
RR - rok urodzenia (2 cyfry)
MM - miesiac urodzenia (z modyfikatorem stulecia)
DD - dzień urodzenia
PPPP - numer porzadkowy (ostatnia cyfra okresla płeć)
K - cyfra kontrolna
Modyfikator miesiaca dla stulecia:
- 1800-1899: miesiac + 80
- 1900-1999: miesiac (bez modyfikacji)
- 2000-2099: miesiac + 20
- 2100-2199: miesiac + 40
- 2200-2299: miesiac + 60
Płeć (10. cyfra PESEL):
- Nieparzysta (1,3,5,7,9) = mezczyzna
- Parzysta (0,2,4,6,8) = kobieta

Sprawdzenie podstawowej struktury:

function validateBasicStructure($pesel) {
if (strlen($pesel) !== 11) {
return "PESEL musi mieć dokładnie 11 cyfr";
}
if (!ctype_digit($pesel)) {
return "PESEL może zawierac tylko cyfry";
}
return null; // brak błędu
}

Algorytm sumy kontrolnej:

function validateChecksum($pesel) {
$weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
$sum = 0;
for ($i = 0; $i < 10; $i++) {
$sum += intval($pesel[$i]) * $weights[$i];
}
$checkDigit = (10 - ($sum % 10)) % 10;
$actualCheckDigit = intval($pesel[10]);
if ($checkDigit !== $actualCheckDigit) {
return "Niepoprawna suma kontrolna (oczekiwano: $checkDigit, otrzymano: $actualCheckDigit)";
}
return null; // poprawna
}

Dekodowanie daty urodzenia:

function decodeBirthDate($pesel) {
$year = intval(substr($pesel, 0, 2));
$month = intval(substr($pesel, 2, 2));
$day = intval(substr($pesel, 4, 2));
// Okreslenie stulecia na podstawie miesiaca
if ($month > 80) {
$year += 1800;
$month -= 80;
} elseif ($month > 60) {
$year += 2200;
$month -= 60;
} elseif ($month > 40) {
$year += 2100;
$month -= 40;
} elseif ($month > 20) {
$year += 2000;
$month -= 20;
} else {
$year += 1900;
}
return sprintf('%04d-%02d-%02d', $year, $month, $day);
}

Dekodowanie płci:

function decodeGender($pesel) {
$genderDigit = intval($pesel[9]);
return ($genderDigit % 2 === 0) ? 'kobieta' : 'mezczyzna';
}

Generowanie PESEL:

function generatePesel($birthDate, $gender) {
$date = new DateTime($birthDate);
$year = intval($date->format('Y'));
$month = intval($date->format('m'));
$day = intval($date->format('d'));
// Modyfikator miesiaca dla stulecia
if ($year >= 2000 && $year < 2100) {
$month += 20;
} elseif ($year >= 1800 && $year < 1900) {
$month += 80;
}
// (dodaj pozostałe przypadki dla pełnej implementacji)
// Losowy numer porzadkowy z odpowiednia cyfra płci
$serial = rand(0, 999);
$genderDigit = ($gender === 'małe') ? rand(0, 4) * 2 + 1 : rand(0, 4) * 2;
$peselWithoutCheck = sprintf('%02d%02d%02d%03d%d',
$year % 100, $month, $day, $serial, $genderDigit);
// Oblicz cyfre kontrolna
$weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
$sum = 0;
for ($i = 0; $i < 10; $i++) {
$sum += intval($peselWithoutCheck[$i]) * $weights[$i];
}
$checkDigit = (10 - ($sum % 10)) % 10;
return $peselWithoutCheck . $checkDigit;
}

Wykorzystaj lekcje!

Cotygodniowe spotkania podczas lekcji to idealny moment, by:

  • Pokazac postepy - nawet małe kroki się licza
  • Wyjaśnić watpliwosci - pytaj, nie zgaduj
  • Skonsultowac rozwiązania - feedback pomoze Ci się rozwijac

Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!