Mark a Magento order as complete programmatically
Solution 1
You can take a look at this article (in Russian).
Here is the code from the article:
$order = $observer->getEvent()->getOrder();
if (!$order->getId()) {
return false;
}
if (!$order->canInvoice()) {
return false;
}
$savedQtys = array();
$invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($savedQtys);
if (!$invoice->getTotalQty()) {
return false;
}
$invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE);
$invoice->register();
$invoice->getOrder()->setCustomerNoteNotify(false);
$invoice->getOrder()->setIsInProcess(true);
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($invoice->getOrder());
$transactionSave->save();
Solution 2
Try
$order->setStateUnprotected('complete',
'complete',
'Order marked as complete automatically',
false);
This method is in app/code/local/Mage/Sales/Model/Order.php
(in v1.6.1)
938: public function setStateUnprotected($state, $status = false, $comment = '', $isCustomerNotified = null)
In Magento 1.7.0.0 this method has been removed. Try this instead:
$order->setData('state', "complete");
$order->setStatus("complete");
$history = $order->addStatusHistoryComment('Order marked as complete automatically.', false);
$history->setIsCustomerNotified(false);
$order->save();
Solution 3
I'm doing this that way:
$order->setState('complete', true, $this->__('Your Order History Message Here.'))
->save();
Solution 4
Code for processing order programmatically. Can be put on success event or cron
$order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
$order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE);
$order->setStatus(Mage_Sales_Model_Order::STATE_COMPLETE);
$history = $order->addStatusHistoryComment('Order is complete', false);
$history->setIsCustomerNotified(false);
$order->save();
Comments
-
gregdev almost 2 years
I'm trying to mark a "Processing" order as Complete when I get a certain response back from a third party service. I've got everything set up for this, but the only problem is that orders are staying in the Processing state.
I'm generating an invoice (I don't think I need this though, as each item is marked as "invoiced" in the Magento backend) and a shipment like so:
$order = Mage::getModel('sales/order')... (etc) $shipment = $order->prepareShipment($quantities); $shipment->register(); $shipment->setOrder($order); $shipment->save(); $invoice = $order->prepareInvoice($quantities); $invoice->register(); $invoice->setOrder($order); $invoice->save();
This doesn't seem to be doing it though - I get no errors back from this code, but the order remains as processing. In the backend I can still see the "Ship" button at the top of the order, and each item is in the "invoiced" state.
Any tips would be greatly appreciated.
-
gregdev over 12 yearsThanks, the code in the article did the trick after I changed to to a shipment rather than an invoice.
-
gregdev over 12 yearsThanks for the response. This didn't seem to have any effect in Magento 1.4
-
gregdev over 12 yearsThanks for the response. This brought up the error "The Order State "complete" must not be set manually."
-
Mike about 12 yearsUnfortunately, the link is now broken.
-
shaune about 12 yearsWould be really nice to have an updated link. archive.org still has a version of the link in case anyone is interested. web.archive.org/web/20110414102634/http://snowcore.net/…. Use google chrome to get a translation.
-
Roman Snitko about 12 years@Mike domain will be available in few days, so you can check later
-
jfreak53 over 11 yearsThrew error,
Call to a member function getMethodInstance() on a non-object
in 1.7.0.2 -
Jon Surrell over 9 years@gregdev can you share your solution? (shipment rather than invoice)
-
Marcus Wolschon about 5 yearsBut you can not create a custom state. Just a custom status and assign one or multiple status values to a state.
-
Marcus Wolschon about 5 yearsWhy are you setting state and status to the same value?
-
Ahmad Vaqas Khan about 5 years@MarcusWolschon : For better understanding take a look of "sales_order_status" table . Status is a representation of state and based on it , status label is displayed.
-
Marcus Wolschon about 5 yearsThe names of the shop-specific status codes (and their translated labels) are usually different from the fixed Magento state values. A status is assigned to a state and one status may be assinged as the default status for a Magento state. So the question remains. Why set status and state to the same value. The status is Shop-specific and should not come from a Magento constant for a state.