【问题标题】:Magento: Increase "Qty" upon cancel a shipped orderMagento:取消发货订单时增加“数量”
【发布时间】:2012-10-31 01:48:42
【问题描述】:

我使用的是 Magento 1.7.0.2。我使用“货到付款”作为我的付款方式。我会准确地告诉你我在任何订单上遵循的步骤。下订单时(数量减少 1 件),我为它创建一个装运,如果客户支付了订单总价。我为该订单创建发票。

我的问题,如果下订单(数量减少 1 件),我会为此订单创建一个发货。如果客户拒绝付款,我打开这个订单并“取消”它,在这种情况下,“数量”没有增加,所以我怎样才能让它增加?

【问题讨论】:

    标签: magento magento-1.7


    【解决方案1】:

    感谢 R.S,因为他对我的帮助越来越多。

    我按照 R.S 回复 https://stackoverflow.com/a/13330543/1794834 的所有说明进行操作,并且只更改了观察者代码。这是在 Magento 1.7.0.2 上与我一起使用的观察者代码。

    $curr_date = date('Y-m-d H:i:s');
    $order = $observer->getEvent()->getOrder();
    
    foreach ($order->getItemsCollection() as $item) 
    { 
        $productId  = $item->getProductId();
        $qty = (int)$item->getQtyOrdered();
        $product = Mage::getModel('catalog/product')->load($productId);
        $stock_obj = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
        $stockData = $stock_obj->getData();
        $product_qty_before = (int)$stock_obj->getQty();
        $product_qty_after = (int)($product_qty_before + $qty); 
        $stockData['qty'] = $product_qty_after;
        /*
         * it may be case that admin has enabled product add in stock, after product sold,
         * he set is_in_stock = 0 and if order cancelled then we need to update only qty not is_in_stock status.
         * make a note of it
         */
        if($product_qty_after != 0) {
            $stockData['is_in_stock'] = 1;
        }else{
            $stockData['is_in_stock'] = 0;
        }
    
        $productInfoData = $product->getData();
        $productInfoData['updated_at'] = $curr_date;
        $product->setData($productInfoData);
        $product->setStockData($stockData);
        $product->save();
    }
    

    【讨论】:

      【解决方案2】:

      如果订单状态为处理中

      为“order_cancel_before”创建一个带有观察者的自定义模块(参见示例@Change Magento default status for duplicated products更改<catalog_model_product_duplicate> to <order_cancel_before>

      因为<order_cancel_before> 没有在 app/code/core/Mage/Sales/Model/Order.php 中定义

      您可以覆盖/重写订单模型类,例如 http://phprelated.myworks.ro/how-to-override-rewrite-model-class-in-magento/

      在你的本地模块中做

      public function cancel()
      {
          if ($this->canCancel()) {
              Mage::dispatchEvent('order_cancel_before', array('order' => $this));
              $this->getPayment()->cancel();
              $this->registerCancellation();
      
              Mage::dispatchEvent('order_cancel_after', array('order' => $this));
          }
      
          return $this;
      }
      

      或者您可以在模型中创建一个新方法 increaseProductQty() 并将下面的代码复制到其中(这样您就不需要观察者了)。然后将 Mage::dispatchEvent('order_cancel_before'... 行替换为 $this->increaseProductQty()

      在你的观察者方法中(伪代码)

      $curr_date = date('Y-m-d H:i:s');
      $order = $observer->getEvent()->getOrder();
      
      foreach ($order->getItemsCollection() as $item) 
      { 
          $productId  = $item->getProductId();
          $qty = $item->getQty();
      
          // you need to check order status to make sure it processing
          //$order->getStatus() (assuming you are canceling entire order)
          //$order->getPayment();
      
          $product = Mage::getModel('catalog/product')->load($product_id);
          $stock_obj = Mage::getModel('cataloginventory/stock_item')->load($product_id);
          $stockData = $stock_obj->getData();
          $product_qty_before = (int)$stock_obj->getQty();
          $product_qty_after = (int)($product_qty_before + $qty); 
          $stockData['qty'] = $product_qty_after;
      
          $productInfoData = $product->getData();
          $productInfoData['updated_at'] = $curr_date;
          $product->setData($productInfoData);
          $product->setStockData($stockData);
          $product->save();
      }
      

      如果您在更新库存时遇到问题,请参阅Set default product values when adding new product in Magento 1.7

      参考http://pragneshkaria.com/programatically-change-products-quantity-after-order-cancelled-magento/

      如果订单状态为待处理

      看看系统>配置>库存

      在订单取消时将商品的状态设置为有库存 - 控制挂单中的产品是否在订单被取消时自动返回库存。范围:商店视图。

      阅读更多@

      How to Manage Magento Store Inventory?

      ADMIN: System → Configuration → Inventory Tab

      【讨论】:

      • 当订单处于待处理状态时,您的解决方案运行良好,但我的问题是取消处于处理状态的订单(当我发货时)
      • 非常感谢您,我会尝试您的代码,但我希望上述代码仅适用于“货到付款”付款方式。
      • 查看支付方式类型stackoverflow.com/questions/4669099/…
      • 真的很感谢您与我的努力。我还有一个问题请问如何检查订单状态以确保它正在处理
      • config.xml 中的方法名是什么??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2018-06-18
      相关资源
      最近更新 更多