123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Observer;
- use Magento\Customer\Api\GroupManagementInterface;
- use Magento\Customer\Helper\Address as HelperAddress;
- use Magento\Customer\Model\Address;
- use Magento\Customer\Model\Address\AbstractAddress;
- use Magento\Customer\Model\Session as CustomerSession;
- use Magento\Customer\Model\Vat;
- 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\ObserverInterface;
- use Magento\Framework\Message\ManagerInterface;
- use Magento\Framework\Registry;
- use Magento\Store\Model\ScopeInterface;
- /**
- * Customer Observer Model
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class AfterAddressSaveObserver implements ObserverInterface
- {
- /**
- * VAT ID validation processed flag code
- */
- const VIV_PROCESSED_FLAG = 'viv_after_address_save_processed';
- /**
- * @var HelperAddress
- */
- protected $_customerAddress;
- /**
- * @var Registry
- */
- protected $_coreRegistry;
- /**
- * @var Vat
- */
- protected $_customerVat;
- /**
- * @var GroupManagementInterface
- */
- protected $_groupManagement;
- /**
- * @var AppState
- */
- protected $appState;
- /**
- * @var ScopeConfigInterface
- */
- protected $scopeConfig;
- /**
- * @var ManagerInterface
- */
- protected $messageManager;
- /**
- * @var Escaper
- */
- protected $escaper;
- /**
- * @var CustomerSession
- */
- private $customerSession;
- /**
- * @param Vat $customerVat
- * @param HelperAddress $customerAddress
- * @param Registry $coreRegistry
- * @param GroupManagementInterface $groupManagement
- * @param ScopeConfigInterface $scopeConfig
- * @param ManagerInterface $messageManager
- * @param Escaper $escaper
- * @param AppState $appState
- * @param CustomerSession $customerSession
- */
- public function __construct(
- Vat $customerVat,
- HelperAddress $customerAddress,
- Registry $coreRegistry,
- GroupManagementInterface $groupManagement,
- ScopeConfigInterface $scopeConfig,
- ManagerInterface $messageManager,
- Escaper $escaper,
- AppState $appState,
- CustomerSession $customerSession
- ) {
- $this->_customerVat = $customerVat;
- $this->_customerAddress = $customerAddress;
- $this->_coreRegistry = $coreRegistry;
- $this->_groupManagement = $groupManagement;
- $this->scopeConfig = $scopeConfig;
- $this->messageManager = $messageManager;
- $this->escaper = $escaper;
- $this->appState = $appState;
- $this->customerSession = $customerSession;
- }
- /**
- * Address after save event handler
- *
- * @param \Magento\Framework\Event\Observer $observer
- * @return void
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function execute(\Magento\Framework\Event\Observer $observer)
- {
- /** @var $customerAddress Address */
- $customerAddress = $observer->getCustomerAddress();
- $customer = $customerAddress->getCustomer();
- if (!$this->_customerAddress->isVatValidationEnabled($customer->getStore())
- || $this->_coreRegistry->registry(self::VIV_PROCESSED_FLAG)
- || !$this->_canProcessAddress($customerAddress)
- ) {
- return;
- }
- try {
- $this->_coreRegistry->register(self::VIV_PROCESSED_FLAG, true);
- if ($customerAddress->getVatId() == ''
- || !$this->_customerVat->isCountryInEU($customerAddress->getCountry())
- ) {
- $defaultGroupId = $this->_groupManagement->getDefaultGroup($customer->getStore())->getId();
- if (!$customer->getDisableAutoGroupChange() && $customer->getGroupId() != $defaultGroupId) {
- $customer->setGroupId($defaultGroupId);
- $customer->save();
- $this->customerSession->setCustomerGroupId($defaultGroupId);
- }
- } else {
- $result = $this->_customerVat->checkVatNumber(
- $customerAddress->getCountryId(),
- $customerAddress->getVatId()
- );
- $newGroupId = $this->_customerVat->getCustomerGroupIdBasedOnVatNumber(
- $customerAddress->getCountryId(),
- $result,
- $customer->getStore()
- );
- if (!$customer->getDisableAutoGroupChange() && $customer->getGroupId() != $newGroupId) {
- $customer->setGroupId($newGroupId);
- $customer->save();
- $this->customerSession->setCustomerGroupId($newGroupId);
- }
- $customerAddress->setVatValidationResult($result);
- if ($this->appState->getAreaCode() == Area::AREA_FRONTEND) {
- if ($result->getIsValid()) {
- $this->addValidMessage($customerAddress, $result);
- } elseif ($result->getRequestSuccess()) {
- $this->addInvalidMessage($customerAddress);
- } else {
- $this->addErrorMessage($customerAddress);
- }
- }
- }
- } catch (\Exception $e) {
- $this->_coreRegistry->register(self::VIV_PROCESSED_FLAG, false, true);
- }
- }
- /**
- * Check whether specified address should be processed in after_save event handler
- *
- * @param Address $address
- * @return bool
- */
- protected function _canProcessAddress($address)
- {
- if ($address->getForceProcess()) {
- return true;
- }
- if ($this->_coreRegistry->registry(BeforeAddressSaveObserver::VIV_CURRENTLY_SAVED_ADDRESS) != $address->getId()
- ) {
- return false;
- }
- $configAddressType = $this->_customerAddress->getTaxCalculationAddressType();
- if ($configAddressType == AbstractAddress::TYPE_SHIPPING) {
- return $this->_isDefaultShipping($address);
- }
- return $this->_isDefaultBilling($address);
- }
- /**
- * Check whether specified billing address is default for its customer
- *
- * @param Address $address
- * @return bool
- */
- protected function _isDefaultBilling($address)
- {
- return $address->getId() && $address->getId() == $address->getCustomer()->getDefaultBilling()
- || $address->getIsPrimaryBilling()
- || $address->getIsDefaultBilling();
- }
- /**
- * Check whether specified shipping address is default for its customer
- *
- * @param Address $address
- * @return bool
- */
- protected function _isDefaultShipping($address)
- {
- return $address->getId() && $address->getId() == $address->getCustomer()->getDefaultShipping()
- || $address->getIsPrimaryShipping()
- || $address->getIsDefaultShipping();
- }
- /**
- * Add success message for valid VAT ID
- *
- * @param Address $customerAddress
- * @param DataObject $validationResult
- * @return $this
- */
- protected function addValidMessage($customerAddress, $validationResult)
- {
- $message = [
- (string)__('Your VAT ID was successfully validated.'),
- ];
- $customer = $customerAddress->getCustomer();
- if (!$this->scopeConfig->isSetFlag(HelperAddress::XML_PATH_VIV_DISABLE_AUTO_ASSIGN_DEFAULT)
- && !$customer->getDisableAutoGroupChange()
- ) {
- $customerVatClass = $this->_customerVat->getCustomerVatClass(
- $customerAddress->getCountryId(),
- $validationResult
- );
- $message[] = $customerVatClass == Vat::VAT_CLASS_DOMESTIC
- ? (string)__('You will be charged tax.')
- : (string)__('You will not be charged tax.');
- }
- $this->messageManager->addSuccess(implode(' ', $message));
- return $this;
- }
- /**
- * Add error message for invalid VAT ID
- *
- * @param Address $customerAddress
- * @return $this
- */
- protected function addInvalidMessage($customerAddress)
- {
- $vatId = $this->escaper->escapeHtml($customerAddress->getVatId());
- $message = [
- (string)__('The VAT ID entered (%1) is not a valid VAT ID.', $vatId),
- ];
- $customer = $customerAddress->getCustomer();
- if (!$this->scopeConfig->isSetFlag(HelperAddress::XML_PATH_VIV_DISABLE_AUTO_ASSIGN_DEFAULT)
- && !$customer->getDisableAutoGroupChange()
- ) {
- $message[] = (string)__('You will be charged tax.');
- }
- $this->messageManager->addError(implode(' ', $message));
- return $this;
- }
- /**
- * Add error message
- *
- * @param Address $customerAddress
- * @return $this
- */
- protected function addErrorMessage($customerAddress)
- {
- $message = [
- (string)__('Your Tax ID cannot be validated.'),
- ];
- $customer = $customerAddress->getCustomer();
- if (!$this->scopeConfig->isSetFlag(HelperAddress::XML_PATH_VIV_DISABLE_AUTO_ASSIGN_DEFAULT)
- && !$customer->getDisableAutoGroupChange()
- ) {
- $message[] = (string)__('You will be charged tax.');
- }
- $email = $this->scopeConfig->getValue('trans_email/ident_support/email', ScopeInterface::SCOPE_STORE);
- $message[] = (string)__('If you believe this is an error, please contact us at %1', $email);
- $this->messageManager->addError(implode(' ', $message));
- return $this;
- }
- }
|