#history#cancel#delete
ภาพรวม
การยกเลิก/ลบเอกสารต้องรักษาความสัมพันธ์ระหว่างเอกสารเดิม เอกสารยกเลิก GL กลับรายการ และสถานะ flow ไว้ครบ ช่วง 2026-10-19..24 พบบั๊กลบ/ยกเลิกแล้วมีเศษค้าง (GL กลับรายการ, แถวลูกสินค้าชุด, เอกสารยกเลิก) หรือยอดหัวบิลไม่ตรง C#
อาการ
- A (e7168c84): ลบเอกสารยกเลิกแล้ว GL กลับรายการค้าง; ลบเอกสารที่ถูกใบอื่นอ้างอิงหรือมัดจำที่ใช้/คืนแล้วได้ (แถวอ้างอิงชี้ที่ไม่มี); เลขเอกสารยกเลิกไม่แยก flag
- B (6983d7ea, bc8d27d4): ยกเลิกรายบรรทัด (flag 7/39/37) ไม่ตรวจเพดานจำนวน และสถานะ PO (
doc_success/used_status) ไม่ตามการยกเลิก; PR อนุมัติ (flag 4) ทับค่าที่ขอเดิม; หน้ายกเลิก/อนุมัติมี grid เตี้ยจน help bar ทับแถวเครดิต - C (bd834b16): commit ไม่มีเนื้อความ แต่คอมเมนต์ใน
docs.goระบุอาการปัจจุบัน: ลบ ap_ar_trans 239/19 ต้นฉบับที่ถูกยกเลิกแล้ว จะทิ้งเอกสารยกเลิกและ GL กลับรายการไว้ - D (86519142): ยกเลิกรายชิ้น (37) เขียนเพียง
total_amountไม่ใช่ชุดยอดหัวบิลเต็มแบบ C# - E (678fc5fc, T3): ลบแถวสินค้าชุดแล้วแถวลูกค้าง ยอดแถวลูกยังถูกรวม
สาเหตุ (root cause)
- A: C#
_transProcess.cs:1009-1200จัดเลขDOC<flag>และลบ GL กำพร้า แต่ Go ยังไม่พอร์ต และ delete ไม่เช็กการอ้างอิง - B: ยอดคงเหลือต่อบรรทัดและสถานะ PO ใน C# คำนวณใน
_docFlowThreadซึ่ง Go ยังไม่มีตอนนั้น - C:
SaveDoc/DeleteDocของ ap_ar_trans ไม่มีด่านเช็กสถานะเอกสารที่เก็บไว้ (ตรงกับ_myManageData1__checkEditData) - D: ไม่ได้ใช้ฟังก์ชันรวมยอดเดียวกับหน้าจอ/บันทึกปกติ
- E: แถวชุดกับแถวลูกผูกกันด้วย
ref_guid/set_ref_lineแต่ handler ลบแถวเดียว
วิธีแก้
- A:
DOC%dต่อ flag, ลบ GL กำพร้าตอนลบเอกสารยกเลิก,refuseIfReferencedใช้referencingDocร่วม cancel/delete,refuseUsedDepositDeleteสำหรับมัดจำ - B:
parseCancelLines/checkCancelQtyตรวจเพดานจากlineBalances;orderDerivedStatusคำนวณused_status/doc_success; PR flag 4 เก็บค่าที่ขอในtemp_float_1/2+temp_string_1แล้วรวมยอดหัวบิลใหม่ - C:
checkStoredApArEditableปฏิเสธเอกสารที่ used/finished/cancelled; undo-cancel ผ่านCancelDocไม่โดนด่านนี้ + เทสต์TestApArCancelUndoIntegration - D: ให้
companyHeaderTotalsคำนวณยอดตาม_calcล่างของ C# (ข้ามแถวชุด) ทั้งหน้าจอและตอนบันทึก ตัดสินใจ: เอกสารเก่าคงยอดเดิม ไม่ย้อนแก้ (handoff:68) - E: ลบแถวชุดพร้อมแถวที่
set_ref_lineตรงกับref_guid
commit ที่เกี่ยวข้อง
e7168c84— เลข DOC<flag>, ลบ GL กำพร้า, ลบต้องเช็กการอ้างอิง, ตรวจมัดจำ6983d7ea— ยกเลิกรายบรรทัด 7/39/37, อนุมัติ PR flag 4, สถานะ PObd834b16— ด่าน ap_ar_trans + undo-cancel (ไม่มีเนื้อความ)86519142— ยอดยกเลิกรายชิ้น 37 ตาม_calcbc8d27d4— จอยกเลิก/AR issue #36-#48 (ไม่มีเนื้อความ; ยังไม่ได้ตรวจ diff ละเอียด)678fc5fc— ลบสินค้าชุดพร้อมแถวลูก
โค้ดปัจจุบันที่ป้องกัน
process/doc_cancel.go:399เลขDOC%d,:497refuseIfReferenced,:547referencingDoc,:637ลบ GL กำพร้าprocess/trans_deposit.go:246refuseUsedDepositDeleteprocess/docs.go:457apArEditLocked,:463checkStoredApArEditable; เทสต์docs_test.go:47process/doc_cancel_item.go:74checkCancelQty,:135checkItemCancel,:205companyHeaderTotals,:223orderDerivedStatus;doc_approve_item.go:96frontend/account/transaction/UniversalTransScreen.tsx:3606-3608ลบแถวชุดพร้อมลูก
บทเรียน / กฎที่ได้
- ลบ/ยกเลิกทุกชนิดต้องเช็ก "ใครอ้างถึงฉัน" ก่อน และลบตารางลูก/GL ที่เป็นของเอกสารนั้นให้หมดใน tx เดียว
- ยอดหัวบิลต้องผ่าน
companyHeaderTotalsตัวเดียวทุกเส้นทาง ห้ามเขียนยอดย่อยเอง - ด่าน "แก้ไม่ได้ถ้าใช้แล้ว/ปิดแล้ว/ยกเลิกแล้ว" ต้องอยู่ที่ save และ delete ด้วย ไม่ใช่เฉพาะปุ่มบนจอ
- ลบแถวพ่วง (สินค้าชุด) ต้องลบทั้งกลุ่ม ไม่งั้นยอดรวมผิดเงียบๆ
- รายการเปิด: จอยกเลิก 3/7/31/37/39 ยังไม่เทียบ C# ref flow (handoff บรรทัด 77)
ดูเพิ่ม
ยกเลิกและอนุมัติเอกสาร (Document cancel / approve) · การลบ แก้ไข และล็อกเอกสาร (Transaction Delete / Edit Guards) · การจัดเมนูตาม Workflow หน้าจอยกเลิกเอกสาร และ Lookup คลิกเดียว (Menu Workflow, Cancel Screens) · บทเรียนเอกสารอ้างอิงและ Doc Flow (Document Reference & Flow) · บทเรียนกฎตอนบันทึกเอกสาร (Trans Save Rules & Validation)
ที่มาในโค้ด
backend/internal/application/process/doc_cancel.go:399,497,547,637docs/HANDOFF_SMLCM_PARITY_2026-10-22.md:68,77- git:e7168c84, git:6983d7ea, git:86519142, git:678fc5fc