8.1 KiB
8.1 KiB
Explanation Request Workflow Implementation
Overview
Modified the explanation request system with the following workflow:
- Initial Request: Link sent to staff, informational notification to manager
- Escalation: If staff doesn't respond within SLA, manager gets a link to respond
- Manager Response: Manager can submit their perspective when escalated
Workflow Diagram
┌─────────────────────────────────────────────────────────────────────┐
│ EXPLANATION REQUEST FLOW │
└─────────────────────────────────────────────────────────────────────┘
INITIAL REQUEST
│
├──► Staff receives: Link to submit explanation
│ (can respond immediately)
│
└──► Manager receives: Informational email only
(no link - just notification)
│
│
┌──────────────┴──────────────┐
│ │
[Staff responds] [No response]
│ │
▼ ▼
Explanation saved After SLA deadline
System notifies (e.g., 48 hours)
assigned user │
▼
ESCALATION TRIGGERED
│
▼
Manager receives:
Link to submit explanation
as escalation response
│
▼
[Manager responds]
│
▼
Manager explanation saved
Linked to staff explanation
Changes Made
1. Backend API (apps/complaints/views.py)
request_explanation method
Behavior:
- Creates ONE explanation record (for staff only)
- Sends link to staff member
- Sends informational email to manager (no link, no token)
Staff Email:
- Subject: "Explanation Request - Complaint #..."
- Contains: Link to submit explanation
- SLA deadline applies
Manager Email:
- Subject: "Staff Explanation Request Notification - Complaint #..."
- Contains: Complaint details for awareness
- States: "If no response is received within the SLA deadline, you will receive a follow-up request with a link to provide your perspective as the manager."
- NO link/token included
API Response:
{
"success": true,
"results": [
{
"recipient_type": "staff",
"recipient": "Dr. Ahmed Smith",
"sent": true,
"explanation_id": "..."
},
{
"recipient_type": "manager",
"recipient": "Dr. Sarah Johnson",
"sent": true,
"informational_only": true,
"note": "Manager will receive link if staff does not respond within SLA"
}
],
"staff_explanation_id": "...",
"manager_notified": true
}
resend_explanation method
Behavior:
- Only resends to staff member (regenerates token)
- Manager informational email is NOT resent (they already received it)
2. Celery Tasks (apps/complaints/tasks.py)
check_overdue_explanation_requests task
Behavior:
- Runs every 15 minutes
- Finds staff explanations that are overdue (past SLA deadline)
- Creates NEW explanation record for manager with:
- Unique token/link
- Fresh SLA deadline
- Escalation metadata
- Sends email to manager with link
Manager Escalation Email:
- Subject: "Explanation Request: Complaint #..."
- Contains: Link to submit explanation
- Message: "ESCALATED: [Staff Name] did not provide an explanation within the SLA deadline..."
Escalation Linkage:
staff_explanation.escalated_to_manager = manager_explanation
staff_explanation.escalated_at = now
3. UI Template (templates/complaints/complaint_detail.html)
Before Request:
- Shows staff as primary recipient (with link)
- Shows manager as "Notification Only"
- Note: "Will receive link only if staff doesn't respond within SLA"
After Request:
- Shows staff explanation status
- Shows manager escalation status (when applicable)
- Distinguishes between:
- "Explanation from Staff" / "Pending Staff Explanation"
- "Explanation from Manager (Escalated)" / "Pending Manager Explanation"
Data Model
Staff Explanation Record
{
"id": "uuid",
"staff": staff_id,
"token": "secure_token_for_staff",
"is_used": false/true,
"sla_due_at": "2026-02-12T10:00:00Z",
"escalated_to_manager": null or manager_explanation_id,
"escalated_at": null or timestamp,
"metadata": {
"escalation_level": 0 // Staff is level 0
}
}
Manager Explanation Record (Created on Escalation)
{
"id": "uuid",
"staff": manager_id, // The manager
"token": "secure_token_for_manager",
"is_used": false/true,
"sla_due_at": "2026-02-14T10:00:00Z", // Fresh SLA
"escalated_to_manager": null, // Manager can also escalate up
"metadata": {
"escalated_from_explanation_id": "staff_explanation_id",
"escalation_level": 1,
"original_staff_id": "staff_id",
"original_staff_name": "Staff Name",
"is_escalation": True
}
}
API Endpoints
POST /api/complaints/{id}/request_explanation/
Send initial explanation request to staff + informational notification to manager.
POST /api/complaints/{id}/resend_explanation/
Resend explanation request to staff only (new token).
GET /complaints/{complaint_id}/explain/{token}/
Public form for submitting explanation (works for both staff and manager tokens).
Escalation Hierarchy
Level 0: Staff (initial request with link)
↓ (if no response within SLA)
Level 1: Manager (receives link via escalation)
↓ (if no response within SLA)
Level 2: Manager's Manager (receives link via escalation)
↓
Level 3+: Continue up hierarchy...
Benefits of This Approach
- Staff Priority: Staff gets first chance to respond with direct link
- Manager Awareness: Manager is informed immediately but not burdened with link
- Clear Escalation Path: Manager only gets involved if staff doesn't respond
- Audit Trail: Clear record of escalation from staff to manager
- Fresh SLA: Manager gets their own SLA deadline when escalated
- Parallel Visibility: Both explanations visible in complaint detail
Testing Scenarios
Scenario 1: Staff Responds Immediately
- Request explanation → Staff gets link, Manager gets notification
- Staff clicks link and submits explanation
- System shows "Explanation from Staff" as submitted
- Manager escalation never triggered
Scenario 2: Staff Doesn't Respond
- Request explanation → Staff gets link, Manager gets notification
- Staff doesn't respond within SLA (e.g., 48 hours)
- Escalation task runs → Manager gets link
- Manager submits explanation
- System shows:
- Staff: "Pending Explanation (Overdue)"
- Manager: "Explanation from Manager (Escalated)"
Scenario 3: No Manager Assigned
- Request explanation → Only staff gets email
- System shows warning "No manager assigned"
- If staff doesn't respond, no escalation possible
Files Modified
apps/complaints/views.py-request_explanationandresend_explanationmethodsapps/complaints/tasks.py-check_overdue_explanation_requeststasktemplates/complaints/complaint_detail.html- UI updates
Backward Compatibility
- Existing staff explanations work as before
- Manager escalation creates new explanation record
- No database migrations required
- API endpoints remain at same URLs