# Phase 10: Support Ticket System **Status:** Not started **Depends on:** Phase 9 (Email Dispatcher — for email notifications) ## Goal Polish and harden the existing ticket system with SLA tracking display, email notifications on ticket create/reply, priority auto-escalation, and ticket assignment. ## Planned Scope ### Backend **Email notifications** (using Phase 9 HTML templates) - New ticket created → email to super admin(s) - Super admin replies → email to school admin - School admin replies → email to super admin(s) - Template: `ticket_notification.html` **SLA display** - `first_response_at` already stored — compute SLA status in list endpoint: - `sla_status`: `on_track` | `at_risk` (>24h no response) | `breached` (>48h no response) - Add `sla_status` to ticket list response **Priority auto-escalation** (new Celery task `tickets.escalate_stale`) - Scheduled every hour - Tickets open > 48h with `priority = normal` → set `priority = high` - Tickets open > 72h with no reply → set `priority = urgent` **Ticket assignment** - `assigned_to: str | None` column already on model - `PUT /api/tickets/{id}` already accepts `assigned_to` - Add `GET /api/users?role=super_admin` filter for assignee picker **Bulk actions** - `POST /api/tickets/bulk-close` — close list of resolved ticket IDs (super admin) ### Frontend **TicketsPage.vue** — super admin view enhancements - SLA status column (green/amber/red badge) - Assignee column + inline assign dropdown - Priority badge - Bulk close: checkbox selection + "Close Selected" button - Status filter tabs (All / Open / In Progress / Resolved / Closed) **TicketDetailPage.vue** — enhancements - Assignee selector - Priority selector - SLA timer display (hours since opened, color-coded) - Internal notes clearly marked with lock icon (super admin only) **worker.py** — add `tickets.escalate_stale` to beat schedule (every hour) ## Key Files to Modify - `backend/app/routers/tickets.py` — SLA status in response, bulk-close endpoint - `backend/app/tasks/tickets.py` (new) — escalate_stale task - `backend/app/worker.py` — add escalation task to beat schedule - `backend/app/templates/email/ticket_notification.html` (new) - `frontend/src/pages/TicketsPage.vue` — SLA, assign, bulk close - `frontend/src/pages/TicketDetailPage.vue` — SLA timer, assign, priority - `frontend/src/lib/api.ts` — bulkCloseTickets