Question

I have installed Magento 1.8. When a user orders a product, the quantity is decreased by one, but if he cancels that order (before invoicing), the stock quantity does not gets increased.

Admin > Catalog > Inventory > Stock Options > Set Items Status to be In Stock When Order is Cancelled is set to Yes

The code I have been using to cancel order is as follows:

class Kaushikamdotcom_Pay_OrderController extends Mage_Core_Controller_Front_Action {
    public function cancelAction() {
        if (($order_id = $this->getRequest()->getParam('order_id'))) {
            $order = Mage::getModel('sales/order')->load($order_id);

            $order->setState(Mage_Sales_Model_Order::STATE_CANCELED, true);
            $order->save();
        }

        $this->_redirect('sales/order/history');
    }
}

The code I have been using to know the current stock is as follows (The same can be also seen in the admin side):

Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product)->getQty();

Why is the quantity not get increased ? Is it the intended behavior ? I searched in google, on those links I have been instructed to do it programmatically.

Was it helpful?

Solution 2

I was only changing the state of the order. That was not the correct way to do cancellation. I have found out an elegant way to do that here.

The relevant code from this tutorial is:

if(!$order->canCancel()) {
    throw new Exception('Order cannot be canceled anymore.');
}
$order->cancel();
$order->save();

OTHER TIPS

You can try below code for cancelling an order.

$orderModel = Mage::getModel('sales/order');
$orderModel->load($orderId);
if(!$orderModel->canCancel()) {
$orderModel->cancel();
$orderModel->setState(Mage_Sales_Model_Order::STATE_CANCELED, true)->save();
$orderModel->save();
}

In your code, actual code is missing for cancel the order, you had never called cancel() function of class Mage_Sales_Model_Order

I suggest you try and hook on the order_cancel_after event and refund the ordered quantity using the event.

Your code just change order status. If you want to return item to stock you should use Mage_Sales_Model_Order::cancel() instead, or if payment method doesn't support cancelation try Mage_Sales_Model_Order::registerCancellation.

This method cancel all order items and return it to stock.

        foreach ($this->getAllItems() as $item) {
            ...
            $item->cancel();
        }
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top