How To Create Order in Magento 2 Programmatically?

Today, we’re going to teach you guys how to create order programmatically in Magento 2.

Learning how to create order programmatically in Magento 2 is very helpful for store owners because the manual process is quite a time-consuming process.

However, in order to create order programmatically in Magento 2, we need to first create a quote.

Below are the steps you need to follow to create a quote and order programmatically in Magento 2.

Step-by-Step Process to Create Order Programmatically in Magento 2

Step 1. First of all, we’ll use the following sample data to create both quote and order in Magento 2.

<?php

$order = [

    'currency_id' => 'USD',

    'email' => '[email protected]',

    'shipping_address' => ['firstname' => 'John',

        'lastname' => 'Green',

        'street' => 'xxxxxx',

        'city' => 'xxxxxxx',

        'country_id' => 'US',

        'region' => 'xxxxx',

        'postcode' => '85001',

        'telephone' => '52556542',

        'fax' => '3242322556',

        'save_in_address_book' => 1],

    'items' => [

        ['product_id' => '1', 'qty' => 1],

        ['product_id' => '2', 'qty' => 2]]

    ];

?>

Step 2. After that, we now need to create a function in the module helper file as shown below:

<?php

namespaceYourNameSpace\ModuleName\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

class Data extends AbstractHelper

{

    public function __construct(\Magento\Framework\App\Helper\Context $context, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\Product $product, \Magento\Framework\Data\Form\FormKey $formkey, \Magento\Quote\Model\QuoteFactory $quote, \Magento\Quote\Model\QuoteManagement $quoteManagement, \Magento\Customer\Model\CustomerFactory $customerFactory, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository, \Magento\Sales\Model\Service\OrderService $orderService)

    {

        $this->storeManager = $storeManager;

        $this->product = $product;

        $this->formkey = $formkey;

        $this->quote = $quote;

        $this->quoteManagement = $quoteManagement;

        $this->customerFactory = $customerFactory;

        $this->customerRepository = $customerRepository;

        $this->orderService = $orderService;

        parent::__construct($context);

    }

    public function createOrder($order)

    {

        $store = $this->storeManager->getStore();

        $websiteId = $this->storeManager->getStore()->getWebsiteId();

        $customer = $this->customerFactory->create();

        $customer->setWebsiteId($websiteId);

        $customer->loadByEmail($order['email']); // load customet by email address

       if (!$customer->getEntityId()) {

            //If not avilable then create this customer

           $customer->setWebsiteId($websiteId)->setStore($store)->setFirstname($order['shipping_address']['firstname'])->setLastname($order['shipping_address']['lastname'])->setEmail($order['email'])->setPassword($order['email']);

            $customer->save();

        }

        $quote = $this->quote->create(); // Create Quote Object

       $quote->setStore($store); // Set Store

       $customer = $this->customerRepository->getById($customer->getEntityId());

        $quote->setCurrency();

        $quote->assignCustomer($customer); // Assign quote to Customer

        //add items in quote

       foreach ($order['items'] as $item) {

            $product = $this->product->load($item['product_id']);

            $product->setPrice($item['price']);

            $quote->addProduct($product, intval($item['qty']));

        }

        $quote->getBillingAddress()->addData($order['shipping_address']);

        $quote->getShippingAddress()->addData($order['shipping_address']);

        // Collect Rates and Set Shipping & Payment Method

       $shippingAddress = $quote->getShippingAddress();

        $shippingAddress->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod('freeshipping_freeshipping');

        $quote->setPaymentMethod('checkmo');

        $quote->setInventoryProcessed(false);

        $quote->save();

        // Set Sales Order Payment

       $quote->getPayment()->importData(['method' => 'checkmo']);

        // Collect Totals & Save Quote

       $quote->collectTotals()->save();

        // Create Order From Quote

       $orderdata = $this->quoteManagement->submit($quote);

        $orderdata->setEmailSent(0);

        $increment_id = $order->getRealOrderId();

        if ($orderdata->getEntityId()) {

            $result['order_id'] = $orderdata->getRealOrderId();

        } else {

            $result = ['error' => 1, 'msg' => 'Your custom message'];

        }

        return $result;

    }

}

?>

And that’s about it!

Conclusion

This is all you need to do to create a quote & order programmatically in Magento 2.

And if you need our professional assistance, feel free to contact us at any time.

Magento 2 Development Services