<?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]; } }