注文中に在庫の減少を停止する必要があります。このアクティビティは、支払いが成功した後にのみ実行する必要があります。
5 に答える
はい、この数量の減少を実用的に無効にすることができます
どのように ?
Mage_Checkout_Model_Type_Onepageを拡張し、 saveOrderメソッドを書き直します
変更点
上記の方法で次の行の前に、#740から#742あたりになります
$service = Mage::getModel('sales/service_quote', $this->getQuote());
$service->submitAll();
追加
$quote = $this->getQuote();
# Ref: Mage_CatalogInventory_Model_Observer::subtractQuoteInventory
$quote->setInventoryProcessed(true);
これにより、見積もりの在庫を処理しないことがMagentoに通知されるため、処理するように構成されている場合でも、数量が減少することはありません。
システム>構成>カタログ>在庫>ストックオプション
注文時に在庫を減らす>いいえ
注文時の減算に関する詳細情報を知りたい場合は、Magento EE/CEの両方でこのイベントを調べる必要があります。
sales_model_service_quote_submit_before
この方法で行う必要がある特別な理由がない限り、管理者の在庫管理を無効にすることができますか?
支払いが成功した後、数量に追加するオブザーバーを設定できます。フックできるMagentoイベントのリストについては、http ://www.nicksays.co.uk/magento_events_cheat_sheet/を確認してください。
<events>
<sales_order_payment_pay>
<observers>
<my_observer>
<type>singleton</type>
<class>my/observer</class>
<method>addQty</method>
</my_observer>
</observers>
</sales_order_payment_pay>
</events>
そして、オブザーバーは数量を追加し直します。
<?php
class Company_My_Model_Observer
{
public function addQty($event)
{
$order = $event->getInvoice()->getOrder(); // Mage_Sales_Model_Order
$items = $order->getAllVisibleItems();
foreach($items as $item) {
$qty = $item->getQtyOrdered(); // Amount to add back on
$product = Mage::getModel('catalog/product')->load($item->getProductId());
/**
* Here you would load the product and add this amount back on
*/
}
return $this;
}
}
それはおそらくそのままでは機能しませんが、あなたはその考えを理解します。異なる支払いモジュールはこれらのイベントをわずかに異なる方法で処理できるため、magentoおよび支払いタイプのイベントに注意する必要があります。
場合によっては、次を使用できます。
config.xml
<frontend>
<routers>
<sales_model_service_quote_submit_after>
<observers>
<inventory>
<type>singleton</type>
<class>Vendor_Name_Model_Observer</class>
<method>revertQuoteInventory</method>
</inventory>
</observers>
</sales_model_service_quote_submit_after>
</events>
</frontend>
Observer.php
public function revertQuoteInventory(Varien_Event_Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$inventory = Mage::getModel('cataloginventory/observer');
$inventory->revertQuoteInventory($observer);
$inventory->reindexQuoteInventory($observer);
$quote->setInventoryProcessed(true);
}