Magento: Create an order programmatically in internal code

I am trying to create an order in the backend in Magento (1.5.1.0).

Here is the code:

// Get the product id stored in the optionValue of the widget $productId = $order['customIdNumber']; // Load the product $product = Mage::getModel('catalog/product')->load($productId); // Check whether the product could be loaded if($product->getId()) { // Get the customer model $customer = Mage::getModel('customer/customer'); // Set the website id associated with the customer $customer->setWebsiteId(Mage::app()->getWebsite()->getId()); // Try to load the customer by email $customer->loadByEmail($order['personAddresses'][0]['email']); // Check whether the customer not exists if(!$customer->getId()) { // Create the customer $customer->setEmail($order['personAddresses'][0]['email']); $customer->setFirstname($order['personAddresses'][0]['firstName']); $customer->setLastname($order['personAddresses'][0]['lastName']); $customer->save(); } // Set the esstial order data $orderData = array( 'currency' => $order['currencyCode'], 'account' => array( 'group_id' => Mage_Customer_Model_Group::NOT_LOGGED_IN_ID, 'email' => $order['personAddresses'][0]['email'] ), 'billing_address' => 'firstname' => $order['personAddresses'][0]['firstName'], 'lastname' => $order['personAddresses'][0]['lastName'], 'street' => $order['personAddresses'][0]['street'], 'city' => $order['personAddresses'][0]['city'], 'country_id' => $order['personAddresses'][0]['country'], 'region_id' => 'BW', 'postcode' => $order['personAddresses'][0]['postalCode'], 'telephone' => '0123456789', ), 'comment' => array( 'customer_note' => "[Order has been created by the sellaround widget module]\nCustomer message:\n". $order['personAddresses'][0]['message'] ), 'send_confirmation' => false // does that something? ); // Set the shipping address to the billing address $orderData['shipping_address'] = $orderData['billing_address']; // Set the payment method $paymentMethod = 'checkmo'; // Set the shipping method $shippingMethod = 'flatrate_flatrate'; // Get the backend quote session $quoteSession = Mage::getSingleton('adminhtml/session_quote'); // Set the session store id $quoteSession->setStoreId(Mage::app()->getStore('default')->getId()); // Set the session customer id $quoteSession->setCustomerId($customer->getId()); // Get the backend order create model $orderCreate = Mage::getSingleton('adminhtml/sales_order_create'); // Import the data $orderCreate->importPostData($orderData); // Calculate the shipping rates $orderCreate->collectShippingRates(); // Set the shipping method $orderCreate->setPaymentMethod($paymentMethod); // Set the payment method to the payment instance $orderCreate->getQuote()->getPayment()->addData(array('method' => $paymentMethod)); // Set the shipping method $orderCreate->setShippingMethod($shippingMethod); // Set the quote shipping address shipping method $orderCreate->getQuote()->getShippingAddress()->setShippingMethod($shippingMethod); // Add the product $orderCreate->addProducts(array($product->getId() => array('qty' => 0))); // Initialize data for price rules $orderCreate->initRuleData(); // Save the quote $orderCreate->saveQuote(); // neccessary? // Create the order $order = $orderCreate->createOrder(); } 

I always get an exception. Please specify a shipping method. in Mage_Sales_Model_Service_Quote::_validate on line 293.

The code for the lines around the exception:

  $method= $address->getShippingMethod(); $rate = $address->getShippingRateByCode($method); if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) { Mage::throwException($helper->__('Please specify a shipping method.')); } 

Does anyone know why I am getting this error? Is it because speed cannot be loaded? (The product is not virtual)

+6
source share
2 answers

I solve this time ago using the delivery method that I created myself.

The code for creating an order has also changed from the base singleton method 'frontend method' as follows:

 // Get the Quote to save the order $quote = Mage::getModel('sales/quote')->setStoreId($storeId); // Set the customer $quote->setCustomer($customer); // Add the product with the product options $quote->addProduct($product, new Varien_Object($productOptions)); // Add the address data to the billing address $billingAddress = $quote->getBillingAddress()->addData($addressData); // Add the adress data to the shipping address $shippingAddress = $quote->getShippingAddress()->addData($addressData); // Collect the shipping rates $shippingAddress->setCollectShippingRates(true)->collectShippingRates(); // Set the shipping method /////////// Here i set my own shipping method $shippingAddress->setShippingMethod($shippingMethod); // Set the payment method $shippingAddress->setPaymentMethod($paymentMethod); // Set the payment method $quote->getPayment()->importData(array('method' => $paymentMethod)); // Collect the prices $quote->collectTotals()->save(); // Get the service to submit the order $service = Mage::getModel('sales/service_quote', $quote); // Submit the order $service->submitAll(); // Get the new order $newOrder = $service->getOrder(); // Get payment instance $payment = $newOrder->getPayment(); // Set the buyer data $this->_importPaymentInformation($payment, $order); // Set the transaction data $payment->setData('last_trans_id', $order['transNrPurchaseForReceiver']); // Save the payment changes $payment->save(); // Set the order state and save the order $newOrder->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, $comment)->save(); 
+2
source

I tried this problem. In some cases, order is created programmatically. I decided to work around this problem by overriding the _validate method of the Mage_Sales_Model_Service_Quote class.

0
source

Source: https://habr.com/ru/post/892841/


All Articles