Magento + Phoenix Cash On Delivery + 自动发票 == 发票合计错误

Magento + Phoenix Cash On Delivery + automatic invoices == Invoice totals wrong

我是 运行 Magento 1.8.1.0(已修补 SUPEE-5344、SUPEE-1533、SUPEE-5994、SUPEE-6285)在 LAMP 堆栈环境中。 我已经安装了 Phoenix COD extension (v. 1.0.8)。 在我的开发环境中 缓存被禁用.

我实现了一个模块,用于根据付款方式(COD、PayPal、信用卡等)自动创建发票。生成 COD 订单时,订单总计是正确的,但在发票的总计中,COD 费用没有出现

自动开票模块

这是我模块的 /etc/modules/ 文件:

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompany_Autoinvoice>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Sales />
                <Phoenix_CashOnDelivery />
            </depends>
        </MyCompany_Autoinvoice>
    </modules>
</config>

我在 sales_order_save_after 事件上创建了一个观察者函数

public function salesSaveAfter( $event ) {
    $order               = $event->getOrder();
    $payment_method_code = $order->getPayment()->getMethodInstance()->getCode();

    $is_Paypal = ( strpos( $payment_method_code, 'paypal' ) !== false ) ? true : false;
    $is_Xpay   = ( strpos( $payment_method_code, 'xpay' ) !== false ) ? true : false;
    $is_Cod    = ( strpos( $payment_method_code, 'cashondelivery' ) !== false ) ? true : false;

    if ( $order->canInvoice() && ( $is_Paypal || $is_Xpay || $is_Cod ) ) {
        $invoice = Mage::getModel( 'sales/service_order', $order )->prepareInvoice();
        if ( ! $invoice->getTotalQty() ) {
            Mage::throwException( $this->__( 'Cannot create an invoice without products.' ) );

            return;
        }

        $invoice->register();
        $transactionSave = Mage::getModel( 'core/resource_transaction' )
                               ->addObject( $invoice )
                               ->addObject( $invoice->getOrder() );
        $transactionSave->save();
    } else {
        return;
    }
}

更多笔记

你有没有看到我的模块依赖于Phoenix_CacheOnDelivery所以这个函数应该在任何观察者的函数之后被触发。

如果我手动生成发票,一切正常。

如果我以编程方式启动一个脚本来生成第二张发票(对于带有第一张发票但没有 COD 费用的订单),则仅使用 COD 费用生成发票:所以一切正常。

我自己找到了解决方案!

问题: Phoenix_CashOnDelivery 通过附加到订单中 sales_order_save_after 之后的事件 sales_order_payment_place_end 添加 COD 费用它们在发票生成时设置为 0。

解决方法:只需将事件改成监听sales_order_place_after即可。

另外,sales_order_save_after 被调用了很多次,所以代码被优化了!耶!

我希望这对外面的人有用。