Magento:创建发票编号=订单号的发票?

Posted

技术标签:

【中文标题】Magento:创建发票编号=订单号的发票?【英文标题】:Magento: Create an invoice with invoice number = order number? 【发布时间】:2012-08-11 12:53:05 【问题描述】:

我正在使用此代码在 Magento 中创建发票:

$invoiceId = Mage::getModel('sales/order_invoice_api')->create($order->getIncrementId(), array());

这会自动为发票分配一个编号 (increment_id),例如 100016050。我想创建一个发票,其中 发票的 increment_id = 订单的 increment_id

如何做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

这需要编写一个完整的自定义模块,所以我只解释一些基础知识。

在 Magento 中,orderinvoicecreditmemoshipping 等实体每个 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

您的代码需要以使orderinvoice 保持同步的方式管理此差距。

为此,您可以为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 对象(以及 orderincrement_id)。

检索到order.increment_id 后,您可以搜索invoices 以查明带有order.increment_idinvoice 是否已经存在。

如果它还不存在,您可以在离开观察者之前将order.increment_id 的值分配给invoice.increment_id 并完成。

请注意,这些只是基础知识。还有一些陷阱。

例如,尚未处理每个订单的多张和/或重复发票。

例如,在某些国家/地区,财政/税务当局要求发票数量不断增加。必须是1, 2, 3, 4, 5,但1, 2, 3, 4 is missing, 5 是不可接受的。使用上述技术,由于用户取消付款等原因,仍然会出现这种差距。

但是,这应该会让你走上正轨。

【讨论】:

以上是关于Magento:创建发票编号=订单号的发票?的主要内容,如果未能解决你的问题,请参考以下文章

sql [magento]为订单,报价单,发票,货件或贷项通知单设置下一个increment_id

Magento 中的 Paypal 状态

如何创建带有发票的 Stripe 订单?

完成付款后停止 Magento 发送自动发票

如何在 Magento 中获取订单时间?

postgresql中的自定义自动增量字段(发票/订单号)