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
Zpět