|
Apache/2.4.41 (Ubuntu) Linux vmi616275.contaboserver.net 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 uid=33(www-data) gid=33(www-data) groups=33(www-data) server ip : 62.171.164.128 | your ip : 127.0.0.1 safemode OFF > / home / dev2.destoffenstraat.com / app / code / Geissweb / Euvat / Validator / |
Filename | /home/dev2.destoffenstraat.com/app/code/Geissweb/Euvat/Validator/Vies.php |
Size | 9.94 kb |
Permission | rwxrwxrwx |
Owner | root : root |
Create time | 17-Aug-2025 10:26 |
Last modified | 09-Jul-2024 08:40 |
Last accessed | 22-Aug-2025 02:07 |
Actions | edit | rename | delete | download (gzip) |
View | text | code | image |
<?php
/**
* ||GEISSWEB| EU VAT Enhanced
*
* NOTICE OF LICENSE
*
* This source file is subject to the GEISSWEB End User License Agreement
* that is available through the world-wide-web at this URL: https://www.geissweb.de/legal-information/eula
*
* DISCLAIMER
*
* Do not edit this file if you wish to update the extension in the future. If you wish to customize the extension
* for your needs please refer to our support for more information.
*
* @copyright Copyright (c) 2015 GEISS Weblösungen (https://www.geissweb.de)
* @license https://www.geissweb.de/legal-information/eula GEISSWEB End User License Agreement
*/
declare(strict_types=1);
namespace Geissweb\Euvat\Validator;
use Magento\Framework\Exception\LocalizedException;
use SoapClient;
use stdClass;
/**
* Class Vies
* VIES service wrapper
*/
class Vies extends BaseValidator
{
/**
* @var string
*/
public string $serviceUrl = 'https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
/**
* Validate VAT number
*
* @return void
* @throws \SoapFault
*/
public function validate(): void
{
try {
$requesterCountryCode = $this->getParam('requesterCountryCode');
$requesterVatNumber = $this->getParam('requesterVatNumber');
$this->logger->customLog('[ViesValidation] validation request', $this->params);
if ($requesterCountryCode === 'GR') {
$this->setParam('requesterCountryCode', 'EL');
}
if (!empty($requesterCountryCode)
&& !empty($requesterVatNumber)
&& $this->configHelper->isEuCountry($requesterCountryCode)
) {
$result = $this->client->checkVatApprox($this->params);
} else {
$result = $this->client->checkVat($this->params);
}
if (!is_soap_fault($result)) {
$this->logger->customLog('[ViesValidation] response data', (array)$result);
}
//throw new \SoapFault('123', 'GLOBAL_MAX_CONCURRENT_REQ'); //for testing
// Set the number again in case VIES returns empty (because invalid) number
if (isset($result->vatNumber) && $result->vatNumber === '') {
$result->vatNumber = $this->getParam('vatNumber');
}
$this->buildResult($result);
$this->eventManager->dispatch('vat_validation_after', [
'validation_result' => $this->validationResult
]);
} catch (\SoapFault $e) {
$this->handleViesException($e->faultstring);
}
}
/**
* Handle exception
*
* @param string $faultstring
*
* @return void
*/
private function handleViesException(string $faultstring): void
{
if ($this->configHelper->isOfflineValidationEnabled()
&& $this->configHelper->isOfflineValidationCountry($this->getParam('countryCode'))
&& $this->syntaxValidator->isValid($this->getParam('vatNumber'), $this->getParam('countryCode'))
) {
$this->validationResult = $this->getOfflineResult(); //offline result
} else {
$this->validationResult = $this->getResult(); //empty/new result
switch ($faultstring) {
case 'INVALID_REQUESTER_INFO':
case 'Empty Requester VAT number':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('Invalid requester information. Please check your merchant VAT number.')->render()
);
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'MS_UNAVAILABLE':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('Currently it is not possible to validate VAT numbers from this country.')->render()
);
$this->validationResult->setWarning(true);
break;
case 'TIMEOUT':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('The connection to the validation interface timed out. Please try again.')->render()
);
$this->validationResult->setWarning(true);
break;
case 'INVALID_INPUT':
case 'Invalid_input':
case 'VAT_BLOCKED':
$this->validationResult->setVatRequestSuccess(true);
$this->validationResult->setRequestMessage(__('The VAT number is invalid.')->render());
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'IP_BLOCKED':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(__('This IP address is blocked')->render());
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'GLOBAL_MAX_CONCURRENT_REQ':
case 'GLOBAL_MAX_CONCURRENT_REQ_TIME':
case 'MS_MAX_CONCURRENT_REQ':
case 'MS_MAX_CONCURRENT_REQ_TIME':
case 'SERVICE_UNAVAILABLE':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('The VAT number validation service is busy.')->render()
);
$this->validationResult->setWarning(true);
break;
default:
$this->validationResult->setRequestMessage($faultstring);
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
}
}
$this->logger->customLog('[VIES] Exception: '.$faultstring.', '.$this->validationResult->getRequestMessage());
}
/**
* Adds data to $this->validationResult
*
* @param \stdClass $result
*
* @return void
*/
public function buildResult(stdClass $result): void
{
try {
if (!isset($result->faultstring)) {
$this->validationResult->setVatRequestSuccess(true);
}
//@phpstan-ignore-next-line
foreach ($result as $key => $value) {
switch ($key) {
case 'valid':
$this->validationResult->setVatIsValid((bool)$value);
break;
case 'countryCode':
$this->validationResult->setVatRequestCountryCode($value);
break;
case 'vatNumber':
$this->validationResult->setVatId($value);
break;
case 'requestDate':
$this->validationResult->setVatRequestDate(date("Y-m-d H:i:s", time()));
break;
case 'traderName':
$this->validationResult->setVatTraderName($value);
break;
case 'traderAddress':
$this->validationResult->setVatTraderAddress($value);
break;
case 'requestIdentifier':
$this->validationResult->setVatRequestId($value);
break;
case 'traderCompanyType':
$this->validationResult->setVatTraderCompanyType($value);
break;
default:
$this->validationResult->setData($key, $value);
break;
}
}
$reqMsg = $this->validationResult->getRequestMessage();
if ($this->validationResult->getVatIsValid()) {
$this->validationResult->setRequestMessage(__('The VAT number is valid.')->render());
} elseif (empty($reqMsg)) {
$this->validationResult->setRequestMessage(__('The VAT number is invalid.')->render());
}
} catch (LocalizedException $e) {
$this->logger->critical($e);
}
}
/**
* Return the validation client
*
* @return \SoapClient|null
*/
public function getClient(): ?SoapClient
{
return $this->getSoapClient();
}
/**
* Create SOAP client based on VAT validation service WSDL
*
* @return \SoapClient|null
*/
protected function getSoapClient(): ?SoapClient
{
try {
if ($this->configHelper->getIsIpv6Compat()) {
$context = stream_context_create([ // phpcs:ignore Magento2.Functions.DiscouragedFunction
'socket' => [
'bindto' => $this->configHelper->getIPv4ToBindOn() . ':0'
]
]);
return new SoapClient($this->serviceUrl, [
'soap_version' => SOAP_1_1,
'user_agent' => 'Magento2 Webshop',
'cache_wsdl' => WSDL_CACHE_MEMORY,
'stream_context'=> $context,
'exceptions' => true,
]);
}
return new SoapClient($this->serviceUrl, [
'soap_version' => SOAP_1_1,
'user_agent' => 'Magento2 Webshop',
'cache_wsdl' => WSDL_CACHE_MEMORY,
'exceptions' => true,
]);
} catch (\SoapFault $e) {
$this->logger->critical($e);
}
return null;
}
}
/**
* ||GEISSWEB| EU VAT Enhanced
*
* NOTICE OF LICENSE
*
* This source file is subject to the GEISSWEB End User License Agreement
* that is available through the world-wide-web at this URL: https://www.geissweb.de/legal-information/eula
*
* DISCLAIMER
*
* Do not edit this file if you wish to update the extension in the future. If you wish to customize the extension
* for your needs please refer to our support for more information.
*
* @copyright Copyright (c) 2015 GEISS Weblösungen (https://www.geissweb.de)
* @license https://www.geissweb.de/legal-information/eula GEISSWEB End User License Agreement
*/
declare(strict_types=1);
namespace Geissweb\Euvat\Validator;
use Magento\Framework\Exception\LocalizedException;
use SoapClient;
use stdClass;
/**
* Class Vies
* VIES service wrapper
*/
class Vies extends BaseValidator
{
/**
* @var string
*/
public string $serviceUrl = 'https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
/**
* Validate VAT number
*
* @return void
* @throws \SoapFault
*/
public function validate(): void
{
try {
$requesterCountryCode = $this->getParam('requesterCountryCode');
$requesterVatNumber = $this->getParam('requesterVatNumber');
$this->logger->customLog('[ViesValidation] validation request', $this->params);
if ($requesterCountryCode === 'GR') {
$this->setParam('requesterCountryCode', 'EL');
}
if (!empty($requesterCountryCode)
&& !empty($requesterVatNumber)
&& $this->configHelper->isEuCountry($requesterCountryCode)
) {
$result = $this->client->checkVatApprox($this->params);
} else {
$result = $this->client->checkVat($this->params);
}
if (!is_soap_fault($result)) {
$this->logger->customLog('[ViesValidation] response data', (array)$result);
}
//throw new \SoapFault('123', 'GLOBAL_MAX_CONCURRENT_REQ'); //for testing
// Set the number again in case VIES returns empty (because invalid) number
if (isset($result->vatNumber) && $result->vatNumber === '') {
$result->vatNumber = $this->getParam('vatNumber');
}
$this->buildResult($result);
$this->eventManager->dispatch('vat_validation_after', [
'validation_result' => $this->validationResult
]);
} catch (\SoapFault $e) {
$this->handleViesException($e->faultstring);
}
}
/**
* Handle exception
*
* @param string $faultstring
*
* @return void
*/
private function handleViesException(string $faultstring): void
{
if ($this->configHelper->isOfflineValidationEnabled()
&& $this->configHelper->isOfflineValidationCountry($this->getParam('countryCode'))
&& $this->syntaxValidator->isValid($this->getParam('vatNumber'), $this->getParam('countryCode'))
) {
$this->validationResult = $this->getOfflineResult(); //offline result
} else {
$this->validationResult = $this->getResult(); //empty/new result
switch ($faultstring) {
case 'INVALID_REQUESTER_INFO':
case 'Empty Requester VAT number':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('Invalid requester information. Please check your merchant VAT number.')->render()
);
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'MS_UNAVAILABLE':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('Currently it is not possible to validate VAT numbers from this country.')->render()
);
$this->validationResult->setWarning(true);
break;
case 'TIMEOUT':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('The connection to the validation interface timed out. Please try again.')->render()
);
$this->validationResult->setWarning(true);
break;
case 'INVALID_INPUT':
case 'Invalid_input':
case 'VAT_BLOCKED':
$this->validationResult->setVatRequestSuccess(true);
$this->validationResult->setRequestMessage(__('The VAT number is invalid.')->render());
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'IP_BLOCKED':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(__('This IP address is blocked')->render());
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
case 'GLOBAL_MAX_CONCURRENT_REQ':
case 'GLOBAL_MAX_CONCURRENT_REQ_TIME':
case 'MS_MAX_CONCURRENT_REQ':
case 'MS_MAX_CONCURRENT_REQ_TIME':
case 'SERVICE_UNAVAILABLE':
$this->validationResult->setVatRequestSuccess(false);
$this->validationResult->setRequestMessage(
__('The VAT number validation service is busy.')->render()
);
$this->validationResult->setWarning(true);
break;
default:
$this->validationResult->setRequestMessage($faultstring);
$this->validationResult->setError(true);
$this->validationResult->setWarning(false);
break;
}
}
$this->logger->customLog('[VIES] Exception: '.$faultstring.', '.$this->validationResult->getRequestMessage());
}
/**
* Adds data to $this->validationResult
*
* @param \stdClass $result
*
* @return void
*/
public function buildResult(stdClass $result): void
{
try {
if (!isset($result->faultstring)) {
$this->validationResult->setVatRequestSuccess(true);
}
//@phpstan-ignore-next-line
foreach ($result as $key => $value) {
switch ($key) {
case 'valid':
$this->validationResult->setVatIsValid((bool)$value);
break;
case 'countryCode':
$this->validationResult->setVatRequestCountryCode($value);
break;
case 'vatNumber':
$this->validationResult->setVatId($value);
break;
case 'requestDate':
$this->validationResult->setVatRequestDate(date("Y-m-d H:i:s", time()));
break;
case 'traderName':
$this->validationResult->setVatTraderName($value);
break;
case 'traderAddress':
$this->validationResult->setVatTraderAddress($value);
break;
case 'requestIdentifier':
$this->validationResult->setVatRequestId($value);
break;
case 'traderCompanyType':
$this->validationResult->setVatTraderCompanyType($value);
break;
default:
$this->validationResult->setData($key, $value);
break;
}
}
$reqMsg = $this->validationResult->getRequestMessage();
if ($this->validationResult->getVatIsValid()) {
$this->validationResult->setRequestMessage(__('The VAT number is valid.')->render());
} elseif (empty($reqMsg)) {
$this->validationResult->setRequestMessage(__('The VAT number is invalid.')->render());
}
} catch (LocalizedException $e) {
$this->logger->critical($e);
}
}
/**
* Return the validation client
*
* @return \SoapClient|null
*/
public function getClient(): ?SoapClient
{
return $this->getSoapClient();
}
/**
* Create SOAP client based on VAT validation service WSDL
*
* @return \SoapClient|null
*/
protected function getSoapClient(): ?SoapClient
{
try {
if ($this->configHelper->getIsIpv6Compat()) {
$context = stream_context_create([ // phpcs:ignore Magento2.Functions.DiscouragedFunction
'socket' => [
'bindto' => $this->configHelper->getIPv4ToBindOn() . ':0'
]
]);
return new SoapClient($this->serviceUrl, [
'soap_version' => SOAP_1_1,
'user_agent' => 'Magento2 Webshop',
'cache_wsdl' => WSDL_CACHE_MEMORY,
'stream_context'=> $context,
'exceptions' => true,
]);
}
return new SoapClient($this->serviceUrl, [
'soap_version' => SOAP_1_1,
'user_agent' => 'Magento2 Webshop',
'cache_wsdl' => WSDL_CACHE_MEMORY,
'exceptions' => true,
]);
} catch (\SoapFault $e) {
$this->logger->critical($e);
}
return null;
}
}