4

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

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

这会自动为发票分配一个数字(increment_id),例如 100016050。我想创建一个发票,其中 invoice_id的 increment_id = order 的 increment_id

怎么可能呢?

谢谢!

4

1 回答 1

4

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

在 Magento 中,像 , 和 每个实体都有order自己独立的数字组。invoicecreditmemoshippingstore_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

这发生在创建此类实体时。但是,创建 anorder并不总是意味着invoice也将创建一个 for 它。例如,用户可以在下订单时取消付款,否则付款将不会被付款提供商授权,因此不会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's increment_idinvoice

检索到 s 后,order.increment_id您可以搜索invoices 以确定是否存在invoicewith 。order.increment_id

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

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

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

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

但是,这应该让您走上正确的轨道。

于 2012-08-15T09:03:42.167 回答