Set document series based on posting date and other scenario (Credit Note, Invoice, Paymen, Receive)

By Default, ERPNext uses the current date for templating. :smiling_face_with_tear:

(โดยปกติ ERPNext ใช้วันที่ปัจจุบันในการสร้างชื่อซีรีส์)

Case: The User wants the year and month part of naming to be the same as the posting date.

• Let’s assume the Naming Template is IV-.YY.MM.-.####.

• If today’s date is 1/10/2024, and the user edits the posting date to 30/9/2024, ERPNext will use IV-2410-#### as the naming series.

แก้ไขปัญหานี้ได้โดยใช้สคริปต์ client ง่ายๆ เพื่อจัดการการตั้งค่าซีรีส์

frappe.ui.form.on('Sales Invoice', {
    validate(frm) {
        //check for isCN
        if(frm.doc.is_return == 1){
            frm.doc.naming_series = "";        
            let year = frm.doc.posting_date.slice(2,4);
            let month = frm.doc.posting_date.slice(5,7);
            frm.doc.naming_series += "CN-" + year + month + "-.####";    
        }else{
            frm.doc.naming_series = "";        
            let year = frm.doc.posting_date.slice(2,4);
            let month = frm.doc.posting_date.slice(5,7);
            frm.doc.naming_series += "IV-" + year + month + "-.####";    
        }
    }
});

Case: The user needs to differentiate the naming series for different payment types (REC, PAY, INTERNAL).

กรณี: ผู้ใช้ต้องการแยกแยะซีรีส์ของการชำระเงิน (REC, PAY, INTERNAL)

frappe.ui.form.on('Payment Entry', {
    validate(frm) {
        let postingDate = new Date(frm.doc.posting_date);
        
        if(frm.doc.payment_type == "Internal Transfer"){
            frm.doc.naming_series = "";        
            let year = frm.doc.posting_date.slice(2,4);
            let month = frm.doc.posting_date.slice(5,7);
            frm.doc.naming_series += "INTERNAL-" + year + month + "-.####";    
        }
        if(frm.doc.payment_type == "PAY"){
            frm.doc.naming_series = "";        
            let year = frm.doc.posting_date.slice(2,4);
            let month = frm.doc.posting_date.slice(5,7);
            frm.doc.naming_series += "PAY-" + year + month + "-.####";    
        }
        if(frm.doc.payment_type == "Receive"){
            frm.doc.naming_series = "";        
            let year = frm.doc.posting_date.slice(2,4);
            let month = frm.doc.posting_date.slice(5,7);
            frm.doc.naming_series += "REC-" + year + month + "-.####";    
        }
    }
});

Pro:

  • Easy to implement (ง่ายต่อการใช้งาน)

Con:

  • If the user forgets to modify the posting date before saving it as a draft, the naming series will be incorrect, and editing the naming series after saving it as a draft is not allowed. The user must delete the draft and recreate the document.
    (หากผู้ใช้ลืมแก้ไขวันที่โพสต์ก่อนบันทึกเป็นฉบับร่าง ชื่อซีรีส์จะไม่ถูกต้อง และไม่สามารถแก้ไขซีรีส์หลังบันทึกเป็นฉบับร่างได้ ผู้ใช้จำเป็นต้องลบฉบับร่างและสร้างเอกสารใหม่อีกครั้ง)

You can set customize naming series, check Documentation
https://frappeframework.com/docs/user/en/basics/doctypes/naming#by-controller-method

2 Likes

ครับ นี่เป็นปัญหาโลกแตกของ Frappe เพราะระบบนี้เค้า name document ตอน insert เสมอ (ทำให้การแก้ date หลัง insert มีประเด็น)

ส่วนตัวมีแนวทางประมาณนึง แต่ก็ไม่น่าในว่าดีที่สุดหรือไม่

แยกเป็น 2 เรื่องครับ

เรื่องแรก ถ้าเป็นเรื่อง dynamic naming การใช้ Document Naming Rule สะดวกดีแต่ หรือไม่ก็ใช้ autoname ก็ได้ (ส่วนตัวจะไม่ใช้ client script เพราะจะมีปํญหาหากสร้างด้าวย API)

ส่วนเรื่องใช้เลขที่ตามวัน posting date ซึ่งควรจะสร้างตอน submit เอกสาร ไม่ใช้ insert เรื่องนี้ต้องทำใจแล้วสร้าง custom field “name2” และรันเลขที่นี่ตอน submit เอกสาร แล้วใช้เลขนี้ในการอ้างอง (as title)

Note:

  • นี่เป็นเหตุผลนึงที่ thai_tax สร้างเอกสาร Tax Invoice แยกมาตอน submit เอกสารหลัก (Sales Invoice) โดยใช้เลขที่ของ Tax Invoice ออกรายงานภาษีโดยไม่ให้ความสำคัญกับเลขที่ของ Sales Invoice ใช้แค่ไว้อ้างถึง
  • จริงๆอยากให้ Frappe แก้ไขเรื่องนี้เหมือนกัน เห็นมีคนเรียกร้องบ่อยๆ แต่เค้าคงไม่แก้แล้วมั้ง เพราะมันคง break core process มากไป
1 Like

For dynamic naming, Document Naming Rule here is the answer. But for naming only after submit, I think Frappe still don’t have a proper solution.