# Complaint Escalation Dropdown Implementation ## Overview Modified the escalate complaint modal to show a dropdown for selecting who to escalate to, with the staff's manager pre-selected as the default. ## Changes Made ### 1. Backend - `apps/complaints/ui_views.py` #### Added Logger Import ```python import logging logger = logging.getLogger(__name__) ``` #### Updated `complaint_detail` View Added escalation targets to the context: ```python # Get escalation targets (for escalate modal dropdown) escalation_targets = [] default_escalation_target = None if complaint.hospital: # Get hospital admins and department managers as escalation targets escalation_targets = list(User.objects.filter( is_active=True, hospital=complaint.hospital ).filter( models.Q(role='hospital_admin') | models.Q(role='department_manager') | models.Q(role='px_admin') ).select_related('department').order_by('first_name', 'last_name')) # If complaint has staff with a manager, add manager as default if complaint.staff and complaint.staff.report_to: # Try to find the manager's user account manager_user = None if complaint.staff.report_to.user: manager_user = complaint.staff.report_to.user else: # Try to find by email manager_user = User.objects.filter( email=complaint.staff.report_to.email, is_active=True ).first() if manager_user and manager_user not in escalation_targets: escalation_targets.insert(0, manager_user) if manager_user: default_escalation_target = manager_user.id ``` Added to context: ```python "escalation_targets": escalation_targets, "default_escalation_target": default_escalation_target, ``` #### Updated `complaint_escalate` View Modified to accept and handle the `escalate_to` parameter: ```python reason = request.POST.get("reason", "") escalate_to_id = request.POST.get("escalate_to", "") # Get the escalation target user escalate_to_user = None if escalate_to_id: escalate_to_user = User.objects.filter(id=escalate_to_id, is_active=True).first() # If no user selected or user not found, default to staff's manager if not escalate_to_user and complaint.staff and complaint.staff.report_to: if complaint.staff.report_to.user: escalate_to_user = complaint.staff.report_to.user else: # Try to find by email escalate_to_user = User.objects.filter( email=complaint.staff.report_to.email, is_active=True ).first() # Mark as escalated and assign to selected user complaint.escalated_at = timezone.now() if escalate_to_user: complaint.assigned_to = escalate_to_user complaint.save(update_fields=["escalated_at", "assigned_to"]) ``` Features added: - Creates detailed escalation message with target user name - Sends email notification to the escalated user - Logs audit with escalation details - Shows success message with the name of the person escalated to ### 2. Frontend - `templates/complaints/complaint_detail.html` #### Updated Escalate Modal **Before:** - Simple modal with just a reason text area - No selection of who to escalate to **After:** - Dropdown to select escalation target (required field) - Shows all hospital admins, department managers, and PX admins - Manager of the staff is pre-selected by default (marked with [Manager (Default)]) - Shows department and role for each target - Helpful text explaining the default selection - Warning if no manager is assigned **Template Code:** ```html
{% if complaint.staff and complaint.staff.report_to %}
{% trans "Default selected is" %} {{ complaint.staff.report_to.get_full_name }} ...
{% else %}
{% trans "No manager assigned to this staff member..." %}
{% endif %}
``` ## User Flow ### Scenario 1: Staff Has Manager Assigned 1. Admin opens complaint detail page 2. Clicks "Escalate" button 3. Modal opens with dropdown pre-selected to staff's manager 4. Manager's name shows with "[Manager (Default)]" label 5. Admin can either: - Keep the default (manager) and submit - Select a different person from the dropdown 6. On submit: - Complaint is assigned to the selected user - Escalation update is created with details - Selected user receives email notification - Admin sees success message with selected person's name ### Scenario 2: Staff Has No Manager Assigned 1. Admin opens complaint detail page 2. Clicks "Escalate" button 3. Modal opens with dropdown but no default selection 4. Warning message shows: "No manager assigned to this staff member" 5. Admin must select a person from the dropdown 6. On submit: Same flow as above ## Escalation Target Selection ### Available Targets Include: - **Staff's Manager** (default, if exists) - marked with "[Manager (Default)]" - Hospital Admins - Department Managers - PX Admins ### Display Format: ``` John Smith (Cardiology) - Hospital Admin [Manager (Default)] Sarah Johnson (Emergency) - Department Manager Mike Davis (Surgery) - PX Admin ``` ## API Changes ### `POST /complaints/{id}/escalate/` **Parameters:** - `reason` (required): Reason for escalation - `escalate_to` (optional): User ID to escalate to (defaults to staff's manager) **Behavior:** - If `escalate_to` is provided and valid, escalates to that user - If `escalate_to` is not provided or invalid, defaults to staff's manager - If staff has no manager and no target is selected, escalation proceeds without assignment ## Files Modified 1. `apps/complaints/ui_views.py` - Added logging import - Updated `complaint_detail` to pass escalation targets - Updated `complaint_escalate` to handle target selection 2. `templates/complaints/complaint_detail.html` - Updated escalate modal with dropdown - Added default selection logic - Added help text and warnings ## Testing Checklist - [ ] Open complaint with staff who has manager → Manager pre-selected - [ ] Open complaint with staff who has no manager → No default, warning shown - [ ] Escalate with default manager → Success, manager gets email - [ ] Escalate with different target → Success, selected person gets email - [ ] Escalate without selecting target when no manager → Works without assignment - [ ] Verify escalation appears in complaint timeline - [ ] Verify audit log captures escalation details - [ ] Verify assigned_to field is updated to selected user