commit
This commit is contained in:
624
plans/approval-publishing-workflow.md
Normal file
624
plans/approval-publishing-workflow.md
Normal file
@@ -0,0 +1,624 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user