mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-08 01:37:36 +00:00
670 lines
23 KiB
PHP
670 lines
23 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Customer\Test\Unit\Observer;
|
|
|
|
use Magento\Customer\Api\Data\GroupInterface;
|
|
use Magento\Customer\Api\GroupManagementInterface;
|
|
use Magento\Customer\Helper\Address as HelperAddress;
|
|
use Magento\Customer\Model\Address\AbstractAddress;
|
|
use Magento\Customer\Model\Customer;
|
|
use Magento\Customer\Model\Session;
|
|
use Magento\Customer\Model\Vat;
|
|
use Magento\Customer\Observer\AfterAddressSaveObserver;
|
|
use Magento\Customer\Observer\BeforeAddressSaveObserver;
|
|
use Magento\Framework\App\Area;
|
|
use Magento\Framework\App\Config\ScopeConfigInterface;
|
|
use Magento\Framework\App\State as AppState;
|
|
use Magento\Framework\DataObject;
|
|
use Magento\Framework\Escaper;
|
|
use Magento\Framework\Event\Observer;
|
|
use Magento\Framework\Message\ManagerInterface;
|
|
use Magento\Framework\Registry;
|
|
use Magento\Store\Model\ScopeInterface;
|
|
use Magento\Store\Model\Store;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class AfterAddressSaveObserverTest extends TestCase
|
|
{
|
|
/**
|
|
* @var AfterAddressSaveObserver
|
|
*/
|
|
protected $model;
|
|
|
|
/**
|
|
* @var Vat|MockObject
|
|
*/
|
|
protected $vat;
|
|
|
|
/**
|
|
* @var HelperAddress|MockObject
|
|
*/
|
|
protected $helperAddress;
|
|
|
|
/**
|
|
* @var Registry|MockObject
|
|
*/
|
|
protected $registry;
|
|
|
|
/**
|
|
* @var GroupManagementInterface|MockObject
|
|
*/
|
|
protected $groupManagement;
|
|
|
|
/**
|
|
* @var ScopeConfigInterface|MockObject
|
|
*/
|
|
protected $scopeConfig;
|
|
|
|
/**
|
|
* @var ManagerInterface|MockObject
|
|
*/
|
|
protected $messageManager;
|
|
|
|
/**
|
|
* @var Escaper|MockObject
|
|
*/
|
|
protected $escaper;
|
|
|
|
/**
|
|
* @var AppState|MockObject
|
|
*/
|
|
protected $appState;
|
|
|
|
/**
|
|
* @var Session|MockObject
|
|
*/
|
|
protected $customerSessionMock;
|
|
|
|
/**
|
|
* @var GroupInterface|MockObject
|
|
*/
|
|
protected $group;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->vat = $this->createMock(Vat::class);
|
|
$this->helperAddress = $this->createMock(HelperAddress::class);
|
|
$this->registry = $this->createMock(Registry::class);
|
|
$this->escaper = $this->createMock(Escaper::class);
|
|
$this->appState = $this->createMock(AppState::class);
|
|
$this->customerSessionMock = $this->createMock(Session::class);
|
|
$this->group = $this->getMockBuilder(GroupInterface::class)
|
|
->onlyMethods(['getId'])
|
|
->getMockForAbstractClass();
|
|
$this->group->expects($this->any())->method('getId')->willReturn(1);
|
|
$this->groupManagement = $this->getMockBuilder(GroupManagementInterface::class)
|
|
->onlyMethods(['getDefaultGroup'])
|
|
->getMockForAbstractClass();
|
|
$this->groupManagement->expects($this->any())->method('getDefaultGroup')->willReturn($this->group);
|
|
|
|
$this->scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class)
|
|
->getMockForAbstractClass();
|
|
$this->messageManager = $this->getMockBuilder(ManagerInterface::class)
|
|
->getMockForAbstractClass();
|
|
|
|
$this->model = new AfterAddressSaveObserver(
|
|
$this->vat,
|
|
$this->helperAddress,
|
|
$this->registry,
|
|
$this->groupManagement,
|
|
$this->scopeConfig,
|
|
$this->messageManager,
|
|
$this->escaper,
|
|
$this->appState,
|
|
$this->customerSessionMock
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param bool $isVatValidationEnabled
|
|
* @param bool $processedFlag
|
|
* @param bool $forceProcess
|
|
* @param int $addressId
|
|
* @param mixed $registeredAddressId
|
|
* @param mixed $configAddressType
|
|
* @dataProvider dataProviderAfterAddressSaveRestricted
|
|
*/
|
|
public function testAfterAddressSaveRestricted(
|
|
bool $isVatValidationEnabled,
|
|
bool $processedFlag,
|
|
bool $forceProcess,
|
|
int $addressId,
|
|
$registeredAddressId,
|
|
$configAddressType
|
|
) {
|
|
$store = $this->getMockBuilder(Store::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$customer = $this->getMockBuilder(Customer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getDefaultBilling', 'getDefaultShipping'])
|
|
->onlyMethods(['getStore', 'getGroupId'])
|
|
->getMock();
|
|
$customer->expects($this->any())
|
|
->method('getStore')
|
|
->willReturn($store);
|
|
$customer->expects($this->any())
|
|
->method('getDefaultBilling')
|
|
->willReturn(null);
|
|
$customer->expects($this->any())
|
|
->method('getDefaultShipping')
|
|
->willReturn(null);
|
|
$customer->expects($this->any())
|
|
->method('getGroupID')
|
|
->willReturn(1);
|
|
|
|
$address = $this->getMockBuilder(\Magento\Customer\Model\Address::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(
|
|
[
|
|
'getIsDefaultBilling',
|
|
'getIsDefaultShipping',
|
|
'setForceProcess',
|
|
'getIsPrimaryBilling',
|
|
'getIsPrimaryShipping',
|
|
'getForceProcess'
|
|
]
|
|
)
|
|
->onlyMethods(['getId', 'getCustomer'])
|
|
->getMock();
|
|
$address->expects($this->any())
|
|
->method('getId')
|
|
->willReturn($addressId);
|
|
$address->expects($this->any())
|
|
->method('getCustomer')
|
|
->willReturn($customer);
|
|
$address->expects($this->any())
|
|
->method('getForceProcess')
|
|
->willReturn($forceProcess);
|
|
$address->expects($this->any())
|
|
->method('getIsPrimaryBilling')
|
|
->willReturn(null);
|
|
$address->expects($this->any())
|
|
->method('getIsDefaultBilling')
|
|
->willReturn($addressId);
|
|
$address->expects($this->any())
|
|
->method('getIsPrimaryShipping')
|
|
->willReturn(null);
|
|
$address->expects($this->any())
|
|
->method('getIsDefaultShipping')
|
|
->willReturn($addressId);
|
|
|
|
$observer = $this->getMockBuilder(Observer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods([
|
|
'getCustomerAddress',
|
|
])
|
|
->getMock();
|
|
$observer->expects($this->once())
|
|
->method('getCustomerAddress')
|
|
->willReturn($address);
|
|
|
|
$this->helperAddress->expects($this->once())
|
|
->method('isVatValidationEnabled')
|
|
->with($store)
|
|
->willReturn($isVatValidationEnabled);
|
|
|
|
$this->registry->expects($this->any())
|
|
->method('registry')
|
|
->willReturnMap([
|
|
[AfterAddressSaveObserver::VIV_PROCESSED_FLAG, $processedFlag],
|
|
[BeforeAddressSaveObserver::VIV_CURRENTLY_SAVED_ADDRESS, $registeredAddressId],
|
|
]);
|
|
|
|
$this->helperAddress->expects($this->any())
|
|
->method('getTaxCalculationAddressType')
|
|
->willReturn($configAddressType);
|
|
|
|
$this->model->execute($observer);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public static function dataProviderAfterAddressSaveRestricted()
|
|
{
|
|
return [
|
|
[false, false, false, 1, null, null],
|
|
[true, true, false, 1, null, null],
|
|
[true, false, false, 1, null, null],
|
|
[true, false, false, 1, 1, AbstractAddress::TYPE_BILLING],
|
|
[true, false, false, 1, 1, AbstractAddress::TYPE_SHIPPING],
|
|
];
|
|
}
|
|
|
|
public function testAfterAddressSaveException()
|
|
{
|
|
$store = $this->getMockBuilder(Store::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$customer = $this->getMockBuilder(Customer::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$customer->expects($this->any())
|
|
->method('getStore')
|
|
->willReturn($store);
|
|
|
|
$address = $this->getMockBuilder(\Magento\Customer\Model\Address::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getForceProcess', 'getVatId'])
|
|
->onlyMethods(['getCustomer'])
|
|
->getMock();
|
|
$address->expects($this->any())
|
|
->method('getCustomer')
|
|
->willReturn($customer);
|
|
$address->expects($this->once())
|
|
->method('getForceProcess')
|
|
->willReturn(true);
|
|
$address->expects($this->any())
|
|
->method('getVatId')
|
|
->willThrowException(new \Exception('Exception'));
|
|
|
|
$observer = $this->getMockBuilder(Observer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods([
|
|
'getCustomerAddress',
|
|
])
|
|
->getMock();
|
|
$observer->expects($this->once())
|
|
->method('getCustomerAddress')
|
|
->willReturn($address);
|
|
|
|
$this->helperAddress->expects($this->once())
|
|
->method('isVatValidationEnabled')
|
|
->with($store)
|
|
->willReturn(true);
|
|
|
|
$this->registry->expects($this->any())
|
|
->method('registry')
|
|
->with(AfterAddressSaveObserver::VIV_PROCESSED_FLAG)
|
|
->willReturn(false);
|
|
$this->registry->expects($this->any())
|
|
->method('register')
|
|
->willReturnMap([
|
|
[AfterAddressSaveObserver::VIV_PROCESSED_FLAG, true, false, $this->registry],
|
|
[AfterAddressSaveObserver::VIV_PROCESSED_FLAG, false, true, $this->registry],
|
|
]);
|
|
|
|
$this->model->execute($observer);
|
|
}
|
|
|
|
/**
|
|
* @param mixed $vatId
|
|
* @param int $countryId
|
|
* @param bool $isCountryInEU
|
|
* @param int $customerGroupId
|
|
* @param int $defaultGroupId
|
|
* @param bool $disableAutoGroupChange
|
|
* @dataProvider dataProviderAfterAddressSaveDefaultGroup
|
|
*/
|
|
public function testAfterAddressSaveDefaultGroup(
|
|
$vatId,
|
|
int $countryId,
|
|
bool $isCountryInEU,
|
|
int $customerGroupId,
|
|
int $defaultGroupId,
|
|
bool $disableAutoGroupChange
|
|
) {
|
|
$store = $this->getMockBuilder(Store::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$dataGroup = $this->getMockBuilder(GroupInterface::class)
|
|
->getMockForAbstractClass();
|
|
$dataGroup->expects($this->any())
|
|
->method('getId')
|
|
->willReturn($defaultGroupId);
|
|
|
|
$customer = $this->getMockBuilder(Customer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getDisableAutoGroupChange', 'setGroupId'])
|
|
->onlyMethods([
|
|
'getStore',
|
|
'getGroupId',
|
|
'save'
|
|
])
|
|
->getMock();
|
|
$customer->expects($this->exactly(2))
|
|
->method('getStore')
|
|
->willReturn($store);
|
|
$customer->expects($this->once())
|
|
->method('getDisableAutoGroupChange')
|
|
->willReturn($disableAutoGroupChange);
|
|
$customer->expects($this->any())
|
|
->method('getGroupId')
|
|
->willReturn($customerGroupId);
|
|
$customer->expects($this->any())
|
|
->method('setGroupId')
|
|
->with($defaultGroupId)
|
|
->willReturnSelf();
|
|
$customer->expects($this->any())
|
|
->method('save')
|
|
->willReturnSelf();
|
|
|
|
$address = $this->getMockBuilder(\Magento\Customer\Model\Address::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getForceProcess', 'getVatId'])
|
|
->onlyMethods([
|
|
'getCustomer',
|
|
'getCountry',
|
|
])
|
|
->getMock();
|
|
$address->expects($this->once())
|
|
->method('getCustomer')
|
|
->willReturn($customer);
|
|
$address->expects($this->once())
|
|
->method('getForceProcess')
|
|
->willReturn(true);
|
|
$address->expects($this->once())
|
|
->method('getVatId')
|
|
->willReturn($vatId);
|
|
$address->expects($this->any())
|
|
->method('getCountry')
|
|
->willReturn($countryId);
|
|
|
|
$observer = $this->getMockBuilder(Observer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods([
|
|
'getCustomerAddress',
|
|
])
|
|
->getMock();
|
|
$observer->expects($this->once())
|
|
->method('getCustomerAddress')
|
|
->willReturn($address);
|
|
|
|
$this->helperAddress->expects($this->once())
|
|
->method('isVatValidationEnabled')
|
|
->with($store)
|
|
->willReturn(true);
|
|
|
|
$this->vat->expects($this->any())
|
|
->method('isCountryInEU')
|
|
->with($countryId)
|
|
->willReturn($isCountryInEU);
|
|
|
|
$this->groupManagement->expects($this->any())
|
|
->method('getDefaultGroup')
|
|
->with($store)
|
|
->willReturn($dataGroup);
|
|
|
|
$this->model->execute($observer);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public static function dataProviderAfterAddressSaveDefaultGroup()
|
|
{
|
|
return [
|
|
'when vatId is empty, non EU country and disable auto group false' => ['', 1, false, 1, 1, false],
|
|
'when vatId is empty, non EU country and disable auto group true' => ['', 1, false, 1, 1, true],
|
|
'when vatId is empty, non EU country, disable auto group true
|
|
and different groupId' => ['', 1, false, 1, 2, true],
|
|
'when vatId is not empty, non EU country and disable auto group false' => [1, 1, false, 1, 1, false],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param mixed $vatId
|
|
* @param mixed $vatClass
|
|
* @param int $countryId
|
|
* @param string $country
|
|
* @param int $newGroupId
|
|
* @param string $areaCode
|
|
* @param bool $resultVatIsValid
|
|
* @param bool $resultRequestSuccess
|
|
* @param string $resultValidMessage
|
|
* @param string $resultInvalidMessage
|
|
* @param string $resultErrorMessage
|
|
* @dataProvider dataProviderAfterAddressSaveNewGroup
|
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
|
|
*/
|
|
public function testAfterAddressSaveNewGroup(
|
|
$vatId,
|
|
$vatClass,
|
|
int $countryId,
|
|
string $country,
|
|
int $newGroupId,
|
|
string $areaCode,
|
|
bool $resultVatIsValid,
|
|
bool $resultRequestSuccess,
|
|
string $resultValidMessage,
|
|
string $resultInvalidMessage,
|
|
string $resultErrorMessage
|
|
) {
|
|
$store = $this->getMockBuilder(Store::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$validationResult = $this->getMockBuilder(DataObject::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods([
|
|
'getIsValid',
|
|
'getRequestSuccess',
|
|
])
|
|
->getMock();
|
|
$validationResult->expects($this->any())
|
|
->method('getIsValid')
|
|
->willReturn($resultVatIsValid);
|
|
$validationResult->expects($this->any())
|
|
->method('getRequestSuccess')
|
|
->willReturn($resultRequestSuccess);
|
|
|
|
$customer = $this->getMockBuilder(Customer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getDisableAutoGroupChange', 'setGroupId'])
|
|
->onlyMethods([
|
|
'getStore',
|
|
'getGroupId',
|
|
'save',
|
|
])
|
|
->getMock();
|
|
$customer->expects($this->exactly(2))
|
|
->method('getStore')
|
|
->willReturn($store);
|
|
$customer->expects($this->any())
|
|
->method('getDisableAutoGroupChange')
|
|
->willReturn(false);
|
|
$customer->expects($this->once())
|
|
->method('getGroupId')
|
|
->willReturn(null);
|
|
$customer->expects($this->once())
|
|
->method('setGroupId')
|
|
->with($newGroupId)
|
|
->willReturnSelf();
|
|
$customer->expects($this->once())
|
|
->method('save')
|
|
->willReturnSelf();
|
|
|
|
$this->customerSessionMock->expects($this->once())
|
|
->method('setCustomerGroupId')
|
|
->with($newGroupId)
|
|
->willReturnSelf();
|
|
|
|
$address = $this->getMockBuilder(\Magento\Customer\Model\Address::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods(['getForceProcess', 'getVatId', 'setVatValidationResult', 'getCountryId'])
|
|
->onlyMethods([
|
|
'getCustomer',
|
|
'getCountry'
|
|
])
|
|
->getMock();
|
|
$address->expects($this->any())
|
|
->method('getCustomer')
|
|
->willReturn($customer);
|
|
$address->expects($this->once())
|
|
->method('getForceProcess')
|
|
->willReturn(true);
|
|
$address->expects($this->any())
|
|
->method('getVatId')
|
|
->willReturn($vatId);
|
|
$address->expects($this->any())
|
|
->method('getCountryId')
|
|
->willReturn($countryId);
|
|
$address->expects($this->once())
|
|
->method('getCountry')
|
|
->willReturn($country);
|
|
$address->expects($this->once())
|
|
->method('setVatValidationResult')
|
|
->with($validationResult)
|
|
->willReturnSelf();
|
|
|
|
$observer = $this->getMockBuilder(Observer::class)
|
|
->disableOriginalConstructor()
|
|
->addMethods([
|
|
'getCustomerAddress',
|
|
])
|
|
->getMock();
|
|
$observer->expects($this->once())
|
|
->method('getCustomerAddress')
|
|
->willReturn($address);
|
|
|
|
$this->helperAddress->expects($this->once())
|
|
->method('isVatValidationEnabled')
|
|
->with($store)
|
|
->willReturn(true);
|
|
|
|
$this->vat->expects($this->any())
|
|
->method('isCountryInEU')
|
|
->with($country)
|
|
->willReturn(true);
|
|
$this->vat->expects($this->once())
|
|
->method('checkVatNumber')
|
|
->with($countryId, $vatId)
|
|
->willReturn($validationResult);
|
|
$this->vat->expects($this->once())
|
|
->method('getCustomerGroupIdBasedOnVatNumber')
|
|
->with($countryId, $validationResult, $store)
|
|
->willReturn($newGroupId);
|
|
$this->vat->expects($this->any())
|
|
->method('getCustomerVatClass')
|
|
->with($countryId, $validationResult)
|
|
->willReturn($vatClass);
|
|
|
|
$this->appState->expects($this->once())
|
|
->method('getAreaCode')
|
|
->willReturn($areaCode);
|
|
|
|
$this->scopeConfig->expects($this->any())
|
|
->method('isSetFlag')
|
|
->with(HelperAddress::XML_PATH_VIV_DISABLE_AUTO_ASSIGN_DEFAULT)
|
|
->willReturn(false);
|
|
|
|
if ($resultValidMessage) {
|
|
$this->messageManager->expects($this->once())
|
|
->method('addSuccess')
|
|
->with($resultValidMessage)
|
|
->willReturnSelf();
|
|
}
|
|
if ($resultInvalidMessage) {
|
|
$this->escaper->expects($this->once())
|
|
->method('escapeHtml')
|
|
->with($vatId)
|
|
->willReturn($vatId);
|
|
$this->messageManager->expects($this->once())
|
|
->method('addErrorMessage')
|
|
->with($resultInvalidMessage)
|
|
->willReturnSelf();
|
|
}
|
|
if ($resultErrorMessage) {
|
|
$this->scopeConfig->expects($this->once())
|
|
->method('getValue')
|
|
->with('trans_email/ident_support/email', ScopeInterface::SCOPE_STORE)
|
|
->willReturn('admin@example.com');
|
|
$this->messageManager->expects($this->once())
|
|
->method('addErrorMessage')
|
|
->with($resultErrorMessage)
|
|
->willReturnSelf();
|
|
}
|
|
|
|
$this->model->execute($observer);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public static function dataProviderAfterAddressSaveNewGroup()
|
|
{
|
|
return [
|
|
[
|
|
'vat_id' => 1,
|
|
'vat_class' => null,
|
|
'country_id' => 1,
|
|
'country_code' => 'US',
|
|
'group_id' => 1,
|
|
'area_code' => Area::AREA_ADMINHTML,
|
|
'is_vat_valid' => false,
|
|
'request_sucess' => false,
|
|
'valid_message' => '',
|
|
'invalid_message' => '',
|
|
'error_message' => '',
|
|
],
|
|
[
|
|
'vat_id' => 1,
|
|
'vat_class' => Vat::VAT_CLASS_DOMESTIC,
|
|
'country_id' => 1,
|
|
'country_code' => 'US',
|
|
'group_id' => 1,
|
|
'area_code' => Area::AREA_FRONTEND,
|
|
'is_vat_valid' => true,
|
|
'request_sucess' => false,
|
|
'valid_message' => 'Your VAT ID was successfully validated. You will be charged tax.',
|
|
'invalid_message' => '',
|
|
'error_message' => '',
|
|
],
|
|
[
|
|
'vat_id' => 1,
|
|
'vat_class' => Vat::VAT_CLASS_INTRA_UNION,
|
|
'country_id' => 1,
|
|
'country_code' => 'US',
|
|
'group_id' => 1,
|
|
'area_code' => Area::AREA_FRONTEND,
|
|
'is_vat_valid' => true,
|
|
'request_sucess' => false,
|
|
'valid_message' => 'Your VAT ID was successfully validated. You will not be charged tax.',
|
|
'invalid_message' => '',
|
|
'error_message' => '',
|
|
],
|
|
[
|
|
'vat_id' => 1,
|
|
'vat_class' => Vat::VAT_CLASS_INTRA_UNION,
|
|
'country_id' => 1,
|
|
'country_code' => 'US',
|
|
'group_id' => 1,
|
|
'area_code' => Area::AREA_FRONTEND,
|
|
'is_vat_valid' => false,
|
|
'request_sucess' => true,
|
|
'valid_message' => '',
|
|
'invalid_message' => 'The VAT ID entered (1) is not a valid VAT ID. You will be charged tax.',
|
|
'error_message' => '',
|
|
],
|
|
[
|
|
'vat_id' => 1,
|
|
'vat_class' => Vat::VAT_CLASS_INTRA_UNION,
|
|
'country_id' => 1,
|
|
'country_code' => 'US',
|
|
'group_id' => 1,
|
|
'area_code' => Area::AREA_FRONTEND,
|
|
'is_vat_valid' => false,
|
|
'request_sucess' => false,
|
|
'valid_message' => '',
|
|
'invalid_message' => '',
|
|
'error_message' => 'Your Tax ID cannot be validated. You will be charged tax. '
|
|
. 'If you believe this is an error, please contact us at admin@example.com',
|
|
],
|
|
];
|
|
}
|
|
}
|