0

I am trying to create a new Order programatically. But i keep getting following fatal error when ever i try to create an order

Fatal error: Uncaught Error: Call to a member function setFinalPrice() on null in C:\wamp\www\Project\vendor\magento\module-quote\Model\Quote\Item\AbstractItem.php on line 152
( ! ) Error: Call to a member function setFinalPrice() on null in C:\wamp\www\Project\vendor\magento\module-quote\Model\Quote\Item\AbstractItem.php on line 152

Below is the code i tried

CreateOrder.php

<?php
namespace <Vendor>\Sales\Model\Order;

class OrderCreate
{
     /**
    * @param Magento\Framework\App\Helper\Context $context
    * @param Magento\Store\Model\StoreManagerInterface $storeManager
    * @param Magento\Catalog\Model\Product $product
    * @param Magento\Framework\Data\Form\FormKey $formKey $formkey,
    * @param Magento\Quote\Model\Quote $quote,
    * @param Magento\Customer\Model\CustomerFactory $customerFactory,
    * @param Magento\Sales\Model\Service\OrderService $orderService,
    */
    public function __construct(
        \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;
    }

    /**
     * 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();
        }
        $quote=$this->quote->create(); //Create object of quote
        $quote->setStore($store); //set store for which you create quote
        // 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
        $quote->save(); //Now Save quote and your quote is ready

        // Set Sales Order Payment
        $quote->getPayment()->importData(['method' => 'checkmo']);

        // Collect Totals & Save Quote
        $quote->collectTotals()->save();

        // Create Order From Quote
        $order = $this->quoteManagement->submit($quote);

        $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;
    }
}

Code i tried to create order

$tempOrder=[
                'currency_id'  => 'USD',
                'email'        => 'karthik@abc.com', //buyer email id
                'shipping_address' =>[
                    'firstname'    => 'Karthik', //address Details
                    'lastname'     => 'Nk',
                    'street' => '11/87, North Street',
                    'city' => 'Neyyoor',
                    'country_id' => 'US',
                    'region' => 'Anchorage, Alaska',
                    'postcode' => '99501',
                    'telephone' => '999-999-9999',
                    'fax' => '32423',
                    'save_in_address_book' => 1
                ],
                'items'=> [ //array of product which order you want to create
                      ['product_id'=>'1','qty'=>1,'price'=>1000],
                      ['product_id'=>'2','qty'=>2,'price'=>1000]
                    ]
            ];
            $orderModel = $this->objectManager->get('<Vendor>\Sales\Model\Order\OrderCreate');
            $orderId = $orderModel->createMageOrder($tempOrder);
  • To create order with custom script into magento 2 please follow the link. I hope this will help you. Custom Script to create order You don't need to create the quote to generate the order with custom script. – Envision Ecommerce Oct 25 '17 at 14:00
0

You are passing product id 1 and 2. Mentioned error occurs if Product associated with these ids are not available. Please check id for existing product and pass correct one.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.