316 lines
12 KiB
Python
316 lines
12 KiB
Python
"""
|
|
Verification Script - Confirm NO Journeys are Created
|
|
|
|
This script verifies that:
|
|
1. HISAdapter.process_his_data() does NOT create PatientJourneyInstance
|
|
2. HISAdapter.process_his_data() does NOT create PatientJourneyStageInstance
|
|
3. Only SurveyInstance is created
|
|
4. Survey is sent via SMS
|
|
|
|
Usage:
|
|
python verify_no_journeys.py
|
|
"""
|
|
import os
|
|
import django
|
|
import sys
|
|
|
|
# Setup Django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
django.setup()
|
|
|
|
from apps.integrations.services.his_adapter import HISAdapter
|
|
from apps.surveys.models import SurveyInstance
|
|
from apps.journeys.models import PatientJourneyInstance, PatientJourneyStageInstance
|
|
from apps.organizations.models import Hospital
|
|
from datetime import datetime
|
|
|
|
def test_no_journeys_created():
|
|
"""Test that no journey instances are created"""
|
|
|
|
print("=" * 80)
|
|
print("VERIFICATION: NO JOURNEYS CREATED TEST")
|
|
print("=" * 80)
|
|
|
|
# Count existing records before
|
|
surveys_before = SurveyInstance.objects.count()
|
|
journeys_before = PatientJourneyInstance.objects.count()
|
|
stages_before = PatientJourneyStageInstance.objects.count()
|
|
|
|
print(f"\n📊 Before Test:")
|
|
print(f" Survey Instances: {surveys_before}")
|
|
print(f" Journey Instances: {journeys_before}")
|
|
print(f" Stage Instances: {stages_before}")
|
|
|
|
# Create test HIS data (discharged patient)
|
|
his_data = {
|
|
"FetchPatientDataTimeStampList": [{
|
|
"PatientID": "TEST-VERIFY-001",
|
|
"AdmissionID": "ADM-VERIFY-001",
|
|
"HospitalID": "1",
|
|
"HospitalName": "Al Hammadi Hospital - Main",
|
|
"PatientType": "2", # OPD
|
|
"AdmitDate": "29-Jan-2026 10:00",
|
|
"DischargeDate": "29-Jan-2026 14:00", # Discharged
|
|
"PatientName": "Verify Test Patient",
|
|
"MobileNo": "0512345678",
|
|
"Email": "verify@test.com",
|
|
"Gender": "M",
|
|
"DOB": "01-Jan-1990",
|
|
"SSN": "1234567890"
|
|
}],
|
|
"FetchPatientDataTimeStampVisitDataList": [],
|
|
"Code": 200,
|
|
"Status": "Success"
|
|
}
|
|
|
|
print(f"\n📥 Processing HIS Data:")
|
|
print(f" PatientID: {his_data['FetchPatientDataTimeStampList'][0]['PatientID']}")
|
|
print(f" PatientType: {his_data['FetchPatientDataTimeStampList'][0]['PatientType']}")
|
|
print(f" DischargeDate: {his_data['FetchPatientDataTimeStampList'][0]['DischargeDate']}")
|
|
|
|
# Process HIS data
|
|
print(f"\n⚙️ Processing...")
|
|
result = HISAdapter.process_his_data(his_data)
|
|
|
|
print(f"\n✅ Result:")
|
|
print(f" Success: {result['success']}")
|
|
print(f" Message: {result['message']}")
|
|
|
|
if result['patient']:
|
|
print(f" Patient: {result['patient'].get_full_name()}")
|
|
|
|
if result['survey']:
|
|
print(f" Survey ID: {result['survey'].id}")
|
|
print(f" Survey Status: {result['survey'].status}")
|
|
print(f" Survey URL: {result.get('survey_url', 'N/A')}")
|
|
|
|
print(f" Survey Sent: {result.get('survey_sent', False)}")
|
|
print(f" Patient Type: {result.get('patient_type', 'N/A')}")
|
|
|
|
# Count records after
|
|
surveys_after = SurveyInstance.objects.count()
|
|
journeys_after = PatientJourneyInstance.objects.count()
|
|
stages_after = PatientJourneyStageInstance.objects.count()
|
|
|
|
print(f"\n📊 After Test:")
|
|
print(f" Survey Instances: {surveys_after} (change: +{surveys_after - surveys_before})")
|
|
print(f" Journey Instances: {journeys_after} (change: +{journeys_after - journeys_before})")
|
|
print(f" Stage Instances: {stages_after} (change: +{stages_after - stages_before})")
|
|
|
|
# Verify results
|
|
print(f"\n🔍 Verification:")
|
|
|
|
survey_created = surveys_after > surveys_before
|
|
journey_created = journeys_after > journeys_before
|
|
stage_created = stages_after > stages_before
|
|
|
|
print(f" ✅ Survey Created: {survey_created}")
|
|
print(f" ❌ Journey Created: {journey_created}")
|
|
print(f" ❌ Stage Created: {stage_created}")
|
|
|
|
# Check for journeys with this admission ID
|
|
admission_id = his_data['FetchPatientDataTimeStampList'][0]['AdmissionID']
|
|
matching_journeys = PatientJourneyInstance.objects.filter(
|
|
metadata__admission_id=admission_id
|
|
)
|
|
|
|
print(f"\n🔍 Direct Check for Admission ID '{admission_id}':")
|
|
print(f" Matching Journeys: {matching_journeys.count()}")
|
|
|
|
# Check survey metadata
|
|
if result['survey']:
|
|
survey = result['survey']
|
|
print(f"\n📋 Survey Details:")
|
|
print(f" Survey ID: {survey.id}")
|
|
print(f" Survey Template: {survey.survey_template.name}")
|
|
print(f" Hospital: {survey.hospital.name}")
|
|
print(f" Patient: {survey.patient.get_full_name()}")
|
|
print(f" Status: {survey.status}")
|
|
print(f" Delivery Channel: {survey.delivery_channel}")
|
|
print(f" Recipient Phone: {survey.recipient_phone}")
|
|
print(f" Metadata: {survey.metadata}")
|
|
|
|
# Check if survey has journey_instance
|
|
has_journey = survey.journey_instance is not None
|
|
print(f" Has Journey Instance: {has_journey}")
|
|
|
|
# Final verdict
|
|
print(f"\n{'=' * 80}")
|
|
print("FINAL VERDICT:")
|
|
print(f"{'=' * 80}")
|
|
|
|
if survey_created and not journey_created and not stage_created:
|
|
print("✅ SUCCESS: Only survey was created (NO journeys, NO stages)")
|
|
print("✅ System correctly creates only surveys from HIS data")
|
|
return True
|
|
else:
|
|
print("❌ FAILURE: Unexpected behavior detected")
|
|
if not survey_created:
|
|
print(" - Survey was NOT created")
|
|
if journey_created:
|
|
print(" - Journey was created (should NOT happen)")
|
|
if stage_created:
|
|
print(" - Stage was created (should NOT happen)")
|
|
return False
|
|
|
|
def test_non_discharged_patient():
|
|
"""Test that non-discharged patients don't get surveys"""
|
|
|
|
print(f"\n{'=' * 80}")
|
|
print("VERIFICATION: NON-DISCHARGED PATIENT TEST")
|
|
print(f"{'=' * 80}")
|
|
|
|
# Create test HIS data (NOT discharged)
|
|
his_data = {
|
|
"FetchPatientDataTimeStampList": [{
|
|
"PatientID": "TEST-VERIFY-002",
|
|
"AdmissionID": "ADM-VERIFY-002",
|
|
"HospitalID": "1",
|
|
"HospitalName": "Al Hammadi Hospital - Main",
|
|
"PatientType": "2", # OPD
|
|
"AdmitDate": "29-Jan-2026 10:00",
|
|
"DischargeDate": None, # NOT discharged
|
|
"PatientName": "Non-Discharged Patient",
|
|
"MobileNo": "0512345679",
|
|
"Email": "nondischarge@test.com",
|
|
"Gender": "M",
|
|
"DOB": "01-Jan-1990",
|
|
"SSN": "2345678901"
|
|
}],
|
|
"FetchPatientDataTimeStampVisitDataList": [],
|
|
"Code": 200,
|
|
"Status": "Success"
|
|
}
|
|
|
|
print(f"\n📥 Processing Non-Discharged HIS Data:")
|
|
print(f" PatientID: {his_data['FetchPatientDataTimeStampList'][0]['PatientID']}")
|
|
print(f" PatientType: {his_data['FetchPatientDataTimeStampList'][0]['PatientType']}")
|
|
print(f" DischargeDate: {his_data['FetchPatientDataTimeStampList'][0]['DischargeDate']}")
|
|
|
|
# Process HIS data
|
|
print(f"\n⚙️ Processing...")
|
|
result = HISAdapter.process_his_data(his_data)
|
|
|
|
print(f"\n✅ Result:")
|
|
print(f" Success: {result['success']}")
|
|
print(f" Message: {result['message']}")
|
|
print(f" Survey: {result.get('survey')}")
|
|
|
|
if result['message'] == 'Patient not discharged - no survey sent':
|
|
print(f"\n✅ SUCCESS: Non-discharged patient correctly did NOT receive survey")
|
|
return True
|
|
else:
|
|
print(f"\n❌ FAILURE: Unexpected behavior for non-discharged patient")
|
|
return False
|
|
|
|
def test_all_patient_types():
|
|
"""Test all patient types (OPD, INPATIENT, EMS)"""
|
|
|
|
print(f"\n{'=' * 80}")
|
|
print("VERIFICATION: ALL PATIENT TYPES TEST")
|
|
print(f"{'=' * 80}")
|
|
|
|
test_cases = [
|
|
("OPD", "2"),
|
|
("OPD (alternative)", "O"),
|
|
("INPATIENT", "1"),
|
|
("EMS", "3"),
|
|
("EMS (alternative)", "E"),
|
|
]
|
|
|
|
all_passed = True
|
|
|
|
for type_name, patient_type in test_cases:
|
|
ssn_counter = 3000000000 + list(test_cases).index((type_name, patient_type))
|
|
his_data = {
|
|
"FetchPatientDataTimeStampList": [{
|
|
"PatientID": f"TEST-TYPES-{patient_type}",
|
|
"AdmissionID": f"ADM-TYPES-{patient_type}",
|
|
"HospitalID": "1",
|
|
"HospitalName": "Al Hammadi Hospital - Main",
|
|
"PatientType": patient_type,
|
|
"AdmitDate": "29-Jan-2026 10:00",
|
|
"DischargeDate": "29-Jan-2026 14:00",
|
|
"PatientName": f"Patient {type_name}",
|
|
"MobileNo": "0512345678",
|
|
"Email": f"type{patient_type}@test.com",
|
|
"Gender": "M",
|
|
"DOB": "01-Jan-1990",
|
|
"SSN": str(ssn_counter)
|
|
}],
|
|
"FetchPatientDataTimeStampVisitDataList": [],
|
|
"Code": 200,
|
|
"Status": "Success"
|
|
}
|
|
|
|
print(f"\n📥 Testing {type_name} (PatientType={patient_type})")
|
|
result = HISAdapter.process_his_data(his_data)
|
|
|
|
if result['success'] and result['survey']:
|
|
expected_type = HISAdapter.map_patient_type_to_survey_type(patient_type)
|
|
actual_type = result['survey'].survey_template.name
|
|
survey_type_in_template = expected_type in actual_type.upper()
|
|
|
|
print(f" ✅ Survey created")
|
|
print(f" Expected Type: {expected_type}")
|
|
print(f" Template Name: {actual_type}")
|
|
print(f" Match: {survey_type_in_template}")
|
|
|
|
if not survey_type_in_template:
|
|
print(f" ⚠️ WARNING: Template doesn't match patient type")
|
|
all_passed = False
|
|
else:
|
|
print(f" ❌ Survey NOT created: {result.get('message', 'Unknown error')}")
|
|
all_passed = False
|
|
|
|
if all_passed:
|
|
print(f"\n✅ SUCCESS: All patient types work correctly")
|
|
else:
|
|
print(f"\n❌ FAILURE: Some patient types failed")
|
|
|
|
return all_passed
|
|
|
|
if __name__ == "__main__":
|
|
print("\n" + "=" * 80)
|
|
print("PX360 SIMPLIFIED SURVEY INTEGRATION - VERIFICATION")
|
|
print("=" * 80)
|
|
print("\nThis script verifies that:")
|
|
print("1. NO patient journeys are created")
|
|
print("2. ONLY surveys are created from HIS data")
|
|
print("3. Surveys are sent to patients via SMS")
|
|
print("=" * 80)
|
|
|
|
try:
|
|
# Run all tests
|
|
test1_passed = test_no_journeys_created()
|
|
test2_passed = test_non_discharged_patient()
|
|
test3_passed = test_all_patient_types()
|
|
|
|
# Summary
|
|
print(f"\n{'=' * 80}")
|
|
print("TEST SUMMARY")
|
|
print(f"{'=' * 80}")
|
|
print(f"Test 1 - No Journeys Created: {'✅ PASS' if test1_passed else '❌ FAIL'}")
|
|
print(f"Test 2 - Non-Discharged Patient: {'✅ PASS' if test2_passed else '❌ FAIL'}")
|
|
print(f"Test 3 - All Patient Types: {'✅ PASS' if test3_passed else '❌ FAIL'}")
|
|
|
|
if test1_passed and test2_passed and test3_passed:
|
|
print(f"\n{'=' * 80}")
|
|
print("✅ ALL TESTS PASSED")
|
|
print(f"{'=' * 80}")
|
|
print("\n✅ CONFIRMED: System correctly creates ONLY surveys (no journeys)")
|
|
print("✅ CONFIRMED: Surveys are sent to patients based on HIS data")
|
|
print("✅ CONFIRMED: PatientType mapping works correctly")
|
|
sys.exit(0)
|
|
else:
|
|
print(f"\n{'=' * 80}")
|
|
print("❌ SOME TESTS FAILED")
|
|
print(f"{'=' * 80}")
|
|
sys.exit(1)
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ ERROR: {str(e)}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1) |