这需要编写一个完整的自定义模块,所以我只解释一些基础知识。
在 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 通常将每个实体加一,请参阅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 对象传递给这个观察者。这将允许您使用此 invoice 对象检索相关的 order 对象(以及 order 的 increment_id)。
检索到order.increment_id 后,您可以搜索invoices 以查明带有order.increment_id 的invoice 是否已经存在。
如果它还不存在,您可以在离开观察者之前将order.increment_id 的值分配给invoice.increment_id 并完成。
请注意,这些只是基础知识。还有一些陷阱。
例如,尚未处理每个订单的多张和/或重复发票。
例如,在某些国家/地区,财政/税务当局要求发票数量不断增加。必须是1, 2, 3, 4, 5,但1, 2, 3, 4 is missing, 5 是不可接受的。使用上述技术,由于用户取消付款等原因,仍然会出现这种差距。
但是,这应该会让你走上正轨。