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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
<?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 🙂 .
18 comments
Thanks for your query, for sure we will update it in our future blogs.
And i need an assistance in get shipping method process in Rest API in magento2.1.6
If you are interest, pls let me .. and mail me
thanks in advance
– vijikannan
$quote->setInventoryProcessed(false)
?I guess
InventoryProcessed
is false by default, because inventory wasn’t processed. It’ll be processed insubmit
operation.This method required a MagentoCustomerApiDataCustomerInterface param.
Here you give MagentoCustomerModelCustomer . It should not work imo.
please suggest
In which table will I find the quote and order entry ?
Thanks.
I have found same issue. Did found any solution?
Thanks!
How i can add the disscount?
run the Order item with 2 products but it adding only one item added Quote and order.
Kindly advice.
I have found same issue. Did found any solution?
Thanks!