6 declare(strict_types=1);
10 use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory;
12 use Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory;
13 use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
20 use Magento\InventorySourceDeductionApi\Model\ItemToDeductFactory;
21 use Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestFactory;
29 private $websiteRepository;
34 private $salesChannelFactory;
39 private $salesEventFactory;
44 private $itemsToSellFactory;
49 private $placeReservationsForSalesEvent;
54 private $getSourceDeductedOrderItems;
59 private $itemToDeductFactory;
64 private $sourceDeductionRequestFactory;
69 private $sourceDeductionService;
84 SalesChannelInterfaceFactory $salesChannelFactory,
85 SalesEventInterfaceFactory $salesEventFactory,
86 ItemToSellInterfaceFactory $itemsToSellFactory,
89 ItemToDeductFactory $itemToDeductFactory,
90 SourceDeductionRequestFactory $sourceDeductionRequestFactory,
95 $this->salesEventFactory = $salesEventFactory;
96 $this->itemsToSellFactory = $itemsToSellFactory;
97 $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent;
98 $this->getSourceDeductedOrderItems = $getSourceDeductedOrderItems;
99 $this->itemToDeductFactory = $itemToDeductFactory;
100 $this->sourceDeductionRequestFactory = $sourceDeductionRequestFactory;
101 $this->sourceDeductionService = $sourceDeductionService;
110 array $itemsToRefund,
111 array $returnToStockItems
113 $salesChannel = $this->getSalesChannelForOrder(
$order);
114 $deductedItems = $this->getSourceDeductedOrderItems->execute(
$order, $returnToStockItems);
115 $itemToSell = $backItemsPerSource = [];
117 foreach ($itemsToRefund as
$item) {
118 $sku =
$item->getSku();
120 $totalDeductedQty = $this->getTotalDeductedQty(
$item, $deductedItems);
121 $processedQty =
$item->getProcessedQuantity() - $totalDeductedQty;
122 $qtyBackToSource = ($processedQty > 0) ?
$item->getQuantity() - $processedQty :
$item->getQuantity();
123 $qtyBackToStock = ($qtyBackToSource > 0) ?
$item->getQuantity() - $qtyBackToSource :
$item->getQuantity();
125 if ($qtyBackToStock > 0) {
126 $itemToSell[] = $this->itemsToSellFactory->create([
128 'qty' => (
float)$qtyBackToStock
132 foreach ($deductedItems as $deductedItemResult) {
133 $sourceCode = $deductedItemResult->getSourceCode();
134 foreach ($deductedItemResult->getItems() as $deductedItem) {
135 if ($sku != $deductedItem->getSku() || $this->isZero((
float)$qtyBackToSource)) {
139 $backQty = min($deductedItem->getQuantity(), $qtyBackToSource);
141 $backItemsPerSource[
$sourceCode][] = $this->itemToDeductFactory->create([
142 'sku' => $deductedItem->getSku(),
145 $qtyBackToSource -= $backQty;
151 $salesEvent = $this->salesEventFactory->create([
154 'objectId' => (
string)
$order->getEntityId()
158 $sourceDeductionRequest = $this->sourceDeductionRequestFactory->create([
161 'salesChannel' => $salesChannel,
162 'salesEvent' => $salesEvent
164 $this->sourceDeductionService->execute($sourceDeductionRequest);
167 $this->placeReservationsForSalesEvent->execute($itemToSell, $salesChannel, $salesEvent);
175 private function getTotalDeductedQty(
$item, array $deductedItems): float
179 foreach ($deductedItems as $deductedItemResult) {
180 foreach ($deductedItemResult->getItems() as $deductedItem) {
181 if (
$item->getSku() != $deductedItem->getSku()) {
184 $result += $deductedItem->getQuantity();
195 private function getSalesChannelForOrder(OrderInterface
$order): SalesChannelInterface
200 return $this->salesChannelFactory->create([
215 private function isZero(
float $floatNumber): bool
217 return $floatNumber < 0.0000001;
execute(OrderInterface $order, array $itemsToRefund, array $returnToStockItems)
__construct(WebsiteRepositoryInterface $websiteRepository, SalesChannelInterfaceFactory $salesChannelFactory, SalesEventInterfaceFactory $salesEventFactory, ItemToSellInterfaceFactory $itemsToSellFactory, PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent, GetSourceDeductedOrderItemsInterface $getSourceDeductedOrderItems, ItemToDeductFactory $itemToDeductFactory, SourceDeductionRequestFactory $sourceDeductionRequestFactory, SourceDeductionService $sourceDeductionService)
const EVENT_CREDITMEMO_CREATED
if(!isset($_GET['website_code'])) $websiteCode