จอยกเลิก/อนุมัติเอกสาร (เมนู "ยกเลิก…" 61 เมนู และ "อนุมัติ…" 5 เมนู)
จอเดียว (UniversalCancelConfirmScreen) ใช้ทำ 2 หน้าที่ตามพารามิเตอร์ mode: cancel = ยกเลิกเอกสารที่บันทึกแล้ว และ approve = อนุมัติ/ไม่อนุมัติเอกสาร จอนี้ ไม่ได้แก้เอกสารเดิม แต่สั่ง backend สร้าง "เอกสารยกเลิก/อนุมัติ" ใบใหม่ที่อ้างถึงใบเดิมผ่าน doc_ref (ตรรกะฝั่ง Go ดู ยกเลิกและอนุมัติเอกสาร (Document cancel / approve) และ สถานะยกเลิก/อนุมัติเอกสาร (last_status / approve_status / cancel flag); ภาพรวมการยกเลิก/แก้ย้อนหลังดู แก้ไข ลบ ยกเลิกเอกสาร และผลย้อนกลับ (Edit, Delete, Cancel & Reversal)) ส่วนจอบันทึกเอกสารปกติคือ จอบันทึกเอกสารธุรกรรม มุมมองผู้ใช้ (UniversalTransScreen)
วิธีเปิด
เมนูที่ getTransMenuConfig ระบุ mode: "cancel" หรือ "approve" (transMenuMap.ts; สัดส่วนจริง 61 ยกเลิก + 5 อนุมัติ) UniversalTransScreen เห็น mode นี้แล้วคืนจอนี้แทนจอบันทึกเอกสารทันที (UniversalTransScreen.tsx:461-480) กลไกเมนูดู ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu)
| กลุ่ม | รหัสเมนู : flag ของใบยกเลิก/อนุมัติ |
|---|---|
| สต็อก (ยกเลิก) | 2071:61 รับสินค้าสำเร็จรูป, 2072:123 ขอเบิก, 2073:57 ใบเบิก, 2074:59 รับคืน, 2075:73 โอน, 2076:67 / 2077:69 ปรับปรุงสต๊อก |
| จัดซื้อ (อนุมัติ) | 3002:4 ใบเสนอซื้อ, 3004:8 ใบสั่งซื้อ |
| จัดซื้อ (ยกเลิก) | 3020:3 ใบเสนอซื้อ, 3021:7 ใบสั่งซื้อ, 3022:150 / 3023:161 / 3024:151 / 3025:152 จ่ายล่วงหน้า-มัดจำและรับคืน, 3026:13 ซื้อ/ตั้งหนี้, 3027:17 ลดหนี้, 3028:15 เพิ่มหนี้, 3029-3033 (flag 330, 331, 335, 336, 337) รับสินค้า/ตั้งหนี้/เพิ่ม-ลดหนี้จากการรับสินค้าตามใบสั่งซื้อ (คีย์เมนู purchase_partial) |
| ขาย (อนุมัติ) | 4002:32 ใบเสนอราคา, 4004:38 ใบสั่งจอง, 4006:52 ใบสั่งขาย |
| ขาย (ยกเลิก) | 4018:31 ใบเสนอราคา, 4019:39 ใบสั่งจอง, 4020:37 ใบสั่งขาย, 4021:41 / 4023:111 รับเงินล่วงหน้า-มัดจำ, 4022:43 / 4024:113 คืนเงิน, 4025:45 ขาย, 4026:49 รับคืน/ลดหนี้, 4027:47 เพิ่มหนี้ |
| เจ้าหนี้ (ยกเลิก) | 5016:88 ตั้งหนี้อื่น, 5017:90 เพิ่มหนี้อื่น, 5018:92 ลดหนี้อื่น, 5019:214 ใบรับวางบิล, 5020:23 จ่ายชำระหนี้ |
| ลูกหนี้ (ยกเลิก) | 6021:100 ตั้งหนี้อื่น, 6022:102 เพิ่มหนี้อื่น, 6023:104 ลดหนี้อื่น, 6024:236 ใบวางบิล, 6025:240 ชำระหนี้/ใบเสร็จ |
| เงินสด/ธนาคาร/เช็ค (ยกเลิก) | 7033:303 / 7034:302 เงินสดย่อย, 7035-7040 (flag 251, 255, 253, 261, 265, 263) รายได้/ค่าใช้จ่ายอื่น, 7041:403 ฝาก, 7042:404 ถอน, 7043:423 โอนเงิน, 7045-7049 (flag 430-433, 436) เช็ครับ, 7050-7053 (flag 471, 473, 472, 476) เช็คจ่าย |
เอกสารต้นทางที่จอเลือกมาจาก origFlag ของเมนู (เช่น เมนู 3021 ยกเลิกใบสั่งซื้อ: ต้นทาง flag 6 ใบยกเลิก flag 7) รายการเมนูทั้งหมดอยู่ที่ สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต) ส่วนความหมายของแต่ละเอกสารดูโน้ต doc-* ที่ตรงกัน
โครงจอ
แบ่งซ้าย/ขวาด้วย ResizableSplit (ความกว้างเริ่ม 520 px, ขวาอย่างน้อย 600 px, จำตำแหน่งในคีย์ sml_trans_split ตัวเดียวกับจอบันทึกเอกสาร)
- ซ้าย: รายการเอกสารต้นทาง ใช้บานรายการกลางเดียวกับจอบันทึกเอกสาร (จอบันทึกเอกสารธุรกรรม มุมมองผู้ใช้ (UniversalTransScreen)) ค้นด้วยเลขที่เอกสาร/รหัสคู่ค้า/หมายเหตุ ตัวกรองวันที่เริ่มต้น 3 เดือนย้อนหลังถึงวันนี้ ดึงสูงสุด 200 แถว เรียงใหม่ไปเก่า (
:226-265) คอลัมน์สถานะ: โหมดยกเลิก "ปกติ" / "ยกเลิกแล้ว"; โหมดอนุมัติ "รออนุมัติ" / "อนุมัติแล้ว" / "ไม่อนุมัติ" คลิกแถวหรือดับเบิลคลิกแถว = เลือกเอกสาร (ไม่มีโหมดแก้ไข) - ขวา: แถบสถานะบน (ข้อความผลลัพธ์ + ป้ายเหลือง "โหมดยกเลิกเอกสาร" / "โหมดอนุมัติเอกสาร"), แถบปุ่ม, ฟอร์มหัวเอกสาร (อ่านอย่างเดียวเกือบทั้งหมด) แล้วตามด้วยตาราง/แท็บตามชนิดเอกสาร
ปุ่มและคีย์ลัด
| ปุ่ม | เงื่อนไข / ทำอะไร |
|---|---|
| บันทึกยกเลิก / บันทึกอนุมัติ / บันทึกไม่อนุมัติ | มีเมื่อเอกสารที่เลือกยังทำรายการได้ (canCreate: ยกเลิก = last_status = 0; อนุมัติ = last_status = 0 และยังไม่เคยอนุมัติ/ไม่อนุมัติ) ใช้ได้เมื่อผู้ใช้มีสิทธิ์เพิ่มหรือแก้ไข (canAct) ดู การตรวจสิทธิ์เมนูของ route process (Process route rights); ปุ่มอนุมัติเป็นสีเขียว ปุ่มยกเลิก/ไม่อนุมัติเป็นสีแดง |
| ดึงรายการ | เฉพาะการยกเลิกใบเสนอซื้อ/ใบสั่งซื้อ/ใบเสนอราคา/ใบสั่งจอง/ใบสั่งขาย (flag 3, 7, 31, 37, 39) ใช้ได้เมื่อเลือก "ยกเลิกรายสินค้า" |
| คืนสถานะเอกสารปกติ (โหมดยกเลิก) / ยกเลิกการอนุมัติ (โหมดอนุมัติ) | มีเมื่อเอกสารถูกยกเลิก/อนุมัติแล้ว (canUndo) และไม่ใช่เอกสารกลุ่มยกเลิกรายสินค้า สั่ง backend ลบใบยกเลิก/อนุมัติ (undo: true) |
| เลือกเอกสาร | เปิดหน้าต่างเลือกเอกสารต้นทาง (ดูหัวข้อด้านล่าง) |
| Document Flow | เปิด DocumentFlowModal ดูสายเอกสารที่เกี่ยวข้องของใบที่เลือก คลิกเอกสารในจอเดียวกันจะเลือกให้ ดู ป๊อปอัปเอกสารและรายการสินค้า (ChequePickerModal / DocumentFlowModal / ItemNameModal / ItemRemarkModal / ItemGridContextMenu) และ สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering) |
| ปิดหน้าจอ | มีเมื่อจอเปิดเป็นแท็บ (มี onClose) ดู พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace) |
คีย์ลัดมีแค่ Ctrl+S (หรือ Cmd+S) = บันทึกยกเลิก/อนุมัติ เมื่อแท็บนี้เป็นแท็บที่เห็นอยู่และ canCreate (:562-573) คอมเมนต์ในโค้ดเขียนว่า "F12" แต่ที่ผูกจริงคือ Ctrl+S ไม่มี Esc
หัวเอกสาร (อ่านอย่างเดียว ยกเว้นวันที่/หมายเหตุ/ตัวเลือก)
ข้อมูลหัวมาจากเอกสารต้นทาง (SQL อ่านตรง ic_trans/ap_ar_trans/cb_trans ตาม kind, :279-370) ส่วนช่อง "เลขที่เอกสาร" "รหัสเอกสาร" "เวลา" เป็นของใบยกเลิก/อนุมัติ: ถ้ายังไม่มีใบ จะแสดง "สร้างอัตโนมัติเมื่อบันทึก" และเลขรันที่ backend (จากรูปแบบเอกสาร erp_doc_format ดู กำหนดรูปแบบเลขที่เอกสาร (DocFormatScreen)) ช่องที่ใช้ได้:
- วันที่ (วันที่ของใบยกเลิก/อนุมัติ ค่าเริ่มต้น = วันนี้ แก้ได้เมื่อยังทำรายการได้) และ เวลา (อ่านอย่างเดียว)
- ช่องคู่ค้า: "รหัส/ชื่อเจ้าหนี้", "รหัส/ชื่อลูกหนี้" หรือ "รหัสคู่ค้า/ชื่อคู่ค้า" ตาม
partyType(อ่านอย่างเดียว) - ช่องอ้างอิงเอกสารต้นทาง (ป้ายต่างกันตามชนิด เช่น "เลขที่ใบเสนอซื้อ", "เลขที่ใบสั่งซื้อ", "ใบเพิ่มหนี้", "ใบรับวางบิล", "เลขที่ใบรับชำระหนี้" ตาราง
REF_LABELS:128-144) พร้อมปุ่มแว่น "ค้นหาเอกสาร" และ "เอกสารอ้างอิงวันที่" - ประเภทรายการ, ประเภทภาษี, ผู้ขออนุมัติ, ผู้อนุมัติ/ผู้ยกเลิก — โชว์เฉพาะหัวของใบเสนอซื้อ/ใบสั่งซื้อ (flag 3, 4, 7, 8) ตาม
HEAD_ROWS; ผู้อนุมัติ/ผู้ยกเลิก (ค่าเริ่มต้นเป็นรหัสผู้ใช้ที่ล็อกอินอยู่ ถ้ายังไม่มีใบ), มูลค่าสุทธิ (เฉพาะเอกสารเงินล่วงหน้า/มัดจำ flag 150, 151, 152, 161) - ไม่อนุมัติ (ช่องติ๊ก) มีเฉพาะหัวของ flag 4 (อนุมัติใบเสนอซื้อ) และ 8 (อนุมัติใบสั่งซื้อ) ตาม
HEAD_ROWSอนุมัติ flag 32, 38, 52 ไม่มีช่องนี้ จึงเลือก "ไม่อนุมัติ" ไม่ได้ในจอ (ตั้งแต่เปิดจอค่าคือไม่ติ๊ก) - ประเภทการยกเลิก (ปุ่มวิทยุ "ยกเลิกทั้งหมด" / "ยกเลิกรายสินค้า") เฉพาะ flag 3, 7, 31, 37, 39 ปิดใช้งานเมื่อเอกสารถูกยกเลิกไปแล้ว
- หมายเหตุ: ตอนยังทำรายการได้เป็นช่องพิมพ์ (ตัวอย่างในช่อง "ระบุเหตุผลการยกเลิก" หรือ "ระบุหมายเหตุการอนุมัติ") หลังทำแล้วเปลี่ยนเป็นแสดงหมายเหตุของใบที่บันทึก
หัวเอกสารแต่ละ flag จัดแถว/คอลัมน์ต่างกันตามตาราง HEAD_ROWS (flag 8 ใช้แบบ 4 คอลัมน์) ส่วน flag ที่ไม่ได้ระบุใช้แถวมาตรฐาน (วันที่/เวลา, คู่ค้า, เลขที่/รหัสเอกสาร, อ้างอิง, หมายเหตุ)
ตารางสินค้าและแท็บ
เฉพาะเอกสารกลุ่ม ic_trans (:273-276)
- มีตารางและแท็บ "รายละเอียด" / "เพิ่มเติม": flag 3, 4, 7, 8, 31, 32, 37, 38, 39, 52 แท็บรายละเอียดคือตารางสินค้า (
TransItemGrid) + แผงสรุปยอด (TransBottomPanel) แท็บเพิ่มเติมคือTransExtraTabsแบบอ่านอย่างเดียว ดูรายละเอียดช่องที่ หัวเอกสาร แผงล่าง และแท็บเสริมของจอเอกสาร (TransTopForm / TransBottomPanel / TransExtraTabs) - มีตารางอย่างเดียว: flag 57, 59, 61, 67, 69, 73, 123 (กลุ่มสต็อก)
- ไม่มีตาราง (เห็นแค่หัว): ที่เหลือ เช่น ใบเงินล่วงหน้า/มัดจำ ลูกหนี้-เจ้าหนี้อื่น เช็ค เงินสดย่อย
ตารางใช้
TransItemGridตัวเดียวกับจอบันทึก (ตารางรายการสินค้า/จำนวนเงินในเอกสาร (TransItemGrid)) แต่เปิดเป็นโหมดอ่านอย่างเดียว ยกเว้นคอลัมน์ที่จอสั่งให้แก้ได้ในสองกรณีด้านล่าง ยอดรวมในแผงล่างแสดงตามเอกสารต้นทาง หรือคำนวณใหม่จากบรรทัดในตารางด้วยสูตรเดียวกับ backend (เงินเป็นสตริงทศนิยม ดู ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts))
กรณี 1: ยกเลิกรายสินค้า (flag 3, 7, 31, 37, 39)
- เลือกเอกสารต้นทาง (ใบเสนอซื้อ/สั่งซื้อ/เสนอราคา/สั่งจอง/สั่งขาย) แล้วเลือก "ยกเลิกรายสินค้า" ตารางว่างเปล่า
- กด ดึงรายการ: โหลดบรรทัดที่ ยังมียอดคงเหลือ (จำนวนในใบสั่ง ลบจำนวนที่ถูกใช้ไปแล้วในเอกสารปลายทาง, หน่วยแปลงด้วย stand/divide) โดยกำหนดว่าเอกสารปลายทางใดนับเป็น "ใช้แล้ว" ตาม
PULL_BALANCE(:100-107): ใบเสนอซื้อ (flag 2) นับ 3 และ 6; ใบสั่งซื้อ (6) นับ 7, 12, 310; ใบเสนอราคา (30) นับ 31, 34, 36, 44; ใบสั่งจอง (34) นับ 39, 36, 44; ใบสั่งขาย (36) นับ 37, 44 ถ้าไม่มีรายการคงเหลือขึ้นข้อความ "ใบนี้ไม่มีรายการคงเหลือให้ยกเลิก" - คอลัมน์จำนวนเปลี่ยนป้ายเป็น จำนวนยกเลิก ตั้งต้นเท่ากับยอดคงเหลือ แก้ได้ (ใส่ 0 = ไม่ยกเลิกบรรทัดนั้น) ระบบส่งเฉพาะบรรทัดที่จำนวนยกเลิกมากกว่า 0 ถ้าไม่มีสักบรรทัดขึ้นข้อความ "ยังไม่มีรายการยกเลิก: กด ดึงรายการ แล้วใส่จำนวนยกเลิก"
- กด บันทึกยกเลิก: ส่ง
cancelType: 2+linesใบที่บันทึกมีcancel_type = 2ใบสั่งหนึ่งใบมีใบยกเลิกได้หลายใบ (จอลิสต์เป็นรายการ ข้อ 5) - ใต้หัวมีกล่อง ใบยกเลิกของเอกสารนี้ ลิสต์ทุกใบ (เลขที่, วันที่, "ยกเลิกทั้งหมด"/"ยกเลิกรายสินค้า", หมายเหตุ) พร้อมปุ่ม คืนสถานะ ต่อใบ (ลบใบนั้นด้วย
cancelDocNo) แทนปุ่มคืนสถานะบนแถบเครื่องมือ
กรณี 2: อนุมัติใบเสนอซื้อ (flag 4)
- ตารางแก้ได้ 3 คอลัมน์: จำนวนอนุมัติ, ราคาอนุมัติ, ส่วนลด และโชว์ค่าที่ขอเดิม (
showRequested) ค่าเริ่มต้นเท่ากับที่ขอ มูลค่าบรรทัด/ยอดรวมคำนวณใหม่ทันทีที่แก้ (ส่วนลดแบบ "5%" หรือจำนวนเงิน) (:755-769) - ส่งเฉพาะบรรทัดที่ค่าต่างจากที่ขอ (
approveLines) ติ๊ก "ไม่อนุมัติ" แล้วตารางล็อกและไม่ส่งการแก้ไข - เมื่ออนุมัติแล้ว ตารางแสดงค่าที่อนุมัติจากใบอนุมัติที่บันทึกไว้ โดยเก็บค่าที่ขอเดิมไว้ในคอลัมน์
temp_float_1/2และtemp_string_1ของบรรทัดอนุมัติ (:344-350) - อนุมัติใบเสนอราคา (30) ไม่คำนวณ
approve_statusของใบเอง แต่อ่านสถานะจากใบอนุมัติ flag 32 ที่อ้างถึงใบนั้น (ไม่อนุมัติ = สถานะ 2) (:208-214)
หน้าต่างเลือกเอกสาร (เลือกเอกสาร / ปุ่มแว่นข้างช่องอ้างอิง)
เปิดรายการเอกสารต้นทาง (SmlLookupModal หัวข้อ "เลือก…" ตามป้ายอ้างอิง) คอลัมน์ เลขที่เอกสาร / วันที่ / รหัสคู่ค้า / ชื่อคู่ค้า / มูลค่าสุทธิ สูงสุด 500 รายการ เรียงใหม่ไปเก่า เฉพาะที่ ยังไม่ถูกยกเลิก (last_status = 0) และเพิ่มเงื่อนไข: ต้นทาง flag 2, 10, 11, 20, 25 ต้องยังไม่ถูกนำไปใช้ (used_status = 0), ใบสั่งซื้อ (6) ต้องมี doc_success = 0, โหมดอนุมัติ ต้องยังไม่เคยอนุมัติ/ไม่อนุมัติ (:575-591) คอมเมนต์ในโค้ดระบุว่าไม่กรองตามรหัสคู่ค้าที่หัวเหมือนโปรแกรมเดิม เพราะหัวตามเอกสารที่เลือก ดูกลไก lookup ที่ รายการข้อมูล ค้นหา lookup และ dialog กลาง (SmlDataList / SmlLookupModal / SmlDialog)
การบันทึก (API)
ทั้งยกเลิก อนุมัติ และคืนสถานะ เรียก setDocStatus → POST /api/process/doc/cancel หรือ /api/process/doc/approve (query-client.ts:801-821) ส่ง flag (ชนิดใบยกเลิก/อนุมัติ), origFlag, docRef (เลขที่ต้นทาง), docFormat, screenCode, docDate, remark, undo, และตามกรณี cancelType/lines/cancelDocNo/approveLines/notApprove backend เป็นผู้รันเลขที่เอกสารใหม่ (จากรหัสรูปแบบเอกสารของเมนู) ข้อความผลลัพธ์แสดงที่แถบสถานะบน เช่น "ยกเลิกเอกสาร … เรียบร้อยแล้ว", "คืนสถานะเอกสาร …", "บันทึกไม่อนุมัติเอกสาร …" หลังสำเร็จจอโหลดรายการซ้ายและรายละเอียดใหม่
ข้อควรระวัง
- จอนี้ไม่ลบ/ไม่แก้เอกสารต้นทาง การ "คืนสถานะ" คือการลบใบยกเลิก/อนุมัติใบนั้น ไม่ใช่การแก้ย้อนหลัง ผลต่อสต็อกและบัญชีเป็นของ backend ดู ยกเลิกและอนุมัติเอกสาร (Document cancel / approve) และบทเรียน บทเรียนยกเลิก ลบ และยกเลิกรายบรรทัด (Cancel, Delete & Partial Cancel)
- ปุ่ม "คืนสถานะ…" บนแถบเครื่องมือจะไม่ขึ้นสำหรับเอกสารกลุ่มยกเลิกรายสินค้า (ต้องกดที่ใบยกเลิกแต่ละใบในกล่อง "ใบยกเลิกของเอกสารนี้")
- ปุ่มบันทึกถูกปิดทั้งหมดถ้าผู้ใช้ไม่มีสิทธิ์เพิ่ม/แก้ไขของเมนูนั้น (แม้เปิดจอดูข้อมูลได้)
- ค้นเอกสารต้นทางผ่านบานรายการซ้ายได้ไม่เกิน 200 แถว ภายในช่วงวันที่ที่ตั้ง (เริ่มต้น 3 เดือน) เอกสารเก่ากว่านั้นต้องขยายช่วงวันที่หรือใช้ปุ่ม "เลือกเอกสาร" (500 รายการ แต่ไม่กรองวันที่)
- ปุ่ม "ปิดหน้าจอ" ในจอนี้ปิดแท็บจริง (ไม่มีโหมดแก้ไข จึงไม่มีความหมาย "ยกเลิกการแก้" เหมือนจอบันทึกเอกสาร)
- ช่อง "ผู้อนุมัติ/ผู้ยกเลิก" ที่โชว์ก่อนบันทึกคือผู้ใช้ที่ล็อกอิน ไม่ใช่ช่องที่พิมพ์ได้
ที่มาในโค้ด
frontend/account/transaction/UniversalCancelConfirmScreen.tsx:19-32props;:100-107PULL_BALANCE;:92-147แถวหัวเอกสาร/ป้ายอ้างอิง/ชุด flag;:226-265โหลดรายการซ้าย;:273-276ชุด flag ที่มีตาราง;:279-370โหลดหัว ใบยกเลิก บรรทัด;:439-505handleToggleStatus;:507-541ดึงรายการ;:562-573Ctrl+S;:575-591เลือกเอกสาร;:614-700ช่องหัว;:755-769ตารางสินค้า;:817-876ปุ่ม;:908-925ใบยกเลิกของเอกสารนี้frontend/account/transaction/UniversalTransScreen.tsx:461-480สลับมาจอนี้frontend/account/tabs/transMenuMap.ts:82-96ตัวอย่างเมนูอนุมัติ/ยกเลิกfrontend/src/lib/query-client.ts:801-821setDocStatus- ดูเพิ่ม: จอเอกสารธุรกรรมแบบเดียวกันทุกจอ (UniversalTransScreen) · รายการเมนูเอกสาร จัดซื้อ ขาย สินค้าคงคลัง (transMenuMap หมวด 1-3) · รายการเมนูเอกสาร เจ้าหนี้ ลูกหนี้ เงินสด ธนาคาร เช็ค สมุดรายวัน (transMenuMap หมวด 4-6) · สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต)