customerVat = $customerVat; $this->customerAddressHelper = $customerAddressHelper; $this->vatValidator = $vatValidator; $this->customerDataFactory = $customerDataFactory; $this->groupManagement = $groupManagement; $this->addressRepository = $addressRepository; $this->customerSession = $customerSession; } /** * Handle customer VAT number if needed on collect_totals_before event of quote address * * @param \Magento\Framework\Event\Observer $observer * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment */ $shippingAssignment = $observer->getShippingAssignment(); /** @var \Magento\Quote\Model\Quote $quote */ $quote = $observer->getQuote(); /** @var \Magento\Quote\Model\Quote\Address $address */ $address = $shippingAssignment->getShipping()->getAddress(); $customer = $quote->getCustomer(); $storeId = $customer->getStoreId(); if ($customer->getDisableAutoGroupChange() || false == $this->vatValidator->isEnabled($address, $storeId) ) { return; } $customerCountryCode = $address->getCountryId(); $customerVatNumber = $address->getVatId(); /** try to get data from customer if quote address needed data is empty */ if (empty($customerCountryCode) && empty($customerVatNumber) && $customer->getDefaultShipping()) { $customerAddress = $this->addressRepository->getById($customer->getDefaultShipping()); $customerCountryCode = $customerAddress->getCountryId(); $customerVatNumber = $customerAddress->getVatId(); } $groupId = null; if (empty($customerVatNumber) || false == $this->customerVat->isCountryInEU($customerCountryCode)) { $groupId = $customer->getId() ? $this->groupManagement->getDefaultGroup( $storeId )->getId() : $this->groupManagement->getNotLoggedInGroup()->getId(); } else { // Magento always has to emulate group even if customer uses default billing/shipping address $groupId = $this->customerVat->getCustomerGroupIdBasedOnVatNumber( $customerCountryCode, $this->vatValidator->validate($address, $storeId), $storeId ); } if ($groupId) { $address->setPrevQuoteCustomerGroupId($quote->getCustomerGroupId()); $quote->setCustomerGroupId($groupId); $this->customerSession->setCustomerGroupId($groupId); $customer->setGroupId($groupId); $quote->setCustomer($customer); } } }