@@ -826,7 +826,9 @@ public function getCustomerGroupId()
826
826
* @return $this
827
827
* @throws \Magento\Framework\Exception\LocalizedException
828
828
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
829
+ * @SuppressWarnings(PHPMD.NPathComplexity)
829
830
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
831
+ * phpcs:disable Generic.Metrics.NestingLevel
830
832
*/
831
833
public function moveQuoteItem ($ item , $ moveTo , $ qty )
832
834
{
@@ -886,11 +888,20 @@ public function moveQuoteItem($item, $moveTo, $qty)
886
888
);
887
889
}
888
890
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 ());
892
904
}
893
- $ cartItem ->setPrice ($ item ->getProduct ()->getPrice ());
894
905
$ this ->_needCollectCart = true ;
895
906
$ removeItem = true ;
896
907
}
@@ -933,7 +944,11 @@ public function moveQuoteItem($item, $moveTo, $qty)
933
944
)->setStoreId (
934
945
$ this ->getSession ()->getStoreId ()
935
946
);
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
+ }
937
952
$ removeItem = true ;
938
953
}
939
954
break ;
@@ -980,8 +995,8 @@ public function applySidebarData($data)
980
995
if ($ item ) {
981
996
$ this ->moveQuoteItem ($ item , 'order ' , $ qty );
982
997
$ transferredItems = $ this ->_session ->getTransferredItems () ?? [];
983
- $ transferredItems ['cart ' ][] = $ itemId ;
984
- $ this ->_session ->setTransferredItems ($ transferredItems ) ;
998
+ $ transferredItems ['cart ' ][$ itemId ] = $ itemId ;
999
+ $ this ->_session ->setTransferredItems ($ transferredItems );
985
1000
}
986
1001
}
987
1002
}
@@ -996,8 +1011,8 @@ public function applySidebarData($data)
996
1011
if ($ item ->getId ()) {
997
1012
$ this ->addProduct ($ item ->getProduct (), $ item ->getBuyRequest ()->toArray ());
998
1013
$ transferredItems = $ this ->_session ->getTransferredItems () ?? [];
999
- $ transferredItems ['wishlist ' ][] = $ itemId ;
1000
- $ this ->_session ->setTransferredItems ($ transferredItems ) ;
1014
+ $ transferredItems ['wishlist ' ][$ itemId ] = $ itemId ;
1015
+ $ this ->_session ->setTransferredItems ($ transferredItems );
1001
1016
}
1002
1017
}
1003
1018
}
@@ -2094,6 +2109,30 @@ private function removeTransferredItems(): void
2094
2109
}
2095
2110
}
2096
2111
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
+
2097
2136
/**
2098
2137
* Validate quote data before order creation
2099
2138
*
0 commit comments