4

このコードを使用して、Magento で請求書を作成しています。

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

これにより、100016050 などの番号 (increment_id) が請求書に自動的に割り当てられます

どうすればそれができますか?

ありがとう!

4

1 に答える 1

4

これには完全なカスタムモジュールのコーディングが必要になるため、いくつかの基本を説明します。

Magentoでは、、、などのエンティティには、orderそれぞれinvoice独自の独立した番号グループがあります。creditmemoshippingstore_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

これは、そのようなエンティティが作成されたときに発生します。ただし、anの作成は、order必ずしもそれのinvoiceforも作成されることを意味するわけではありません。たとえば、ユーザーが注文中に支払いをキャンセルしたり、支払いが支払いプロバイダーによって承認されなかったりするため、何invoiceも作成されません。

これにより、ギャップが発生する可能性order100000005あり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される前に、オブジェクトをこのオブザーバーに渡します。これにより、このオブジェクトを使用して関連オブジェクト(したがって's )をinvoice取得できます。orderorderincrement_idinvoice

を取得しorder.increment_idたら、を検索して、それがすでに存在するinvoiceかどうかを確認できます。invoiceorder.increment_id

まだ存在しない場合は、オブザーバーを離れる前ににの値order.increment_idを割り当てることができます。invoice.increment_id

これらは基本的なものにすぎないことに注意してください。それにはさらにいくつかの落とし穴があります。

たとえば、注文ケースごとに複数の請求書や重複する請求書はまだ処理されていません。

たとえば、一部の国では、財政/税務当局は請求書番号を継続的に増やすことを要求しています。でなければなりませんが1, 2, 3, 4, 51, 2, 3, 4 is missing, 5受け入れられません。上記の手法を使用すると、ユーザーによる支払いのキャンセルなどにより、このようなギャップが発生する可能性があります。

ただし、これで正しい方向に進むはずです。

于 2012-08-15T09:03:42.167 に答える