#faq#master-data#change-code#admin
เปลี่ยนรหัสสินค้า/ลูกค้า/เจ้าหนี้/ผังบัญชีที่ใช้ไปแล้วได้ไหม
ตอบสั้น: ได้ แต่ต้องเป็น admin และทำที่เมนู "เปลี่ยนรหัสสินค้า / เจ้าหนี้ / ลูกหนี้ / ผังบัญชี" (รหัส 1106-1109) ระบบเปลี่ยนรหัสใน master และทุกตารางที่อ้างอิง (เอกสาร รายการบัญชี ฯลฯ) ในธุรกรรมเดียว โดยรหัสใหม่ต้องยังไม่มีอยู่ จะ "รวมรหัส" เข้ากับรหัสที่มีอยู่แล้วไม่ได้
รายละเอียด
- เมนู:
menu_change_code_item1106,menu_change_code_supplier1107,menu_change_code_customer1108,menu_change_gl_account_code1109 (ดู รหัสเมนู (เช่น 2.1.7 หรือ 4013) คือหน้าจอไหน และระบบเปิดหน้าจอจากรหัสยังไง) เป็นเมนู admin เท่านั้น (smlMenu.ts:317-320) และ APIworkflow/change-codeกำหนดสิทธิ์ admin (permission.go:50) หน้าจอเรียกที่SystemProcessWorkbenchScreen.tsx:679ปุ่ม "เริ่มเปลี่ยนรหัส" (:779) - ชนิดที่รองรับมี 4 อย่าง
item,customer,supplier,gl_accountตามตารางchangeCodeSpecsซึ่งระบุ master และคอลัมน์อ้างอิงทั้งหมด (workflow.go:125-172) เช่นสินค้า:ic_inventory.codeฯลฯ รวมถึงรหัสสินค้าในบรรทัดเอกสารic_trans_detail.item_code; ผังบัญชี:gl_chart_of_account.code,gl_journal_detail.account_codeและตารางจัดสรร/แผนก/โครงการ - ตรวจก่อนเปลี่ยน: ส่งได้ 1-500 คู่ต่อครั้ง, รหัสยาวไม่เกิน 50 ตัว, รหัสใหม่ถูกแปลงเป็นตัวพิมพ์ใหญ่, ห้ามเหมือนรหัสเดิม และห้ามซ้ำกันในรายการ (
workflow.go:204-228) - ตรวจในฐานข้อมูล: ต้องมีรหัสเดิม ("แถว N: ไม่พบ… เดิม …") และรหัสใหม่ต้องไม่มี ("แถว N: …ใหม่ … มีอยู่แล้ว") โดยเทียบแบบไม่สนตัวพิมพ์ (
workflow.go:258,:267) - ไม่มีการเช็คว่ารหัสเดิมถูกใช้แล้วหรือยัง: ใช้แล้วก็เปลี่ยนได้ เอกสารเก่าจะถูกแก้รหัสตามไปด้วย; ถ้า UPDATE ตารางใดล้ม ("เปลี่ยนรหัสใน … ไม่สำเร็จ") ทั้งชุดถูก rollback (
workflow.go:280,:324-340) - ตาราง/คอลัมน์ที่ไม่มีในฐานของบริษัทนั้นถูกข้ามและรายงานใน
skippedTablesแทนที่จะทำให้ทั้งชุดล้ม (workflow.go:240-249) - ทุกคู่ที่เปลี่ยนจะเขียน log ลง
master_logs(รหัสเดิม รหัสใหม่ จำนวนแถวต่อตาราง) (workflow.go:350-356)
ข้อควรระวัง
- ไม่พบการเรียกคำนวณสต็อก/รายการบัญชีใหม่ใน workflow.go (ไม่มีคำว่า rebuild ในไฟล์) เพราะเป็นการเปลี่ยนชื่อรหัสอย่างเดียว (
workflow.go:230-294) ส่วนข้อมูลที่เก็บรหัสไว้นอกรายการในตารางchangeCodeSpecs(เช่น ค่าตั้งต้นที่อ้างผังบัญชีเป็นข้อความ) ไม่ชัดจากโค้ดว่าถูกแก้ด้วยหรือไม่ - ย้อนกลับได้โดยสั่งเปลี่ยนกลับ (รหัสเดิมจะว่างหลังเปลี่ยน จึงไม่ชนเงื่อนไข "มีอยู่แล้ว") ควรทดลองกับ 1-2 รหัสก่อนชุดใหญ่
ดูเพิ่ม
- เปลี่ยนรหัสหลัก สินค้า/ลูกหนี้/เจ้าหนี้/ผังบัญชี (Change Code)
- ผังบัญชี และประเภทบัญชี (chart of account / gl_chart_of_account)
- ทำไมเข้าเมนู/กดบันทึกแล้วขึ้น 403 ไม่มีสิทธิ์ และตั้งสิทธิ์เมนูให้ผู้ใช้อย่างไร
- รหัสเมนู (เช่น 2.1.7 หรือ 4013) คือหน้าจอไหน และระบบเปิดหน้าจอจากรหัสยังไง
- บทเรียนธุรกรรมอะตอมมิกและ error ที่ถูกกลืน (Atomic Transactions & Swallowed Errors)
ที่มาในโค้ด
backend/internal/application/process/workflow.go:125-172(changeCodeSpecs)backend/internal/application/process/workflow.go:204-228(normalizeChangeCodePairs),:230-294(ChangeCode),:324-340(renameMasterWithFKChildren),:350-356(writeMasterLog)backend/internal/adapter/inbound/http/process/permission.go:50frontend/src/config/smlMenu.ts:317-320(ADMIN_ONLY_MENU_SET)frontend/account/process/SystemProcessWorkbenchScreen.tsx:679,:779