2012-08-15 209 views
3

我使用這個代碼,以創建在Magento發票:Magento:創建發票號碼=訂單號的發票?

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

這會自動分配一個編號(increment_id)到發票,例如100016050.我想創建發票其中的發票increment_id =訂單的increment_id。

如何做到這一點?

謝謝!

回答

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

這可能導致間隙,例如, 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後,您可以搜索invoice以確定是否存在具有該order.increment_idinvoice

如果它尚不存在,則可以在離開觀察者之前將order.increment_id的值指定爲invoice.increment_id並完成。

請注意,這些只是基礎知識。它還有一些缺陷。

例如,每個訂單案例的多個和/或重複發票尚未處理。

例如,在一些國家,財政/稅務部門要求發票號碼不斷增加。它必須是1, 2, 3, 4, 5,但1, 2, 3, 4 is missing, 5是不可接受的。使用上述技術,這種差距仍然可能發生,因爲用戶付款取消等。

但是,這應該讓你走上正軌。