# Complaint Form Django Form Implementation

## Summary

The complaint form has been successfully refactored to use Django's built-in form rendering instead of manual HTML fields and complex AJAX calls.

## Changes Made

### 1. New `ComplaintForm` in `apps/complaints/forms.py`

**Fields Included:**
- `patient` - Required dropdown, filtered by user hospital
- `hospital` - Required dropdown, pre-filtered by user permissions
- `department` - Optional dropdown, filtered by selected hospital
- `staff` - Optional dropdown, filtered by selected department
- `encounter_id` - Optional text field
- `description` - Required textarea

**Fields Removed (AI will determine):**
- `category` - AI will determine automatically
- `subcategory` - AI will determine automatically
- `source` - Set to 'staff' for authenticated users

**Features:**
- User permission filtering (PX admins see all, hospital users see only their hospital)
- Dependent queryset initialization (departments load when hospital is pre-selected)
- Full Django form validation
- Clean error messages

### 2. Updated `complaint_create` View in `apps/complaints/ui_views.py`

**Changes:**
- Uses `ComplaintForm(request.POST, user=request.user)` for form handling
- Handles `form.is_valid()` validation
- Sets AI defaults before saving:
  - `title = 'Complaint'` (AI will generate)
  - `category = None` (AI will determine)
  - `subcategory = ''` (AI will determine)
  - `source = 'staff'` (default for authenticated users)
  - `priority = 'medium'` (AI will update)
  - `severity = 'medium'` (AI will update)
- Creates initial update record
- Triggers AI analysis via Celery
- Logs audit trail
- Handles hospital parameter for form pre-selection

### 3. Updated Template `templates/complaints/complaint_form.html`

**Changes:**
- Uses Django form rendering: `{{ form.field }}`
- Removed all manual HTML input fields
- Removed complex AJAX endpoints
- Kept minimal JavaScript:
  - Hospital change → reload form with hospital parameter
  - Department change → load staff via `/complaints/ajax/physicians/`
  - Form validation

**Removed AJAX Endpoints:**
- `/api/organizations/departments/` - No longer needed
- `/api/organizations/patients/` - No longer needed
- `/complaints/ajax/get-staff-by-department/` - Changed to `/complaints/ajax/physicians/`

**Structure:**
- Patient Information section
- Organization section (Hospital, Department, Staff)
- Complaint Details section (Description)
- AI Classification info alert
- SLA Information alert
- Action buttons

## Benefits

1. **Simpler Code** - Django handles form rendering and validation
2. **Better Error Handling** - Form validation with clear error messages
3. **Less JavaScript** - Only minimal JS for dependent dropdowns
4. **Cleaner Separation** - Business logic in forms, presentation in templates
5. **User Permissions** - Automatic filtering based on user role
6. **AI Integration** - Category, subcategory, severity, and priority determined by AI

## Testing Checklist

- [ ] Form loads correctly for PX admin users
- [ ] Form loads correctly for hospital users (filtered to their hospital)
- [ ] Hospital dropdown pre-fills when hospital parameter in URL
- [ ] Department dropdown populates when hospital selected
- [ ] Staff dropdown populates when department selected
- [ ] Form validation works for required fields
- [ ] Complaint saves successfully
- [ ] AI analysis task is triggered after creation
- [ ] User is redirected to complaint detail page
- [ ] Back links work for both regular and source users

## Related Files

- `apps/complaints/forms.py` - ComplaintForm definition
- `apps/complaints/ui_views.py` - complaint_create view
- `templates/complaints/complaint_form.html` - Form template
- `apps/complaints/urls.py` - URL configuration
- `apps/complaints/tasks.py` - AI analysis task

## Notes

- The form uses a simple reload approach for hospital selection to keep JavaScript minimal
- Staff loading still uses AJAX because it's a common pattern and provides good UX
- All AI-determined fields are hidden from the user interface
- The form is bilingual-ready using Django's translation system
