ลดหนี้ / คืนสินค้า
เมนูนี้ใช้สร้างใบลดหนี้จากใบแจ้งหนี้ โดยเลือกได้ทั้งการคืนสินค้าจริงและการลดหนี้ทางการเงินอย่างเดียว กฎข้อมูล สิทธิ และเงื่อนไขของ Mobile กับ POS Terminal เหมือนกัน ต่างกันเพียงรูปแบบหน้าจอ
จุดเริ่มต้น
| แอป | จุดเข้าใช้งาน |
|---|---|
| Mobile | CreditNoteList → CreditNoteDetail หรือกดทำใบคืนสินค้าจากใบแจ้งหนี้ |
| POS Terminal | เมนูแบบ split-pane creditNote หรือกด เปิดใบคืนสินค้า จากรายละเอียดใบแจ้งหนี้ |
รายการจะถูกจำกัดตาม branchId และ whGrpCode ที่เลือก รองรับค้นหา กรองสถานะ รีเฟรช และโหลดเพิ่ม โดยค่าเริ่มต้นเปิดตัวกรอง มีการคืนสินค้า ซึ่งส่ง isReturn=1; ปิดตัวกรองนี้เพื่อดูใบลดหนี้ทางการเงินอย่างเดียวด้วย
ขั้นตอนคืนสินค้าแบบครบถ้วน
- เปิดใบแจ้งหนี้และเริ่มแบบร่างใบคืนสินค้า ระบบคัดลอกข้อมูลใบแจ้งหนี้ ลูกค้า บริษัท คลัง พนักงานขาย และรายการสินค้าในใบแจ้งหนี้มาให้ ใบคืนสินค้าเดิมจะโหลดใบแจ้งหนี้ที่ผูกไว้ซ้ำ เพื่อให้ยังเลือกรายการต้นทางได้
- เลือก เหตุผล 1 ซึ่งจำเป็นก่อนเพิ่มรายการสินค้าและก่อนบันทึกเอกสาร
- เลือกรายการจากใบแจ้งหนี้ ระบบตั้งต้นจำนวน ราคา ยอดเงิน หน่วยนับ คลัง ภาษี และข้อมูลน้ำหนักจากรายการต้นทาง
- ระบุประเภทการคืน จำนวนคืน (
qtyCN) และยอดลดหนี้ (priceCN) ระบบไม่ยอมให้จำนวนคืนมากกว่าจำนวนในรายการต้นทาง หรือยอดลดหนี้มากกว่ายอดเงินของรายการต้นทาง - บันทึกรายการ หากเอกสารยังไม่มี ระบบจะสร้างเป็น
DRAFTก่อน จากนั้นจะรีเฟรชรายการและยอดรวม - หากเป็นการคืนสินค้าจริง (
isReturn = 1) ผู้มีสิทธิ์คลังเลือก Lot/Batch ที่เมนู ตำแหน่งวาง ตัวเลือก Lot มาจากGET /api/invoices/{invoiceId}?includeLot=trueในฟิลด์items[].lotsของรายการต้นทางโดยตรง ระบบจะไม่เรียก/api/products/lotและไม่ตรวจสต็อกคงเหลือปัจจุบัน - เมื่อเลือก Lot ระบบบันทึก
{ lotNo, qty: qtyCN }จำนวนที่บันทึกจึงยึดจำนวนคืนในใบลดหนี้ ไม่ได้ยึดจำนวนที่แสดงของ Lot ในใบแจ้งหนี้ หากมีหลายบรรทัดในใบแจ้งหนี้ที่ใช้รหัสสินค้าเดียวกัน ระบบรวมจำนวนตามเลข Lot เพื่อใช้แสดงตัวเลือกเท่านั้น - เพิ่มรูปหลักฐานหลังเอกสารถูกสร้างแล้ว เมื่อผู้ใช้ยังแก้ไขเอกสารได้ แล้วบันทึกหรือส่งต่อเอกสารตามสิทธิและสถานะด้านล่าง
- ก่อนส่ง B1 รายการที่คืนสินค้าจริงทุกรายการต้องมี Lot และต้องติ๊ก Q1/Q2/Q3 อย่างน้อยหนึ่งข้อ อุณหภูมิถูกเก็บเป็นข้อมูลเอกสาร แต่ฝั่งแอปไม่มีการตรวจช่วงอุณหภูมิเพิ่มเติม
กฎ Lot และจำนวนคืน
| กฎ | พฤติกรรมของแอป |
|---|---|
| แหล่งข้อมูล Lot | เรียกข้อมูลใบแจ้งหนี้ด้วย includeLot=true |
| ตัวเลือก Lot | ใช้ invoice.items[].lots; แสดง lotNo เป็น Batch พร้อมจำนวนในใบแจ้งหนี้ |
| การตรวจสต็อก | ไม่มีการตรวจสต็อกคงเหลือสำหรับ flow คืนสินค้านี้ จึงไม่บล็อกเพราะสต็อกปัจจุบันน้อยกว่า qtyCN |
| จำนวนที่ส่งเมื่อเลือก Lot | ส่งเท่ากับ qtyCN ของรายการใบลดหนี้เสมอ |
| คืนสินค้าจริง | isReturn = 1; ต้องเลือก Lot ก่อนส่ง B1 |
| ลดหนี้อย่างเดียว | isReturn = 0; ไม่ต้องเลือก Lot ก่อนส่ง B1 |
| ตรวจข้อมูลรายการต้นทาง | qtyCN ต้องไม่มากกว่า qty ต้นทาง และ priceCN ต้องไม่มากกว่า amount ต้นทาง |
| หลาย Lot | หน้าจอปัจจุบันเลือก Lot ได้หนึ่ง Lot ต่อหนึ่งรายการ และส่ง lots ที่มีหนึ่งรายการ |
สถานะและการบันทึก
สถานะที่แอปแสดง ได้แก่ DRAFT, NEW, WAITINGCN, INVUPDATE, RECEIVED, APPROVED/APPROVE, CANCELED และ ERRORRECEIVED
| ผู้ดำเนินการ / การทำงาน | ผลลัพธ์หรือเงื่อนไข |
|---|---|
| บันทึกเอกสารใหม่ครั้งแรก | สร้างสถานะ DRAFT |
| ผู้ที่ไม่ใช่ฝ่ายคลังบันทึกและมีรายการคืนสินค้า | เปลี่ยนเป็น WAITINGCN |
| ผู้ที่ไม่ใช่ฝ่ายคลังบันทึกและไม่มีรายการคืนสินค้า | เปลี่ยนเป็น NEW |
ฝ่ายคลังบันทึกจาก WAITINGCN | เปลี่ยนเป็น INVUPDATE |
ฝ่ายคลังบันทึกจาก INVUPDATE | คงเป็น INVUPDATE |
| ฝ่ายคลังบันทึกจากสถานะอื่น | ระบบบล็อกและแจ้งให้รอขั้นตอนคลัง |
| ส่ง B1 | เรียก B1 แล้วอัปเดตเป็น RECEIVED เมื่อสำเร็จ |
| เคยส่ง B1 แล้ว | ส่งซ้ำไม่ได้เมื่อมี datetimeToB1 |
RECEIVED | การแก้ไขต่าง ๆ เป็นแบบอ่านอย่างเดียวหรือถูกปิดใช้งาน |
สิทธิและเงื่อนไข
ค่าด้านล่างเป็น deptCode ทั้งหมด ส่วน user-code ที่ได้รับสิทธิ์ B1 เพิ่มเติมคือ 012142, 012570, 012544, 012051, 012566
| ความสามารถ | สิทธิและเงื่อนไข |
|---|---|
| เปิดเมนูลดหนี้/คืนสินค้า (Mobile/POS Terminal) | -2, 1, 2, 3, 4, 7, 8, 9, 12, 13, 16, 20, 21, 22, 23, 27, 28, 29 หรือ user-code ที่ตั้งค่า override ไว้สำหรับเมนู |
| สร้างจากรายการ Mobile | -2, 1, 2, 4, 7, 8, 9, 12, 16, 22, 28, 29 |
| บันทึกเอกสาร | 7, 8, 9, 12, 22, 28, 29 และสถานะต้องเป็น DRAFT, NEW, WAITINGCN หรือ INVUPDATE |
| เพิ่มรายการ | เอกสารไม่ใช่ RECEIVED และผู้ใช้ปัจจุบันเป็นเจ้าของเอกสาร |
| แก้จำนวนหรือยอดรายการ | เอกสารไม่ใช่ RECEIVED, ต้องเป็นเจ้าของเอกสาร และอยู่ใน 7, 12, 22, 28, 29 |
| ลบรายการ | เอกสารไม่ใช่ RECEIVED และผู้ใช้ปัจจุบันเป็นเจ้าของเอกสาร |
| เลือกตำแหน่งวาง/Lot | เอกสารไม่ใช่ RECEIVED และเป็นรายการคืนสินค้าจริง; แผนก 12, 22, 28 เลือกได้ทุกสาขา ส่วนแผนก 20, 23 เลือกได้เมื่อสาขาที่เลือกมี isMain = false เท่านั้น หรือเป็น user-code override ของ B1; ไม่บังคับว่าเป็นเจ้าของเอกสาร |
| ช่องตรวจรับของคลัง | 8, 9, 12, 22, 28, 29; Q1/Q2/Q3 และอุณหภูมิจะอ่านอย่างเดียวหลัง RECEIVED |
| เพิ่ม/ลบรูปหลักฐาน | เอกสารถูกสร้างแล้วและยังไม่ใช่ RECEIVED |
| ส่ง B1 | เอกสารถูกสร้างแล้ว, ยังไม่ใช่ RECEIVED, ผู้ใช้เป็น 8, 9, 12, 20, 22, 23, 28, 29 หรือ user-code override ของ B1, ไม่มี datetimeToB1, เลือก Lot ครบทุกรายการคืนสินค้า และมี Q1/Q2/Q3 อย่างน้อยหนึ่งข้อเมื่อมีการคืนสินค้าจริง |
| ลบเอกสารจากรายการ | ห้ามลบเมื่อเป็น RECEIVED, APPROVED หรือ APPROVE; นอกนั้นแผนกยกเลิก -2, 1, 2, 4, 12, 22, 28 ลบได้, สถานะ DRAFT/NEW เจ้าของลบได้, และสถานะ WAITINGCN/INVUPDATE ลบได้ ต้องยืนยันก่อนลบทุกครั้ง |
แผนที่ API
| การทำงาน | API / service |
|---|---|
| รายการใบลดหนี้ | GET /api/credit-notes ผ่าน getCreditNotes พร้อม scope สาขา/คลัง และตัวเลือก status, ค้นหา, isReturn |
| รายละเอียดใบลดหนี้ | GET /api/credit-notes/{creditNoteId} |
| ใบแจ้งหนี้ต้นทางและ Lot | GET /api/invoices/{invoiceId}?includeLot=true |
| สร้าง/แก้ไขหัวเอกสาร | POST/PUT /api/credit-notes |
| สร้าง/แก้ไข/ลบรายการ | /api/credit-notes/{creditNoteId}/items |
| บันทึก Lot ที่เลือก | PUT /api/credit-notes/{creditNoteId}/items/{itemId}/lots พร้อม lots: [{ lotNo, qty }] |
| รูปหลักฐาน | endpoint สำหรับอัปโหลด/ลบไฟล์ของใบลดหนี้ |
| B1 | endpoint ส่งใบลดหนี้เข้า B1 แล้วอัปเดตสถานะเป็น RECEIVED |
ความสอดคล้องของ Mobile และ POS Terminal
ทั้งสองแอปใช้ Lot จากใบแจ้งหนี้ การตรวจรายการต้นทาง การเปลี่ยนสถานะ เงื่อนไขส่ง B1 และสิทธิแผนก/user-code ชุดเดียวกัน Mobile ใช้หน้าจอแบบ stack และ modal ส่วน POS Terminal ใช้ CreditNoteDetailForm ใน split pane โดย POS Terminal เก็บ sourceInvoiceItems ไว้เมื่อเปิดใบคืนสินค้าเดิม เพื่อให้ตัวเลือก Lot ใช้ข้อมูลใบแจ้งหนี้เดียวกัน