สิ่งนี้จะต้องมีการเข้ารหัสโมดูลแบบกำหนดเองที่สมบูรณ์ ดังนั้นฉันจะอธิบายพื้นฐานบางอย่างเท่านั้น
ใน 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
หากต้องการทราบว่าเอนทิตี_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
รหัสของคุณจะต้องจัดการช่องว่างนี้ในลักษณะที่ทำให้ 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
ไปยังผู้สังเกตการณ์รายนี้ ก่อนที่วัตถุ invoice
จะถูกบันทึก สิ่งนี้จะช่วยให้คุณสามารถดึงข้อมูลวัตถุ order
ที่เกี่ยวข้อง (และดังนั้น order
's increment_id
) โดยใช้วัตถุ invoice
นี้
เมื่อดึงข้อมูล order.increment_id
แล้ว คุณสามารถค้นหา invoice
s เพื่อดูว่ามี invoice
ที่มี order.increment_id
นั้นอยู่แล้วหรือไม่
หากยังไม่มี คุณสามารถกำหนดค่า order.increment_id
เป็น invoice.increment_id
ก่อนออกจากผู้สังเกตและเป็นอันเสร็จสิ้น
โปรดทราบว่าสิ่งเหล่านี้เป็นเพียงพื้นฐานเท่านั้น มีข้อผิดพลาดเพิ่มเติมอยู่บ้าง
ตัวอย่างเช่น ใบแจ้งหนี้หลายรายการและ/หรือซ้ำกันต่อกรณีคำสั่งซื้อยังไม่ได้รับการจัดการ
ตัวอย่างเช่น ในบางประเทศ หน่วยงานด้านการเงิน/ภาษีกำหนดให้หมายเลขใบแจ้งหนี้ต้องเพิ่มขึ้นอย่างต่อเนื่อง ต้องเป็น 1, 2, 3, 4, 5
แต่ 1, 2, 3, 4 is missing, 5
ไม่เป็นที่ยอมรับ การใช้เทคนิคข้างต้น ช่องว่างดังกล่าวยังคงเกิดขึ้นได้ เนื่องจากผู้ใช้ยกเลิกการชำระเงิน ฯลฯ
อย่างไรก็ตาม สิ่งนี้จะทำให้คุณไปถูกทางแล้ว
person
Jürgen Thelen
schedule
15.08.2012