Magento:创建一张发票号码=订单号的发票?

时间:2012-08-15 07:49:13

标签: magento-1.4 invoice

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

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

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

怎么办呢?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

在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通常会将每个实体增加1,请参阅eav_entity_type.increment_per_store

这种实体创建时会发生这种情况。但是,创建order并不总是意味着,也会创建invoice。例如,用户可以在下订单时取消付款,或者付款将不会由付款提供商授权,因此不会创建invoice

这可能导致间隙,例如order100000005,而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对象传递给此观察者。这样您就可以使用此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是不可接受的。使用上述技术,由于用户取消支付等原因,这种差距仍然可能发生。

然而,这应该让你走上正轨。