Автоматическое выставление счетов в magento - PullRequest
4 голосов
/ 16 февраля 2011

Я создал новый тип продукта, который расширяет виртуальный продукт в magento. Теперь я хотел бы заблокировать автоматическое выставление счетов для онлайн-платежей, например. PayPal, когда заказ содержит хотя бы один пользовательский тип продукта. Все заказы с таким продуктом должны оплачиваться вручную. Как мне решить эту проблему?

1 Ответ

5 голосов
/ 17 февраля 2011

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

...