Adóazonosító jel ellenőrző-összeg generátor

A magánszemélyek adóazonosító jele 10 számjegyből áll: az első mindig a "8"-as szám, a 2.-6. számjegyek az adott személy születési dátuma és 1867. január 1. között eltelt napok száma, a 7.-9. számjegyek az azonos napon születettek megkülönböztetésére használt (pl. véletlenszerűen generált) számsorozat, a tizedik számjegy pedig egy ellenőrző-összeg.

Az ellenőrző-összeg számítása a következő algoritmus szerint zajlik: az adóazonosító jel első kilenc számjegyét megszorozzuk a számjegy sorszámával, majd ezeket összeadjuk, az összeget elosztjuk 11-gyel és ha az osztás maradéka kisebb tíznél, akkor az lesz az ellenőrző-összeg, ha pedig tíz, akkor az eredmény nem használható adóazonosító jelként (változtassunk a 7.-9. számjegyeken -pl. adjunk hozzá egyet- és máris jó lesz az ebből kiszámolt ellenőrző-összeg).

Egy példa: 1967. február 13-án született személy adóazonosító jelének generálása:
  1. az első számjegy fixen a "8"
  2. a 2.-6. számjegyek az 1967.02.13 és 1867.01.01 között eltelt napok számát tartalmazzák, ami 36567
  3. a 7.-9. számjegyek legyenek most a lehető legkisebb érték (választhatnánk bármit 000 és 999 között, csak az ellenőrző-összeg legyen jó a végén :-) ), azaz 000
  4. így az első kilenc számjegy: 836567000
  5. az összeg képzése: 1 * 8 + 2 * 3 + 3 * 6 + 4 * 5 + 5 * 6 + 6 * 7 + 7 * 0 + 8 * 0 + 9 * 0 = 124
  6. a 11-gyel való osztás maradéka (azaz az ellenőrző-összeg): 3
  7. a teljes adóazonosító jel így néz ki: 8365670003
Az alábbi szövegdobozba beírva a születési dátumot (eeee.hh.nn formátumban) és opcionálisan a 7.-9. számjegyeket kiszámítja az ellenőrző-összeget (az Enter lenyomására). Ha nem adjuk meg a 7.-9. számjegyeket, akkor a generátor a "000"-t fogja használni. Ha a generált ellenőrző-összeg a tíz lenne, akkor ezt jelzi a generátor "Érvénytelen ellenőrző-összeg" üzenettel.

Az előző példát követve ezt lehetne beírni: 1967.02.13 000


A fenti szövegdoboz HTML kódja (a számítást végző JavaScript-tel együtt):
<input type="text" onkeydown="if (event.keyCode != 13 && event.keyCode != 10) return; s = this.value; if (! /^[0-9]{4}.[0-9]{2}.[0-9]{2}/.test(s)) { alert('A születési dátumot írd be éééé-hh-nn formátumban!'); return; }; months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; d1 = new Date('01 Jan 1867 00:00 GMT'); d2 = new Date(s.substr(8, 2) + ' ' + months[s.substr(5, 2) - 1] + s.substr(0, 4) + ' 00:00 GMT'); days = (d2 - d1) / 86400000; da = ('' + days).split(''); f = new Array(10); f[0] = 8; for (i = 1; i < 6; i++) if (i <= 5 - da.length) f[i] = 0; else f[i] = da[i - (6 - da.length)]; if (/^.{10}[^0-9]*[0-9]{3}/.test(s)) rand = s.substr(11).replace(/[^0-9]*([0-9]{3})/, '$1'); else rand = '000'; for (i = 6; i < 9; i++) f[i] = rand.substr(i - 6, 1); cksum = 0; for (i = 0; i < 9; i++) cksum += (i + 1) * parseInt(f[i]); cksum = cksum % 11; if (cksum > 9) this.value = 'Érvénytelen ellenőrző-összeg'; else this.value = f.join('') + cksum;">

A fenti kód elvileg mindenféle böngésző alatt működik (IE 6, Firefox 3 és Chrome 16 alatt teszteltem ... feltehetően az ezeknél frissebbekben is megy).

ui: az adózó polgár adóazonosító jelének képzési szabályairól az 1996. évi XX. törvény 1. számú melléklete intézkedik.
Pár link segítségül:

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

nem jön ki a matek

Szia!

Jóanyám adószáma kellene, mert persze nem találja.

Az elméletet lefuttatva egyik szám se jött ki.

Sorolom, hol akadt el:
1) nekem 0118 a vége az adószámomnak, pont a szorzások összeadása után jön ki. Ennek a maradéka 8 azaz, ha 008-cal viszem fel nem jön ki a szükséges 0118. De valamire ráhúzható...

2) barátom utolsó 4 száma: 3776, a szorzatok összege meg 130, maradéka 9. sehogy se jön ki. Meg eleve nem 0-val kezdődik az utolsó 4 számjegy.

3) feleségem utolsó 4 száma 0370, a szorzatok összeg 89, maradék 1. Ráadásul itt ki is dobja, hogy "nem értelmezhető", mert 10-re végződik. Nos 001-et írtam be. => innen elkezdtem az összeset 4 számjegyűvel, de nem jó a megoldás.

Van azóta tipped, hogy mi lehet a hiba, mert 3-ból egynél látok valami logikát, de ez nem teljes így, sajnos.

Előre is köszi: Gyuri

Szia!Nem vagyok biztos

Szia!

Nem vagyok biztos benne, hogy jól értettelek.

Ennek a maradéka 8 azaz, ha 008-cal viszem fel nem jön ki a szükséges 0118.

Mit értesz az alatt, hogy "008"-cal viszem fel?

Az oldalon található szövegdoboz csak egy dolgot tud: beírsz egy születési dátumot ÉÉÉÉ.HH.NN formában és mögé írsz 3 számjegyet, amik az adószám 7.-8.-9. pozíciójában szerepelnének (ezen számokat egy konkrét, valós adószámhoz kitalálni nem lehet; ez egy sorszám, ami az egyes személyekhez rendelnek, amikor kiosztják nekik az adószámukat) és a javascript kiszámítja az utolsó számjegyet, azaz az ellenőrző összeget.

Szóval az algoritmussal nem lehet kitalálni valaki adószámát, mert ebben van egy "véletlenszerű" rész.

Kb. egy dologra jó, amit eme oldalon leírtam: formailag érvényes adószámot tudsz vele generálni.
Azaz választasz egy tetszőleges születési dátumot (1867.01.01 után Smile ), majd három számjegyet (véletlenszerűen) és a szövegdobozba írva ezeket (és enter-t nyomva) kiszámolja az ezekhez tartozó adószámot. Ha azt írja ki, hogy hiba van, akkor a véletleszerűen választott három számjegyet addig kell módosítani (növelni v. csökkenteni), amíg jó nem lesz.

Nekem ez arra volt jó, hogy véletlenszerű adószámokat generálhassak egy az akkoriban (2011) a munkahelyemen fejlesztett szoftver teszteléséhez, ami csak formailag jó adószámokat fogadott el.

ui: az én adószámomra egyébként működik, azaz ha a saját születési dátumomat írom be és mögé az adószámom 7.-8.-9. számjegyeti, akkor kiírja a valódi adószámomat.