Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 59 additions & 16 deletions app/code/Magento/Sales/Model/AdminOrder/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -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()
{
Expand All @@ -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();
Expand All @@ -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;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down