So verwalten die Aktienverfügbarkeit (IN_Stock oder Outof_Stock) des Produkts mit rückgängiger Stornierung der Bestellung

magento.stackexchange https://magento.stackexchange.com/questions/6030

Frage

Ich versuche, eine stornierte Auftragsverlängerung von undo zu entwickeln. Dafür erweitere ich 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()));
    }

}

Es funktioniert gut, sogar die Produktaktien gemäß der abgebrochenen Menge aktualisieren, aber wenn die Produktmenge Null wird, zeigt sie noch auf Lager.

Wie kann ich die Verfügbarkeit von Aktien aktualisieren, wenn Qty Null wird?

War es hilfreich?

Lösung

Im Folgenden aktualisierte Code sortieren Sie die oben genannte Probleme. Ich hoffe, das wird jemandem helfen. (Wenn Sie Änderungen oder Fehler haben, kommentieren Sie bitte)

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()));
}

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top