feat: add /api/register-patient endpoint to seed demographics for binary-only monitors
This commit is contained in:
@@ -349,6 +349,80 @@ def _calculate_age(dob_str: str) -> Optional[int]:
|
|||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@router.post("/register-patient")
|
||||||
|
def register_patient(
|
||||||
|
mrn: str,
|
||||||
|
gender: str,
|
||||||
|
dob: str,
|
||||||
|
name: str = "Unknown",
|
||||||
|
bed_id: str = None,
|
||||||
|
device_id: str = None,
|
||||||
|
db: Session = Depends(get_db)
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Register or update patient demographics in the monitor database.
|
||||||
|
|
||||||
|
Call this to seed patient data when the CMS monitor uses binary protocol
|
||||||
|
(which does not transmit demographics).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
POST /api/register-patient?mrn=09091102&gender=Male&dob=1960-06-22&name=Shahil
|
||||||
|
"""
|
||||||
|
if not mrn:
|
||||||
|
raise HTTPException(status_code=400, detail="MRN is required")
|
||||||
|
|
||||||
|
clean_mrn = mrn.strip().upper()
|
||||||
|
|
||||||
|
# Check if patient already exists
|
||||||
|
patient = db.query(Patient).filter(
|
||||||
|
(Patient.mrn == clean_mrn) | (Patient.patient_id == clean_mrn)
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if patient:
|
||||||
|
# Update existing record
|
||||||
|
patient.mrn = clean_mrn
|
||||||
|
patient.name = name or patient.name
|
||||||
|
patient.gender = gender or patient.gender
|
||||||
|
patient.dob = dob or patient.dob
|
||||||
|
if bed_id:
|
||||||
|
patient.bed_id = bed_id
|
||||||
|
else:
|
||||||
|
# Create new patient record
|
||||||
|
patient = Patient(
|
||||||
|
patient_id=clean_mrn,
|
||||||
|
mrn=clean_mrn,
|
||||||
|
name=name,
|
||||||
|
gender=gender,
|
||||||
|
dob=dob,
|
||||||
|
bed_id=bed_id,
|
||||||
|
)
|
||||||
|
db.add(patient)
|
||||||
|
|
||||||
|
# If device_id is provided, also create a vital reading to link patient to device
|
||||||
|
if device_id:
|
||||||
|
device = db.query(Device).filter(Device.device_id == device_id).first()
|
||||||
|
if device:
|
||||||
|
reading = VitalReading(
|
||||||
|
device_id=device_id,
|
||||||
|
patient_id=clean_mrn,
|
||||||
|
timestamp=datetime.now(timezone.utc),
|
||||||
|
transmitted=True,
|
||||||
|
)
|
||||||
|
db.add(reading)
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
db.refresh(patient)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "ok",
|
||||||
|
"patient_id": patient.patient_id,
|
||||||
|
"mrn": patient.mrn,
|
||||||
|
"name": patient.name,
|
||||||
|
"gender": patient.gender,
|
||||||
|
"dob": patient.dob,
|
||||||
|
"bed_id": patient.bed_id,
|
||||||
|
}
|
||||||
|
|
||||||
@router.get("/match-patient")
|
@router.get("/match-patient")
|
||||||
def match_patient(
|
def match_patient(
|
||||||
mrn: str = None,
|
mrn: str = None,
|
||||||
|
|||||||
Reference in New Issue
Block a user