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…

In this essay

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

Follow the thread

Start here

Eight essays connecting disciplines, useful progress, and deliberate choices.

Writing archive

Browse the complete archive, including technical, personal, travel, and book writing.

Projects

Tools and experiments where the ideas meet practical work.

4 responses

  1. Maciek N Avatar
    Maciek N

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

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

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

    1. Dzięki, naprawiłem!

Leave a Reply

Discover more from Artur Piszek

Subscribe now to keep reading and get access to the full archive.

Continue reading