我正在使用此代码在Magento中创建发票:
$invoiceId = Mage::getModel('sales/order_invoice_api')->create($order->getIncrementId(), array());
这会自动为发票分配一个数字(increment_id),例如100016050.我想创建一个发票,其中发票的increment_id =订单的increment_id 。
怎么办呢?
谢谢!
答案 0 :(得分:3)
这需要编写一个完整的自定义模块,所以我只是解释一些基础知识。
在Magento中,order
,invoice
,creditmemo
和shipping
等实体每个store_id
都有自己独立的数字组。
可以在表eav_entity_store
中定义这些数字组:
entity_store_id entity_type_id store_id increment_prefix increment_last_id
1 5 1 1 100000000
2 6 1 2 200000000
3 7 1 3 300000000
4 8 1 4 400000000
要知道哪个entity_type_id引用哪个实体,请检查您的eav_entity_type
表格:
entity_type_id entity_type_code entity_model
5 order sales/order
6 invoice sales/order_invoice
7 creditmemo sales/order_creditmemo
8 shipment sales/order_shipment
请注意,您的entity_type_id
可能(或可能不会)与此不同。
Magento通常会将每个实体增加1,请参阅eav_entity_type.increment_per_store
。
这种实体创建时会发生这种情况。但是,创建order
并不总是意味着,也会创建invoice
。例如,用户可以在下订单时取消付款,或者付款将不会由付款提供商授权,因此不会创建invoice
。
这可能导致间隙,例如order
已100000005
,而invoice
仍位于200000002
。
您的代码需要以保持order
和invoice
同步的方式管理此差距。
为此,您可以为sales_order_invoice_save_before
事件创建一个观察者,例如。
app/code/local/Mycompany/Mymodule/etc/config.xml
:
<config>
<modules>
<Mycompany_Mymodule>
<version>0.1.0</version>
</Mycompany_Mymodule>
</modules>
<global>
<models>
<mymodule>
<class>Mycompany_Mymodule_Model</class>
</mymodule>
</models>
<events>
<sales_order_invoice_save_before>
<observers>
<myobserver>
<type>singleton</type>
<class>mymodule/observer</class>
<method>salesOrderInvoiceSaveBefore</method>
</myobserver>
</observers>
</sales_order_invoice_save_before>
</events>
</global>
</config>
app/code/local/Mycompany/Mymodule/Model/Observer.php
:
class Mycompany_Mymodule_Model_Observer
{
/**
* Hook to observe `sales_order_invoice_save_before` event
*
* @param Varien_Event_Observer $oObserver
*/
public function salesOrderInvoiceSaveBefore($oObserver)
{
$oInvoice = $oObserver->getInvoice();
}
}
Magento在保存invoice
对象之前将invoice
对象传递给此观察者。这样您就可以使用此order
对象检索相关的order
对象(以及increment_id
的{{1}})。
检索到invoice
后,您可以搜索order.increment_id
以查看invoice
是否已存在invoice
。
如果它还不存在,您可以在离开观察者之前将order.increment_id
的值分配给order.increment_id
并完成。
请注意,这些只是基础知识。还有一些陷阱。
例如,尚未处理每个订单案例的多个和/或重复发票。
例如,在某些国家/地区,财政/税务机关要求发票号码不断增加。它必须是invoice.increment_id
,但1, 2, 3, 4, 5
是不可接受的。使用上述技术,由于用户取消支付等原因,这种差距仍然可能发生。
然而,这应该让你走上正轨。