Jeśli pracujecie z systemem lub portalem w którym wprowadza się dane osobowe, prawdopodobnie będziecie także mieli do wprowadzenia Pesel.
Pesel jest dość magicznym numerem, który (jeśli programista umie dodać 2 do dwóch) pozwala na spore ułatwienia dla użytkownika. W przypadku rozwiązań WEB’owych nic nie stoi na przeszkodzie, by numer pesel walidować w Javascripcie.
Informacje, jakie możemy z Peselu wyciągnąć ‘ot tak’ to:
- Data urodzenia
- Płeć
- Informacja, czy pesel został wpisany bez błędów.
Jak zatem zdobyć te wszystkie informacje? Poniżej gotowa funkcja JavaScript:
Sprawdź działanie sam:
Sprawdź! | |
Poprawny: | |
Poprawny2: | |
Płeć: | |
Data urodzenia: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://piszek.com/2013/03/13/walidacja-numeru-pesel-w-javascript/ | |
// Funkcja dekodujaca nr. Pesel | |
function peselDecode(pesel) { | |
// Wycinamy daty z numeru | |
var rok = parseInt(pesel.substring(0, 2), 10); | |
var miesiac = parseInt(pesel.substring(2, 4), 10) - 1; | |
var dzien = parseInt(pesel.substring(4, 6), 10); | |
// Pesel został wprowadzony w 20 wieku, ale zawiera modyfikatory na przysłość | |
// Miesiąc zawiera dodatkowe liczby dla dat z przyszłości. | |
if (miesiac > 80) { | |
rok = rok + 1800; | |
miesiac = miesiac - 80; | |
} else if (miesiac >= 60) { | |
rok = rok + 2200; | |
miesiac = miesiac - 60; | |
} else if (miesiac >= 40) { | |
rok = rok + 2100; | |
miesiac = miesiac - 40; | |
} else if (miesiac >= 20) { | |
rok = rok + 2000; | |
miesiac = miesiac - 20; | |
} else { | |
rok += 1900; | |
} | |
if( miesiac >=0 && miesiac < 12 && dzien > 0 && dzien < 32 ) { | |
// Daty sa ok. Teraz ustawiamy. | |
var urodzony = new Date(); | |
urodzony.setFullYear(rok, miesiac, dzien); | |
} else { | |
var urodzony = false; | |
} | |
//plec | |
var plec; | |
if (parseInt(pesel.substring(9, 10), 10) % 2 === 1) { | |
plec = 'm'; | |
} else { | |
plec = 'k'; | |
} | |
return { | |
sex: plec, | |
date: urodzony, | |
}; | |
} | |
// Metoda weryfikacji na podstawie przypisanych wag. | |
function checkPeselWithWeights( pesel ) { | |
var wagi = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7]; | |
var suma = 0; | |
for (var i = 0; i < wagi.length; i++) { | |
suma += (parseInt(pesel.substring(i, i + 1), 10) * wagi[i]); | |
} | |
suma = suma % 10; | |
return (suma === parseInt(pesel.substring(10, 11), 10)); | |
} | |
// Metoda weryfikacji za pomocą sumy kontrolnej | |
function checkPeselWithControlSum(pesel) { | |
var tabnr = '1379137913'; | |
var suma = 0; | |
var result = false; | |
if (pesel.length == 11) { | |
for (var i = 0; i < tabnr.length; i++) { | |
suma = suma + parseInt(tabnr.charAt(i), 10) * parseInt(pesel.charAt(i), 10); | |
} | |
var modu = suma % 10; | |
if (modu == 0) | |
result = (0 == parseInt(pesel.charAt(10), 10)); | |
else | |
result = ((10 - modu) == parseInt(pesel.charAt(10), 10)); | |
} else { | |
return false; | |
} | |
return result; | |
} |
Struktura numeru pesel
Struktura numeru pesel jest następująca:
DDDDDDSSSPK
Gdzie
- D - Data. W powszechnym mniemaniu Są to dwie ostatnie cyfry roku, miesiąc dzień. I jest to prawda, ale nie cała prawda. Wielokrotnie spotykałem się z obawami programistów, iż nie ma jak przypisać numeru pesel osobom urodzonym po 2000 roku. Nie ma obawy - system nie jest aż tak dziurawy :). W specyfikacji numeru pesel jest tak, że do miesiąca jest dodawana konkretna liczba wskazująca stulecie urodzenia.
- dla lat 1800-1899 - 80
- dla lat 2000-2099 - 20
- dla lat 2100-2199 - 40
- dla lat 2200-2299 - 60
- S - cyfry reprezentujące numer serii
- P - Płeć. Parzysta dla kobiet, nieparzysta dla mężczyzn.
- K - cyfra kontrolna. O algorytmie tworzenia cyfry kontrolnej napisano wiele, dlatego pozwolę sobie tutaj dokładnych kroków nie przytaczać.
Hej, tu znalazłem fajny generator PESEL: http://generatory.it/ Gdyby ktoś chciał testować.
Zawsze jest dobrze zareklamować swoją stronę 🙂
Ale przy okazji to generator generuje też numery z zakresu nigdy nie nadanych.
00000000000 – nie jest peselem poprawnym, a walidator twierdzi inaczej – trzeba jeszcze dorzucić dodatkowe warunki…
Dzięki, naprawiłem!