Magento:如何创建一个发票,使发票编号等于订单编号?

4
我正在使用以下代码在Magento中创建发票:

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

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

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

如何实现呢?

谢谢!

1个回答

4
这需要编写完整的自定义模块,因此我将仅解释一些基础知识。
在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”的情况。使用上述技术,由于用户的付款取消等原因,仍可能出现此类差距。
但是,这应该可以让您走上正确的道路。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接