|
|
|
@ -23,6 +23,7 @@ declare(strict_types=1); |
|
|
|
|
|
|
|
namespace App\Rules; |
|
|
|
|
|
|
|
use App\Services\CSV\Converter\Iban as IbanConverter; |
|
|
|
use Illuminate\Contracts\Validation\Rule; |
|
|
|
|
|
|
|
/** |
|
|
|
@ -33,93 +34,13 @@ class Iban implements Rule |
|
|
|
/** |
|
|
|
* Determine if the given value is a valid IBAN. |
|
|
|
* |
|
|
|
* @param string $attribute |
|
|
|
* @param mixed $value |
|
|
|
* @param string $attribute |
|
|
|
* @param mixed $value |
|
|
|
* @return bool |
|
|
|
*/ |
|
|
|
public function passes($attribute, $value) |
|
|
|
public function passes($attribute, $value): bool |
|
|
|
{ |
|
|
|
if (null === $value || !is_string($value) || strlen($value) < 6) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
// strip spaces
|
|
|
|
$search = [ |
|
|
|
"\x20", // normal space
|
|
|
|
"\u{0001}", // start of heading
|
|
|
|
"\u{0002}", // start of text
|
|
|
|
"\u{0003}", // end of text
|
|
|
|
"\u{0004}", // end of transmission
|
|
|
|
"\u{0005}", // enquiry
|
|
|
|
"\u{0006}", // ACK
|
|
|
|
"\u{0007}", // BEL
|
|
|
|
"\u{0008}", // backspace
|
|
|
|
"\u{000E}", // shift out
|
|
|
|
"\u{000F}", // shift in
|
|
|
|
"\u{0010}", // data link escape
|
|
|
|
"\u{0011}", // DC1
|
|
|
|
"\u{0012}", // DC2
|
|
|
|
"\u{0013}", // DC3
|
|
|
|
"\u{0014}", // DC4
|
|
|
|
"\u{0015}", // NAK
|
|
|
|
"\u{0016}", // SYN
|
|
|
|
"\u{0017}", // ETB
|
|
|
|
"\u{0018}", // CAN
|
|
|
|
"\u{0019}", // EM
|
|
|
|
"\u{001A}", // SUB
|
|
|
|
"\u{001B}", // escape
|
|
|
|
"\u{001C}", // file separator
|
|
|
|
"\u{001D}", // group separator
|
|
|
|
"\u{001E}", // record separator
|
|
|
|
"\u{001F}", // unit separator
|
|
|
|
"\u{007F}", // DEL
|
|
|
|
"\u{00A0}", // non-breaking space
|
|
|
|
"\u{1680}", // ogham space mark
|
|
|
|
"\u{180E}", // mongolian vowel separator
|
|
|
|
"\u{2000}", // en quad
|
|
|
|
"\u{2001}", // em quad
|
|
|
|
"\u{2002}", // en space
|
|
|
|
"\u{2003}", // em space
|
|
|
|
"\u{2004}", // three-per-em space
|
|
|
|
"\u{2005}", // four-per-em space
|
|
|
|
"\u{2006}", // six-per-em space
|
|
|
|
"\u{2007}", // figure space
|
|
|
|
"\u{2008}", // punctuation space
|
|
|
|
"\u{2009}", // thin space
|
|
|
|
"\u{200A}", // hair space
|
|
|
|
"\u{200B}", // zero width space
|
|
|
|
"\u{202F}", // narrow no-break space
|
|
|
|
"\u{3000}", // ideographic space
|
|
|
|
"\u{FEFF}", // zero width no -break space
|
|
|
|
'-', |
|
|
|
'?', |
|
|
|
]; |
|
|
|
$replace = ''; |
|
|
|
$value = str_replace($search, $replace, $value); |
|
|
|
$value = strtoupper($value); |
|
|
|
|
|
|
|
$search = [' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; |
|
|
|
$replace = ['', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', |
|
|
|
'32', '33', '34', '35',]; |
|
|
|
|
|
|
|
// take
|
|
|
|
$first = substr($value, 0, 4); |
|
|
|
$last = substr($value, 4); |
|
|
|
$iban = $last . $first; |
|
|
|
$iban = trim(str_replace($search, $replace, $iban)); |
|
|
|
if (0 === strlen($iban)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
try { |
|
|
|
$checksum = bcmod($iban, '97'); |
|
|
|
} catch (ValueError $e) { |
|
|
|
$message = sprintf('Could not validate IBAN check value "%s" (IBAN "%s")', $iban, $value); |
|
|
|
Log::error($message); |
|
|
|
Log::error($e->getTraceAsString()); |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
return 1 === (int)$checksum; |
|
|
|
return IbanConverter::isValidIban((string) $value); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -127,7 +48,7 @@ class Iban implements Rule |
|
|
|
* |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
public function message() |
|
|
|
public function message(): string |
|
|
|
{ |
|
|
|
return 'The :attribute is not a valid IBAN.'; |
|
|
|
} |
|
|
|
|