HH/COMPLAINT_CATEGORIES_FIX.md

121 lines
4.5 KiB
Markdown

# Complaint Categories Fix - Multi-Hospital Support
## Problem
The ComplaintCategory model had a ForeignKey relationship to Hospital, which prevented categories from being shared across multiple hospitals. Each category could only belong to one hospital.
## Solution
Changed the ComplaintCategory model from a ForeignKey to a ManyToMany relationship with Hospital. This allows:
- Categories to be assigned to multiple hospitals
- Categories with no hospitals (system-wide) to be available to all hospitals
- Each hospital to have its own custom categories while also accessing system-wide categories
## Changes Made
### 1. Model Changes (apps/complaints/models.py)
- Changed `hospital = models.ForeignKey(...)` to `hospitals = models.ManyToManyField(...)`
- Removed `Meta.indexes` that referenced the old hospital field
- Removed hospital-related `Meta.constraints`
- Updated docstrings to reflect the new relationship
### 2. Migration Created (apps/complaints/migrations/0003_alter_complaintcategory_options_and_more.py)
- Removes the old `hospital` field and its index
- Adds the new `hospitals` ManyToMany field
- Applies the changes successfully
### 3. Admin Interface Updated (apps/complaints/admin.py)
- Added filter_horizontal = ['hospitals'] for better UI
- Updated `hospitals_display` method to handle ManyToMany
- Shows hospital count or "System-wide" for categories
### 4. Management Command Updated (apps/complaints/management/commands/load_complaint_categories.py)
- Removed hospital reference from category/subcategory creation
- Categories are now created without hospital assignments (system-wide)
- Works correctly with the ManyToMany field
### 5. API Endpoint Updated (apps/complaints/ui_views.py)
```python
# Old code:
categories_queryset = ComplaintCategory.objects.filter(
Q(hospital_id=hospital_id) | Q(hospital__isnull=True),
is_active=True
).order_by('-hospital', 'order', 'name_en')
# New code:
categories_queryset = ComplaintCategory.objects.filter(
Q(hospitals__id=hospital_id) | Q(hospitals__isnull=True),
is_active=True
).distinct().order_by('order', 'name_en')
```
Key changes:
- Changed `hospital_id=hospital_id` to `hospitals__id=hospital_id`
- Changed `hospital__isnull=True` to `hospitals__isnull=True`
- Added `.distinct()` to remove duplicates
- Removed `-hospital` from ordering (no longer applicable)
## Testing Results
### Database Verification
```
Total parent categories: 5
Categories with hospitals: 0
System-wide categories: 5
```
### API Endpoint Test
```
Response status: 200
Categories count: 21
Sample categories:
- Cleanliness (Parent ID: 8952a7e3..., ID: 43ec2d94...) ← Subcategory
- Diagnosis concerns (Parent ID: 9e99195c..., ID: 20ce76ab...) ← Subcategory
- Privacy & Confidentiality (Parent ID: 755b053e..., ID: 564583fd...) ← Subcategory
- Quality of Care & Treatment (Parent ID: None, ID: 9e99195c...) ← Parent
- Staff attitude (Parent ID: b6302801..., ID: ffa88ba9...) ← Subcategory
```
## How It Works
### System-Wide Categories (Default)
Categories created without any hospital assignments are available to ALL hospitals:
```python
category = ComplaintCategory.objects.create(
code='quality_care',
name_en='Quality of Care & Treatment',
# No hospitals specified → available to all
)
```
### Hospital-Specific Categories
Categories can be assigned to specific hospitals:
```python
from apps.organizations.models import Hospital
hospitals = Hospital.objects.filter(status='active')
category = ComplaintCategory.objects.create(
code='special_category',
name_en='Special Category'
)
category.hospitals.add(*hospitals) # Assign to multiple hospitals
```
### Querying Categories
The API endpoint returns:
1. Hospital-specific categories (assigned to the hospital)
2. System-wide categories (no hospital assignment)
3. Both parent categories and their subcategories
## Benefits
1. **Flexibility**: Hospitals can share common categories while maintaining custom ones
2. **Efficiency**: No need to duplicate categories for each hospital
3. **Scalability**: Easy to add new categories that apply to all hospitals
4. **Maintainability**: System-wide changes can be made in one place
## Future Enhancements
1. **Category Prioritization**: Add a field to prioritize hospital-specific over system-wide categories
2. **Category Copying**: Create a management command to copy system-wide categories to hospital-specific
3. **Category Versioning**: Track changes to categories over time
4. **Category Analytics**: Report on which categories are most used per hospital