Magento: How to update order status to complete

In this tutorial, I will present a code snippet to demonstrate how to convert a Pending or Processing Magento order into Complete with creation of invoice and shipment pro grammatically.

Posted on May 9, 2019 in Magento, PHP

We just use a controller action to update an existing Magento order’s status. If you want to use a cron job to update the order status, you can define a method in the Observer class.


//changeOrderAction()

    public function changeOrderAction()
    {
        $increment_id = $this->getRequest()->getParam('orderId', null);
        $message = $this->getRequest()->getParam('message', null);
        $tracking = $this->getRequest()->getParam('tracking', null);
        $code = $this->getRequest()->getParam('code', null);

        if(!$message || !$increment_id || $message !== 'somesecretphase you decided') {
            echo json_encode(array('message' => 'bad parameters'));
            return $this;
        }

        $order = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('increment_id', $increment_id)->getFirstItem();

        if(empty($order->getData())) {
            echo json_encode(array('message' => 'Order not existed'));

            return $this;
        }
        $totalpaid = $order->getGrandTotal();

        $order->setTotalDue(0);

        //echo $order->getState() . '<br />';

        //echo  '1' . Mage_Sales_Model_Order::STATE_COMPLETE . '<br />';
        //echo  '2' . Mage_Sales_Model_Order::STATE_NEW . '<br />';
        //echo  '3' . Mage_Sales_Model_Order::STATE_PROCESSING . '<br />';
        //echo  '4' . Mage_Sales_Model_Order::STATE_PENDING_PAYMENT . '<br />';
        //echo  '5' . Mage_Sales_Model_Order::STATE_CLOSED . '<br />';
        //echo  '6' . Mage_Sales_Model_Order::STATE_HOLDED . '<br />';


        //$orders = Mage::getModel('sales/order_invoice')->getCollection()
        //    ->addAttributeToFilter('order_id' , array('eq' => $order->getId()));

        //$orders->getSelect()->limit(1);

        if($order->getState() == Mage_Sales_Model_Order::STATE_COMPLETE)
        {
            echo json_encode(array('message'=>'order already completed'));
            return $this;
        }
        else if($order->getState() == Mage_Sales_Model_Order::STATE_CLOSED)
        {
            echo json_encode(array('message'=>'order already closed'));
            return $this;
        }
        else if($order->getState() == Mage_Sales_Model_Order::STATE_CANCELED)
        {
            echo json_encode(array('message'=>'order already canceled'));
            return $this;
        }
        else if($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED)
        {
            echo json_encode(array('message'=>'order already hold'));
            return $this;
        }

        if($order->getState() == Mage_Sales_Model_Order::STATE_NEW) {
            try {
                if(!$order->canInvoice()) {
                    $order->addStatusHistoryComment('Order cannot be invoiced.', false);
                    $order->save();
                }

                //Start Handle Invoice
                $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
                $invoice->setRquestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE);
                $invoice->register();

                $invoice->getOrder()->setCustomerNoteNotify(false);
                $invoice->getOrder()->setIsInProcess(true);
                $order->addStatusHistoryComment('Automatically INVOICED by NetSuite call.', false);
                $transactionSave = Mage::getModel('core/resource_transaction')
                    ->addObject($invoice)
                    ->addObject($invoice->getOrder());

                $transactionSave->save();
                //End Handle Invoice

                //Start Handle Shipment
                $shipment = $order->prepareShipment();
                $shipment->register();

                //Add track object to shipment
                if(!empty($tracking)) {
                    $trackingArr = explode('<BR>', $tracking);
                    $length = count($trackingArr);

                    for($i = 0; $i < $length; $i++) {
                        $trackingDetail = array(
                                'carrier_code' => 'usps',
                                'title' => 'United Parcel Service',
                                'number' => $trackingArr[$i], // Replace with your tracking number
                        );

                        $track = Mage::getModel('sales/order_shipment_track')->addData($trackingDetail);
                        $shipment->addTrack($track);
                    }
                }


                $order->setIsInProcess(true);
                $order->addStatusHistoryComment('Automatically SHIPPED by NetSuite call.', false);

                $transactionSave = Mage::getModel('core/resource_transaction')
                    ->addObject($shipment)
                    ->addObject($shipment->getOrder())
                    ->save();
                //End handl shipment

            }
            catch(Exception $e) {
                $order->addStatusHistoryComment('Exception occured during automatically Invoice and shipping action. Exception message: ' . $e->getMessage(), false);
                echo json_encode(array('message' => 'failed'));
                $order->save();
            }
        }
        else if($order->getState() == Mage_Sales_Model_Order::STATE_PROCESSING) {
            try {

                //Start Handle Shipment
                $shipment = $order->prepareShipment();
                $shipment->register();

                //Add track object to shipment
                if(!empty($tracking)) {
                    $trackingDetail = array(
                        'carrier_code' => 'usps',
                        'title' => 'United Parcel Service',
                        'number' => $tracking, // Replace with your tracking number
                    );

                    $track = Mage::getModel('sales/order_shipment_track')->addData($trackingDetail);
                    $shipment->addTrack($track);
                }

                $order->setIsInProcess(true);
                $order->addStatusHistoryComment('Automatically SHIPPED by NetSuite call.', false);

                $transactionSave = Mage::getModel('core/resource_transaction')
                    ->addObject($shipment)
                    ->addObject($shipment->getOrder())
                    ->save();
                //End handl shipment

            }
            catch(Exception $e) {
                $order->addStatusHistoryComment('Exception occured during automatically Invoice and shipping action. Exception message: ' . $e->getMessage(), false);
                echo json_encode(array('message' => 'failed'));
                $order->save();
            }

        }
        echo json_encode(array('message' => 'successfully'));
    }


comments powered by Disqus