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
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?
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.
Tryb walidacji Użytkownik wprowadza numer PESEL, a system sprawdza jego poprawnosc (długość, cyfry, suma kontrolna) i wyświetla szczegółowy komunikat.
Tryb generowania Użytkownik podaje date urodzenia i płeć, a system generuje przykładowy numer PESEL zgodny że specyfikacja.
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:
Przykładowy scenariusz:
Ocena: 3.0Uż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”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik wpisuje “02270803628”. System wyświetla: “PESEL poprawny. Data urodzenia: 08.07.2002, Płeć: kobieta”. Przy wpisaniu “12345678901” widzi: “PESEL niepoprawny - błędna suma kontrolna (oczekiwano: X, otrzymano: Y)”.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik wybiera tryb “Generuj”, wpisuje date 15.05.1990 i wybiera płeć “mezczyzna”. System generuje przykładowy PESEL: “90051512357”. Może przefiltrowac historie, żeby zobaczyc tylko błędne walidacje lub tylko operacje generowania.
PESEL: RRMMDDPPPPK
RR - rok urodzenia (2 cyfry)MM - miesiac urodzenia (z modyfikatorem stulecia)DD - dzień urodzeniaPPPP - 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) = kobietaSprawdzenie 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:
Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!