0

I want to create orders with the multiple items using XML. I have gone through the below tutorials but it's working fine with the single items but not multiple items.

https://webkul.com/blog/create-quote-and-order-programmatically-in-magento2/

After that I found answer on the stackexchange for create orders, but it's also working with the single item.

How to create order programmatically in Magento 2?

Below is OrderImport.XML code:

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <release_number>TEST-LGAKFX1627L</release_number>
    <cc_number>4486660002638431</cc_number>
    <cc_type>VISA</cc_type>
    <cc_exp>10/31/19</cc_exp>
    <buyer_name>Buyer Name</buyer_name>
    <buyer_phone>0123456789</buyer_phone>
    <buyer_mail>buyer_name@example.com</buyer_mail>
    <company_name>COmpany Name</company_name>
    <billing_address_1>Billing Address 1</billing_address_1>
    <billing_address_2>Billing Address 2</billing_address_2>
    <billing_address_3>Billing Address 3</billing_address_3>
    <billing_address_4>Billing Address 4</billing_address_4>
    <products>
        <product>
            <qty>1</qty>
            <unit_price>9.78</unit_price>
            <vendor_part_no>SKU</vendor_part_no>
            <pay_carrier>PREPAID ( BY SELLER )</pay_carrier>
            <transport_responsibility>DESTINATION ( SHIPPING )</transport_responsibility>
        </product>
        <product>
            <qty>1</qty>
            <unit_price>10.56</unit_price>
            <vendor_part_no>SKU</vendor_part_no>
            <pay_carrier>PREPAID ( BY SELLER )</pay_carrier>
            <transport_responsibility>DESTINATION ( SHIPPING )</transport_responsibility>
        </product>
    </products>
</order>

Also,I have checked in the admin panel both products quantity and both are In Stock.

Below is Module file helper Data.php:

public function createOrder($data,$import_file)
{   
    self::$_currentReleaseNumber = (string) $data->release_number;
    $name = explode(' ', (string) $data->buyer_name);
    $shipping_firstName = $firstName = $name[0];
    if (count($name) == 3) {
        $shipping_middleName = $middleName = $name[1];
        $shipping_lastName = $lastName = $name[2];
    } else {
        $shipping_middleName = $middleName = '';
        $shipping_lastName = $lastName = $name[1];
    }

    if(isset($data->shipping_name)){
        $shipping_name = explode(' ', (string) $data->shipping_name);
        $shipping_firstName = $shipping_name[0];
        if (count($shipping_name) == 3) {
            $shipping_middleName = $shipping_name[1];
            $shipping_lastName = $shipping_name[2];
        } else {
            $shipping_middleName = '';
            $shipping_lastName = $shipping_name[1];
        }
    }    

    $shipping_countryCode = $countryCode = $this->_getCountryCode((string)$data->billing_address_4); 
    $shipping_addressData = $addressData = $this->_getAddressData((string) $data->billing_address_3, $countryCode);

    if(isset($data->shipping_address_4)){
        $shipping_countryCode = $this->_getCountryCode((string)$data->shipping_address_4); 
    }

    if(isset($data->shipping_address_3)){
        $shipping_addressData = $this->_getAddressData((string)$data->shipping_address_3, $shipping_countryCode);
    }

    $shipping_address_1 = (string) $data->billing_address_1;
    $shipping_address_2 = (string) $data->billing_address_2;

    if(isset($data->shipping_address_1)){
       $shipping_address_1 =  (string)$data->shipping_address_1;
    }
    if(isset($data->shipping_address_2)){
       $shipping_address_2 =  (string)$data->shipping_address_2;
    }
    if(isset($data->transportation_control_number)){
        $shipping_address_2 .= "\n TCN: ".(string)$data->transportation_control_number;
    }

    $shipping_phone = (string)$data->buyer_phone;
    if(isset($data->shipping_phone)){
        $shipping_phone = (string)$data->shipping_phone;
    }

    $productData =array();
    foreach ($data->products->product as $item) {
        $sku = (string) $item->vendor_part_no;
        if ($product = $this->_productFactory->loadByAttribute('sku', $sku)) {
            $productData[] = array(
                'product_id' => $product->getId(),
                'qty' =>  (int)$item->qty,
                'custom_price' => (string) $item->unit_price,
            );
            /*  $orderComments = $orderData['order']['comment']['customer_note']
                ."<br/>".$item->authorization_number."<br/>".$item->pay_carrier."<br/>".
                $item->transport_responsibility; */
        } 
        else {
            //die('No product found with sku '. $sku);
            $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/orderimport.log');
            $logger = new \Zend\Log\Logger();
            $logger->addWriter($writer);
            $logger->info("Error");
            $logger->info('No product found with sku '. $sku);
            $this->errorEmail('No product found with sku '. $sku,$import_file);
            return;
        }
    }

    $orderData=array(
        'currency'  => 'USD',
        'email'        => (string)$data->buyer_mail, //buyer email id
        'billing_address' =>array(
            'prefix'       => '',
            'firstname'    => $firstName, //address Details
            'middlename'   => $middleName,
            'lastname'     => $lastName,
            'suffix'       => '',
            'company'      => (string) $data->company_name,
            'street' => array(
                (string) $data->billing_address_1,
                (string) $data->billing_address_2,
            ),
            'city' => $addressData['city'],
            'country_id' => $countryCode,
            'region_id' => $addressData['region_id'],
            'postcode' => $addressData['postcode'],
            'telephone' => (string) $data->buyer_phone,
            'fax' => '',
            'save_in_address_book' => 1
        ),
        'shipping_address' =>array(
            'prefix'       => '',
            'firstname'    => $shipping_firstName, //address Details
            'middlename'   => $shipping_middleName,
            'lastname'     => $shipping_lastName . ' (' . (string) $data->release_number . ')',
            'suffix'       => '',
            'company'      => (string) $data->company_name,
            'street' => array(
                $shipping_address_1,
                $shipping_address_2,
            ),
            'city' => $shipping_addressData['city'],
            'country_id' => $shipping_countryCode,
            'region_id' => $shipping_addressData['region_id'],
            'postcode' => $shipping_addressData['postcode'],
            'telephone' => $shipping_phone,
            'fax' => '',
            'save_in_address_book' => 1
        ),
       'items'  => $productData
    );

    /* for payment method*/

    $ccMethod = 'authorizenet';
    if ($this->_isPaymentActive('authnetcim')) {
        $ccMethod = 'authnetcim';
    }
    if (isset($data->cc_exp) && $this->_isPaymentActive($ccMethod)) {
        $ccExpData = explode('/', $data->cc_exp);
        if (strlen((string) $ccExpData[2]) <=2) {
            $ccExpData[2] += 2000;
        }
        $orderData['payment'] = array(
            'method'       => $ccMethod,
            'cc_number'    => (string)$data->cc_number,
            'cc_type'      => $this->_mapCardType((string)$data->cc_type),
            'cc_exp_month' => (string)$ccExpData[0],
            'cc_exp_year'  => (string)$ccExpData[2],
        );
    } elseif ($this->_isPaymentActive('purchaseorder')) {
        $orderData['payment'] = array(
            'method' => 'purchaseorder',
            'po_number' => (string)$data->release_number,
        );
    } else {
        $orderData['payment'] = array(
            'method' => 'checkmo',
        );
    }

    $orderData['order']['comment']['customer_note'] = '';

    if (isset($data->mark_for_party)) {
        $orderData['order']['comment']['customer_note'] = "LABEL FOR ULTIMATE CONSIGNEE";
        $orderData['order']['comment']['customer_note'] .= "<br>";
        $orderData['order']['comment']['customer_note'] .= (string) $data->mark_for_party;
    }

    if (isset($data->reference_to)) {
        $orderData['order']['comment']['customer_note'] .= (string)$data->reference_to;
    }
    /* for payment method */

    try{
        $storeId = $this->_getStoreId();
        $store=$this->_storeManager->getStore($storeId);
        $websiteId = $store->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
        $cart_id = $this->cartManagementInterface->createEmptyCart();
        $quote = $this->cartRepositoryInterface->get($cart_id);


        $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();
        //$this->cartRepositoryInterface->save($quote);
        $quote->assignCustomer($customer); //Assign quote to customer

        //add items in quote
        foreach($orderData['items'] as $item){
            $product=$this->_productFactory->load($item['product_id']);
            $product->setPrice($item['custom_price']);
            $quote->addProduct(
                $product,
                intval($item['qty'])
            );
        }       

        //Set Address to quote
        $quote->getBillingAddress()->addData($orderData['billing_address']);
        $quote->getShippingAddress()->addData($orderData['shipping_address']);

        $quote->setReleaseNumber((string)$data->release_number);

         // Collect Rates and Set Shipping & Payment Method
        $this->shippingRate->setCode('freeshipping_freeshipping')->getPrice(1);
        $shippingAddress = $quote->getShippingAddress();
        //@todo set in order data
        $shippingAddress->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod('freeshipping_freeshipping'); //shipping method
        //$quote->getShippingAddress()->addShippingRate($this->rate);
        $quote->setPaymentMethod($orderData['payment']['method']); //payment method
        //$quote->setPaymentMethod('checkmo');

        $quote->setInventoryProcessed(false); //not effetc inventory
        //$quote->save(); //Now Save quote and your quote is ready

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

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

        $quote->collectTotals(); // replace it with me as we still need to collect totals

        $quote->save();

        // Create Order From Quote
        //$order = $this->quoteManagement->submit($quote);
        $quote = $this->cartRepositoryInterface->get($quote->getId());
        $order_id = $this->cartManagementInterface->placeOrder($quote->getId());

        //$order->setEmailSent(0);
        //$increment_id = $order->getRealOrderId();
        /*if($order->getRealOrderId()){
            $result['order_id']= $order->getRealOrderId();
        }else{
            $result=['error'=>1,'msg'=>'Your custom message'];
        }*/

        $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/orderimport.log');
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info("Success");
        $logger->info($order_id);

        if(isset($order_id) && $order_id!=''){
            $loadOrder= $this->order->load($order_id);    
            $loadOrder->setReleaseNumber((string)$data->release_number);
            $loadOrder->addStatusHistoryComment($orderData['order']['comment']['customer_note']);
            $loadOrder->setIsCustomerNotified(false);
            $loadOrder->addStatusHistoryComment('ACS Archive # ' . str_replace('.xml', '', self::$_currentFile));

            $loadOrder->save();

            $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/orderimport.log');
            $logger = new \Zend\Log\Logger();
            $logger->addWriter($writer);
            $logger->info("release_number");
            $logger->info($data->release_number);
        }

        return $order_id;
    }
    catch(\Exception $e){
        //die($e->getMessage());
        $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/orderimport.log');
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info("Error");
        $logger->info($e->getMessage());
        $this->errorEmail($e->getMessage(),$import_file);
        return;
    }
}

When I print_r($orderData['items']) it's output is below:

Array ( [0] => Array ( [product_id] => 541564 [qty] => 1 [custom_price] => 9.78 ) [1] => Array ( [product_id] => 423562 [qty] => 1 [custom_price] => 10.56 ) )

Please help!!!!

1

I have found the solution at my end after do lots of things and many thanks to Godric Cao.

I have used the below class to create the order with multiple items:

https://gist.github.com/godriccao/de490ca3f0ba96733b0a84c2928f0458

Now, the order import functionality is working fine with multiple items.

  • Hello, can you please share you full code? – Hardik Mar 22 '18 at 7:40

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.