Skip to content

Commit ad96795

Browse files
authored
Merge pull request #16 from ho-nl/canary
Release canary
2 parents d2b43f7 + c19c842 commit ad96795

File tree

57 files changed

+2381
-370
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2381
-370
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ on:
33
push:
44
branches:
55
- master
6+
- canary
67
jobs:
78
release:
89
name: Release

IOSReservations/Model/NullifySourceReservations.php renamed to IOSReservations/Model/CancelSourceReservations.php

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,15 @@
55
use Magento\Framework\Exception\CouldNotSaveException;
66
use Magento\Framework\Exception\InputException;
77
use Magento\Framework\Validation\ValidationException;
8-
use Magento\InventorySales\Model\GetItemsToCancelFromOrderItem;
98
use Magento\InventorySalesApi\Api\Data\ItemToSellInterface;
10-
use Magento\InventorySalesApi\Model\ReturnProcessor\Request\ItemsToRefundInterface;
11-
use Magento\Sales\Api\Data\OrderInterface;
129
use Psr\Log\LoggerInterface;
13-
use ReachDigital\IOSReservations\Model\MagentoInventorySales\CancelOrderItems;
14-
use ReachDigital\ISReservations\Model\MetaData\DecodeMetaData;
1510
use ReachDigital\ISReservationsApi\Api\EncodeMetaDataInterface;
1611
use ReachDigital\ISReservationsApi\Api\GetReservationsByMetadataInterface;
1712
use ReachDigital\ISReservationsApi\Model\AppendSourceReservationsInterface;
1813
use 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
*
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace ReachDigital\IOSReservations\Model;
4+
5+
use Magento\Framework\Exception\CouldNotSaveException;
6+
use Magento\Framework\Exception\InputException;
7+
use Magento\Framework\Exception\LocalizedException;
8+
use Magento\Framework\Exception\NoSuchEntityException;
9+
use Magento\Framework\Validation\ValidationException;
10+
use Magento\InventorySales\Model\GetItemsToCancelFromOrderItem;
11+
use Magento\InventorySalesApi\Api\Data\ItemToSellInterface;
12+
use Psr\Log\LoggerInterface;
13+
14+
class CancelStockAndSourceReservations
15+
{
16+
/**
17+
* @var LoggerInterface
18+
*/
19+
private $logger;
20+
/**
21+
* @var GetItemsToCancelFromOrderItem
22+
*/
23+
private $getItemsToCancelFromOrderItem;
24+
/**
25+
* @var CancelStockReservations
26+
*/
27+
private $cancelStockReservations;
28+
/**
29+
* @var CancelSourceReservations
30+
*/
31+
private $cancelSourceReservations;
32+
33+
public function __construct(
34+
GetItemsToCancelFromOrderItem $getItemsToCancelFromOrderItem,
35+
CancelStockReservations $cancelStockReservations,
36+
CancelSourceReservations $cancelSourceReservations,
37+
LoggerInterface $logger
38+
) {
39+
$this->getItemsToCancelFromOrderItem = $getItemsToCancelFromOrderItem;
40+
$this->cancelStockReservations = $cancelStockReservations;
41+
$this->cancelSourceReservations = $cancelSourceReservations;
42+
$this->logger = $logger;
43+
}
44+
45+
/**
46+
* @param ItemToSellInterface[] $itemsToCancel
47+
* @return ItemToSellInterface[]
48+
*
49+
* @throws CouldNotSaveException
50+
* @throws InputException
51+
* @throws LocalizedException
52+
* @throws NoSuchEntityException
53+
* @throws ValidationException
54+
*/
55+
public function execute(int $orderId, array $itemsToCancel): array
56+
{
57+
$itemsToCancel = $this->cancelStockReservations->execute($orderId, $itemsToCancel);
58+
$itemsToCancel = $this->cancelSourceReservations->execute($orderId, $itemsToCancel);
59+
60+
$this->logger->warning('remaining_items_to_cancel', [
61+
'module' => 'reach-digital/magento2-order-source-reservations',
62+
'order' => $orderId,
63+
'items' => array_map(function ($item) {
64+
return [$item->getSku(), $item->getQuantity()];
65+
}, $itemsToCancel),
66+
]);
67+
68+
return $itemsToCancel;
69+
}
70+
}

0 commit comments

Comments
 (0)