2011-02-16 63 views
4

我創建了新的自定義產品類型,它擴展了magento中的虛擬產品。現在我想阻止在線支付的自動發票,例如。貝寶當訂單至少包含一種自定義產品類型時。所有使用此類產品的訂單都必須手動開具發票。我應該如何解決這個問題?magento的自動發票

+1

是隻爲貝寶或其他付款嗎?發票由付款方式控制,而不是產品類型。 – 2011-02-17 02:04:05

回答

5

最好的辦法是在支付捕獲過程中註冊一個事件,但我沒有看到太多相關的遺憾。您可以嘗試sales_order_invoice_save_before來截取save(),但我並不熱衷於此,因爲它可能會使控制器混淆發票保存失敗的原因。

通過PayPal代碼查看,您將在Mage_Paypal_Model_Ipn::_processOrder()中看到成功調用$this->_registerPaymentCapture(),而這又調用$payment->registerCaptureNotification()

Mage_Sales_Model_Order_Payment::registerCaptureNotification($amount)創建新的發票(如果尚不存在且付款是訂單的全部金額)。它使用_isCaptureFinal($amount)方法來驗證這一點。

一種選擇是延長Mage_Sales_Model_Order_Payment與代碼線沿線的覆蓋_isCaptureFinal($amount)

foreach($this->getOrder()->getAllItems() as $oOrderItem){ 
    if($oOrderItem()->getProduct()->getTypeId() == 'your_custom_product_type'){ 
    return false; 
    } 
} 
return parent::_isCaptureFinal($amountToCapture); 

不要忘了父母最後調用!

你會做這一切的自定義模塊中(如果你想先從ModuleCreator),並插入以下到config.xml中

<global> 
    <models> 
     <modulename> 
      <class>Namespace_Modulename_Model</class> 
     </modulename> 
     <sales> 
      <rewrite> 
       <order_payment>Namespace_Modulename_Model_Order_Payment</order_payment> 
      </rewrite> 
     </sales> 
    </models> 

標準的聲明,你的資金交易搞亂在這裏,所以確保你徹底地測試它真的真的

請注意,這種方法將適用於所有支付方式,調用Mage_Sales_Model_Order_Payment::registerCaptureNotification($amount),而不只是貝寶。

好運,
JD