Skip to content

Commit 7652d02

Browse files
committed
MAGETWO-59074: Creditmemo return to stock only one unit of configurable product
1 parent 22e67c2 commit 7652d02

File tree

5 files changed

+70
-27
lines changed

5 files changed

+70
-27
lines changed

app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,9 @@ public function load()
217217
foreach ($creditmemo->getAllItems() as $creditmemoItem) {
218218
$orderItem = $creditmemoItem->getOrderItem();
219219
$parentId = $orderItem->getParentItemId();
220-
if (isset($backToStock[$orderItem->getId()])) {
220+
if ($parentId && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
221221
$creditmemoItem->setBackToStock(true);
222-
} elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
222+
} elseif (isset($backToStock[$orderItem->getId()])) {
223223
$creditmemoItem->setBackToStock(true);
224224
} elseif (empty($savedData)) {
225225
$creditmemoItem->setBackToStock(

app/code/Magento/SalesInventory/Model/Order/ReturnProcessor.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,22 @@ public function __construct(
8282
* @param CreditmemoInterface $creditmemo
8383
* @param OrderInterface $order
8484
* @param array $returnToStockItems
85+
* @param bool $isAutoReturn
8586
* @return void
8687
*/
8788
public function execute(
8889
CreditmemoInterface $creditmemo,
8990
OrderInterface $order,
90-
array $returnToStockItems = []
91+
array $returnToStockItems = [],
92+
$isAutoReturn = False
9193
) {
9294
$itemsToUpdate = [];
9395
foreach ($creditmemo->getItems() as $item) {
9496
$qty = $item->getQty();
9597
$productId = $item->getProductId();
9698
$orderItem = $this->orderItemRepository->get($item->getOrderItemId());
9799
$parentItemId = $orderItem->getParentItemId();
98-
if ($this->canReturnItem($item, $qty, $parentItemId, $returnToStockItems)) {
100+
if ($isAutoReturn || $this->canReturnItem($item, $qty, $parentItemId, $returnToStockItems)) {
99101
$parentItem = $parentItemId ? $this->getItemByOrderId($creditmemo, $parentItemId) : false;
100102
$qty = $parentItem ? $parentItem->getQty() * $qty : $qty;
101103
if (isset($itemsToUpdate[$productId])) {

app/code/Magento/CatalogInventory/Observer/RefundOrderInventoryObserver.php renamed to app/code/Magento/SalesInventory/Observer/RefundOrderInventoryObserver.php

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\CatalogInventory\Observer;
7+
namespace Magento\SalesInventory\Observer;
88

99
use Magento\CatalogInventory\Api\StockConfigurationInterface;
1010
use Magento\CatalogInventory\Api\StockManagementInterface;
1111
use Magento\Framework\Event\Observer as EventObserver;
1212
use Magento\Framework\Event\ObserverInterface;
13+
use Magento\Sales\Model\OrderRepository;
14+
use Magento\SalesInventory\Model\Order\ReturnProcessor;
1315

1416
/**
1517
* Catalog inventory module observer
@@ -36,6 +38,16 @@ class RefundOrderInventoryObserver implements ObserverInterface
3638
*/
3739
protected $priceIndexer;
3840

41+
/**
42+
* @var \Magento\SalesInventory\Model\Order\ReturnProcessor
43+
*/
44+
private $returnProcessor;
45+
46+
/**
47+
* @var \Magento\Sales\Api\OrderRepositoryInterface
48+
*/
49+
private $orderRepository;
50+
3951
/**
4052
* @param StockConfigurationInterface $stockConfiguration
4153
* @param StockManagementInterface $stockManagement
@@ -64,31 +76,48 @@ public function execute(EventObserver $observer)
6476
{
6577
/* @var $creditmemo \Magento\Sales\Model\Order\Creditmemo */
6678
$creditmemo = $observer->getEvent()->getCreditmemo();
67-
$itemsToUpdate = [];
68-
foreach ($creditmemo->getAllItems() as $item) {
69-
$qty = $item->getQty();
70-
if (($item->getBackToStock() && $qty) || $this->stockConfiguration->isAutoReturnEnabled()) {
71-
$productId = $item->getProductId();
72-
$parentItemId = $item->getOrderItem()->getParentItemId();
73-
/* @var $parentItem \Magento\Sales\Model\Order\Creditmemo\Item */
74-
$parentItem = $parentItemId ? $creditmemo->getItemByOrderId($parentItemId) : false;
75-
$qty = $parentItem ? $parentItem->getQty() * $qty : $qty;
76-
if (isset($itemsToUpdate[$productId])) {
77-
$itemsToUpdate[$productId] += $qty;
78-
} else {
79-
$itemsToUpdate[$productId] = $qty;
80-
}
79+
$order = $this->getOrderRepository()->get($creditmemo->getOrderId());
80+
$returnToStockItems = [];
81+
foreach ($creditmemo->getItems() as $item) {
82+
if ($item->getBackToStock()) {
83+
$returnToStockItems[] = $item->getOrderItemId();
8184
}
8285
}
83-
if (!empty($itemsToUpdate)) {
84-
$this->stockManagement->revertProductsSale(
85-
$itemsToUpdate,
86-
$creditmemo->getStore()->getWebsiteId()
87-
);
86+
$this->getReturnProcessor()->execute(
87+
$creditmemo,
88+
$order,
89+
$returnToStockItems,
90+
$this->stockConfiguration->isAutoReturnEnabled()
91+
);
92+
}
93+
94+
/**
95+
* Get OrderRepository
96+
*
97+
* @return OrderRepository
98+
* @deprecated
99+
*/
100+
private function getOrderRepository()
101+
{
102+
if (!($this->orderRepository instanceof OrderRepository)) {
103+
return \Magento\Framework\App\ObjectManager::getInstance()->get(OrderRepository::class);
104+
} else {
105+
return $this->orderRepository;
106+
}
107+
}
88108

89-
$updatedItemIds = array_keys($itemsToUpdate);
90-
$this->stockIndexerProcessor->reindexList($updatedItemIds);
91-
$this->priceIndexer->reindexList($updatedItemIds);
109+
/**
110+
* Get OrderRepository
111+
*
112+
* @return ReturnProcessor
113+
* @deprecated
114+
*/
115+
private function getReturnProcessor()
116+
{
117+
if (!($this->returnProcessor instanceof OrderRepository)) {
118+
return \Magento\Framework\App\ObjectManager::getInstance()->get(ReturnProcessor::class);
119+
} else {
120+
return $this->returnProcessor;
92121
}
93122
}
94123
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © 2016 Magento. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
9+
<event name="sales_order_creditmemo_save_after">
10+
<observer name="inventory" instance="Magento\SalesInventory\Observer\RefundOrderInventoryObserver"/>
11+
</event>
12+
</config>

0 commit comments

Comments
 (0)