HH/docs/HIS_SIMULATOR_GUIDE.md
2026-01-24 15:27:30 +03:00

417 lines
14 KiB
Markdown

# HIS Simulator - Complete Implementation Guide
## Overview
The HIS (Hospital Information System) simulator is a continuous event generator that simulates patient journeys through the healthcare system and sends survey invitations when journeys are complete.
## Architecture
```
┌─────────────────┐
│ HIS Simulator │
│ (Python) │
└────────┬────────┘
│ Sends events
┌─────────────────┐
│ PX360 API │
│ /api/simulator│
│ /his-events/ │
└────────┬────────┘
├─► Creates Patient
├─► Creates Journey Instance
├─► Completes Stages
└─► Sends Survey
┌───────────────┐
│ Notifications │
│ Service │
└───────────────┘
┌────────┴────────┐
↓ ↓
Email Simulator SMS Simulator
(Terminal + SMTP) (Terminal)
```
## Components
### 1. Journey Templates & Surveys
**File:** `apps/simulator/management/commands/seed_journey_surveys.py`
Creates:
- **EMS Journey** (2-4 random stages)
- Stages: Ambulance Dispatch, On Scene Care, Patient Transport, Hospital Handoff
- Survey: EMS Experience Survey (4 questions)
- **Inpatient Journey** (3-6 random stages)
- Stages: Admission, Treatment, Nursing Care, Lab Tests, Radiology, Discharge
- Survey: Inpatient Experience Survey (7 questions)
- **OPD Journey** (3-5 random stages)
- Stages: Registration, Consultation, Lab Tests, Radiology, Pharmacy
- Survey: OPD Experience Survey (7 questions)
### 2. HIS Simulator Script
**File:** `apps/simulator/his_simulator.py`
Features:
- Continuous event generation (infinite or limited)
- Generates realistic patient data (Arabic names, Saudi phone numbers)
- Creates both full and partial journeys (40% full, 60% partial)
- Sends events to PX360 API
- Displays statistics every 10 patients
- Configurable delay between events
### 3. API Endpoint
**File:** `apps/simulator/views.py` - `his_events_handler()`
Endpoint: `POST /api/simulator/his-events/`
Processes:
1. Patient creation/retrieval
2. Journey instance creation
3. Stage instance completion
4. Post-discharge survey sending (when journey complete)
### 4. Survey Sending
**File:** `apps/simulator/views.py` - `send_post_discharge_survey()`
When journey is complete:
- Creates `SurveyInstance`
- Sends email via `NotificationService.send_survey_invitation()`
- Sends SMS via `NotificationService.send_sms()`
- Both email and SMS contain secure survey link
## Setup Instructions
### Step 1: Seed Journey Templates and Surveys
```bash
# Run management command
python manage.py seed_journey_surveys
```
This creates:
- Hospital: Al Hammadi Hospital (ALH-main)
- Departments: Emergency, Cardiology, Orthopedics, Pediatrics, Lab, Radiology, Pharmacy, Nursing
- 3 Journey Templates (EMS, Inpatient, OPD) with random stages
- 3 Survey Templates with bilingual questions
### Step 2: Start Django Server
```bash
# In one terminal
python manage.py runserver
```
### Step 3: Run HIS Simulator
```bash
# In another terminal
python apps/simulator/his_simulator.py
```
**Options:**
```bash
# Default settings (infinite patients, 5 second delay)
python apps/simulator/his_simulator.py
# Custom URL
python apps/simulator/his_simulator.py --url http://localhost:8000/api/simulator/his-events/
# Custom delay (10 seconds between patients)
python apps/simulator/his_simulator.py --delay 10
# Limited patients (stop after 20 patients)
python apps/simulator/his_simulator.py --max-patients 20
# Combined options
python apps/simulator/his_simulator.py --url http://localhost:8000/api/simulator/his-events/ --delay 3 --max-patients 50
```
## Expected Output
### HIS Simulator Output
```
======================================================================
🏥 HIS SIMULATOR - Patient Journey Event Generator
======================================================================
API URL: http://localhost:8000/api/simulator/his-events/
Delay: 5 seconds between events
Max Patients: Infinite
======================================================================
Starting simulation... Press Ctrl+C to stop
📤 Sending 4 events for Ahmed Al-Saud...
✅ 🏥 Patient Journey Created
Patient: Ahmed Al-Saud
Encounter ID: ENC-2024-00123
Type: OPD - Partial Journey
Stages: 3/5 completed
API Status: Success
```
### Email Simulator Output (in Django terminal)
```
╔═══════════════════════════════════════════════════════════════════════════════╗
║ 📧 EMAIL SIMULATOR ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ Request #: 1 ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ To: ahmed.alsaud@gmail.com ║
║ Subject: Your Experience Survey - Al Hammadi Hospital ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ Message: ║
║ Dear Ahmed Al-Saud, ║
║ Thank you for your visit to Al Hammadi Hospital. ║
║ We value your feedback and would appreciate if you could take ║
║ a few minutes to complete our survey. ║
║ Survey Link: http://localhost:8000/surveys/abc123xyz/ ║
╚═══════════════════════════════════════════════════════════════════════════════╝
```
### SMS Simulator Output (in Django terminal)
```
╔═══════════════════════════════════════════════════════════════════════════════╗
║ 📱 SMS SIMULATOR ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ Request #: 1 ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ To: +966501234567 ║
║ Time: 2024-01-20 16:30:00 ║
╠═══════════════════════════════════════════════════════════════════════════════╣
║ Message: ║
║ Your experience survey is ready: ║
║ http://localhost:8000/surveys/abc123xyz/ ║
╚═══════════════════════════════════════════════════════════════════════════════╝
```
## Statistics Output (every 10 patients)
```
======================================================================
📊 SIMULATION STATISTICS
======================================================================
Total Journeys: 10
Successful: 10 (100.0%)
Failed: 0
Full Journeys: 4
Partial Journeys: 6
EMS Journeys: 3
Inpatient Journeys: 4
OPD Journeys: 3
Total Events Sent: 38
======================================================================
```
## Testing Scenarios
### Scenario 1: Full Journey with Survey
1. HIS simulator generates patient with full OPD journey (5 stages)
2. All 5 events sent to API
3. Journey marked as complete
4. Survey instance created
5. Email and SMS sent with survey link
**Check:**
```bash
# Check survey was created
python manage.py shell
>>> from apps.surveys.models import SurveyInstance
>>> SurveyInstance.objects.count() # Should be > 0
>>> survey = SurveyInstance.objects.first()
>>> survey.status # Should be 'pending'
>>> survey.get_survey_url() # Should return URL
```
### Scenario 2: Partial Journey (No Survey)
1. HIS simulator generates patient with partial EMS journey (2 of 4 stages)
2. Only 2 events sent to API
3. Journey NOT complete
4. NO survey created
5. NO email/SMS sent
**Check:**
```bash
# Check journey status
python manage.py shell
>>> from apps.journeys.models import PatientJourneyInstance
>>> journey = PatientJourneyInstance.objects.last()
>>> journey.is_complete() # Should be False
```
### Scenario 3: Multiple Stages
1. Patient starts journey
2. First stage completed → journey created
3. Second stage completed → journey updated
4. Third stage completed → journey still not complete
5. Fourth stage completed → journey complete → survey sent
**Check:**
```bash
# Check stage instances
python manage.py shell
>>> from apps.journeys.models import PatientJourneyStageInstance, StageStatus
>>> journey = PatientJourneyInstance.objects.last()
>>> stages = journey.stage_instances.all()
>>> for stage in stages:
... print(f"{stage.stage_template.name}: {stage.status}")
```
## API Response Format
**Successful Response:**
```json
{
"success": true,
"message": "Processed 4 events successfully",
"results": [
{
"encounter_id": "ENC-2024-00123",
"patient_id": "uuid",
"journey_id": "uuid",
"stage_id": "uuid",
"stage_status": "completed",
"survey_sent": true,
"survey_id": "uuid",
"survey_url": "/surveys/abc123xyz/",
"delivery_channel": "email_and_sms"
}
],
"surveys_sent": 1,
"survey_details": [
{
"encounter_id": "ENC-2024-00123",
"survey_id": "uuid",
"survey_url": "/surveys/abc123xyz/"
}
]
}
```
**Partial Journey Response (no survey):**
```json
{
"success": true,
"message": "Processed 2 events successfully",
"results": [
{
"encounter_id": "ENC-2024-00124",
"patient_id": "uuid",
"journey_id": "uuid",
"stage_id": "uuid",
"stage_status": "completed",
"survey_sent": false
}
],
"surveys_sent": 0,
"survey_details": []
}
```
## Troubleshooting
### Issue: "No active journey template found"
**Cause:** Journey templates not seeded
**Solution:**
```bash
python manage.py seed_journey_surveys
```
### Issue: Survey not sent after journey completion
**Check:**
1. Journey template has `send_post_discharge_survey = True`
2. First stage has survey template associated
3. Check logs: `grep "survey" logs/django.log`
### Issue: Email/SMS not displayed
**Check:**
1. Django server is running
2. NotificationService is configured correctly
3. Check terminal output for formatted messages
### Issue: API returns 500 error
**Check:**
1. Django logs: `logs/django.log`
2. Check if all required fields are present in event data
3. Verify database migrations are up to date
## Advanced Usage
### Custom Journey Templates
Edit `seed_journey_surveys.py` to add:
- New journey types
- Custom stage names
- Additional survey questions
- Different scoring thresholds
### Realistic Testing
For production-like testing:
```bash
# Simulate 100 patients over 10 minutes
python apps/simulator/his_simulator.py \
--max-patients 100 \
--delay 6 \
--url http://localhost:8000/api/simulator/his-events/
```
### Stress Testing
```bash
# High frequency (1 second between patients)
python apps/simulator/his_simulator.py --delay 1 --max-patients 50
```
## Database Tables Created
1. **Patient** - Patient records
2. **PatientJourneyTemplate** - Journey definitions
3. **PatientJourneyStageTemplate** - Stage definitions
4. **PatientJourneyInstance** - Patient journeys
5. **PatientJourneyStageInstance** - Stage instances
6. **SurveyTemplate** - Survey definitions
7. **SurveyQuestion** - Survey questions
8. **SurveyInstance** - Survey instances
9. **SurveyResponse** - Survey responses (when patient completes survey)
## Next Steps
After successful testing:
1. Implement survey completion UI (Phase 4)
2. Add survey response scoring
3. Integrate with PX Action Center for negative feedback
4. Add analytics dashboard for survey results
5. Implement real-time notifications (Celery + Redis)
## Files Created/Modified
**Created:**
- `apps/simulator/management/commands/seed_journey_surveys.py`
- `apps/simulator/his_simulator.py`
- `apps/simulator/serializers.py`
**Modified:**
- `apps/simulator/views.py` - Added HIS events handler
- `apps/simulator/urls.py` - Added HIS events endpoint
**Documentation:**
- `docs/HIS_SIMULATOR_GUIDE.md` (this file)