|
|
- <?php
-
- namespace App\Helper;
-
- class TransactionCodeHelper
- {
- private const VALID_CHARS = [
- '2',
- '3',
- '4',
- '5',
- '6',
- '7',
- '8',
- '9',
- 'A',
- 'B',
- 'C',
- 'D',
- 'E',
- 'F',
- 'G',
- 'H',
- 'J',
- 'K',
- 'L',
- 'M',
- 'N',
- 'P',
- 'Q',
- 'R',
- 'S',
- 'T',
- 'U',
- 'V',
- 'W',
- 'X',
- 'Y',
- 'Z',
- ];
-
- private const FACTOR = 2;
-
- /**
- * Validate the transaction code
- *
- * @param $key string
- * @return bool
- */
- public static function verifyKey(string $key): bool
- {
- if (strlen($key) !== 10) {
- return false;
- }
-
- $checkDigit = self::generateCheckCharacter(strtoupper(substr($key, 0, 9)));
-
- return $key[9] === $checkDigit;
- }
-
- /**
- * generate the check character that should correspond to the last letter of the string
- *
- * @param $input
- * @return string
- */
- public static function generateCheckCharacter(string $input): string
- {
- $factor = self::FACTOR;
-
- $sum = 0;
- $n = count(self::VALID_CHARS);
-
- for ($i = strlen($input) - 1; $i >= 0; $i--) {
- $code_point = array_search($input[$i], self::VALID_CHARS, true);
- $addend = $factor * $code_point;
- $factor = ($factor === 2) ? 1 : 2;
- $addend = ($addend / $n) + ($addend % $n);
- $sum += $addend;
- }
-
- $remainer = ($sum % $n);
- $checkCodePoint = ($n - $remainer) % $n;
-
- return self::VALID_CHARS[$checkCodePoint];
- }
- }
|