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:
Syndicate content