# Prompt: Implement Approval & Publishing Workflow for Announcement and Online Lesson

## Objective

ปรับปรุงระบบหลังบ้านของ Training Management System (TMS) ให้รองรับ Approval & Publishing Workflow สำหรับโมดูล:

1. ประกาศ (Announcement)
2. บทเรียนออนไลน์ (Online Lesson)

โดยให้ HRD Staff / Admin สามารถสร้างและส่งอนุมัติได้ แต่ไม่สามารถเผยแพร่สู่สาธารณะได้เอง ยกเว้น Admin IT ซึ่งเป็น Super Admin และสามารถดำเนินการได้ทั้งหมด

---

## Scope

ให้ดำเนินการเฉพาะโมดูล:

- Announcement
- Online Lesson

ยังไม่ต้องขยายไปยังโมดูลอื่น

---

## Roles & Permissions

### Admin IT / Super Admin

มีสิทธิ์ทำได้ทั้งหมด ได้แก่:

- Create
- Edit
- Delete
- Submit for Approval
- Approve
- Reject
- Publish
- Schedule Publish
- Unpublish
- Archive
- Preview
- Manage all records

### HRD Staff

มีสิทธิ์:

- Create
- Edit Draft
- Delete Draft
- Submit for Approval
- Preview Draft

ไม่มีสิทธิ์:

- Approve
- Reject
- Publish
- Schedule Publish
- Unpublish
- Archive

### HRD Manager

มีสิทธิ์:

- View Pending Approval
- Approve
- Reject
- Publish
- Schedule Publish
- Unpublish
- Archive
- Preview before Publish
- View HRD Manager Dashboard

### Employee

มีสิทธิ์:

- เห็นเฉพาะรายการที่มีสถานะ Published เท่านั้น
- ไม่สามารถเห็น Draft, Pending Approval, Approved, Scheduled, Rejected หรือ Archived

---

## Required Status

ให้รองรับสถานะดังนี้:

```text
Draft
Pending Approval
Approved
Scheduled
Published
Rejected
Archived
```

---

## Workflow

### Create Flow

```text
Create
  ↓
Draft
  ↓
Submit for Approval
  ↓
Pending Approval
  ↓
Approve
  ↓
Approved
  ↓
Publish Now / Schedule Publish
  ↓
Published
```

---

### Reject Flow

```text
Pending Approval
  ↓
Reject
  ↓
Draft
```

เมื่อ Reject:

- ต้องบันทึกเหตุผลการ Reject
- รายการกลับเป็น Draft
- ผู้สร้างสามารถแก้ไขได้
- ผู้สร้างสามารถลบได้
- สามารถ Submit for Approval ใหม่ได้

---

### Schedule Publish Flow

```text
Approved
  ↓
Schedule Publish
  ↓
Scheduled
  ↓
ถึงเวลาที่กำหนด
  ↓
Published
```

ต้องรองรับ:

- ตั้งวันเวลาเผยแพร่
- แก้ไขวันเวลาเผยแพร่
- ยกเลิก Schedule
- Publish ทันที แม้เคยตั้ง Schedule ไว้แล้ว

---

## Versioning Requirement

ต้องเพิ่ม Versioning สำหรับ Announcement และ Online Lesson

### กรณีรายการยังไม่ Published

- สามารถแก้ไข Draft ได้ตามปกติ

### กรณีรายการ Published แล้ว

ห้ามแก้ไข Published Record โดยตรง

เมื่อมีการแก้ไขรายการที่ Published แล้ว ให้สร้าง Draft Revision ใหม่ เช่น:

```text
Published V1
  ↓
Create Draft Revision
  ↓
Draft V2
  ↓
Submit for Approval
  ↓
Pending Approval
  ↓
Approved
  ↓
Published V2
```

ข้อกำหนด:

- ต้องเก็บ version number
- ต้องระบุ parent/original record
- ต้องรู้ได้ว่า version ไหนเป็น current published version
- เมื่อ Publish version ใหม่ ให้ version เดิมไม่แสดงเป็น current แล้ว
- ต้องมีประวัติ version ให้ตรวจสอบย้อนหลังได้

---

## Preview Before Publish

ต้องเพิ่ม Preview ก่อน Publish

### HRD Staff

- Preview ได้เฉพาะ Draft / Revision ของตนเองหรือรายการที่มีสิทธิ์

### HRD Manager

- Preview รายการ Pending Approval, Approved, Scheduled ได้
- Preview ต้องแสดงหน้าตาใกล้เคียงกับที่ Employee จะเห็นจริง

### Admin IT

- Preview ได้ทุกสถานะและทุกรายการ

Preview ต้องไม่ทำให้สถานะเปลี่ยน

---

## HRD Manager Dashboard

เพิ่มหรือปรับหน้า Dashboard สำหรับ HRD Manager เพื่อดูรายการที่ต้องดำเนินการ

ควรมี Section หรือ Tab อย่างน้อย:

- Pending Approval
- Approved รอ Publish
- Scheduled
- Published
- Rejected
- Archived

ควรแสดงข้อมูลสำคัญ:

- ชื่อรายการ
- ประเภท: Announcement / Online Lesson
- ผู้สร้าง
- วันที่สร้าง
- วันที่ส่งอนุมัติ
- สถานะ
- วันที่ตั้งเผยแพร่ ถ้ามี
- ปุ่ม Action ตามสิทธิ์

---

## Frontend Requirement

### HRD Staff / Admin User

ในหน้า Create/Edit ต้องมีปุ่ม:

- Save Draft
- Submit for Approval
- Preview

ห้ามแสดงปุ่ม:

- Approve
- Reject
- Publish
- Schedule Publish
- Unpublish
- Archive

ยกเว้นผู้ใช้เป็น Admin IT

---

### HRD Manager

ต้องมีปุ่มตามสถานะ:

#### Pending Approval

- Preview
- Approve
- Reject

#### Approved

- Preview
- Publish Now
- Schedule Publish

#### Scheduled

- Preview
- Edit Schedule
- Cancel Schedule
- Publish Now

#### Published

- Preview
- Unpublish
- Archive

---

### Admin IT

ต้องเห็นและใช้งานปุ่มทั้งหมดได้ทุกสถานะตามความเหมาะสม

---

## Backend Requirement

ห้ามตรวจสอบสิทธิ์เฉพาะหน้า UI

ต้องตรวจสอบ Role/Permission ที่ API ทุกครั้ง

API สำคัญที่ต้องป้องกัน:

- Submit for Approval
- Approve
- Reject
- Publish
- Schedule Publish
- Cancel Schedule
- Unpublish
- Archive
- Delete
- Create Revision

หากไม่มีสิทธิ์ ให้ return:

```text
403 Forbidden
```

---

## Database Requirement

ตรวจสอบ schema เดิมก่อนเสมอ ห้ามเดาโครงสร้าง

ถ้ายังไม่มี field ที่จำเป็น ให้เพิ่มโดยออกแบบให้สอดคล้องกับ project pattern เดิม

ควรมี field ประมาณนี้:

```text
status
version
parent_id
is_current
submitted_by
submitted_at
approved_by
approved_at
rejected_by
rejected_at
rejected_reason
scheduled_publish_at
published_by
published_at
unpublished_by
unpublished_at
archived_by
archived_at
created_by
updated_by
created_at
updated_at
```

ถ้ามี Audit Log เดิม ให้ใช้ของเดิม
ถ้าไม่มี ให้เพิ่มตาม pattern ของโปรเจกต์

---

## Audit Log Requirement

ต้องบันทึกทุก action สำคัญ:

- Create
- Update
- Delete
- Submit for Approval
- Approve
- Reject
- Create Revision
- Schedule Publish
- Cancel Schedule
- Publish
- Unpublish
- Archive

Audit Log ควรเก็บ:

- module
- record_id
- action
- old_value
- new_value
- actor_id
- actor_role
- created_at
- note / reason

---

## Notification Requirement

ถ้ามีระบบ notification เดิม ให้ reuse ของเดิม

ต้องแจ้งเตือนอย่างน้อยในเหตุการณ์:

- HRD Staff ส่งอนุมัติ → แจ้ง HRD Manager
- HRD Manager Approve → แจ้งผู้สร้าง
- HRD Manager Reject → แจ้งผู้สร้าง พร้อมเหตุผล
- ตั้งเวลาเผยแพร่ → แจ้งผู้เกี่ยวข้อง
- Publish สำเร็จ → แจ้งผู้เกี่ยวข้อง
- Unpublish / Archive → แจ้งผู้เกี่ยวข้อง

---

## Scheduled Publish Job

ต้องตรวจสอบว่าระบบมี cron/job/scheduler อยู่แล้วหรือไม่

ถ้ามี ให้ใช้ pattern เดิม

ถ้าไม่มี ให้เสนอแนวทางที่เหมาะสมก่อนลงมือแก้

Scheduled Job ต้องทำงานประมาณนี้:

```text
ค้นหารายการ status = Scheduled
และ scheduled_publish_at <= current time
จากนั้นเปลี่ยนสถานะเป็น Published
บันทึก published_at
บันทึก Audit Log
```

ต้องระวัง timezone และใช้แนวทางเดียวกับ project เดิม

---

## Employee Visibility Rule

ทุกหน้า Employee ต้อง query เฉพาะ:

```text
status = Published
is_current = true
```

ห้ามแสดง:

- Draft
- Pending Approval
- Approved
- Scheduled
- Rejected
- Archived
- version เก่า

---

## Validation

ใช้ validation เดิมของ Create/Edit ให้มากที่สุด

ก่อน Submit for Approval ต้อง validate ข้อมูลเหมือนกับการเตรียมเผยแพร่จริง

หากข้อมูลไม่ครบ:

- ไม่เปลี่ยนสถานะ
- แสดง error ให้ครบทุกจุด
- ยังคงเป็น Draft

---

## Required Implementation Steps

1. ตรวจสอบโครงสร้างโปรเจกต์เดิมก่อนแก้ไข
2. ตรวจสอบ Announcement module
3. ตรวจสอบ Online Lesson module
4. ตรวจสอบ Role/Permission เดิม
5. ตรวจสอบ API routes / server actions / services เดิม
6. ตรวจสอบ Database schema เดิม
7. สร้าง `plan.md` ก่อนเริ่มแก้ไข
8. Implement database migration
9. Implement backend permission checks
10. Implement workflow actions
11. Implement versioning
12. Implement preview page/modal
13. Implement HRD Manager dashboard
14. Implement scheduled publish
15. Update employee visibility query
16. Add audit log
17. Add notification
18. Test role-based behavior
19. Test regression ทั้ง Announcement และ Online Lesson
20. สร้างเอกสารสรุปหลังทำงานเสร็จ

---

## Required Documents

หลังดำเนินการเสร็จ ต้องสร้างเอกสารไว้ในโฟลเดอร์ `docs`

ชื่อไฟล์แนะนำ:

```text
docs/approval-publishing-workflow.md
```

เนื้อหาในเอกสารต้องมี:

- Summary
- Objective
- Scope
- Role & Permission Matrix
- Workflow Diagram
- Status Transition
- Versioning Design
- Preview Before Publish
- HRD Manager Dashboard
- Database Changes
- API Changes
- Security / Permission Checks
- Audit Log
- Notification
- Testing Summary
- Files Changed
- Known Issues / Follow-up Items

---

## Testing Checklist

ต้องทดสอบอย่างน้อย:

### HRD Staff

- สร้าง Draft ได้
- แก้ไข Draft ได้
- ลบ Draft ได้
- Submit ได้
- Publish ไม่ได้
- Approve ไม่ได้
- Schedule Publish ไม่ได้

### HRD Manager

- เห็นรายการ Pending Approval
- Preview ได้
- Approve ได้
- Reject ได้
- Publish ได้
- Schedule Publish ได้
- Unpublish ได้
- Archive ได้

### Admin IT

- ทำได้ทุก action
- เห็นทุกสถานะ
- Override Publish ได้

### Employee

- เห็นเฉพาะ Published
- ไม่เห็น Draft / Pending / Approved / Scheduled / Rejected / Archived
- ไม่เห็น version เก่า

### Versioning

- Published แล้วแก้ไขต้องสร้าง Draft Revision
- Publish version ใหม่แล้ว version เดิมไม่เป็น current
- Employee เห็นเฉพาะ current published version

### Schedule Publish

- ตั้งเวลาเผยแพร่ได้
- ถึงเวลาแล้วเปลี่ยนเป็น Published
- ยกเลิก Schedule ได้
- Publish ทันทีได้

---

## Important Rules

- ห้ามสร้างระบบใหม่ซ้ำ หากมี pattern เดิมอยู่แล้ว
- ต้อง reuse component, service, hook, validation, permission helper เดิมให้มากที่สุด
- ห้ามแก้เฉพาะ UI โดยไม่ป้องกัน backend
- ห้ามให้ HRD Staff publish ได้
- Admin IT ต้องเป็น Super Admin
- Employee ต้องเห็นเฉพาะ Published current version เท่านั้น
- ต้องสร้างเอกสารสรุปไว้ใน `docs`
- ต้องสร้าง `plan.md` ก่อนลงมือแก้ไข
- ต้องสร้าง report หลังแก้ไขเสร็จ

---

## Final Deliverables

เมื่อทำเสร็จ ต้องมี:

1. Code changes สำหรับ Approval & Publishing Workflow
2. Database migration หรือ schema update
3. Updated frontend pages/components
4. Updated backend API/server actions
5. Role-based permission enforcement
6. Versioning support
7. Preview before Publish
8. HRD Manager Dashboard
9. Scheduled Publish support
10. Audit Log
11. Notification integration
12. `plan.md`
13. `docs/approval-publishing-workflow.md`
14. Final implementation report
