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