Skip to content

Commit 3d1fbb3

Browse files
committed
MAGETWO-59080: Introduce ability return to stock through api for Configurable and Bundle products
1 parent 4d28c86 commit 3d1fbb3

File tree

4 files changed

+117
-51
lines changed

4 files changed

+117
-51
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\SalesInventory\Model\Order;
7+
8+
use Magento\Sales\Api\Data\CreditmemoInterface;
9+
use Magento\Sales\Api\Data\CreditmemoItemInterface;
10+
use Magento\Sales\Api\OrderItemRepositoryInterface;
11+
12+
/**
13+
* Class ReturnItemProcessor
14+
*/
15+
class ReturnItemProcessor
16+
{
17+
/**
18+
* @var OrderItemRepositoryInterface
19+
*/
20+
private $orderItemRepository;
21+
22+
/**
23+
* @var \Magento\Sales\Api\Data\CreditmemoItemExtensionFactory
24+
*/
25+
private $creditmemoItemExtensionAttributsFactory;
26+
27+
/**
28+
* ReturnItemProcessor constructor.
29+
* @param OrderItemRepositoryInterface $orderItemRepository
30+
* @param \Magento\Sales\Api\Data\CreditmemoItemExtensionFactory $creditmemoItemExtensionAttributsFactory
31+
*/
32+
public function __construct(
33+
OrderItemRepositoryInterface $orderItemRepository,
34+
\Magento\Sales\Api\Data\CreditmemoItemExtensionFactory $creditmemoItemExtensionAttributsFactory
35+
) {
36+
$this->orderItemRepository = $orderItemRepository;
37+
$this->creditmemoItemExtensionAttributsFactory = $creditmemoItemExtensionAttributsFactory;
38+
}
39+
40+
/**
41+
* @param CreditmemoInterface $creditmemo
42+
* @param int[] $returnToStockItems
43+
*/
44+
public function execute(CreditmemoInterface $creditmemo, $returnToStockItems = [])
45+
{
46+
foreach ($creditmemo->getItems() as $item) {
47+
$qty = $item->getQty();
48+
$orderItem = $this->orderItemRepository->get($item->getOrderItemId());
49+
$parentItemId = $orderItem->getParentItemId();
50+
$parentItem = $parentItemId ? $this->getItemByOrderId($creditmemo, $parentItemId) : false;
51+
$extensionAttributes = $item->getExtensionAttributes()
52+
? $item->getExtensionAttributes() : $this->creditmemoItemExtensionAttributsFactory->create();
53+
if ($this->canReturnItem($item, $parentItemId, $returnToStockItems, $qty)) {
54+
$extensionAttributes->setReturnToStock(True);
55+
$qty = $parentItem ? $parentItem->getQty() * $qty : $qty;
56+
$extensionAttributes->setReturnToStockQty($qty);
57+
58+
} else {
59+
$extensionAttributes->setReturnToStock(False);
60+
}
61+
$item->setExtensionAttributes($extensionAttributes);
62+
}
63+
}
64+
65+
/**
66+
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
67+
* @param int $parentItemId
68+
* @return bool|CreditmemoItemInterface
69+
*/
70+
private function getItemByOrderId(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo, $parentItemId)
71+
{
72+
foreach ($creditmemo->getItems() as $item) {
73+
if ($item->getOrderItemId() == $parentItemId) {
74+
return $item;
75+
}
76+
}
77+
return false;
78+
}
79+
80+
/**
81+
* @param \Magento\Sales\Api\Data\CreditmemoItemInterface $item
82+
* @param int[] $returnToStockItems
83+
* @param int $parentItemId
84+
* @param int $qty
85+
* @return bool
86+
*/
87+
private function canReturnItem(
88+
\Magento\Sales\Api\Data\CreditmemoItemInterface $item,
89+
$parentItemId = null,
90+
array $returnToStockItems,
91+
$qty
92+
) {
93+
return (in_array($item->getOrderItemId(), $returnToStockItems)
94+
|| in_array($parentItemId, $returnToStockItems)
95+
|| ($item->getExtensionAttributes() && $item->getExtensionAttributes()->getReturnToStock())
96+
)
97+
&& $qty;
98+
}
99+
}

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

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -88,23 +88,20 @@ public function __construct(
8888
/**
8989
* @param CreditmemoInterface $creditmemo
9090
* @param OrderInterface $order
91-
* @param array $returnToStockItems
9291
* @return void
9392
*/
9493
public function execute(
9594
CreditmemoInterface $creditmemo,
96-
OrderInterface $order,
97-
array $returnToStockItems = []
95+
OrderInterface $order
9896
) {
9997
if ($this->stockConfiguration->isAutoReturnEnabled()) {
10098
return;
10199
}
102100
$itemsToUpdate = [];
103101
foreach ($creditmemo->getItems() as $item) {
104-
$qty = $item->getQty();
105-
if ($this->canReturnItem($item, $returnToStockItems, $qty)) {
102+
if ($item->getExtensionAttributes() && $item->getExtensionAttributes()->getReturnToStock()) {
106103
$productId = $item->getProductId();
107-
$qty = $this->calculateQty($item->getOrderItemId(), $qty, $creditmemo);
104+
$qty = $item->getExtensionAttributes()->getReturnToStockQty();
108105
if (isset($itemsToUpdate[$productId])) {
109106
$itemsToUpdate[$productId] += $qty;
110107
} else {
@@ -128,47 +125,4 @@ public function execute(
128125
$this->priceIndexer->reindexList($updatedItemIds);
129126
}
130127
}
131-
132-
/**
133-
* @param int $orderItemId
134-
* @param int|float $qty
135-
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
136-
* @return float
137-
*/
138-
private function calculateQty($orderItemId, $qty, \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo)
139-
{
140-
$orderItem = $this->orderItemRepository->get($orderItemId);
141-
$parentItemId = $orderItem->getParentItemId();
142-
$parentItem = $parentItemId ? $this->getItemByOrderId($creditmemo, $parentItemId) : false;
143-
return $parentItem ? $parentItem->getQty() * $qty : $qty;
144-
}
145-
146-
/**
147-
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
148-
* @param int $parentItemId
149-
* @return bool|CreditmemoItemInterface
150-
*/
151-
private function getItemByOrderId(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo, $parentItemId)
152-
{
153-
foreach ($creditmemo->getItems() as $item) {
154-
if ($item->getOrderItemId() == $parentItemId) {
155-
return $item;
156-
}
157-
}
158-
return false;
159-
}
160-
161-
/**
162-
* @param \Magento\Sales\Api\Data\CreditmemoItemInterface $item
163-
* @param int[] $returnToStockItems
164-
* @param int $qty
165-
* @return bool
166-
*/
167-
private function canReturnItem(
168-
\Magento\Sales\Api\Data\CreditmemoItemInterface $item,
169-
array $returnToStockItems,
170-
$qty
171-
) {
172-
return in_array($item->getOrderItemId(), $returnToStockItems) && $qty;
173-
}
174128
}

app/code/Magento/SalesInventory/Model/Plugin/Order/ReturnToStockOrder.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Sales\Api\CreditmemoRepositoryInterface;
1010
use Magento\Sales\Api\OrderRepositoryInterface;
1111
use Magento\Sales\Api\RefundOrderInterface;
12+
use Magento\SalesInventory\Model\Order\ReturnItemProcessor;
1213

1314
/**
1415
* Class ReturnToStock
@@ -30,21 +31,28 @@ class ReturnToStockOrder
3031
*/
3132
private $orderRepository;
3233

34+
/**
35+
* @var ReturnItemProcessor
36+
*/
37+
private $returnItemProcessor;
3338
/**
3439
* ReturnToStockPlugin constructor.
3540
*
3641
* @param ReturnProcessor $returnProcessor
3742
* @param CreditmemoRepositoryInterface $creditmemoRepository
3843
* @param OrderRepositoryInterface $orderRepository
44+
* @param ReturnItemProcessor $returnItemProcessor
3945
*/
4046
public function __construct(
4147
ReturnProcessor $returnProcessor,
4248
CreditmemoRepositoryInterface $creditmemoRepository,
43-
OrderRepositoryInterface $orderRepository
49+
OrderRepositoryInterface $orderRepository,
50+
ReturnItemProcessor $returnItemProcessor
4451
) {
4552
$this->returnProcessor = $returnProcessor;
4653
$this->creditmemoRepository = $creditmemoRepository;
4754
$this->orderRepository = $orderRepository;
55+
$this->returnItemProcessor = $returnItemProcessor;
4856
}
4957

5058
/**
@@ -80,7 +88,8 @@ public function afterExecute(
8088
}
8189

8290
$creditmemo = $this->creditmemoRepository->get($resultEntityId);
83-
$this->returnProcessor->execute($creditmemo, $order, $returnToStockItems);
91+
$this->returnItemProcessor->execute($creditmemo, $returnToStockItems);
92+
$this->returnProcessor->execute($creditmemo, $order);
8493

8594
return $resultEntityId;
8695
}

app/code/Magento/SalesInventory/etc/extension_attributes.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@
99
<extension_attributes for="Magento\Sales\Api\Data\CreditmemoCreationArgumentsInterface">
1010
<attribute code="return_to_stock_items" type="int[]"/>
1111
</extension_attributes>
12+
<extension_attributes for="Magento\Sales\Api\Data\CreditmemoItemInterface">
13+
<attribute code="return_to_stock" type="bool"/>
14+
<attribute code="return_to_stock_qty" type="int"/>
15+
</extension_attributes>
1216
</config>

0 commit comments

Comments
 (0)