Menu Close
    Hire us Request quote Reading list Switch to dark mode

    Create Quote And Order Programmatically In Magento2

    Create Quote And Order Programmatically In Magento2

    Here we learn  how to create quote and order programmatically in  Magento2

    I’ll use following data for create quote and order

    $tempOrder=[
         'currency_id'  => 'USD',
         'email'        => 'test@webkul.com', //buyer email id
         'shipping_address' =>[
    		    'firstname'	   => 'jhon', //address Details
    		    'lastname'	   => 'Deo',
                        'street' => 'xxxxx',
                        'city' => 'xxxxx',
    		    'country_id' => 'IN',
    		    'region' => 'xxx',
    		    'postcode' => '43244',
    		    'telephone' => '52332',
    		    'fax' => '32423',
    		    'save_in_address_book' => 1
                     ],
       'items'=> [ //array of product which order you want to create
                  ['product_id'=>'1','qty'=>1],
                  ['product_id'=>'2','qty'=>2]
                ]
    ];

    I’ll write order create function in module helper file

    <?php
    namespace YourNameSpace\ModuleName\Helper;
    
    class Data extends \Magento\Framework\App\Helper\AbstractHelper
    {
       /**
        * @param Magento\Framework\App\Helper\Context $context
        * @param Magento\Store\Model\StoreManagerInterface $storeManager
        * @param Magento\Catalog\Model\Product $product,
        * @param Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
        * @param Magento\Quote\Api\CartManagementInterface $cartManagementInterface,
        * @param Magento\Customer\Model\CustomerFactory $customerFactory,
        * @param Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
        * @param Magento\Sales\Model\Order $order
        */
        public function __construct(
            \Magento\Framework\App\Helper\Context $context,
            \Magento\Store\Model\StoreManagerInterface $storeManager,
            \Magento\Catalog\Model\Product $product,
            \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
            \Magento\Quote\Api\CartManagementInterface $cartManagementInterface,
            \Magento\Customer\Model\CustomerFactory $customerFactory,
            \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
            \Magento\Sales\Model\Order $order
        ) {
            $this->_storeManager = $storeManager;
            $this->_product = $product;
            $this->cartRepositoryInterface = $cartRepositoryInterface;
            $this->cartManagementInterface = $cartManagementInterface;
            $this->customerFactory = $customerFactory;
            $this->customerRepository = $customerRepository;
            $this->order = $order;
            parent::__construct($context);
        }
    
        /**
         * Create Order On Your Store
         * 
         * @param array $orderData
         * @return array
         * 
        */
        public function createMageOrder($orderData) {
            $store=$this->_storeManager->getStore();
            $websiteId = $this->_storeManager->getStore()->getWebsiteId();
            $customer=$this->customerFactory->create();
            $customer->setWebsiteId($websiteId);
            $customer->loadByEmail($orderData['email']);// load customet by email address
            if(!$customer->getEntityId()){
            	//If not avilable then create this customer 
                $customer->setWebsiteId($websiteId)
                        ->setStore($store)
                        ->setFirstname($orderData['shipping_address']['firstname'])
                        ->setLastname($orderData['shipping_address']['lastname'])
                        ->setEmail($orderData['email']) 
                        ->setPassword($orderData['email']);
                $customer->save();
            }
            
            $cartId = $this->cartManagementInterface->createEmptyCart(); //Create empty cart
            $quote = $this->cartRepositoryInterface->get($cartId); // load empty cart quote
            $quote->setStore($store);
          	// if you have allready buyer id then you can load customer directly 
            $customer= $this->customerRepository->getById($customer->getEntityId());
            $quote->setCurrency();
            $quote->assignCustomer($customer); //Assign quote to customer
    
            //add items in quote
            foreach($orderData['items'] as $item){
                $product=$this->_product->load($item['product_id']);
                $product->setPrice($item['price']);
                $quote->addProduct($product, intval($item['qty']));
            }
    
            //Set Address to quote
            $quote->getBillingAddress()->addData($orderData['shipping_address']);
            $quote->getShippingAddress()->addData($orderData['shipping_address']);
    
            // Collect Rates and Set Shipping & Payment Method
    
            $shippingAddress=$quote->getShippingAddress();
            $shippingAddress->setCollectShippingRates(true)
                            ->collectShippingRates()
                            ->setShippingMethod('freeshipping_freeshipping'); //shipping method
            $quote->setPaymentMethod('checkmo'); //payment method
            $quote->setInventoryProcessed(false); //not effetc inventory
    
            // Set Sales Order Payment
            $quote->getPayment()->importData(['method' => 'checkmo']);
            $quote->save(); //Now Save quote and your quote is ready
    
            // Collect Totals
            $quote->collectTotals();
    
            // Create Order From Quote
            $quote = $this->cartRepositoryInterface->get($quote->getId());
            $orderId = $this->cartManagementInterface->placeOrder($quote->getId());
            $order = $this->order->load($orderId);
           
            $order->setEmailSent(0);
            $increment_id = $order->getRealOrderId();
            if($order->getEntityId()){
                $result['order_id']= $order->getRealOrderId();
            }else{
                $result=['error'=>1,'msg'=>'Your custom message'];
            }
            return $result;
        }
    }
    
    ?>

    Now using this method you can crate quote and order in magento2 programmatically.
    Thanks 🙂 .

    . . .

    Comments (18)

    Add Your Comment

  • vivek singh
    how to order products with custom options .
    • Webkul Support
      Hi Vivek,
      Thanks for your query, for sure we will update it in our future blogs.
  • Guhan Seenivasagam
    Orders were successfully imported. But the order items were not taken properly. It takes only the last item from item’s array. However quantity calculates properly. Why is it happening?
  • Back to Top
    css.php
    Hire Us!
    Brief us about your requirements and we'll get back to you.
    Woo! Hooy!
    We have just received your message and our expert will get back to you shortly.
    Send Again
    Close