这需要编写完整的自定义模块,因此我将仅解释一些基础知识。
在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
请注意,你的实体类型ID可能会有所不同。Magento通常会将每个实体递增一次,参见eav_entity_type.increment_per_store。这将在创建实体时发生。但是,创建订单并不总是意味着也会创建相应的发票。例如,用户可以在下订单时取消付款,或者支付提供者未能授权付款,因此将不会创建发票。这可能会导致间隙,例如,订单已经到了100000005,而发票仍然在200000002。你的代码需要以一种使订单和发票保持同步的方式来管理这个间隙。为此,你可以为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 会在保存发票之前将发票对象传递给此观察器。这将允许您使用此发票对象检索相关的订单对象(因此可以使用订单的增量 ID)。
检索到 order.increment_id 后,您可以搜索发票以查找是否已存在具有该 order.increment_id 的发票。
如果尚不存在,则可以在离开观察器之前将 order.increment_id 的值分配给 invoice.increment_id ,然后完成操作。
请注意,这些仅是基础知识。还有一些需要注意的细节。例如,尚未处理每个订单的多个/重复发票情况。例如,在某些国家/地区中,财务/税务机构要求发票号码必须连续递增。必须是1、2、3、4、5,但不接受“1、2、3、4缺失,5”的情况。使用上述技术,由于用户的付款取消等原因,仍可能出现此类差距。
但是,这应该可以让您走上正确的道路。