# Policy Management Enhancement Report

## 1. Existing Structure Review

- พบว่าโมดูล `training-policy` เดิมเชื่อมฐานข้อมูลจริงอยู่แล้ว แต่ยังมี scope ค่อนข้างเล็ก ใช้เพียง `year`, `total_hours`, `k_hours`, `s_hours`, `a_hours`, `is_active`
- ส่วนที่ Reuse:
  - โครง `src/features/<feature>/api/{types,service,queries,mutations}.ts`
  - Route Handlers ใต้ `src/app/api/training-policies/**`
  - `useAppForm` + Zod schema เดิม
  - shared DataTable stack (`DataTable`, `DataTableToolbar`, `useDataTable`, `DataTableColumnHeader`)
  - audit log infrastructure เดิม
- ส่วนที่ Refactor:
  - เปลี่ยน access control จาก `requireHRD()` เป็น permission-first ผ่าน `requirePermission(...)`
  - ปรับ list API ให้รองรับ pagination / search / status / sort
  - ปรับหน้า dashboard ให้ใช้ query-string driven table pattern แบบ feature อื่นใน repo
- ส่วนที่ Extend:
  - detail endpoint
  - clone / activate / deactivate endpoints
  - history endpoint ที่ดึงจาก audit log
  - action menu และ detail sheet ฝั่ง UI
- ส่วนที่สร้างใหม่:
  - route handlers สำหรับ `clone`, `activate`, `deactivate`, `history`
  - helper permission dashboard guard แบบ generic
  - UI table flow ใหม่สำหรับ policy management

## 2. Files Changed

- `src/app/api/training-policies/route.ts`
- `src/app/api/training-policies/[id]/route.ts`
- `src/app/api/training-policies/[id]/clone/route.ts`
- `src/app/api/training-policies/[id]/activate/route.ts`
- `src/app/api/training-policies/[id]/deactivate/route.ts`
- `src/app/api/training-policies/[id]/history/route.ts`
- `src/app/dashboard/training-policy/page.tsx`
- `src/features/audit-logs/server/audit-log-data.ts`
- `src/features/audit-logs/server/audit-service.ts`
- `src/features/training-policy/api/types.ts`
- `src/features/training-policy/api/service.ts`
- `src/features/training-policy/api/queries.ts`
- `src/features/training-policy/api/mutations.ts`
- `src/features/training-policy/schemas/training-policy.ts`
- `src/features/training-policy/server/training-policy-data.ts`
- `src/features/training-policy/components/training-policy-form.tsx`
- `src/features/training-policy/components/training-policy-page.tsx`
- `src/lib/auth/page-guards.ts`

## 3. Database Changes

- ไม่มี migration ในรอบนี้
- ไม่มีการเพิ่ม column / index / constraint
- เลือก reuse schema เดิมเพื่อลดผลกระทบกับ runtime data และให้ enhancement รอบแรก deploy ได้เร็ว

## 4. Permission Matrix

- `training_policy:read`
  - list policy
  - view policy detail
  - view policy history
- `training_policy:write`
  - create
  - edit
  - clone
  - activate
  - deactivate

หมายเหตุ: prompt เป้าหมายต้องการ permission แยกละเอียดกว่านี้ แต่ permission catalog ปัจจุบันมีเพียง `read` และ `write` สำหรับโมดูลนี้

## 5. Business Rules

- 1 องค์กรมี policy active ได้เพียง 1 รายการ
- หากเปิดใช้งาน policy ใหม่ ระบบจะปิด policy อื่นในองค์กรก่อน
- clone จะคัดลอกค่า hours ทั้งหมด แต่ตั้ง `is_active = false`
- clone จะหา `year` ถัดไปที่ยังไม่ซ้ำโดยเริ่มจาก `source.year + 1`
- create / update ยังบังคับ rule เดิม: `K + S + A` ต้องเท่ากับ `totalHours`
- duplicate year ในองค์กรเดียวกันจะถูก block ที่ server

## 6. Versioning

- รอบนี้ยังไม่มี version table หรือ field-level diff versioning ในฐานข้อมูล
- ใช้ audit history เป็น lightweight history layer ชั่วคราวสำหรับการตรวจย้อนหลัง

## 7. Audit Log

- รองรับ action:
  - `CREATE`
  - `UPDATE`
  - `CLONE`
  - `ACTIVATE`
  - `DEACTIVATE`
- history ดึงจาก `audit_logs` โดย filter `module_name = TRAINING_POLICY`

## 8. UI Screens

- List:
  - shared DataTable
  - search / status filter / pagination / sorting
  - row action menu
- View:
  - detail sheet
  - history section
- Create / Edit:
  - sheet + existing TanStack Form pattern

## 9. Testing

- ตรวจ `npm run lint` ผ่าน
- ตรวจ `npm run build` ผ่าน
- ไม่มี automated CRUD / permission / responsive regression test เพิ่มในรอบนี้

## 10. Remaining Improvements

- เพิ่ม schema จริงสำหรับ:
  - policy name
  - description
  - effective date
  - archived / restored state
  - version
  - mandatory courses
  - certificate policy
  - advanced settings
- แยก permission ให้ละเอียดตาม action (`clone`, `activate`, `audit`, `restore`)
- เพิ่ม soft delete / restore ตาม archived workflow
- เพิ่ม field-level version comparison
- เพิ่ม scheduled activation / policy comparison / rollback
