Pavel Müller
13.5.2010

Generátor rodných čísel



V poslední době se věnuji automatizovaným Selenium testům jednoho obchodního systému. Při vkládání osob do systému je nutné zadat rodné číslo a systém provádí jeho validaci a sleduje, jestli je v systému unikátní. Abych mohl automatizovat funkčnost zakládání osob, tak jsem se rozhodl, že vytvořím generátor rodných čísel. Není vše ale tak jednoduché, jak by se mohlo zdát.

Obvykle každý ví, že rodná čísla se tvoří od roku 1954 ve tvaru yymmdd/xxxx a ta starší mají tvar yymmdd/xxx. Pokud je to žena, přičte se k měsíci 50. Také si každý myslí, že by mělo být rodné číslo dělitelné jedenáci. Ale zde je právě kámen úrazu. Vše je trochu jinak. Poslední desátá číslice přidávaná od roku 1954 je kontrolní a tvoří se tak, že se vydělí devitimístné číslo jedenácti a zbytek po dělení se použije jako desátá kontrolní číslice. Tím je výsledné desetimístné číslo dělitelné jedenácti. Tedy v případě, že zbytek po dělení nebyl 10. V takovém případě je kontrolní číslice rovna 0, ale tím pádem není celé rodné číslo dělitelné jedenácti. Do roku 1985 bylo přiděleno cca 1000 rodných čísel, která nejsou dělitelná 11. Není vyloučeno, že se v minimálním počtu vyskytly i po tomto roce. Navíc od roku 2004 je zavedena možnost v případě, že jsou v nějaký den vyčerpána všechna platná čtyřčíslí, použít alternativní rodné číslo, u kterého mají muži k číslu měsíce přičteno 20 a ženy 70. A i rodná čísla před rokem 1954 mohou mít čtyřčíslí, pokud se jednalo o dodatečně přidělená rodná čísla (např. při získání občanství). Více informací třeba na Wikipedii nebo na tomto blogu. Většina aplikací se spokojí s ověřením dělitelnosti jedenácti. Ale to je evidentně špatně. Ještěže nemám tu smůlu a nemám nestandardní rodné číslo 🙂 Napsal jsem pro účely Selenium testů generátor rodných čísel s několika možnostmi, jak číslo generovat:

  • pro konkrétní datum a pohlaví
  • pro věkové rozpětí – vhodné třeba pro generování mladistvých
  • oficiální rodné číslo – dle výše popsaných pravidel
  • běžné rodné číslo – takové, které čeká většina aplikací – dělitelnost 11, standarní tvary
  • speciální rodné číslo – takové, které není běžné – vhodné pro test validace

 

Ukázka použití generátoru:

// generates random personal number from 1900 till today 
String personalNumber = RcGenerator.generateRc();

// men between 18 and 30 
personalNumber = RcGenerator.generateRcForAge(18, 30, Gender.MALE);

// common personal number modulo 11 == 0 which passes most validators
personalNumber = RcGenerator.generateRc(RcType.COMMON);

Přiložené třídy můžete volně použít. Budu rád, když najdete chyby nebo generátor vylepšíte, rozšíříte funkčnost a s kódem se zase podělíte. RcGenerator.zip

Vaše emailová adresa nebude zveřejněna

Komentáře

Děkujeme za váš komentář
Další
  • uf

    Dik za info. Hned to proverim

  • maertien

    Clovek by neveril, kolik bude u RC vyjimek a pravidel. Dekuju za informace, ty speciality s tim +20 a +70 jsem nevedel...

  • Pavel Mattivi

    Zajímavý podnět k prošetření, díky. Připomnělo mi to situaci, kdy do webového formuláře své pojišťovny nemůžu zadat požadavek obsahující RČ, protože mi javascript tvrdí něco o nevyplněných povinných údajích, ačkoli skutečný problém tkví ve vynucené absenci lomítka.. :)

  • danisevky

    Diky, moc uzitecne info!

  • antaran

    presne nieco taketo som potreboval :) ale link RcGenerator.zip mi nefunguje :(

  • Díky za upozornění, odkaz je již funkční...

  • Václav

    Dobrý den, rád bych se zeptal, jakou konstrukcí vzniklo za lomítkem u mého RČ číslo 0002. Díky

  • Václav: a je Vaše RČ dělitelné jedenácti? Pokud ano, tak to vzniklo přirozeným způsobem.

  • martin

    číslo za lomítkem znamená kolikátý ses v daný rok a den narodil a poslední číslice je kontrolní příklad. 7554182867 to namená 18.4.1975 a 286 človíček na světě a číslo 7 je jen kontrolní

  • Václav

    Richard Šerý: Ano dělitelné jedenácti je. martin: To jsem se právě dočetl, ale to bych se narodil nultý? :-)... Ne, ono to bude asi složitější - viz mé číslo /0002. Jinak zde http://class.pedf.cuni.cz/jancarik/download/AvI2.ppt je také uvedeno, že 1. číslo za lomítkem udávalo oblast narození (což u mne sedí – 0-Praha)... Ale jak vzniklo to mé, by mne tedy zajímalo...

  • Jovan Kubíček

    Dobrý den, dle mého názoru generátor vytváří nevalidní desetimístná rodná čísla s výjimkou na modulo 11 (modulo 11 = 10 a zároveň poslední desátá číslice = 0) i po roce 1985, kdy tato výjimka dle zákona přestala být přípustná. Příklad : 036018/3330 je desetimístné jedná se o rok 2003 a zároveň modulo 11 není 0. S pozdravem Jovan Kubíček

  • Oleg

    Není ten modul někde zvěřejněn? Github, nebo tak. Aby člověk nemusel táhat cely zdrojak k sebe do projektu.

    1. Monika Vavrikova

      Bohužel není.