【问题标题】:Magento: Create an invoice with invoice number = order number?Magento:创建发票编号=订单号的发票?
【发布时间】: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

如何做到这一点?

谢谢!

【问题讨论】:

    标签: magento-1.4 invoice


    【解决方案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 是不可接受的。使用上述技术,由于用户取消付款等原因,仍然会出现这种差距。

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

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2023-03-12
      • 2021-12-26
      • 1970-01-01
      • 2011-05-13
      相关资源
      最近更新 更多