2

私はMagento 1.7.0.2を使用しています。私は支払い方法として「代金引換」を使用しています。どの注文でも従う手順を正確に説明します。注文が行われると (数量が 1 アイテム減少)、顧客が注文の総額を支払った場合に、その商品の出荷を作成します。その注文の請求書​​を作成します。

私の問題、注文が行われた場合(数量が1アイテム減少)、この注文の出荷を作成します。顧客が支払いを拒否した場合、この注文を開いて「キャンセル」します。この場合、「数量」は増加しません。どうすれば増加させることができますか?

4

2 に答える 2

2

注文ステータスが処理中の場合

'order_cancel_before'のオブザーバーを使用してカスタムモジュールを作成します(例を参照@重複製品のMagentoのデフォルトステータスの変更<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-> beginProductQty()に置き換えます。

オブザーバーメソッド(擬似コード)

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

在庫の更新に問題がある場合は、Magento1.7で新製品を追加するときにデフォルトの製品値を設定するを参照してください。

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

注文ステータスが保留中の場合

[システム]>[構成]>[インベントリ]をご覧ください

注文がキャンセルされたときにアイテムのステータスを在庫に設定する—注文がキャンセルされた場合に、保留中の注文の商品が自動的に在庫に戻るかどうかを制御します。スコープ:ストアビュー。

続きを読む @

Magentoストアの在庫を管理する方法は?

管理者:[システム]→[構成]→[インベントリ]タブ

于 2012-11-11T11:05:20.033 に答える
1

RS に感謝します。

RS の返信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();
}
于 2012-11-12T13:07:06.740 に答える