Skip to content

Commit def5104

Browse files
🔃 [Magento Community Engineering] Community Contributions - 2.4-develop
Accepted Community Pull Requests: - #28483: Rest API Magento 2.4 order update overwrites existing item information (by @engcom-Charlie) Fixed GitHub Issues: - #22431: Rest API Magento 2.4 order update overwrites existing item information (reported by @aschrammel) has been fixed in #28483 by @engcom-Charlie in 2.4-develop branch Related commits: 1. a922551 2. beb41d0 3. 3115fe9 4. 15d20cb 5. ae36ae4
2 parents 86ec99b + b22be3c commit def5104

File tree

2 files changed

+85
-13
lines changed

2 files changed

+85
-13
lines changed

app/code/Magento/Sales/Model/Order/ItemRepository.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,17 +167,31 @@ public function deleteById($id)
167167
public function save(OrderItemInterface $entity)
168168
{
169169
if ($entity->getProductOption()) {
170-
$request = $this->getBuyRequest($entity);
171-
$productOptions = $entity->getProductOptions();
172-
$productOptions['info_buyRequest'] = $request->toArray();
173-
$entity->setProductOptions($productOptions);
170+
$entity->setProductOptions($this->getItemProductOptions($entity));
174171
}
175172

176173
$this->metadata->getMapper()->save($entity);
177174
$this->registry[$entity->getEntityId()] = $entity;
178175
return $this->registry[$entity->getEntityId()];
179176
}
180177

178+
/**
179+
* Return product options
180+
*
181+
* @param OrderItemInterface $entity
182+
* @return array
183+
*/
184+
private function getItemProductOptions(OrderItemInterface $entity): array
185+
{
186+
$request = $this->getBuyRequest($entity);
187+
$productOptions = $entity->getProductOptions();
188+
$productOptions['info_buyRequest'] = $productOptions && !empty($productOptions['info_buyRequest'])
189+
? array_merge($productOptions['info_buyRequest'], $request->toArray())
190+
: $request->toArray();
191+
192+
return $productOptions;
193+
}
194+
181195
/**
182196
* Set parent item.
183197
*

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,94 @@
44
* See COPYING.txt for license details.
55
*/
66

7+
declare(strict_types=1);
8+
79
namespace Magento\Sales\Service\V1;
810

11+
use Magento\Framework\ObjectManagerInterface;
12+
use Magento\Framework\Webapi\Rest\Request;
13+
use Magento\Sales\Api\Data\OrderInterface;
14+
use Magento\Sales\Api\OrderRepositoryInterface;
15+
use Magento\Sales\Model\Order;
16+
use Magento\TestFramework\Helper\Bootstrap;
917
use Magento\TestFramework\TestCase\WebapiAbstract;
1018

19+
/**
20+
* Test for hold order.
21+
*/
1122
class OrderHoldTest extends WebapiAbstract
1223
{
13-
const SERVICE_VERSION = 'V1';
24+
private const SERVICE_VERSION = 'V1';
1425

15-
const SERVICE_NAME = 'salesOrderManagementV1';
26+
private const SERVICE_NAME = 'salesOrderManagementV1';
27+
28+
/**
29+
* @var ObjectManagerInterface
30+
*/
31+
private $objectManager;
32+
33+
/**
34+
* @var OrderRepositoryInterface
35+
*/
36+
private $orderRepository;
37+
38+
/**
39+
* @inheritDoc
40+
*/
41+
protected function setUp(): void
42+
{
43+
$this->objectManager = Bootstrap::getObjectManager();
44+
$this->orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
45+
}
1646

1747
/**
18-
* @magentoApiDataFixture Magento/Sales/_files/order.php
48+
* Test hold order and check order items product options after.
49+
*
50+
* @magentoApiDataFixture Magento/Sales/_files/order_with_two_configurable_variations.php
51+
*
52+
* @return void
1953
*/
20-
public function testOrderHold()
54+
public function testOrderHold(): void
2155
{
22-
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
23-
$order = $objectManager->get(\Magento\Sales\Model\Order::class)->loadByIncrementId('100000001');
56+
$order = $this->objectManager->get(Order::class)
57+
->loadByIncrementId('100000001');
58+
$orderId = $order->getId();
59+
$orderItemsProductOptions = $this->getOrderItemsProductOptions($order);
60+
2461
$serviceInfo = [
2562
'rest' => [
26-
'resourcePath' => '/V1/orders/' . $order->getId() . '/hold',
27-
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
63+
'resourcePath' => '/V1/orders/' . $orderId . '/hold',
64+
'httpMethod' => Request::HTTP_METHOD_POST,
2865
],
2966
'soap' => [
3067
'service' => self::SERVICE_NAME,
3168
'serviceVersion' => self::SERVICE_VERSION,
3269
'operation' => self::SERVICE_NAME . 'hold',
3370
],
3471
];
35-
$requestData = ['id' => $order->getId()];
72+
$requestData = ['id' => $orderId];
3673
$result = $this->_webApiCall($serviceInfo, $requestData);
3774
$this->assertTrue($result);
75+
76+
$this->assertEquals(
77+
$orderItemsProductOptions,
78+
$this->getOrderItemsProductOptions($this->orderRepository->get($orderId))
79+
);
80+
}
81+
82+
/**
83+
* Return order items product options
84+
*
85+
* @param OrderInterface $order
86+
* @return array
87+
*/
88+
private function getOrderItemsProductOptions(OrderInterface $order): array
89+
{
90+
$result = [];
91+
foreach ($order->getItems() as $orderItem) {
92+
$result[] = $orderItem->getProductOptions();
93+
}
94+
95+
return $result;
3896
}
3997
}

0 commit comments

Comments
 (0)