A Postai Luhn-féle ellenőrző összeggel ellátott érték (HungarianPostLuhnCdvValue) entitás egy értéket és a hozzá tartozó ellenőrző összeget tartalmazza.

AdattagTípusMagyarázatKötelezőMegszorítások

value

int

BefizetőazonosítóIgen

 

cdv

int

A Befizetőazonosító alapján

Luhn-képlettel számított ellenőrzőszám.

IgenMeg kell egyeznie a value értékéből számított cdv értékével.

 

A cdv készítés algoritmusának szöveges leírása és példakódja

1. lépés: Minden második számjegyet, a jobb első számjeggyel kezdődően 2-vel szorozzuk meg.

2.lépés: az 1. lépésben kapott eredmény minden egyes számjegyét annak az eredeti számjegynek az
összegéhez kell hozzáadni, amely az 1. lépésben nem volt semmilyen művelet tárgya.

3.lépés: a 2. lépésben kapott eredményt az első "0"-val végződő közvetlenül következő nagyobb számból
le kell vonni.
Ha a 2. lépésben kapott szám végén "0" áll, akkor az ellenőrző számjegy "0".

 

Példa: ellenőrző számjegy nélküli ügyfélazonosító = 9012028684

1. lépés9012028684
műveletjel x x x x x
szorzószám 2 2 2 2 2
           
EREDMÉNY 0 4 4 12 8
           
2. lépés9+0+1+4+0+4+8+1+2+8+8
ÖSSZESEN=45         
3. lépés          
EREDMÉNY50-45=5       

ELLENŐRZŐ SZÁMJEGY: 5

 

forrás: https://www.posta.hu/static/internet/download/PUSZ_16_4_melleklet_20150901.pdf

CDV kód ellenőrzése példa

public function isCdvCorrect()
{
    return $this->calculateCdv() == $this->cdv;
}

public function calculateCdv()
{
    $sum = 0;
    $j = 1;
    $valueAsString = (string) $this->value;
    for ($i = $this->getValueLength() - 1; $i > -1; $i--)
    {
        if ($j % 2 != 0)
        {
            $result = $valueAsString[$i] * 2;
        }
        else
        {
            $result = $valueAsString[$i];
        }

        foreach(str_split($result) as $digit)
        {
            $sum += $digit;
        }

        $j++;
    }
    return $sum % 10;
}

Példa

<payerIdentifier>
    <value>123</value>
    <cdv>2</cdv>
</payerIdentifier>