Page History
A Postai LuhnA Posta-féle Luhn ellenőrző összeggel ellátott érték (HungarianPostLuhnCdvValue) entitás egy értéket és a hozzá tartozó ellenőrző összeget tartalmazza.
Adattag | Típus | Magyarázat | Kö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. | Igen * | Meg kell egyeznie a value értékéből számított cdv értékével. |
valueWithCdv | int | A Befizetőazonosító, majd az utolsó számjegye a Luhn-képlettel számított ellenőrzőszám. | Igen * | Az utolsó számjegyének meg kell egyeznie az előtte található számsor Luhn-féle ellenőrzőösszeggel számított ellenőrzőszámmal. |
Info | ||
---|---|---|
| ||
A value és cdv |
...
Példa
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<payerIdentifier>
<value>123</value>
<cdv>2</cdv>
</payerIdentifier> adattag akkor, és csak akkor hagyható el, ha a valueWithCdv adattag megadásra került. Amennyiben a value és cdv adattag megadásra került, a valueWithCdv adattag kötelezően elhagyandó. |
A CDV készítés algoritmusának szöveges leírása
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és | 9 | 0 | 1 | 2 | 0 | 2 | 8 | 6 | 8 | 4 |
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és | 9 | +0 | +1 | +4 | +0 | +4 | +8 | +1+2 | +8 | +8 |
ÖSSZESEN | =45 | |||||||||
3. lépés | ||||||||||
EREDMÉNY | 50 | -45 | =5 |
ELLENŐRZŐ SZÁMJEGY: 5
forrás: https://www.posta.hu/static/internet/download/PUSZ_16_4_melleklet_20150901.pdf
CDV ellenőrzésének példakódja
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
class LuhnCdvChecker
{
private $value;
private $cdv;
public function __construct($value, $cdv)
{
$this->value = $value;
$this->cdv = $cdv;
}
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++;
}
$modulo = $sum % 10;
return $modulo == 0 ? 0 : 10 - ($modulo);
}
public function getValueLength()
{
return strlen($this->value);
}
}
$checker = new LuhnCdvChecker("9012028684", 5);
echo 'CDV: ' . $checker->calculateCdv() . "\n"; // CDV: 5
echo 'Is correct: ' . ($checker->isCdvCorrect() ? 'true' : 'false') . "\n"; // Is correct: true |
Példa