diff --git a/app/code/Magento/Sales/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php index 154ee6e845bc9..f94be70782e73 100644 --- a/app/code/Magento/Sales/Model/AdminOrder/Create.php +++ b/app/code/Magento/Sales/Model/AdminOrder/Create.php @@ -15,9 +15,11 @@ use Magento\Quote\Model\Quote\Address\CustomAttributeListInterface; use Magento\Quote\Model\Quote\Item; use Magento\Sales\Api\Data\OrderAddressInterface; +use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\Order; use Magento\Store\Model\StoreManagerInterface; use Psr\Log\LoggerInterface; +use Magento\Quote\Model\Quote; /** * Order create model @@ -257,6 +259,11 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\ */ private $customAttributeList; + /** + * @var OrderRepositoryInterface + */ + private $orderRepositoryInterface; + /** * @param \Magento\Framework\ObjectManagerInterface $objectManager * @param \Magento\Framework\Event\ManagerInterface $eventManager @@ -290,6 +297,7 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\ * @param ExtensibleDataObjectConverter|null $dataObjectConverter * @param StoreManagerInterface $storeManager * @param CustomAttributeListInterface|null $customAttributeList + * @param OrderRepositoryInterface|null $orderRepositoryInterface * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -324,7 +332,8 @@ public function __construct( \Magento\Framework\Serialize\Serializer\Json $serializer = null, ExtensibleDataObjectConverter $dataObjectConverter = null, StoreManagerInterface $storeManager = null, - CustomAttributeListInterface $customAttributeList = null + CustomAttributeListInterface $customAttributeList = null, + OrderRepositoryInterface $orderRepositoryInterface = null ) { $this->_objectManager = $objectManager; $this->_eventManager = $eventManager; @@ -361,6 +370,8 @@ public function __construct( $this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class); $this->customAttributeList = $customAttributeList ?: ObjectManager::getInstance() ->get(CustomAttributeListInterface::class); + $this->orderRepositoryInterface = $orderRepositoryInterface ?: ObjectManager::getInstance() + ->get(OrderRepositoryInterface::class); } /** @@ -1983,7 +1994,8 @@ protected function _prepareQuoteItems() /** * Create new order * - * @return \Magento\Sales\Model\Order + * @return Order + * @throws \Magento\Framework\Exception\LocalizedException */ public function createOrder() { @@ -1993,9 +2005,34 @@ public function createOrder() $this->_prepareQuoteItems(); + $orderData = $this->beforeSubmit($quote); + $order = $this->quoteManagement->submit($quote, $orderData); + $this->afterSubmit($order); + + if ($this->getSendConfirmation() && !$order->getEmailSent()) { + $this->emailSender->send($order); + } + + $this->_eventManager->dispatch('checkout_submit_all_after', ['order' => $order, 'quote' => $quote]); + + $this->removeTransferredItems(); + + return $order; + } + + /** + * Prepare and retrieve order data before submitting a quote for order creation. + * + * @param Quote $quote + * @return array + */ + private function beforeSubmit(Quote $quote) + { $orderData = []; - if ($this->getSession()->getOrder()->getId()) { + if ($this->getSession()->getReordered() || $this->getSession()->getOrder()->getId()) { $oldOrder = $this->getSession()->getOrder(); + $oldOrder = $oldOrder->getId() ? + $oldOrder : $this->orderRepositoryInterface->get($this->getSession()->getReordered()); $originalId = $oldOrder->getOriginalIncrementId(); if (!$originalId) { $originalId = $oldOrder->getIncrementId(); @@ -2009,25 +2046,31 @@ public function createOrder() ]; $quote->setReservedOrderId($orderData['increment_id']); } - $order = $this->quoteManagement->submit($quote, $orderData); - if ($this->getSession()->getOrder()->getId()) { + + return $orderData; + } + + /** + * Process old order after submission. + * + * @param Order $order + * @return void + * @throws \Exception + */ + private function afterSubmit(Order $order) + { + if ($this->getSession()->getReordered() || $this->getSession()->getOrder()->getId()) { $oldOrder = $this->getSession()->getOrder(); + $oldOrder = $oldOrder->getId() ? + $oldOrder : $this->orderRepositoryInterface->get($this->getSession()->getReordered()); $oldOrder->setRelationChildId($order->getId()); $oldOrder->setRelationChildRealId($order->getIncrementId()); $oldOrder->save(); - $this->orderManagement->cancel($oldOrder->getEntityId()); + if ($this->getSession()->getOrder()->getId()) { + $this->orderManagement->cancel($oldOrder->getEntityId()); + } $order->save(); } - - if ($this->getSendConfirmation() && !$order->getEmailSent()) { - $this->emailSender->send($order); - } - - $this->_eventManager->dispatch('checkout_submit_all_after', ['order' => $order, 'quote' => $quote]); - - $this->removeTransferredItems(); - - return $order; } /** diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php index bf0c090426821..e3f3a98a7331b 100755 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php @@ -98,6 +98,7 @@ public function testInitFromOrderAndCreateOrderFromQuoteWithAdditionalOptions() $order->loadByIncrementId('100000001'); /** @var $orderCreate \Magento\Sales\Model\AdminOrder\Create */ + $order->setReordered(true); $orderCreate = $this->model->initFromOrder($order); $quoteItems = $orderCreate->getQuote()->getItemsCollection();