# 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