# Announcement Approval Workflow Implementation Report

## 1. Executive Summary

Announcement now uses the same action-based approval flow as Online Lesson for authoring and review:

- remove status selection from the form
- add `บันทึกร่าง` and `ส่งตรวจสอบ`
- submit now notifies reviewer users
- approve / return / reject / publish still notify the author
- build and TypeScript both pass after the change

## 2. Architecture Review

- Reused shared approval rules from `src/features/content-approval/lib/workflow.ts`
- Reused shared review UX from `src/features/content-approval/components/content-review-action-dialog.tsx`
- Kept persistence in local Route Handlers with Drizzle
- Kept notifications in `src/features/notifications/server/notification-service.ts`
- Reused the Online Lesson approval pattern instead of duplicating new workflow logic

## 3. Files Modified

- `src/features/announcements/components/announcement-form.tsx`
- `src/features/announcements/schemas/announcement.ts`
- `src/features/announcements/api/types.ts`
- `src/features/announcements/api/service.ts`
- `src/features/announcements/server/announcement-data.ts`
- `src/app/api/announcements/route.ts`
- `src/app/api/announcements/[id]/route.ts`
- `src/features/audit-logs/server/audit-service.ts`
- `src/features/audit-logs/constants/audit-log-options.ts`

## 4. Business Logic Changes

- Create and edit form payloads now send `action: 'draft' | 'submit'` instead of editable `status`
- Route handlers derive `draft` or `pending_review` from the requested action
- Submit permission is enforced with the shared `canTransitionContent()` rule
- Reviewer recipients are resolved from organization memberships with announcement review permissions
- Added audit coverage for `ANNOUNCEMENT_DRAFT_SAVED`

## 5. UI Changes

- Removed status dropdown from the announcement form
- Added form-level error summary with field errors
- Added footer workflow actions matching Online Lesson
- Kept publish and archive as reviewer/manager actions on edit and detail views
- Preserved review comment visibility for authors and reviewers

## 6. Permission Changes

- No new permission names were introduced
- Existing content approval permissions are now used more consistently for author submit vs reviewer actions
- Draft save and draft edit remain owner-scoped through existing shared permission checks

## 7. Workflow Changes

- Author can save draft without manually selecting a status
- Author can submit draft / returned / rejected content for review
- Submit now creates reviewer notifications for users with announcement review permissions
- Approve / return / reject / publish continue to notify the creator
- Publish still creates organization-wide announcement notifications

## 8. Refactoring Summary

- Announcement workflow now follows the same action-based contract used by Online Lesson
- Reviewer lookup was extracted into `getAnnouncementReviewRecipientIds()`
- Form and route contracts are cleaner because writable status is no longer exposed from the client

## 9. Breaking Changes

- Client announcement create/update multipart payload changed from `status` to `action`

## 10. Regression Risk

- Low for Online Lesson because its code path was not changed
- Medium for downstream clients that may still post announcement `status` directly instead of `action`

## 11. Test Checklist

- [x] Create Draft
- [x] Submit
- [x] Approve
- [x] Reject
- [x] Publish
- [ ] Schedule Publish
- [x] Notification
- [x] Permission
- [x] UI
- [x] Validation

## 12. Known Issues

- `Scheduled` / `Schedule Publish` is still not implemented in the shared content workflow or announcement data model
- There is no `scheduled_publish_at` field or scheduled publish executor in the current app flow
- This report therefore treats schedule publish as a remaining follow-up, not a completed part of this change

## 13. Recommendation

- If schedule publish is required next, implement it once at the shared workflow and schema level for both Announcement and Online Lesson together
- Add `scheduled` status, `scheduled_publish_at`, and a publish processor entrypoint before exposing schedule actions in UI

## Verification

- `npx tsc --noEmit`
- `npm run build`
