このコードを使用して、Magento で請求書を作成しています。
$invoiceId = Mage::getModel('sales/order_invoice_api')->create($order->getIncrementId(), array());
これにより、100016050 などの番号 (increment_id) が請求書に自動的に割り当てられます。
どうすればそれができますか?
ありがとう!
このコードを使用して、Magento で請求書を作成しています。
$invoiceId = Mage::getModel('sales/order_invoice_api')->create($order->getIncrementId(), array());
これにより、100016050 などの番号 (increment_id) が請求書に自動的に割り当てられます。
どうすればそれができますか?
ありがとう!
これには完全なカスタムモジュールのコーディングが必要になるため、いくつかの基本を説明します。
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
entity_type_id
あなたのはそれと異なるかもしれない(または変わらないかもしれない)ことに注意してください。
Magentoは通常、このエンティティを1つずつインクリメントします。を参照してくださいeav_entity_type.increment_per_store
。
これは、そのようなエンティティが作成されたときに発生します。ただし、anの作成は、order
必ずしもそれのinvoice
forも作成されることを意味するわけではありません。たとえば、ユーザーが注文中に支払いをキャンセルしたり、支払いが支払いプロバイダーによって承認されなかったりするため、何invoice
も作成されません。
これにより、ギャップが発生する可能性order
が100000005
あり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
取得できます。order
order
increment_id
invoice
を取得しorder.increment_id
たら、を検索して、それがすでに存在するinvoice
かどうかを確認できます。invoice
order.increment_id
まだ存在しない場合は、オブザーバーを離れる前ににの値order.increment_id
を割り当てることができます。invoice.increment_id
これらは基本的なものにすぎないことに注意してください。それにはさらにいくつかの落とし穴があります。
たとえば、注文ケースごとに複数の請求書や重複する請求書はまだ処理されていません。
たとえば、一部の国では、財政/税務当局は請求書番号を継続的に増やすことを要求しています。でなければなりませんが1, 2, 3, 4, 5
、1, 2, 3, 4 is missing, 5
受け入れられません。上記の手法を使用すると、ユーザーによる支払いのキャンセルなどにより、このようなギャップが発生する可能性があります。
ただし、これで正しい方向に進むはずです。