Magento: สร้างใบแจ้งหนี้ที่มีหมายเลขใบแจ้งหนี้ = หมายเลขคำสั่งซื้อ?

ฉันใช้รหัสนี้เพื่อสร้างใบแจ้งหนี้ใน Magento:

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

ซึ่งจะกำหนดหมายเลข (increation_id) ให้กับใบแจ้งหนี้โดยอัตโนมัติ เช่น 100016050 ฉันต้องการสร้างใบแจ้งหนี้โดยที่ increation_id ของใบแจ้งหนี้ = increat_id ของคำสั่งซื้อ

จะทำแบบนั้นได้อย่างไร?

ขอบคุณ!


person user1540714    schedule 15.08.2012    source แหล่งที่มา


คำตอบ (1)


สิ่งนี้จะต้องมีการเข้ารหัสโมดูลแบบกำหนดเองที่สมบูรณ์ ดังนั้นฉันจะอธิบายพื้นฐานบางอย่างเท่านั้น

ใน 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 แล้ว คุณสามารถค้นหา invoices เพื่อดูว่ามี 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