Skip to content

Commit d93de71

Browse files
Merge remote-tracking branch '37298/fix-for-issue-37028' into comm_jul
2 parents 806f895 + 4ba83aa commit d93de71

File tree

2 files changed

+60
-16
lines changed
  • app/code/Magento/Sales/Model/AdminOrder
  • dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder

2 files changed

+60
-16
lines changed

app/code/Magento/Sales/Model/AdminOrder/Create.php

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
use Magento\Quote\Model\Quote\Address\CustomAttributeListInterface;
1616
use Magento\Quote\Model\Quote\Item;
1717
use Magento\Sales\Api\Data\OrderAddressInterface;
18+
use Magento\Sales\Api\OrderRepositoryInterface;
1819
use Magento\Sales\Model\Order;
1920
use Magento\Store\Model\StoreManagerInterface;
2021
use Psr\Log\LoggerInterface;
22+
use Magento\Quote\Model\Quote;
2123

2224
/**
2325
* Order create model
@@ -257,6 +259,11 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
257259
*/
258260
private $customAttributeList;
259261

262+
/**
263+
* @var OrderRepositoryInterface
264+
*/
265+
private $orderRepositoryInterface;
266+
260267
/**
261268
* @param \Magento\Framework\ObjectManagerInterface $objectManager
262269
* @param \Magento\Framework\Event\ManagerInterface $eventManager
@@ -290,6 +297,7 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
290297
* @param ExtensibleDataObjectConverter|null $dataObjectConverter
291298
* @param StoreManagerInterface $storeManager
292299
* @param CustomAttributeListInterface|null $customAttributeList
300+
* @param OrderRepositoryInterface|null $orderRepositoryInterface
293301
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
294302
*/
295303
public function __construct(
@@ -324,7 +332,8 @@ public function __construct(
324332
\Magento\Framework\Serialize\Serializer\Json $serializer = null,
325333
ExtensibleDataObjectConverter $dataObjectConverter = null,
326334
StoreManagerInterface $storeManager = null,
327-
CustomAttributeListInterface $customAttributeList = null
335+
CustomAttributeListInterface $customAttributeList = null,
336+
OrderRepositoryInterface $orderRepositoryInterface = null
328337
) {
329338
$this->_objectManager = $objectManager;
330339
$this->_eventManager = $eventManager;
@@ -361,6 +370,8 @@ public function __construct(
361370
$this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class);
362371
$this->customAttributeList = $customAttributeList ?: ObjectManager::getInstance()
363372
->get(CustomAttributeListInterface::class);
373+
$this->orderRepositoryInterface = $orderRepositoryInterface ?: ObjectManager::getInstance()
374+
->get(OrderRepositoryInterface::class);
364375
}
365376

366377
/**
@@ -1983,7 +1994,8 @@ protected function _prepareQuoteItems()
19831994
/**
19841995
* Create new order
19851996
*
1986-
* @return \Magento\Sales\Model\Order
1997+
* @return Order
1998+
* @throws \Magento\Framework\Exception\LocalizedException
19871999
*/
19882000
public function createOrder()
19892001
{
@@ -1993,9 +2005,34 @@ public function createOrder()
19932005

19942006
$this->_prepareQuoteItems();
19952007

2008+
$orderData = $this->beforeSubmit($quote);
2009+
$order = $this->quoteManagement->submit($quote, $orderData);
2010+
$this->afterSubmit($order);
2011+
2012+
if ($this->getSendConfirmation() && !$order->getEmailSent()) {
2013+
$this->emailSender->send($order);
2014+
}
2015+
2016+
$this->_eventManager->dispatch('checkout_submit_all_after', ['order' => $order, 'quote' => $quote]);
2017+
2018+
$this->removeTransferredItems();
2019+
2020+
return $order;
2021+
}
2022+
2023+
/**
2024+
* Prepare and retrieve order data before submitting a quote for order creation.
2025+
*
2026+
* @param Quote $quote
2027+
* @return array
2028+
*/
2029+
private function beforeSubmit(Quote $quote)
2030+
{
19962031
$orderData = [];
1997-
if ($this->getSession()->getOrder()->getId()) {
2032+
if ($this->getSession()->getReordered() || $this->getSession()->getOrder()->getId()) {
19982033
$oldOrder = $this->getSession()->getOrder();
2034+
$oldOrder = $oldOrder->getId() ?
2035+
$oldOrder : $this->orderRepositoryInterface->get($this->getSession()->getReordered());
19992036
$originalId = $oldOrder->getOriginalIncrementId();
20002037
if (!$originalId) {
20012038
$originalId = $oldOrder->getIncrementId();
@@ -2009,25 +2046,31 @@ public function createOrder()
20092046
];
20102047
$quote->setReservedOrderId($orderData['increment_id']);
20112048
}
2012-
$order = $this->quoteManagement->submit($quote, $orderData);
2013-
if ($this->getSession()->getOrder()->getId()) {
2049+
2050+
return $orderData;
2051+
}
2052+
2053+
/**
2054+
* Process old order after submission.
2055+
*
2056+
* @param Order $order
2057+
* @return void
2058+
* @throws \Exception
2059+
*/
2060+
private function afterSubmit(Order $order)
2061+
{
2062+
if ($this->getSession()->getReordered() || $this->getSession()->getOrder()->getId()) {
20142063
$oldOrder = $this->getSession()->getOrder();
2064+
$oldOrder = $oldOrder->getId() ?
2065+
$oldOrder : $this->orderRepositoryInterface->get($this->getSession()->getReordered());
20152066
$oldOrder->setRelationChildId($order->getId());
20162067
$oldOrder->setRelationChildRealId($order->getIncrementId());
20172068
$oldOrder->save();
2018-
$this->orderManagement->cancel($oldOrder->getEntityId());
2069+
if ($this->getSession()->getOrder()->getId()) {
2070+
$this->orderManagement->cancel($oldOrder->getEntityId());
2071+
}
20192072
$order->save();
20202073
}
2021-
2022-
if ($this->getSendConfirmation() && !$order->getEmailSent()) {
2023-
$this->emailSender->send($order);
2024-
}
2025-
2026-
$this->_eventManager->dispatch('checkout_submit_all_after', ['order' => $order, 'quote' => $quote]);
2027-
2028-
$this->removeTransferredItems();
2029-
2030-
return $order;
20312074
}
20322075

20332076
/**

dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public function testInitFromOrderAndCreateOrderFromQuoteWithAdditionalOptions()
9898
$order->loadByIncrementId('100000001');
9999

100100
/** @var $orderCreate \Magento\Sales\Model\AdminOrder\Create */
101+
$order->setReordered(true);
101102
$orderCreate = $this->model->initFromOrder($order);
102103

103104
$quoteItems = $orderCreate->getQuote()->getItemsCollection();

0 commit comments

Comments
 (0)