Как управлять доступностью товара (на складе или на складе) с отменой отмены заказа


Я пытаюсь разработать расширение отмены отмененного заказа. Для этого я расширяю OrderController.php .

    class Extension_Undocancel_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Controller_Action
{
    public function undocancelAction()
    {
        $id = $this->getRequest()->getParam('order_id');
        $order = Mage::getModel('sales/order')->load($id);
        $items = $order->getItemsCollection();

        try {
            foreach($items as $item) {
                $canceled = $item->getQtyCanceled();
                if($canceled>0) {
                    $productUpdates[$item->getProductId()] = array('qty' => $canceled);
                }
                $item->setData('qty_canceled',0);
            }
                Mage::getSingleton('cataloginventory/stock')->registerProductsSale($productUpdates);
                $items->save();

            $order->setBaseDiscountCanceled(0)
                ->setBaseShippingCanceled(0)
                ->setBaseSubtotalCanceled(0)
                ->setBaseTaxCanceled(0)
                ->setBaseTotalCanceled(0)
                ->setDiscountCanceled(0)
                ->setShippingCanceled(0)
                ->setSubtotalCanceled(0)
                ->setTaxCanceled(0)
                ->setTotalCanceled(0);

            $state = 'new';
            $status = 'processing';

            $order->setStatus($status)
                ->setState($state)
                ->save();

            $this->_getSession()->addSuccess($this->__('Order was successfully uncancelled.'));
        }
        catch (Mage_Core_Exception $e) {
            $this->_getSession()->addError($e->getMessage());
        }
        catch (Exception $e) {
            $this->_getSession()->addError($this->__('Order was not uncancelled.'));
        }

        $this->_redirect('*/sales_order/view', array('order_id' => $order->getId()));
    }

}

Он отлично работает, даже обновляя запасы продуктов в соответствии с отмененным количеством, но если количество продукта станет равным нулю, оно все равно будет отображаться на складе.

Как я могу обновить наличие на складе, если количество становится равным нулю?

Author: Sandesh, 2013-07-24

1 answers

После обновления кода отсортируйте проблему, упомянутую выше. Я надеюсь, что это кому-то поможет. (Если у вас есть изменения или ошибки, пожалуйста, прокомментируйте)

class Extension_Undocancel_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Controller_Action{
public function undocancelAction()
{
    $id = $this->getRequest()->getParam('order_id');
    $order = Mage::getModel('sales/order')->load($id);
    $items = $order->getItemsCollection();
    try {
        foreach($items as $item) {
            $canceled = $item->getQtyCanceled();
            if($canceled>0) {

                $productUpdates[$item->getProductId()] = array('qty' => $canceled);
                $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($item->getProductId());

                    if (((int)$stockItem->getQty() - (int)$canceled) <= (int)$stockItem->getMinQty()) {
                        $stockItem->setIsInStock(false)
                            ->setStockStatusChangedAutomaticallyFlag(true);
                    }
                    $stockItem->save();
            }
            $item->setData('qty_canceled',0);
        }
            Mage::getSingleton('cataloginventory/stock')->registerProductsSale($productUpdates);
            $items->save();
        $order->setBaseDiscountCanceled(0)
            ->setBaseShippingCanceled(0)
            ->setBaseSubtotalCanceled(0)
            ->setBaseTaxCanceled(0)
            ->setBaseTotalCanceled(0)
            ->setDiscountCanceled(0)
            ->setShippingCanceled(0)
            ->setSubtotalCanceled(0)
            ->setTaxCanceled(0)
            ->setTotalCanceled(0);
        $state = 'processing';
        $status = 'processing';
        $order->setStatus($status)
            ->setState($state)
            ->save();
        $this->_getSession()->addSuccess($this->__('Order was successfully uncancelled.'));
    }
    catch (Mage_Core_Exception $e) {
        $this->_getSession()->addError($e->getMessage());
    }
    catch (Exception $e) {
        $this->_getSession()->addError($this->__('Order was not uncancelled.'));
    }

    $this->_redirect('*/sales_order/view', array('order_id' => $order->getId()));
}

}

 2
Author: ganesh, 2013-07-29 12:25:49