@@ -826,7 +826,9 @@ public function getCustomerGroupId()
826826 * @return $this
827827 * @throws \Magento\Framework\Exception\LocalizedException
828828 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
829+ * @SuppressWarnings(PHPMD.NPathComplexity)
829830 * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
831+ * phpcs:disable Generic.Metrics.NestingLevel
830832 */
831833 public function moveQuoteItem ($ item , $ moveTo , $ qty )
832834 {
@@ -886,11 +888,20 @@ public function moveQuoteItem($item, $moveTo, $qty)
886888 );
887889 }
888890
889- $ cartItem = $ cart ->addProduct ($ product , $ info );
890- if (is_string ($ cartItem )) {
891- throw new \Magento \Framework \Exception \LocalizedException (__ ($ cartItem ));
891+ $ cartItems = $ cart ->getAllVisibleItems ();
892+ $ cartItemsToRestore = [];
893+ foreach ($ cartItems as $ cartItem ) {
894+ $ cartItemsToRestore [$ cartItem ->getItemId ()] = $ cartItem ->getItemId ();
895+ }
896+ $ canBeRestored = $ this ->restoreTransferredItem ('cart ' , $ cartItemsToRestore );
897+
898+ if (!$ canBeRestored ) {
899+ $ cartItem = $ cart ->addProduct ($ product , $ info );
900+ if (is_string ($ cartItem )) {
901+ throw new \Magento \Framework \Exception \LocalizedException (__ ($ cartItem ));
902+ }
903+ $ cartItem ->setPrice ($ item ->getProduct ()->getPrice ());
892904 }
893- $ cartItem ->setPrice ($ item ->getProduct ()->getPrice ());
894905 $ this ->_needCollectCart = true ;
895906 $ removeItem = true ;
896907 }
@@ -933,7 +944,11 @@ public function moveQuoteItem($item, $moveTo, $qty)
933944 )->setStoreId (
934945 $ this ->getSession ()->getStoreId ()
935946 );
936- $ wishlist ->addNewItem ($ item ->getProduct (), $ info );
947+ $ wishlistItems = $ wishlist ->getItemCollection ()->getItems ();
948+ $ canBeRestored = $ this ->restoreTransferredItem ('wishlist ' , $ wishlistItems );
949+ if (!$ canBeRestored ) {
950+ $ wishlist ->addNewItem ($ item ->getProduct (), $ info );
951+ }
937952 $ removeItem = true ;
938953 }
939954 break ;
@@ -980,8 +995,8 @@ public function applySidebarData($data)
980995 if ($ item ) {
981996 $ this ->moveQuoteItem ($ item , 'order ' , $ qty );
982997 $ transferredItems = $ this ->_session ->getTransferredItems () ?? [];
983- $ transferredItems ['cart ' ][] = $ itemId ;
984- $ this ->_session ->setTransferredItems ($ transferredItems ) ;
998+ $ transferredItems ['cart ' ][$ itemId ] = $ itemId ;
999+ $ this ->_session ->setTransferredItems ($ transferredItems );
9851000 }
9861001 }
9871002 }
@@ -996,8 +1011,8 @@ public function applySidebarData($data)
9961011 if ($ item ->getId ()) {
9971012 $ this ->addProduct ($ item ->getProduct (), $ item ->getBuyRequest ()->toArray ());
9981013 $ transferredItems = $ this ->_session ->getTransferredItems () ?? [];
999- $ transferredItems ['wishlist ' ][] = $ itemId ;
1000- $ this ->_session ->setTransferredItems ($ transferredItems ) ;
1014+ $ transferredItems ['wishlist ' ][$ itemId ] = $ itemId ;
1015+ $ this ->_session ->setTransferredItems ($ transferredItems );
10011016 }
10021017 }
10031018 }
@@ -2094,6 +2109,30 @@ private function removeTransferredItems(): void
20942109 }
20952110 }
20962111
2112+ /**
2113+ * Restore items that were transferred from ordered items to their original sources (cart, wishlist, ...)
2114+ *
2115+ * @param string $area
2116+ * @param \Magento\Quote\Model\Quote\Item[]|\Magento\Wishlist\Model\Item[] $items
2117+ * @return bool
2118+ */
2119+ private function restoreTransferredItem (string $ area , array $ items ): bool
2120+ {
2121+ $ transferredItems = $ this ->_session ->getTransferredItems () ?? [];
2122+ if (!isset ($ transferredItems [$ area ])) {
2123+ return false ;
2124+ }
2125+ $ itemToRestore = array_intersect_key ($ items , $ transferredItems [$ area ]);
2126+ $ itemToRestoreId = array_key_first ($ itemToRestore );
2127+
2128+ if ($ itemToRestoreId ) {
2129+ unset($ transferredItems [$ area ][$ itemToRestoreId ]);
2130+ $ this ->_session ->setTransferredItems ($ transferredItems );
2131+ return true ;
2132+ }
2133+ return false ;
2134+ }
2135+
20972136 /**
20982137 * Validate quote data before order creation
20992138 *
0 commit comments