Magyar IBAN generálás és validálás – PL/SQL, JS

Iban structure

(Példa egy IBAN felépítésre, ahol igazából a ‘check digits’ rész az érdekes, azt ezt követő BBAN változó hosszúságú lehet, from: www.jknc.eu/ibanbic)

Egy ideje napi szinten dolgozom IBAN azonosítókkal, főleg első körös IT tesztek kapcsán, így szükségessé vált néhány, ezt támogató programocska is.
Maga az IBAN egy igen fontos azonosító a nemzetközi gyakorlatban, mert ennek hiányában elég problémás lenne a nemzetközi utalás, pl. a különböző nemzeti számlaformátumok miatt (BBAN: Basic Bank Account Number).

Az IBAN egy nemzetközi bankszámlaszám (angolul: International Bank Account Number). Egy kétbetűs országkódból, egy kétjegyű ellenőrző kódból és az adott országban szabvány karakterszámú bankszámlaszámból áll.
A magyarországi IBAN számlaszámok egységesen a HU karakterekkel kezdődnek, ezt követi a kétjegyű ellenőrző kód és a magyar szabvány szerinti 24 karakterű számlaszám.

(from: www.erstebank.hu/hu/tudastar/vallalatok/mindennapi-bankolas/fizetese-megoldasok/atutalasok-es-beszedesek/mi-az-iban)

IBAN képzés szabályai és annak használat az ISO 13616-1:2007 (Financial services – International bank account number (IBAN) — Part 1: Structure of the IBAN) szabványban szerepel. A ugyan dokumentum fizetős, de az esetek 95%-ában bőven elegendő az on-line fellelhető ismeretanyag is a használatához (itt bele lehet lapozni a szabványba is, illetve látható annak „tartalomjegyzéke”).
A lényeg az alábbi:

The IBAN consists of up to 34 alphanumeric characters, as follows:

– country code using ISO 3166-1 alpha-2 – two letters,
– check digits – two digits, and
– Basic Bank Account Number (BBAN) – up to 30 alphanumeric characters that are country-specific.

(from: en.wikipedia.org/wiki/International_Bank_Account_Number)

A nemzeti számlák struktúrája pedig pl. itt megtekinthető.

Gyakran írok ilyen kis tool-okat, mert az esetek többségében már középtávon bőven megtérülnek… Sajnos a legtöbbször nem mentem őket igazából sehova sem, így néha el-el vesznek, ami azért sajnálatos. Ezen próbálok változtatni, pl. jelen bejegyzéssel is…

Egyrészt az oldalon már elérhető egy standard, magyar, 3×8 számból álló bankszámlaszámból IBAN számot előállító „alkalmazás”, amit ha lesz némi időm akkor tovább is fejlesztek, IBAN validátorral és nemcsak magyar számlaszámok támogatásával. Bár ez utóbbi kicsit nagyobb falat a sok eltérő BBAN, pontosabban ezek megfelelő validálása miatt. A kizárólag magyar számlaszámok támogatására optimalizált, nagyon leegyszerűsített IBAN algoritmus is generalizálandó, ami elvileg nem egy nagy feladat, de ettől még számos hibalehetőséget hordoz :).

A magyar IBAN előállítása valójában cca. 7 sor Javascript-ben és nagyjából 5 PL/SQL-ben, hiszen az egyetlen kritikus pont a checksum kiszámolása. Az algoritmus kicsit trükkös, mert a BBAN módosított formában használandó, de a lényeg, hogy a végére kell kerüljön a ‘173000’ (ami egyébként a ‘HU00’ átírásából adódik H=17, U=30, részletek itt). Ez pl. az alábbi módon történhet:

Számomra legérdekesebb rész nem is az IBAN algoritmusa, sokkal inkább a „pad” funkció hiánya volt JS oldalon, mert egy fontos lépés, hogy ha a checksum egy számjegyű, akkor egy vezető nullát is hozzá kell írni. Én valamiért úgy emlékeztem, hogy van ilyen… Szerencsére az Internet megoldotta ezt nekem egy, a maga nemében elegáns függvénnyel:

UPDATE: jól tudtam, van: String.padStart(), de most már mindegy… Viszont működése egyszerűen ellenőrizhető bármely böngésző konzolján:

>>   tmp=’teszt’
<-    „teszt”
>>   tmp.padStart(10,’0′)
<-    „00000teszt”

 

(from: Firefox/Konzol teszt)

Másrészt szükségem volt Oracle oldalon egy kifejezetten magyar IBAN validátorra, ami szintén nem bonyolult, a Wikipedia vonatkozó leírása is bőven egyszerűsíthető, ha csak a magyar IBAN validálása a cél.

Ennek megfelelően a PL/SQL blokk (minimális hibakezeléssel):

Illetve a már tetszőlegesen hívható funkció:

UPDATE: Oracle IBAN generátor, két eltérő megvalósítással:

 

1 hozzászólás

  1. Kozman Bálint április 2, 2020 6:23 du. 

    Klassz cikk, nagyon hasznos volt!

    A javascript checksum generáló eljáráshoz lenne annyi gondolatom, hogy a cikkbeli függvény rövidíthető a kicsit haladóbb Array szintaxissal így:

    return szlaNum.split(”).reduce((accumulator, currentValue) => ((accumulator*10) + parseInt(currentValue, 10)) % 97);

Vélemény, hozzászólás?

FIGYELEM! Ez a bejegyzés több mint egy éves, így a benne szereplő információk is ennek megfelelően kezelendőek! Az esetleges frissítések minden esetben külön megjelöltek.