Лучшим подходом к этому было бы зарегистрировать Наблюдателя на Событии, которое было выброшено в процессе сбора платежей, но, к сожалению, я не вижу слишком много релевантных. Вы могли бы попытаться 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)
, а не только к Paypal.
Удачи,
JD