Автоматическое выставление счетов в magento

Я создал новый пользовательский тип продукта, который расширяет виртуальный продукт в 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