HH/.opencode/plans/appreciation-review-workflow.md
ismail c5f76b3855
Some checks are pending
Build and Push Docker Image / build (push) Waiting to run
updates
2026-05-11 14:45:30 +03:00

182 lines
6.9 KiB
Markdown

# Plan: Appreciation Review & Activation Workflow
## Current State
The appreciation system already exists with:
- **Models**: `Appreciation`, `AppreciationCategory`, `AppreciationBadge`, `AppreciationStats`
- **Public submission**: `/appreciation/public/submit/` — creates with `status=SENT` immediately
- **Email notifications**: Goes to the recipient (staff member) via signals
- **Department model**: Has `manager` (User FK) and `respondent` (Staff FK)
- **Staff model**: Has `is_head` boolean flag
## Problem
Current workflow immediately sends public appreciations to recipients without staff review. The user wants:
1. Appreciations saved as **pending** for staff review
2. Staff selects the actual staff member and assigns to department
3. Staff "activates" the appreciation
4. **Department head** receives email notification upon activation
## Solution
### 1. Modify Public Submission (DRAFT instead of SENT)
**File**: `apps/appreciation/ui_views.py``public_appreciation_submit`
**Changes**:
- Create appreciation with `status=DRAFT` instead of `SENT`
- Remove `appreciation.send()` call
- Store raw submitted data in `metadata` JSON field:
```json
{
"submitted_by_name": "...",
"submitted_by_phone": "...",
"submitted_by_email": "...",
"staff_name_mentioned": "...",
"source": "public_form"
}
```
- Keep `message_en` clean (just the message, not the formatted metadata string)
### 2. Add Review List Page
**New file**: `templates/appreciation/review_list.html`
**Modified file**: `apps/appreciation/ui_views.py` — add `appreciation_review_list` view
**Features**:
- Table of appreciations with `status=DRAFT`
- Columns: Reference, Hospital, Category, Message, Submitted Date, Actions
- "Review" button links to detail page
- "Activate" button (shortcut to activate without detail page)
- Filters: Hospital, Category, Date range
- Pagination
**Permissions**: PX Staff, Hospital Admin, PX Admin
### 3. Add Review Detail Page
**New file**: `templates/appreciation/review_detail.html`
**Modified file**: `apps/appreciation/ui_views.py` — add `appreciation_review` view
**Features**:
- Display appreciation details (message, submitted info from metadata)
- **Staff selection**: Dropdown of staff members (TomSelect)
- Filtered by hospital
- Searchable by name, staff ID
- **Department**: Auto-populated from selected staff's department
- Or manual override dropdown
- **Category**: Dropdown (can change from default)
- "Activate & Send" button
- Sets `status=SENT`
- Sets `recipient` to selected Staff
- Sets `department` to staff's department
- Triggers notification signal
- "Save as Draft" button (keep as DRAFT, update fields)
### 4. Update Email Notification to Department Head
**File**: `apps/appreciation/signals.py` — `send_appreciation_notification`
**Changes**:
- **Current**: Sends to `appreciation.recipient` (staff member)
- **New**: Also send to department head
- Department head = `appreciation.department.manager` (User)
- OR Staff in department with `is_head=True` → then get their user
- Send separate email to department head with subject: "New Appreciation for [Staff Name] in [Department]"
- Keep existing recipient email unchanged
### 5. Update Sidebar Navigation
**File**: `templates/layouts/partials/sidebar.html`
**Changes**:
- Add "Review Appreciations" link under Appreciations section
- Only visible to staff with review permissions (PX Staff, Admin roles)
- Show badge count of pending (DRAFT) appreciations
### 6. Update Appreciation List View
**File**: `apps/appreciation/ui_views.py` — existing list view
**Changes**:
- Add filter for `status` (DRAFT, SENT, ACKNOWLEDGED)
- Show DRAFT appreciations only to reviewers
- Show status badge (color-coded)
### 7. URL Routes
**File**: `apps/appreciation/urls.py`
**New routes**:
- `/appreciation/review/` — Review list
- `/appreciation/review/<uuid:pk>/` — Review detail
- `/appreciation/review/<uuid:pk>/activate/` — Activate action (POST)
### 8. Permissions
- **Public**: Can submit appreciations (no login)
- **Reviewers** (PX Staff, Hospital Admin, PX Admin): Can review and activate
- **Department Heads**: Receive email notifications on activation
- **Recipients** (Staff): View their appreciations after activation
## Database Changes
**No schema changes needed**. The existing `status` field already has `DRAFT` choice. Just need to:
- Use `metadata` JSON field to store submission data
- Use existing `recipient` generic FK to link to Staff
## Files to Modify
1. `apps/appreciation/ui_views.py` — Modify public submit, add review views
2. `apps/appreciation/signals.py` — Update notification to include department head
3. `apps/appreciation/urls.py` — Add review routes
4. `templates/layouts/partials/sidebar.html` — Add review navigation
5. `templates/core/public_submit.html` — Update appreciation form (if needed)
## New Files to Create
1. `templates/appreciation/review_list.html` — Review list page
2. `templates/appreciation/review_detail.html` — Review detail page
3. `templates/appreciation/emails/department_head_notification.html` — Email template for dept head
4. `templates/appreciation/emails/department_head_notification.txt` — Plain text version
## Expected User Flow
1. **Patient** visits public page → selects "Appreciation" → fills form (name, phone, message, staff name mentioned) → submits
2. **System** saves appreciation as DRAFT with metadata
3. **PX Staff** logs in → sees "Review Appreciations" in sidebar with badge count → clicks
4. **Staff** views list of draft appreciations → clicks "Review" on one
5. **Staff** sees form with:
- Patient info (from metadata)
- Staff selector (searchable dropdown)
- Department (auto-filled)
- Category selector
6. **Staff** selects staff member → clicks "Activate & Send"
7. **System**:
- Sets status to SENT
- Links recipient to selected Staff
- Sets department from staff
- Triggers signal
8. **Signal handler** sends emails:
- To recipient (staff member) — existing
- To department head — NEW
9. **Department Head** receives email: "New appreciation for [Staff] in [Department]"
10. **Staff** (recipient) receives email: "You've received an appreciation!"
## Email Recipients
When appreciation is activated, send to:
1. **Recipient** (staff member who received appreciation) — existing behavior
2. **Department Head** — NEW:
- Primary: `department.manager` (User) if exists and has email
- Fallback: Staff in department with `is_head=True` → get their user → send to user.email
- If no department head found, skip (don't fail)
## User Clarifications
1. **Hospital selection**: Patient selects from dropdown (keep current)
2. **Staff mention**: Patient mentions staff name as free text (keep current)
3. **Department head**: BOTH `department.manager` (User) AND Staff with `is_head=True` → get user → send to user.email
4. **Tracking code**: Not needed
5. **Department head UI access**: Not specified — will only send emails for now