55use Magento \Framework \Exception \CouldNotSaveException ;
66use Magento \Framework \Exception \InputException ;
77use Magento \Framework \Validation \ValidationException ;
8- use Magento \InventorySales \Model \GetItemsToCancelFromOrderItem ;
98use Magento \InventorySalesApi \Api \Data \ItemToSellInterface ;
10- use Magento \InventorySalesApi \Model \ReturnProcessor \Request \ItemsToRefundInterface ;
11- use Magento \Sales \Api \Data \OrderInterface ;
129use Psr \Log \LoggerInterface ;
13- use ReachDigital \IOSReservations \Model \MagentoInventorySales \CancelOrderItems ;
14- use ReachDigital \ISReservations \Model \MetaData \DecodeMetaData ;
1510use ReachDigital \ISReservationsApi \Api \EncodeMetaDataInterface ;
1611use ReachDigital \ISReservationsApi \Api \GetReservationsByMetadataInterface ;
1712use ReachDigital \ISReservationsApi \Model \AppendSourceReservationsInterface ;
1813use ReachDigital \ISReservationsApi \Model \SourceReservationBuilderInterface ;
1914
20- class NullifySourceReservations
15+ class CancelSourceReservations
2116{
22- /**
23- * @var GetReservationsByMetadataInterface
24- */
25- private $ getReservationsByMetadata ;
2617 /**
2718 * @var EncodeMetaDataInterface
2819 */
@@ -36,47 +27,69 @@ class NullifySourceReservations
3627 * @var SourceReservationBuilderInterface
3728 */
3829 private $ sourceReservationBuilder ;
30+ /**
31+ * @var LoggerInterface
32+ */
33+ private $ logger ;
34+ /**
35+ * @var GetOrderSourceReservationQuantityBySkuAndSource
36+ */
37+ private $ getOrderSourceReservationQuantityBySkuAndSource ;
3938
4039 public function __construct (
41- GetReservationsByMetadataInterface $ getReservationsByMetadata ,
4240 EncodeMetaDataInterface $ encodeMetaData ,
4341 AppendSourceReservationsInterface $ appendSourceReservations ,
4442 SourceReservationBuilderInterface $ sourceReservationBuilder ,
45- LoggerInterface $ logger
43+ LoggerInterface $ logger ,
44+ GetOrderSourceReservationQuantityBySkuAndSource $ getOrderSourceReservationQuantityBySkuAndSource
4645 ) {
47- $ this ->getReservationsByMetadata = $ getReservationsByMetadata ;
4846 $ this ->encodeMetaData = $ encodeMetaData ;
4947 $ this ->appendSourceReservations = $ appendSourceReservations ;
5048 $ this ->sourceReservationBuilder = $ sourceReservationBuilder ;
49+ $ this ->logger = $ logger ;
50+ $ this ->getOrderSourceReservationQuantityBySkuAndSource = $ getOrderSourceReservationQuantityBySkuAndSource ;
5151 }
5252
5353 /**
54- * @param string $orderId
55- * @param ItemToSellInterface[] $itemsToNullify
54+ * Will nullify source reservations if they are available. Will return items that are not nullified.
55+ *
56+ * @param ItemToSellInterface[] $itemsToCancel
5657 * @return ItemToSellInterface[]
5758 *
5859 * @throws CouldNotSaveException
5960 * @throws InputException
6061 * @throws ValidationException
6162 */
62- public function execute (string $ orderId , array $ itemsToNullify )
63+ public function execute (int $ orderId , array $ itemsToCancel ): array
6364 {
65+ $ this ->logger ->info ('cancel_source_reservations ' , [
66+ 'module ' => 'reach-digital/magento2-order-source-reservations ' ,
67+ 'order ' => $ orderId ,
68+ 'items ' => array_map (function ($ item ) {
69+ return [$ item ->getSku (), $ item ->getQuantity ()];
70+ }, $ itemsToCancel ),
71+ ]);
72+
73+ if (empty ($ itemsToCancel )) {
74+ return $ itemsToCancel ;
75+ }
76+
6477 $ sourceCancellations = [];
65- $ sourceReservations = $ this ->getReservationsBySkuAndSource ($ orderId );
78+ $ sourceReservations = $ this ->getOrderSourceReservationQuantityBySkuAndSource -> execute ($ orderId );
6679
67- foreach ($ itemsToNullify as $ itemToNullify ) {
68- $ qtyToCompensate = $ itemToNullify ->getQuantity ();
80+ foreach ($ itemsToCancel as $ itemToCancel ) {
81+ $ qtyToCompensate = $ itemToCancel ->getQuantity ();
6982
70- if (!isset ($ sourceReservations [$ itemToNullify ->getSku ()])) {
83+ if (!isset ($ sourceReservations [$ itemToCancel ->getSku ()])) {
7184 continue ;
7285 }
7386
7487 // Compensate $qtyToCompensate on the available reservation qty's for each source
75- foreach ($ sourceReservations [$ itemToNullify ->getSku ()] as $ sourceCode => $ sourceReservationQty ) {
88+ foreach ($ sourceReservations [$ itemToCancel ->getSku ()] as $ sourceCode => $ sourceReservationQty ) {
7689 // See if, for this source, we can revert some or all of $qtyToRefund from existing sourceReservations.
7790 $ revertibleQty = min ($ qtyToCompensate , -$ sourceReservationQty );
7891 if (!$ this ->isLtZero ($ revertibleQty )) {
79- $ this ->sourceReservationBuilder ->setSku ($ itemToNullify ->getSku ());
92+ $ this ->sourceReservationBuilder ->setSku ($ itemToCancel ->getSku ());
8093 $ this ->sourceReservationBuilder ->setQuantity ($ revertibleQty );
8194 $ this ->sourceReservationBuilder ->setSourceCode ($ sourceCode );
8295 $ this ->sourceReservationBuilder ->setMetadata (
@@ -88,43 +101,24 @@ public function execute(string $orderId, array $itemsToNullify)
88101 $ sourceCancellations [] = $ this ->sourceReservationBuilder ->build ();
89102 $ qtyToCompensate -= $ revertibleQty ;
90103 } else {
91- break ;
104+ continue ;
92105 }
93106 }
94107
95- // Set the remaining to be cancelled on the stock
96- $ itemToNullify ->setQuantity ($ qtyToCompensate );
108+ // Set the remaining qty so it can be processed somewhere else.
109+ $ itemToCancel ->setQuantity ($ qtyToCompensate );
97110 }
98111
99112 if ($ sourceCancellations ) {
100113 $ this ->appendSourceReservations ->execute ($ sourceCancellations );
101114 }
102115
103- // Cancel the remaining quantity
104- return array_filter ($ itemsToNullify , function ($ item ) {
116+ // Return the remaining qty
117+ return array_filter ($ itemsToCancel , function ($ item ) {
105118 return $ item ->getQuantity () > 0 ;
106119 });
107120 }
108121
109- private function getReservationsBySkuAndSource (string $ orderId ): array
110- {
111- $ reservations = $ this ->getReservationsByMetadata ->execute (
112- $ this ->encodeMetaData ->execute (['order ' => $ orderId ])
113- );
114-
115- $ reservationsBySkuAndSource = [];
116- foreach ($ reservations as $ reservation ) {
117- $ sku = $ reservation ->getSku ();
118- $ sourceCode = $ reservation ->getSourceCode ();
119-
120- $ reservationsBySkuAndSource [$ sku ] = $ reservationsBySkuAndSource [$ sku ] ?? [];
121- $ reservationsBySkuAndSource [$ sku ][$ sourceCode ] = $ reservationsBySkuAndSource [$ sku ][$ sourceCode ] ?? 0 ;
122- $ reservationsBySkuAndSource [$ sku ][$ sourceCode ] += $ reservation ->getQuantity ();
123- }
124-
125- return $ reservationsBySkuAndSource ;
126- }
127-
128122 /**
129123 * Compare float number with some epsilon
130124 *
0 commit comments