Files
ws_vatcheck/src/Model/VatNumber.php
T

131 lines
3.0 KiB
PHP

<?php
namespace Websmid\VatCheck\Model;
use Websmid\VatCheck\Config\Config;
use Context;
class VatNumber
{
private $vatNumber;
private $isoCode;
private $errorMessage = '';
public static $euIso = [
'AT' => 'AT',
'BE' => 'BE',
'DK' => 'DK',
'FI' => 'FI',
'FR' => 'FR',
'FX' => 'FR',
'DE' => 'DE',
'GB' => 'XI',
'GR' => 'EL',
'IE' => 'IE',
'IT' => 'IT',
'LU' => 'LU',
'NL' => 'NL',
'PT' => 'PT',
'ES' => 'ES',
'SE' => 'SE',
'CY' => 'CY',
'EE' => 'EE',
'HU' => 'HU',
'LV' => 'LV',
'LT' => 'LT',
'MT' => 'MT',
'PL' => 'PL',
'SK' => 'SK',
'CZ' => 'CZ',
'SI' => 'SI',
'RO' => 'RO',
'BG' => 'BG',
'HR' => 'HR',
];
private $isoPattern = [
'AT' => 'U[A-Z\d]{8}',
'BE' => '[0|1]{1}\d{9}',
'BG' => '\d{9,10}',
'CY' => '\d{8}[A-Z]',
'CZ' => '\d{8,10}',
'DE' => '\d{9}',
'DK' => '(\d{2} ?){3}\d{2}',
'EE' => '\d{9}',
'GB' => '\d{9}(\d{3})?|[A-Z]{2}\d{3}',
'GR' => '\d{9}',
'ES' => '[A-Z]\d{7}[A-Z]|\d{8}[A-Z]|[A-Z]\d{8}',
'FI' => '\d{8}',
'FR' => '([A-Z0-9]{2})\d{9}',
'FX' => '([A-Z0-9]{2})\d{9}',
'HR' => '\d{11}',
'HU' => '\d{8}',
'IE' => '[A-Z\d]{8}|[A-Z\d]{9}',
'IT' => '\d{11}',
'LT' => '(\d{9}|\d{12})',
'LU' => '\d{8}',
'LV' => '\d{11}',
'MT' => '\d{8}',
'NL' => '\d{9}B\d{2}',
'PL' => '\d{10}',
'PT' => '\d{9}',
'RO' => '\d{2,10}',
'SE' => '\d{12}',
'SI' => '\d{8}',
'SK' => '\d{10}',
];
public function __construct(
string $rawVatNumber,
string $rawIsoCode
) {
$this->vatNumber = $this->commonFormatVatNumber($rawVatNumber);
$this->isoCode = strtoupper($rawIsoCode);
$this->validateVatNr();
}
protected function validateVatNr()
{
$vatPrefix = self::$euIso[$this->isoCode] ?? $this->isoCode;
if( substr($this->vatNumber, 0, 2) != $vatPrefix ){
$this->errorMessage = Context::getContext()->getTranslator()->trans('ISO in VAT number doesn\'t seem to match selected country', [], 'Modules.Ws_VatCheck.Front');
}
$trimmedVat = str_replace($vatPrefix, '', $this->vatNumber);
$isoPattern = $this->isoPattern[$this->isoCode];
if( !preg_match('/^(?:'.$isoPattern.')$/', $trimmedVat) ){
$this->errorMessage = Context::getContext()->getTranslator()->trans('VAT number doesn\'t seem to be valid', [], 'Modules.Ws_VatCheck.Front');
}
}
public function getFormattedVat()
{
return $this->vatNumber;
}
public function hasErrors()
{
return !empty($this->errorMessage);
}
public function isNotEuIso()
{
return !array_key_exists($this->isoCode, self::$euIso);
}
private function commonFormatVatNumber(string $rawVatNumber)
{
return strtoupper(preg_replace('/[ .]/', '', $rawVatNumber));
}
public function getErrorMessage()
{
return $this->errorMessage;
}
}