# Sprint 6 Phase 2 Notification Review

## Summary

ดำเนินการสร้าง Notification Center แบบใช้งานจริงบนฐานข้อมูลเดิมเรียบร้อยแล้ว โดยใช้ตาราง `notifications` ที่มีอยู่แล้วในระบบ และเชื่อมเข้ากับ Auth.js, Drizzle, React Query, header notification popover และหน้า `/dashboard/notifications`

งานในรอบนี้ครอบคลุม:

- สร้าง notification data layer และ reusable notification service
- เพิ่ม API สำหรับ list, mark read, mark all read
- เชื่อม notification event เข้ากับ training review, employee import และ master review
- เปลี่ยน notification center/header จาก mock store เป็นข้อมูลจริงจากฐานข้อมูล
- สร้าง notification center page แบบค้นหา กรอง อ่านทีละรายการ และอ่านทั้งหมด
- เพิ่ม audit log สำหรับ mark read และ mark all read

## Files Changed

- `src/app/dashboard/notifications/page.tsx`
- `src/app/api/notifications/route.ts`
- `src/app/api/notifications/[id]/read/route.ts`
- `src/app/api/notifications/read-all/route.ts`
- `src/app/api/training-records/[id]/review/route.ts`
- `src/app/api/import-employees/route.ts`
- `src/app/api/master-review/route.ts`
- `src/proxy.ts`
- `src/components/ui/notification-card.tsx`
- `src/features/audit-logs/server/audit-service.ts`
- `src/features/audit-logs/constants/audit-log-options.ts`
- `src/features/notifications/api/types.ts`
- `src/features/notifications/api/service.ts`
- `src/features/notifications/api/queries.ts`
- `src/features/notifications/api/mutations.ts`
- `src/features/notifications/constants/notification-options.ts`
- `src/features/notifications/server/notification-service.ts`
- `src/features/notifications/server/notification-data.ts`
- `src/features/notifications/components/notifications-listing.tsx`
- `src/features/notifications/components/notifications-page.tsx`
- `src/features/notifications/components/notification-center.tsx`

## Database Changes

- ไม่มีการเปลี่ยน schema
- ไม่มี migration ใหม่
- ใช้งานตารางเดิม `notifications`

## Routes Added

- `GET /api/notifications`
- `PATCH /api/notifications/[id]/read`
- `PATCH /api/notifications/read-all`
- ใช้งานหน้าเดิม `/dashboard/notifications` แต่เปลี่ยนเป็น data-driven implementation

## Notification Events Implemented

- `createNotification()`
- `createTrainingApprovedNotification()`
- `createTrainingRejectedNotification()`
- `createAnnouncementNotification()`
- `createImportCompletedNotification()`
- `createMasterReviewNotification()`
- `markNotificationAsRead()`
- `markAllNotificationsAsRead()`

Workflow ที่เชื่อมแล้ว:

- HRD อนุมัติ training record -> แจ้ง employee
- HRD ปฏิเสธ training record -> แจ้ง employee
- Employee import completed -> แจ้ง HRD ผู้ที่ทำรายการ
- Master review approve/reject -> แจ้ง HRD ผู้ที่ทำรายการ

## Permission Rules

- ผู้ใช้เห็นเฉพาะ notification ของตัวเอง
- HRD เห็นเฉพาะ notification ของตัวเอง
- API บังคับ ownership ที่ server-side ด้วย `organizationId + userId`
- การอ่าน notification ทีละรายการและอ่านทั้งหมดทำได้เฉพาะของตัวเอง
- หน้า `/dashboard/notifications` ใช้ `requireEmployeeDashboardAccess()`
- API `/api/notifications/**` ใช้ `requireOrganizationAccess()`

## Audit Events Added

- `NOTIFICATION_MARK_READ`
- `NOTIFICATION_MARK_ALL_READ`
- `NOTIFICATION_CREATE` สำหรับ system/manual notification flow ที่เปิด audit

หมายเหตุ:

- ไม่ได้ audit notification อัตโนมัติทุกตัว เพื่อลด log noise
- mark read actions ถูก audit ตาม requirement

## Thai Localization Changes

- เปลี่ยน notification center และ notification page เป็นข้อความไทย
- ปรับ label ของ filter, action, state, empty/error/loading ให้เป็นไทย
- ปรับ relative time บน notification card เป็นไทย

## Responsive/Mobile Notes

- Notification popover ยังคงรองรับ mobile width แบบเดิม
- หน้า `/dashboard/notifications` ใช้ stacked filters บนจอเล็ก
- ปุ่ม action และ mark-all ยังใช้งานได้บน mobile
- card layout ไม่ซ้อนทับข้อความและยังรองรับหลายบรรทัด

## Manual Test Checklist

- Employee can see only own notifications.
- HRD can see only own notifications.
- Training approved creates notification for employee.
- Training rejected creates notification for employee.
- Import completed creates notification for HRD.
- Master review action creates notification for HRD.
- Unread count displays correctly.
- Mark as read works.
- Mark all as read works.
- Search works.
- Filter unread/read works.
- Notification center works on mobile.
- Direct API access cannot read other users' notifications.
- Audit log records mark read actions.

## Known Limitations

- ตาราง `notifications.type` เดิมเป็น enum ชุดเก่า (`approved`, `rejected`, `announcement`, `reminder`) จึงต้อง map logical notification type ของ phase นี้เข้ากับ enum เดิมแทนการเพิ่ม enum ใหม่
- filter ประเภท notification ฝั่ง server ใช้การ resolve จาก `type + referenceType` หลัง query ไม่ได้ทำ SQL-native classification
- `createAnnouncementNotification()` ถูกเตรียมไว้แล้ว แต่ announcements module ยังเป็น placeholder จึงยังไม่ได้เชื่อม workflow publish จริงใน phase นี้
- notification center popover แสดงล่าสุด 5 รายการ ส่วนหน้ารวมใช้ pagination

## Next Phase Recommendation

- เชื่อม announcements publish workflow ให้สร้าง notification จริง
- เพิ่ม background delivery strategy หากภายหลังต้องรองรับ email/push
- เพิ่ม bulk cleanup หรือ archive strategy สำหรับ notification จำนวนมาก
- เพิ่ม richer notification linking เช่น deep link ไปหน้ารายละเอียดแบบ anchor/state-aware
- พิจารณาปรับ enum notification type ใน DB เมื่อพร้อมทำ migration อย่างเป็นทางการ
