#process#permission#warehouse#shelf#erp_option#lookup#report
สิทธิ์คลัง/ที่เก็บรายกลุ่มผู้ใช้ (perm_wh_shelf)
ตัวเลือกบริษัท erp_option.perm_wh_shelf = 1 จำกัดคลัง (wh) และที่เก็บ (shelf) ที่ผู้ใช้เลือกได้ ให้เหลือเฉพาะแถวใน erp_user_group_wh_shelf ของกลุ่มที่ผู้ใช้สังกัด (erp_user_group_detail) แยกตามรหัสจอ screen_code = PU (ซื้อ), SI (ขาย), IM (นำเข้า/โอน), ST (ตรวจนับ) ตามคอมเมนต์หัวไฟล์ C# SMLERPGlobal/_icInfoFlag.cs ซึ่ง C# ไม่ตรวจตอนบันทึก แค่จำกัดหน้าค้นหาและค่าตั้งต้นของตาราง
ทำงานอย่างไร
เงื่อนไข EXISTS กลาง (permWhShelfExists)
EXISTS (SELECT 1 FROM erp_user_group_wh_shelf p WHERE p.group_code IN (กลุ่มของผู้ใช้) [AND p.screen_code = ...] AND p.wh_code = <คอลัมน์คลัง> [AND p.shelf_code = <คอลัมน์ที่เก็บ>]) ผู้ใช้ถูกแปลงเป็นตัวพิมพ์ใหญ่ ใช้ทั้งในตัวกรอง lookup ตัวตารางสินค้า รายงาน และหน้าเลือกคลัง
1. ตัวกรอง lookup ของจอเอกสาร (applyPermWhShelf)
- ถูกเรียกจาก
WarehouseLookupFilterเมื่อperm_wh_shelf = 1(ตัวกรองหน้าค้นหา (Lookup filters: party / ref-doc / warehouse / held items)) - หัวเอกสาร (
whTopDocFlags): ตัวกรองfromWh/fromShelfแทนที่ ตัวกรองสาขา (ตาม C#_icTransScreenTopControl.cs:3227-3260) โดยใช้permScreenTop(12 = PU; 34, 36, 44, 56, 122 = SI; 70-73, 124 = IM; 48, 49 = ST) flag ที่ไม่อยู่ในตารางยังกรองได้ แต่ไม่ระบุscreen_code - ตารางสินค้า: ตัวกรอง
rowWh/rowShelfAND กับตัวกรองสาขา (ตาม_icTransItemGridSelectWareHouseAndShelfForm.cs:150-206) โดยใช้permScreenGrid(6, 12 = PU; 34, 36, 44, 56 = SI; 70-73, 124 = IM; 48, 49 = ST); flag ที่ไม่อยู่ในตารางไม่กรอง
2. ค่าตั้งต้นคลัง/ที่เก็บของตารางสินค้า (gridWhPerm)
loadGridWhPermอ่านperm_wh_shelfและerp_user.ic_wht/erp_user.ic_shelf; ถ้าเปิดสิทธิ์ ใช้permScreenGrid[flag]เป็นจอ; ถ้าไม่เปิด ค่าic_wht/ic_shelfของผู้ใช้ถูกล้าง (ไม่ใช้)gridPermWhereเติมเงื่อนไข($4 = '' OR EXISTS...)ในการหาคลังตั้งต้นของสินค้า- ถ้าผู้ใช้มี
ic_whtหรือic_shelfและสิทธิ์เปิดอยู่ ค่าของผู้ใช้ ชนะ ค่าตั้งต้นของสินค้า (userOverride, อ้าง C# cs:9917-9927 ในคอมเมนต์) - ใช้ใน
trans_grid.go:171และtrans_ref_import_lines.go:150
3. ตรวจคลังที่เลือกจากฟอร์มยอดคงเหลือ (POST /process/lookup/wh-pick-check)
WarehousePickAllowed->whPickAllowedคืน{allowed: bool}- ถ้า
perm_wh_shelf <> 1อนุญาตเสมอ; ถ้าเปิด คลัง+ที่เก็บต้องเป็นแถวของสินค้าในic_wh_shelf; และถ้า flag อยู่ในpermScreenPick(12 = PU; 34, 36, 44 = SI; 70-73 = IM; 48, 49 = ST) คลังกับที่เก็บต้องอยู่ในกลุ่มของผู้ใช้แยกกัน (IN สองชุด ตาม C#_icBalance__getWarehouseLocation)
4. ตัวกรองหน้าเลือกคลังและฟอร์มยอดคงเหลือ (POST /process/lookup/wh-perm-filter)
WarehousePermFilterคืนWhPermFilter:wh,shelf(รายการเลือกคลัง/ที่เก็บ ทุกscreen_code),balance(เงื่อนไขแถวic_trans_detail dของยอดคงเหลือต่อคลัง+ที่เก็บ พร้อมd.qty <> 0และถ้ามีสาขาที่ล็อกอิน กรองเฉพาะคลังของสาขานั้น), และrows/valueOnlyที่คืนเสมอ (ค่าจากstockRowsSQL,stockValueOnlySQLเพื่อให้ผลรวมรายที่เก็บตรงกับic_inventory.balance_qty)- เมื่อ
perm_wh_shelfปิดwh/shelf/balanceเป็นค่าว่าง
5. รายงานสินค้า (icPermMode)
- รายงานบางตัวเลือกคลัง/ที่เก็บล่วงหน้าตามสิทธิ์:
icPermPair(รายงานIC_INFO_STK_MOVEเคลื่อนไหวสินค้า -- เลือกที่เก็บทั้งหมดของผู้ใช้; ถ้าเปิดสิทธิ์แต่ผู้ใช้ไม่มีที่เก็บเลย -> error "กรุณาเลือกที่เก็บสินค้า") และicPermWh(IC_REPORT_STK_MOVEMENT-- เลือกคลังทั้งหมดของผู้ใช้; ไม่มีเลย = ไม่กรอง) กำหนดที่report_menu_ic.go:556,562 icPermOptionsตั้งตัวเลือกฝั่ง serverpw(wh/pair) และpu(ผู้ใช้) แล้วicPermCTE/icPermWhereกรอง CTEln(คอลัมน์wh,sh); spec ที่ใช้โหมดนี้ถูกตั้งpermGuardedทำให้ Custom SQL ถูกปฏิเสธ (SQL กำหนดเองและเทมเพลตรายงาน (Custom SQL & report templates))
6. ตั้งค่าสิทธิ์ (หน้า master)
- แถว
erp_user_group_wh_shelfแก้ผ่านเมนูmenu_setup_user_group_warehouse_shelfแบบ master-detail (gridwh_pu,wh_si,wh_im,wh_stตามscreen_code) ที่master_detail_specs.go:378-408ดู ข้อมูลหลักแบบหัว-รายการ รหัสอัตโนมัติ และเลย์เอาต์รายการ (Master-detail, code auto-run, DataList)
จุดที่ต้องระวัง
- ไม่มีการตรวจตอนบันทึกเอกสาร: ผู้ใช้ที่ส่ง
whCodeตรง ๆ ผ่าน API จะข้ามได้ถ้าฝั่งอื่นไม่ตรวจ (ตามคอมเมนต์ C# "checks nothing at save"; ยังไม่ได้ตรวจว่าSaveTransมีกฎเพิ่มเติมหรือไม่) - flag ที่ไม่อยู่ใน
permScreenGridไม่ถูกกรองในตารางสินค้า แม้จะเปิดสิทธิ์ - คอมเมนต์ใน
permScreenPickระบุว่า 34/36 ใช้SIตามแบบ "SML CM"
ที่มาในโค้ด
backend/internal/application/process/perm_wh_shelf.go:9-22- คอมเมนต์หลักและตารางpermScreenGrid,permScreenTopbackend/internal/application/process/perm_wh_shelf.go:26-permWhShelfExists;:42applyPermWhShelfbackend/internal/application/process/perm_wh_shelf.go:69-105-gridPermWhere,gridWhPerm,loadGridWhPerm,userOverridebackend/internal/application/process/perm_wh_shelf.go:107-143-permScreenPick,WarehousePickAllowed,whPickAllowedbackend/internal/application/process/perm_wh_shelf_rest.go:15-53-WhPermFilter,WarehousePermFilter,whPermFilterbackend/internal/application/process/perm_wh_shelf_rest.go:55-113-icPermMode,icPermOptions,icPermCTE,icPermWherebackend/internal/application/process/report_menu_ic.go:556,562- รายงานที่ใช้โหมดสิทธิ์backend/internal/application/process/master_detail_specs.go:382-408- หน้ากำหนดสิทธิ์กลุ่ม
ดูเพิ่ม
- ตัวกรองหน้าค้นหา (Lookup filters: party / ref-doc / warehouse / held items)
- ทะเบียนรายงานรายเมนูและเงื่อนไขกรอง (Menu report registry & conditions)
- ข้อมูลหลักแบบหัว-รายการ รหัสอัตโนมัติ และเลย์เอาต์รายการ (Master-detail, code auto-run, DataList)
- การตรวจสิทธิ์เมนูของ route process (Process route rights)
- ภาพรวมกลุ่ม process ของ Backend (Process overview)