Reading list Switch to dark mode

    Create Quote And Order Programmatically In Magento2

    Updated 21 February 2024

    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'        => '[email protected]', //buyer email id
         'shipping_address' =>[
    		    'firstname'	   => 'jhon', //address Details
    		    'lastname'	   => 'Deo',
                        'street' => 'xxxxx',
                        'city' => 'xxxxx',
    		    'country_id' => 'IN',
    		    'region' => 'UP',
    		    '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, 'price'=> 30],
                  ['product_id'=>'2','qty'=>2, 'price'=> 40]
                ]
    ];

    I’ll write order create function in module helper file

    <?php
    namespace YourNameSpace\ModuleName\Helper;
    
    class Data extends \Magento\Framework\App\Helper\AbstractHelper
    {
       /**
         * @var Magento\Framework\App\Action\Context
         */
        protected $context;
        /**
         * @var Magento\Store\Model\StoreManagerInterface
         */
        protected $_storeManager;
        /**
         * @var \Magento\Catalog\Model\Product
         */
        protected $_product;
        /**
         * @var \Magento\Framework\Data\Form\FormKey
         */
        protected $_formkey;
        /**
         * @var \Magento\Quote\Model\QuoteFactory
         */
        protected $quote;
        /**
         * @var \Magento\Quote\Model\QuoteManagement
         */
        protected $quoteManagement;
        /**
         * @var \Magento\Customer\Model\CustomerFactory
         */
        protected $customerFactory;
        /**
         * @var $product
         */
        protected $customerRepository;
        /**
         * @var \Magento\Quote\Api\CartRepositoryInterface
         */
        protected $cartRepositoryInterface;
        /**
         * @var \Magento\Quote\Api\CartManagementInterface
         */
        protected $cartManagementInterface;
        /**
         * @var \Magento\Sales\Model\Order
         */
        protected $order;
    
       /**
        * @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('flatrate_flatrate'); //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 🙂 .

    Searching for an experienced
    Magento Company ?
    Find out More
    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    18 comments

  • vivek singh
    • Webkul Support
  • Guhan Seenivasagam
  • Rob Conings
  • VijayaLakshmi M
    • Webkul Support
  • Rustam Zinnatullin
  • Ankit Shah
  • Phuong LÊ
  • Mohammad Mujassam
  • Azher Uddin Farooqi
  • Niteen Barde
    • Kirti Nariya
  • Shinichi
  • poongudivanan
    • Mohammad Mujassam
      • Kirti Nariya
  • Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home