diff --git a/vendor/magento/module-persistent/Model/QuoteManager.php b/vendor/magento/module-persistent/Model/QuoteManager.php index b6504d528fb..35b07ebdb7c 100644 --- a/vendor/magento/module-persistent/Model/QuoteManager.php +++ b/vendor/magento/module-persistent/Model/QuoteManager.php @@ -5,6 +5,7 @@ */ namespace Magento\Persistent\Model; +use Magento\Customer\Api\Data\CustomerInterfaceFactory; use Magento\Customer\Api\Data\GroupInterface; use Magento\Framework\App\ObjectManager; use Magento\Persistent\Helper\Data; @@ -65,12 +66,18 @@ class QuoteManager private $cartExtensionFactory; /** + * @var CustomerInterfaceFactory + */ + private $customerDataFactory; + + /** * @param \Magento\Persistent\Helper\Session $persistentSession * @param Data $persistentData * @param \Magento\Checkout\Model\Session $checkoutSession * @param CartRepositoryInterface $quoteRepository * @param CartExtensionFactory|null $cartExtensionFactory * @param ShippingAssignmentProcessor|null $shippingAssignmentProcessor + * @param CustomerInterfaceFactory|null $customerDataFactory */ public function __construct( \Magento\Persistent\Helper\Session $persistentSession, @@ -78,7 +85,8 @@ class QuoteManager \Magento\Checkout\Model\Session $checkoutSession, CartRepositoryInterface $quoteRepository, ?CartExtensionFactory $cartExtensionFactory = null, - ?ShippingAssignmentProcessor $shippingAssignmentProcessor = null + ?ShippingAssignmentProcessor $shippingAssignmentProcessor = null, + ?CustomerInterfaceFactory $customerDataFactory = null ) { $this->persistentSession = $persistentSession; $this->persistentData = $persistentData; @@ -88,6 +96,8 @@ class QuoteManager ?? ObjectManager::getInstance()->get(CartExtensionFactory::class); $this->shippingAssignmentProcessor = $shippingAssignmentProcessor ?? ObjectManager::getInstance()->get(ShippingAssignmentProcessor::class); + $this->customerDataFactory = $customerDataFactory + ?? ObjectManager::getInstance()->get(CustomerInterfaceFactory::class); } /** @@ -109,14 +119,11 @@ class QuoteManager $quote->getPaymentsCollection()->walk('delete'); $quote->getAddressesCollection()->walk('delete'); $this->_setQuotePersistent = false; + $this->cleanCustomerData($quote); $quote->setIsActive(true) - ->setCustomerId(null) - ->setCustomerEmail(null) - ->setCustomerFirstname(null) - ->setCustomerLastname(null) - ->setCustomerGroupId(GroupInterface::NOT_LOGGED_IN_ID) ->setIsPersistent(false) ->removeAllAddresses(); + //Create guest addresses $quote->getShippingAddress(); $quote->getBillingAddress(); @@ -130,6 +137,27 @@ class QuoteManager } /** + * Clear customer data in quote + * + * @param Quote $quote + */ + private function cleanCustomerData($quote) + { + /** + * Set empty customer object in quote to avoid restore customer id + * @see Quote::beforeSave() + */ + if ($quote->getCustomerId()) { + $quote->setCustomer($this->customerDataFactory->create()); + } + $quote->setCustomerId(null) + ->setCustomerEmail(null) + ->setCustomerFirstname(null) + ->setCustomerLastname(null) + ->setCustomerGroupId(GroupInterface::NOT_LOGGED_IN_ID); + } + + /** * Emulate guest cart with persistent cart * * Converts persistent cart tied to logged out customer to a guest cart, retaining customer information required for diff --git a/vendor/magento/module-persistent/Observer/MakePersistentQuoteGuestObserver.php b/vendor/magento/module-persistent/Observer/MakePersistentQuoteGuestObserver.php index f2f9b96fa82..98c9c3df278 100644 --- a/vendor/magento/module-persistent/Observer/MakePersistentQuoteGuestObserver.php +++ b/vendor/magento/module-persistent/Observer/MakePersistentQuoteGuestObserver.php @@ -1,16 +1,14 @@ _persistentSession = $persistentSession; $this->_persistentData = $persistentData; $this->_customerSession = $customerSession; - $this->quoteManager = $quoteManager; + $this->checkoutSession = $checkoutSession; } /** @@ -74,7 +72,7 @@ class MakePersistentQuoteGuestObserver implements ObserverInterface if (($this->_persistentSession->isPersistent() && !$this->_customerSession->isLoggedIn()) || $this->_persistentData->isShoppingCartPersist() ) { - $this->quoteManager->setGuest(true); + $this->checkoutSession->clearQuote()->clearStorage(); } } } diff --git a/vendor/magento/module-persistent/Observer/RemoveGuestPersistenceOnEmptyCartObserver.php b/vendor/magento/module-persistent/Observer/RemoveGuestPersistenceOnEmptyCartObserver.php index fe754711c91..efc9ecd4c1a 100644 --- a/vendor/magento/module-persistent/Observer/RemoveGuestPersistenceOnEmptyCartObserver.php +++ b/vendor/magento/module-persistent/Observer/RemoveGuestPersistenceOnEmptyCartObserver.php @@ -10,6 +10,8 @@ use Magento\Framework\Exception\NoSuchEntityException; /** * Observer to remove persistent session if guest empties persistent cart previously created and added to by customer. + * + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ class RemoveGuestPersistenceOnEmptyCartObserver implements ObserverInterface { @@ -96,6 +98,8 @@ class RemoveGuestPersistenceOnEmptyCartObserver implements ObserverInterface } if (!$cart || $cart->getItemsCount() == 0) { + $this->customerSession->setCustomerId(null) + ->setCustomerGroupId(null); $this->quoteManager->setGuest(); } }