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
被调用了很多次,所以代码被优化了!耶!
我希望这对外面的人有用。
我是 运行 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
被调用了很多次,所以代码被优化了!耶!
我希望这对外面的人有用。