All checks were successful
Build and Push Docker Image / build (push) Successful in 4m14s
Reference numbers (unified scheme PREFIX-YYYYMM-HOSP-NNNN, e.g. CMP-202606-HHN-0001): - new ReferenceSequence model + generate_reference() helper (apps/core) - Complaint/Inquiry/Observation/Appreciation/Suggestion emit unified refs via save() - prefix-based auto-routing in public track API (CMP/INQ/OBS trackable; APR/SGT internal-only) - removed legacy CMP-/INQ- generators in ui_views, integrations, px_sources - migrations: core.0003_referencesequence, appreciation.0006, feedback.0008, observations.0012 - unit tests (format, sanitization, monthly reset, 40-thread concurrency) QA audit: - isolated E2E hospital sandbox mirroring HH-N + 10 role users (create_e2e_isolated_env) - feedback-modules-audit.spec.ts + audit helper (headed, run-to-completion) - reports/feedback-modules-qa-report.md Also bundles accumulated in-progress work across complaints, observations, organizations, templates, and other modules.
116 lines
4.6 KiB
Markdown
116 lines
4.6 KiB
Markdown
# Fix: Re-import Complaints with Missing Data
|
|
|
|
## Overview
|
|
Full re-import of all complaints (2022-2025) to fix missing timeline dates, satisfaction, resolution_outcome, and other data.
|
|
|
|
## Steps
|
|
|
|
### 1. Delete all existing complaints
|
|
```python
|
|
Complaint.objects.all().delete()
|
|
```
|
|
|
|
### 2. Fix `import_historical_complaints.py` (2022-2024)
|
|
|
|
**2a. Fix COLUMN_MAPPING — add missing columns:**
|
|
```python
|
|
COLUMN_MAPPING = {
|
|
# ... existing mappings ...
|
|
"form_sent_date": 12, # إرسال نموذج الشكوى → form_sent_at
|
|
"activated_date": 17, # تفعيل الشكوى → activated_at
|
|
# col 20 (date_sent) stays → forwarded_to_dept_at (was wrongly mapped to activated_at)
|
|
"escalation_reason": 35, # Reason of Escalation → metadata
|
|
"recommendation": 58, # Recommendation/Action plan → recommendation_action_plan
|
|
}
|
|
```
|
|
|
|
**2b. Fix Complaint.objects.create() — add fields:**
|
|
- `form_sent_at=form_sent_date` (col 12)
|
|
- `activated_at=activated_date` (col 17, NOT col 20)
|
|
- `forwarded_to_dept_at=date_sent` (col 20, was wrongly in activated_at)
|
|
- `satisfaction=normalize_satisfaction(satisfaction_val)` (col 56, write to model field NOT just metadata)
|
|
- `recommendation_action_plan=recommendation` (col 58)
|
|
|
|
**2c. Add satisfaction normalization helper:**
|
|
```python
|
|
def _normalize_satisfaction(self, val):
|
|
val = str(val or "").strip().lower()
|
|
mapping = {"satisfied": "satisfied", "dissatisfied": "dissatisfied", "no response": "no_response"}
|
|
return mapping.get(val, "")
|
|
```
|
|
|
|
### 3. Fix `import_2025_complaints_basic.py`
|
|
|
|
**3a. Fix HEADER_ALIASES — fix satisfaction and add missing columns:**
|
|
```python
|
|
HEADER_ALIASES = {
|
|
# ... existing correct mappings ...
|
|
"satisfaction": ["Satisfied/Dissatisfied"], # FIXED: was pointing to wrong column
|
|
"rightful_side": ["The Rightful Side"], # NEW: col 66
|
|
"complaint_subject": ["موضوع الشكوى الأساسية"], # NEW: col 53
|
|
"form_sent_date": ["إرسال نموذج الشكوى"], # NEW: col 16
|
|
"activated_date": ["تفعيل الشكوى"], # NEW: col 21
|
|
"sent_date": ["تم ارسال الشكوى"], # NEW: col 24
|
|
"first_reminder": ["First Reminder Sent"], # NEW: col 28
|
|
"second_reminder": ["Second Reminder Sent"], # NEW: col 32
|
|
"escalated_date": ["Escalated"], # NEW: col 36
|
|
"closed_date": ["Closed"], # NEW: col 40
|
|
"resolved_date": ["Resolved"], # NEW: col 44
|
|
"delay_reason": ["سبب تأخير القسم بالرد"], # NEW: col 58
|
|
"closure_delay": ["سبب تأخير اغلاق الشكوى خلال 72 ساعه"], # col 59
|
|
"action_taken": ["الاجراء المتخذ من قبل القسم المعني"], # col 62
|
|
"action_result": ["نتيجة الاجراء المتخذ بعد التحقيق"], # col 63
|
|
"recommendation": ["Recommendation/Action plan"], # col 64
|
|
"solutions": ["حلول واقتراحات"], # col 67
|
|
}
|
|
```
|
|
|
|
**3b. Fix _process_sheet() — parse new timeline dates:**
|
|
Add parsing for all new date fields (form_sent_date, activated_date, sent_date, first_reminder, second_reminder, escalated_date, closed_date, resolved_date).
|
|
|
|
**3c. Fix status determination:**
|
|
```python
|
|
# Current: only checks response_date → open/resolved
|
|
# Fixed: check all dates like historical script
|
|
if closed_date:
|
|
status = "closed"
|
|
elif resolved_date:
|
|
status = "resolved"
|
|
elif escalated_date:
|
|
status = "in_progress"
|
|
else:
|
|
status = "open"
|
|
```
|
|
|
|
**3d. Fix Complaint.objects.create() — add all missing fields:**
|
|
- `activated_at=activated_date`
|
|
- `form_sent_at=form_sent_date`
|
|
- `forwarded_to_dept_at=sent_date`
|
|
- `reminder_sent_at=first_reminder`
|
|
- `second_reminder_sent_at=second_reminder`
|
|
- `escalated_at=escalated_date`
|
|
- `closed_at=closed_date`
|
|
- `resolved_at=resolved_date`
|
|
- `satisfaction=normalize_satisfaction(satisfaction_val)`
|
|
- `resolution_outcome=normalize_rightful_side(rightful_side)`
|
|
- `complaint_subject=complaint_subject`
|
|
- `explanation_delay_reason=delay_reason`
|
|
- `delay_reason_closure=closure_delay`
|
|
- `action_taken_by_dept=action_taken`
|
|
- `action_result=action_result`
|
|
- `recommendation_action_plan=recommendation or solutions`
|
|
|
|
### 4. Run re-import
|
|
```bash
|
|
python manage.py shell -c "from apps.complaints.models import Complaint; Complaint.objects.all().delete()"
|
|
python manage.py import_all_complaints --hospital-code=HH-N
|
|
python manage.py backfill_sent_to_department
|
|
```
|
|
|
|
### 5. Verify
|
|
- Check complaint counts match
|
|
- Check timeline dates populated
|
|
- Check satisfaction field populated
|
|
- Check resolution_outcome populated
|
|
- Check department detail page shows correct data
|