HH/docs/HIS_INTEGRATION_COMPLETE.md

431 lines
11 KiB
Markdown

# HIS Integration Complete Documentation
## Overview
This document describes the complete integration between the PX360 system and the HIS (Hospital Information System) simulator. The integration enables automatic patient journey tracking, stage completion, and post-discharge survey triggering based on real HIS data format.
## Architecture
### Components
1. **HIS Simulator** (`apps/simulator/his_simulator.py`)
- Generates realistic patient data in actual HIS format
- Simulates patient visits with timeline data
- Sends data to PX360 API endpoint
2. **HIS Data Adapter** (`apps/integrations/services/his_adapter.py`)
- Adapts real HIS data format to PX360 models
- Maps HIS visit types to journey stages
- Handles patient creation/updating
- Manages journey and stage instance creation
3. **HIS Data Serializer** (`apps/integrations/serializers.py`)
- Validates HIS data structure
- Ensures required fields are present
- Provides proper error messages
4. **Simulator API Views** (`apps/simulator/views.py`)
- `his_patient_data_handler`: New endpoint for real HIS format
- `his_events_handler`: Legacy endpoint (backward compatibility)
5. **Journey Stage Seeding** (`apps/journeys/management/commands/seed_journey_stages_his.py`)
- Creates journey templates with HIS visit types
- Maps HIS visit types to journey stages
## Data Flow
```
HIS Simulator → API Endpoint → Serializer Validation → HIS Adapter →
Patient Creation → Journey Creation → Stage Completion → Survey Trigger
```
## HIS Data Format
The integration expects data in the following format (actual HIS structure):
```json
{
"FetchPatientDataTimeStampList": [{
"Type": "Patient Demographic details",
"PatientID": "123456",
"AdmissionID": "789012",
"HospitalID": "1",
"HospitalName": "ALH-main",
"AdmitDate": "05-Jun-2025 11:06",
"DischargeDate": "05-Jun-2025 15:30",
"SSN": "1234567890",
"PatientName": "Ahmed Mohammed",
"MobileNo": "0501234567",
"Gender": "Male",
"FullAge": "35",
"PatientNationality": "Saudi",
"DOB": "1990-01-15",
"ConsultantID": "PHY001",
"PrimaryDoctor": "Dr. Mohammed",
"InsuranceCompanyName": "Bupa",
"BillType": "Insurance",
"IsVIP": "No"
}],
"FetchPatientDataTimeStampVisitDataList": [
{
"Type": "Consultation",
"BillDate": "05-Jun-2025 11:06"
},
{
"Type": "Doctor Visited",
"BillDate": "05-Jun-2025 11:20"
},
{
"Type": "Clinical Condtion",
"BillDate": "05-Jun-2025 11:30"
},
{
"Type": "ChiefComplaint",
"BillDate": "05-Jun-2025 11:35"
},
{
"Type": "Prescribed Drugs",
"BillDate": "05-Jun-2025 12:00"
}
],
"Code": 200,
"Status": "Success"
}
```
## HIS Visit Type to Journey Stage Mapping
| HIS Visit Type | Journey Stage | Description |
|----------------|---------------|-------------|
| Consultation | MD Consultation | Initial consultation with physician |
| Doctor Visited | MD Visit | Doctor visit and examination |
| Clinical Condtion | Clinical Assessment | Clinical condition assessment |
| ChiefComplaint | Patient Assessment | Chief complaint documentation |
| Prescribed Drugs | Pharmacy | Prescribed drugs dispensing |
## Setup Instructions
### 1. Seed Journey Stages
First, run the management command to create journey stage templates:
```bash
# Seed stages for all hospitals
python manage.py seed_journey_stages_his
# Seed stages for specific hospital
python manage.py seed_journey_stages_his --hospital ALH-main
# Seed stages with specific survey template
python manage.py seed_journey_stages_his --survey-template-id 1
```
### 2. Create Survey Template
Ensure you have a post-discharge survey template:
```bash
python manage.py create_demo_survey
```
Note the survey template ID from the output.
### 3. Attach Survey Template
If you didn't attach during seeding, update the journey template:
```bash
python manage.py seed_journey_stages_his --survey-template-id <ID>
```
### 4. Test the Integration
Run the HIS simulator to send test data:
```bash
# Run the HIS simulator (generates and sends 5 patient records)
python apps/simulator/his_simulator.py
# Or specify custom parameters
python apps/simulator/his_simulator.py --num-patients 3 --hospital ALH-main
```
## API Endpoints
### New HIS Patient Data Endpoint
**Endpoint:** `POST /api/simulator/his-patient-data/`
**Purpose:** Receives real HIS format patient data
**Request Body:** See HIS Data Format section above
**Response:**
```json
{
"success": true,
"message": "Patient data processed successfully. Journey created with 5 stages completed.",
"patient_id": "uuid",
"patient_mrn": "MRN123456",
"patient_name": "Ahmed Mohammed",
"journey_id": "uuid",
"encounter_id": "ENC-2025-001",
"completed_stages": ["Consultation", "Doctor Visited", "Clinical Condtion", "ChiefComplaint", "Prescribed Drugs"],
"survey_triggered": true,
"journey_status": "completed"
}
```
### Legacy HIS Events Endpoint
**Endpoint:** `POST /api/simulator/his-events/`
**Purpose:** Receives legacy format journey events (backward compatibility)
**Note:** This endpoint is kept for backward compatibility. New integrations should use the `/api/simulator/his-patient-data/` endpoint.
## Error Handling
The integration provides detailed error messages:
### Validation Errors
```json
{
"error": "Invalid HIS data format",
"details": {
"Code": ["This field is required."],
"Status": ["This field is required."]
}
}
```
### Processing Errors
```json
{
"error": "Hospital with code 'ALH-main' not found. Please run seed_journey_stages_his command first."
}
```
## Logging
All HIS events are logged to:
1. **Database:** `HISRequestLog` model
2. **File:** Django logs
3. **Console:** Detailed output for debugging
### Viewing Logs
```bash
# View logs in database
python manage.py shell
>>> from apps.simulator.models import HISRequestLog
>>> logs = HISRequestLog.objects.filter(channel='his_event')
>>> for log in logs:
... print(f"{log.timestamp}: {log.status} - {log.patient_id}")
```
Or use the web UI:
- Navigate to `/simulator/logs/`
- Filter by channel 'his_event'
## Testing
### Manual Testing
1. **Verify Journey Stages Seeded**
```bash
python manage.py shell
>>> from apps.journeys.models import PatientJourneyTemplate
>>> template = PatientJourneyTemplate.objects.first()
>>> print(template.stages.count())
```
2. **Test HIS Simulator**
```bash
python apps/simulator/his_simulator.py --num-patients 1
```
3. **Verify Patient Created**
```bash
python manage.py shell
>>> from apps.organizations.models import Patient
>>> patient = Patient.objects.last()
>>> print(f"Patient: {patient.get_full_name()}, MRN: {patient.mrn}")
```
4. **Verify Journey Created**
```bash
python manage.py shell
>>> from apps.journeys.models import PatientJourneyInstance
>>> journey = PatientJourneyInstance.objects.last()
>>> print(f"Journey: {journey.encounter_id}, Status: {journey.status}")
>>> print(f"Stages: {journey.stages.count()}")
```
5. **Verify Survey Triggered**
```bash
python manage.py shell
>>> from apps.surveys.models import SurveyInstance
>>> survey = SurveyInstance.objects.last()
>>> print(f"Survey: {survey.survey_template.title_en}")
>>> print(f"URL: {survey.get_survey_url()}")
```
### Automated Testing
Create a test script to verify the complete flow:
```python
# test_his_integration.py
import requests
import json
# HIS simulator endpoint
url = "http://localhost:8000/api/simulator/his-patient-data/"
# Sample HIS data
his_data = {
"FetchPatientDataTimeStampList": [{
"Type": "Patient Demographic details",
"PatientID": "TEST001",
"AdmissionID": "ADM001",
"HospitalID": "1",
"HospitalName": "ALH-main",
"AdmitDate": "05-Jun-2025 11:06",
"DischargeDate": "05-Jun-2025 15:30",
"SSN": "1234567890",
"PatientName": "Test Patient",
"MobileNo": "0501234567"
}],
"FetchPatientDataTimeStampVisitDataList": [
{"Type": "Consultation", "BillDate": "05-Jun-2025 11:06"},
{"Type": "Doctor Visited", "BillDate": "05-Jun-2025 11:20"}
],
"Code": 200,
"Status": "Success"
}
# Send request
response = requests.post(url, json=his_data)
print(f"Status: {response.status_code}")
print(f"Response: {json.dumps(response.json(), indent=2)}")
```
Run the test:
```bash
python test_his_integration.py
```
## Troubleshooting
### Issue: "Hospital not found"
**Solution:** Run the seed command:
```bash
python manage.py seed_journey_stages_his
```
### Issue: "No stage template found for event_type"
**Solution:** Verify stages are seeded with correct trigger codes:
```bash
python manage.py shell
>>> from apps.journeys.models import PatientJourneyStageTemplate
>>> stages = PatientJourneyStageTemplate.objects.all()
>>> for stage in stages:
... print(f"{stage.name} -> {stage.trigger_event_code}")
```
### Issue: Survey not triggered
**Solution:** Check:
1. Journey template has `send_post_discharge_survey=True`
2. Journey template has `post_discharge_survey_template` set
3. Journey is complete (all stages completed)
```bash
python manage.py shell
>>> from apps.journeys.models import PatientJourneyTemplate
>>> template = PatientJourneyTemplate.objects.first()
>>> print(f"Send survey: {template.send_post_discharge_survey}")
>>> print(f"Survey template: {template.post_discharge_survey_template}")
```
### Issue: "Patient already exists but data is different"
**Solution:** The adapter updates existing patients. Check the patient record:
```bash
python manage.py shell
>>> from apps.organizations.models import Patient
>>> patient = Patient.objects.get(mrn="TEST001")
>>> print(patient.__dict__)
```
## Production Deployment
### Checklist
- [ ] Journey stages seeded for all hospitals
- [ ] Survey templates created and attached
- [ ] HIS API endpoint configured (use `/api/simulator/his-patient-data/`)
- [ ] Error monitoring enabled
- [ ] Logging configured
- [ ] Email/SMS services configured
- [ ] Database indexes optimized
### Security Considerations
1. **API Authentication:** Consider adding API key authentication for HIS endpoint
2. **Data Validation:** Ensure all HIS data is properly sanitized
3. **Rate Limiting:** Implement rate limiting to prevent abuse
4. **HTTPS:** Always use HTTPS in production
### Performance Optimization
1. **Batch Processing:** Process multiple patients in a single request
2. **Async Processing:** Use Celery for heavy operations
3. **Database Indexing:** Ensure proper indexes on frequently queried fields
4. **Caching:** Cache survey templates and journey templates
## Maintenance
### Regular Tasks
1. **Monitor HIS Request Logs:** Check for errors and processing times
2. **Review Patient Data Quality:** Ensure patient data is accurate
3. **Update Journey Templates:** Add/remove stages as needed
4. **Review Survey Response Rates:** Track survey completion rates
### Updating HIS Mappings
To add or update HIS visit type mappings:
1. Edit `apps/journeys/management/commands/seed_journey_stages_his.py`
2. Add new entries to `his_stage_config`
3. Run the seed command:
```bash
python manage.py seed_journey_stages_his
```
## References
- [Journey Engine Documentation](JOURNEY_ENGINE.md)
- [HIS Simulator Guide](HIS_SIMULATOR_GUIDE.md)
- [Survey Documentation](../../docs/SURVEY_DOCUMENTATION.md)
- [API Documentation](API_ENDPOINTS.md)
## Support
For issues or questions:
1. Check the troubleshooting section
2. Review the logs in `/logs/` directory
3. Check database logs via `/simulator/logs/`
4. Contact development team