Walidacja numeru Pesel w JavaScript

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:
// 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;
}
view raw pesel.js hosted with ❤ by GitHub

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ć.

4 Comments

  1. Maciek N says:

    Hej, tu znalazłem fajny generator PESEL: http://generatory.it/ Gdyby ktoś chciał testować.

    1. Romek says:

      Zawsze jest dobrze zareklamować swoją stronę 🙂
      Ale przy okazji to generator generuje też numery z zakresu nigdy nie nadanych.

  2. Waldek says:

    00000000000 – nie jest peselem poprawnym, a walidator twierdzi inaczej – trzeba jeszcze dorzucić dodatkowe warunki…

    1. Artur Piszek says:

      Dzięki, naprawiłem!

Leave a Reply