2002 lines
76 KiB
Python
2002 lines
76 KiB
Python
# Generated by Django 5.2.6 on 2025-09-15 14:05
|
|
|
|
import django.core.validators
|
|
import django.db.models.deletion
|
|
import uuid
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("core", "0001_initial"),
|
|
("patients", "0001_initial"),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="Admission",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"admission_id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
help_text="Unique admission identifier",
|
|
unique=True,
|
|
),
|
|
),
|
|
(
|
|
"admission_datetime",
|
|
models.DateTimeField(help_text="Date and time of admission"),
|
|
),
|
|
(
|
|
"admission_type",
|
|
models.CharField(
|
|
choices=[
|
|
("EMERGENCY", "Emergency Admission"),
|
|
("ELECTIVE", "Elective Admission"),
|
|
("URGENT", "Urgent Admission"),
|
|
("OBSERVATION", "Observation"),
|
|
("DAY_SURGERY", "Day Surgery"),
|
|
("TRANSFER", "Transfer from Another Facility"),
|
|
("READMISSION", "Readmission"),
|
|
("DIRECT", "Direct Admission"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Type of admission",
|
|
max_length=30,
|
|
),
|
|
),
|
|
(
|
|
"admission_source",
|
|
models.CharField(
|
|
choices=[
|
|
("EMERGENCY", "Emergency Department"),
|
|
("OUTPATIENT", "Outpatient Clinic"),
|
|
("PHYSICIAN_OFFICE", "Physician Office"),
|
|
("TRANSFER", "Transfer from Another Hospital"),
|
|
("NURSING_HOME", "Nursing Home"),
|
|
("HOME", "Home"),
|
|
("AMBULATORY_SURGERY", "Ambulatory Surgery"),
|
|
("OTHER_FACILITY", "Other Healthcare Facility"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Source of admission",
|
|
max_length=30,
|
|
),
|
|
),
|
|
(
|
|
"chief_complaint",
|
|
models.TextField(
|
|
help_text="Chief complaint or reason for admission"
|
|
),
|
|
),
|
|
(
|
|
"admitting_diagnosis",
|
|
models.TextField(help_text="Admitting diagnosis"),
|
|
),
|
|
(
|
|
"secondary_diagnoses",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Secondary diagnoses"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("PENDING", "Pending Admission"),
|
|
("ADMITTED", "Admitted"),
|
|
("TRANSFERRED", "Transferred"),
|
|
("DISCHARGED", "Discharged"),
|
|
("DECEASED", "Deceased"),
|
|
("LEFT_AMA", "Left Against Medical Advice"),
|
|
("CANCELLED", "Cancelled"),
|
|
],
|
|
default="PENDING",
|
|
help_text="Current admission status",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"priority",
|
|
models.CharField(
|
|
choices=[
|
|
("ROUTINE", "Routine"),
|
|
("URGENT", "Urgent"),
|
|
("EMERGENT", "Emergent"),
|
|
("CRITICAL", "Critical"),
|
|
],
|
|
default="ROUTINE",
|
|
help_text="Admission priority",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"acuity_level",
|
|
models.PositiveIntegerField(
|
|
default=1,
|
|
help_text="Patient acuity level (1-5, 5 being highest)",
|
|
validators=[
|
|
django.core.validators.MinValueValidator(1),
|
|
django.core.validators.MaxValueValidator(5),
|
|
],
|
|
),
|
|
),
|
|
(
|
|
"insurance_verified",
|
|
models.BooleanField(
|
|
default=False, help_text="Insurance coverage verified"
|
|
),
|
|
),
|
|
(
|
|
"authorization_number",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Insurance authorization number",
|
|
max_length=100,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"estimated_length_of_stay",
|
|
models.PositiveIntegerField(
|
|
blank=True,
|
|
help_text="Estimated length of stay in days",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"discharge_planning_started",
|
|
models.BooleanField(
|
|
default=False, help_text="Discharge planning has been initiated"
|
|
),
|
|
),
|
|
(
|
|
"anticipated_discharge_date",
|
|
models.DateField(
|
|
blank=True, help_text="Anticipated discharge date", null=True
|
|
),
|
|
),
|
|
(
|
|
"discharge_datetime",
|
|
models.DateTimeField(
|
|
blank=True,
|
|
help_text="Actual discharge date and time",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"discharge_disposition",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("HOME", "Home"),
|
|
("HOME_HEALTH", "Home with Health Services"),
|
|
("NURSING_HOME", "Nursing Home"),
|
|
("REHAB_FACILITY", "Rehabilitation Facility"),
|
|
("HOSPICE", "Hospice"),
|
|
("TRANSFER", "Transfer to Another Hospital"),
|
|
("DECEASED", "Deceased"),
|
|
("LEFT_AMA", "Left Against Medical Advice"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Discharge disposition",
|
|
max_length=30,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"isolation_required",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Patient requires isolation precautions",
|
|
),
|
|
),
|
|
(
|
|
"isolation_type",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("CONTACT", "Contact Precautions"),
|
|
("DROPLET", "Droplet Precautions"),
|
|
("AIRBORNE", "Airborne Precautions"),
|
|
("PROTECTIVE", "Protective Isolation"),
|
|
("STRICT", "Strict Isolation"),
|
|
],
|
|
help_text="Type of isolation required",
|
|
max_length=30,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"special_needs",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Special care needs and requirements",
|
|
),
|
|
),
|
|
(
|
|
"allergies",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Patient allergies"
|
|
),
|
|
),
|
|
(
|
|
"alerts",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Clinical alerts and warnings",
|
|
),
|
|
),
|
|
(
|
|
"code_status",
|
|
models.CharField(
|
|
choices=[
|
|
("FULL_CODE", "Full Code"),
|
|
("DNR", "Do Not Resuscitate"),
|
|
("DNI", "Do Not Intubate"),
|
|
("DNR_DNI", "DNR/DNI"),
|
|
("COMFORT_CARE", "Comfort Care Only"),
|
|
("LIMITED", "Limited Code"),
|
|
],
|
|
default="FULL_CODE",
|
|
help_text="Code status",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"advance_directive",
|
|
models.BooleanField(
|
|
default=False, help_text="Advance directive on file"
|
|
),
|
|
),
|
|
(
|
|
"healthcare_proxy",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Healthcare proxy information",
|
|
max_length=200,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"admission_notes",
|
|
models.TextField(
|
|
blank=True, help_text="Admission notes", null=True
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"admitting_physician",
|
|
models.ForeignKey(
|
|
help_text="Admitting physician",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="admitted_patients",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"attending_physician",
|
|
models.ForeignKey(
|
|
help_text="Attending physician",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="attending_patients",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"consulting_physicians",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Consulting physicians",
|
|
related_name="consulting_patients",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"created_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who created the admission",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="created_admissions",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"discharge_planner",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Assigned discharge planner",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="discharge_planning_cases",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
help_text="Admitted patient",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="admissions",
|
|
to="patients.patientprofile",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
help_text="Organization tenant",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="admissions",
|
|
to="core.tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Admission",
|
|
"verbose_name_plural": "Admissions",
|
|
"db_table": "inpatients_admission",
|
|
"ordering": ["-admission_datetime"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Bed",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"bed_number",
|
|
models.CharField(
|
|
help_text="Bed number or identifier", max_length=20
|
|
),
|
|
),
|
|
(
|
|
"room_number",
|
|
models.CharField(help_text="Room number", max_length=20),
|
|
),
|
|
(
|
|
"bed_type",
|
|
models.CharField(
|
|
choices=[
|
|
("STANDARD", "Standard Bed"),
|
|
("ICU", "ICU Bed"),
|
|
("CARDIAC", "Cardiac Monitoring"),
|
|
("ISOLATION", "Isolation Bed"),
|
|
("BARIATRIC", "Bariatric Bed"),
|
|
("PEDIATRIC", "Pediatric Bed"),
|
|
("NEONATAL", "Neonatal Bed"),
|
|
("MATERNITY", "Maternity Bed"),
|
|
("PSYCHIATRIC", "Psychiatric Bed"),
|
|
("STRETCHER", "Stretcher/Gurney"),
|
|
("RECLINER", "Recliner Chair"),
|
|
("OTHER", "Other"),
|
|
],
|
|
default="STANDARD",
|
|
help_text="Type of bed",
|
|
max_length=30,
|
|
),
|
|
),
|
|
(
|
|
"is_operational",
|
|
models.BooleanField(default=True, help_text="Operational status"),
|
|
),
|
|
(
|
|
"is_active",
|
|
models.BooleanField(default=True, help_text="Active status"),
|
|
),
|
|
("is_active_out_of_service", models.BooleanField(default=True)),
|
|
(
|
|
"room_type",
|
|
models.CharField(
|
|
choices=[
|
|
("PRIVATE", "Private Room"),
|
|
("SEMI_PRIVATE", "Semi-Private"),
|
|
("SHARED", "Shared Room"),
|
|
("ICU", "ICU Room"),
|
|
("ISOLATION", "Isolation Room"),
|
|
],
|
|
help_text="Type of room",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("AVAILABLE", "Available"),
|
|
("OCCUPIED", "Occupied"),
|
|
("RESERVED", "Reserved"),
|
|
("MAINTENANCE", "Under Maintenance"),
|
|
("CLEANING", "Being Cleaned"),
|
|
("OUT_OF_ORDER", "Out of Order"),
|
|
("BLOCKED", "Blocked"),
|
|
],
|
|
default="AVAILABLE",
|
|
help_text="Current bed status",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"occupied_since",
|
|
models.DateTimeField(
|
|
blank=True, help_text="When bed became occupied", null=True
|
|
),
|
|
),
|
|
(
|
|
"reserved_until",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Reservation expiry time", null=True
|
|
),
|
|
),
|
|
(
|
|
"equipment",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Equipment available with this bed",
|
|
),
|
|
),
|
|
(
|
|
"features",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Special features of this bed",
|
|
),
|
|
),
|
|
(
|
|
"last_maintenance",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Last maintenance date", null=True
|
|
),
|
|
),
|
|
(
|
|
"next_maintenance",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Next scheduled maintenance", null=True
|
|
),
|
|
),
|
|
(
|
|
"maintenance_notes",
|
|
models.TextField(
|
|
blank=True, help_text="Maintenance notes and history", null=True
|
|
),
|
|
),
|
|
(
|
|
"last_cleaned",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Last cleaning timestamp", null=True
|
|
),
|
|
),
|
|
(
|
|
"cleaning_level",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("STANDARD", "Standard Cleaning"),
|
|
("DEEP", "Deep Cleaning"),
|
|
("ISOLATION", "Isolation Cleaning"),
|
|
("TERMINAL", "Terminal Cleaning"),
|
|
],
|
|
help_text="Level of last cleaning",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"blocked_reason",
|
|
models.TextField(
|
|
blank=True, help_text="Reason for blocking bed", null=True
|
|
),
|
|
),
|
|
(
|
|
"blocked_until",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Blocked until this time", null=True
|
|
),
|
|
),
|
|
(
|
|
"bed_position",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("A", "A"),
|
|
("B", "B"),
|
|
("C", "C"),
|
|
("D", "D"),
|
|
("E", "E"),
|
|
("F", "F"),
|
|
],
|
|
help_text="Position within room",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"blocked_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who blocked the bed",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="blocked_beds",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"cleaned_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Staff member who last cleaned bed",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="cleaned_beds",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"created_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who created the bed record",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="created_beds",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"current_admission",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Current admission using this bed",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="assigned_bed",
|
|
to="inpatients.admission",
|
|
),
|
|
),
|
|
(
|
|
"current_patient",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Currently assigned patient",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="current_bed",
|
|
to="patients.patientprofile",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Bed",
|
|
"verbose_name_plural": "Beds",
|
|
"db_table": "inpatients_bed",
|
|
"ordering": ["ward", "room_number", "bed_number"],
|
|
},
|
|
),
|
|
migrations.AddField(
|
|
model_name="admission",
|
|
name="current_bed",
|
|
field=models.ForeignKey(
|
|
blank=True,
|
|
help_text="Current bed assignment",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="current_admissions",
|
|
to="inpatients.bed",
|
|
),
|
|
),
|
|
migrations.CreateModel(
|
|
name="Ward",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"ward_id",
|
|
models.CharField(help_text="Unique ward identifier", max_length=50),
|
|
),
|
|
("name", models.CharField(help_text="Ward name", max_length=200)),
|
|
(
|
|
"description",
|
|
models.TextField(
|
|
blank=True, help_text="Ward description", null=True
|
|
),
|
|
),
|
|
(
|
|
"ward_type",
|
|
models.CharField(
|
|
choices=[
|
|
("GENERAL", "General Medical"),
|
|
("SURGICAL", "Surgical"),
|
|
("ICU", "Intensive Care Unit"),
|
|
("CCU", "Cardiac Care Unit"),
|
|
("NICU", "Neonatal ICU"),
|
|
("PICU", "Pediatric ICU"),
|
|
("EMERGENCY", "Emergency"),
|
|
("MATERNITY", "Maternity"),
|
|
("PEDIATRIC", "Pediatric"),
|
|
("ONCOLOGY", "Oncology"),
|
|
("CARDIAC", "Cardiac"),
|
|
("ORTHOPEDIC", "Orthopedic"),
|
|
("NEUROLOGY", "Neurology"),
|
|
("PSYCHIATRY", "Psychiatry"),
|
|
("REHABILITATION", "Rehabilitation"),
|
|
("ISOLATION", "Isolation"),
|
|
("STEP_DOWN", "Step Down"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Type of ward",
|
|
max_length=50,
|
|
),
|
|
),
|
|
(
|
|
"specialty",
|
|
models.CharField(
|
|
choices=[
|
|
("GENERAL_MEDICINE", "General Medicine"),
|
|
("SURGERY", "Surgery"),
|
|
("CARDIOLOGY", "Cardiology"),
|
|
("NEUROLOGY", "Neurology"),
|
|
("ONCOLOGY", "Oncology"),
|
|
("PEDIATRICS", "Pediatrics"),
|
|
("OBSTETRICS", "Obstetrics"),
|
|
("GYNECOLOGY", "Gynecology"),
|
|
("ORTHOPEDICS", "Orthopedics"),
|
|
("PSYCHIATRY", "Psychiatry"),
|
|
("EMERGENCY", "Emergency Medicine"),
|
|
("CRITICAL_CARE", "Critical Care"),
|
|
("REHABILITATION", "Rehabilitation"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Medical specialty",
|
|
max_length=100,
|
|
),
|
|
),
|
|
(
|
|
"total_beds",
|
|
models.PositiveIntegerField(
|
|
help_text="Total number of beds in ward"
|
|
),
|
|
),
|
|
(
|
|
"private_rooms",
|
|
models.PositiveIntegerField(
|
|
default=0, help_text="Number of private rooms"
|
|
),
|
|
),
|
|
(
|
|
"semi_private_rooms",
|
|
models.PositiveIntegerField(
|
|
default=0, help_text="Number of semi-private rooms"
|
|
),
|
|
),
|
|
(
|
|
"shared_rooms",
|
|
models.PositiveIntegerField(
|
|
default=0, help_text="Number of shared rooms"
|
|
),
|
|
),
|
|
(
|
|
"building",
|
|
models.CharField(
|
|
help_text="Building name or identifier", max_length=100
|
|
),
|
|
),
|
|
(
|
|
"floor",
|
|
models.CharField(
|
|
help_text="Floor number or identifier", max_length=20
|
|
),
|
|
),
|
|
(
|
|
"wing",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Wing or section",
|
|
max_length=50,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"min_nurses_day",
|
|
models.PositiveIntegerField(
|
|
default=1, help_text="Minimum nurses required for day shift"
|
|
),
|
|
),
|
|
(
|
|
"min_nurses_night",
|
|
models.PositiveIntegerField(
|
|
default=1, help_text="Minimum nurses required for night shift"
|
|
),
|
|
),
|
|
(
|
|
"nurse_to_patient_ratio",
|
|
models.FloatField(default=1.0, help_text="Nurse to patient ratio"),
|
|
),
|
|
(
|
|
"equipment_list",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Available equipment in ward",
|
|
),
|
|
),
|
|
(
|
|
"special_features",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Special features and capabilities",
|
|
),
|
|
),
|
|
(
|
|
"admission_criteria",
|
|
models.TextField(
|
|
blank=True,
|
|
help_text="Admission criteria for this ward",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"age_restrictions",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=dict,
|
|
help_text="Age restrictions (min_age, max_age)",
|
|
),
|
|
),
|
|
(
|
|
"gender_restrictions",
|
|
models.CharField(
|
|
choices=[
|
|
("NONE", "No Restrictions"),
|
|
("MALE_ONLY", "Male Only"),
|
|
("FEMALE_ONLY", "Female Only"),
|
|
],
|
|
default="NONE",
|
|
help_text="Gender restrictions",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"is_active",
|
|
models.BooleanField(
|
|
default=True, help_text="Ward is active and operational"
|
|
),
|
|
),
|
|
(
|
|
"is_accepting_admissions",
|
|
models.BooleanField(
|
|
default=True, help_text="Ward is accepting new admissions"
|
|
),
|
|
),
|
|
(
|
|
"closure_reason",
|
|
models.TextField(
|
|
blank=True,
|
|
help_text="Reason for closure if not accepting admissions",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"phone_number",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Ward phone number",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"extension",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Phone extension",
|
|
max_length=10,
|
|
null=True,
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"attending_physicians",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Attending physicians for this ward",
|
|
related_name="attending_wards",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"created_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who created the ward",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="created_wards",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"nurse_manager",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Nurse manager for this ward",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="managed_wards",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
help_text="Organization tenant",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="wards",
|
|
to="core.tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Ward",
|
|
"verbose_name_plural": "Wards",
|
|
"db_table": "inpatients_ward",
|
|
"ordering": ["building", "floor", "name"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Transfer",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"transfer_id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
help_text="Unique transfer identifier",
|
|
unique=True,
|
|
),
|
|
),
|
|
(
|
|
"transfer_type",
|
|
models.CharField(
|
|
choices=[
|
|
("WARD", "Ward Transfer"),
|
|
("BED", "Bed Transfer"),
|
|
("ROOM", "Room Transfer"),
|
|
("UNIT", "Unit Transfer"),
|
|
("FACILITY", "Facility Transfer"),
|
|
],
|
|
help_text="Type of transfer",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"requested_datetime",
|
|
models.DateTimeField(
|
|
auto_now_add=True, help_text="When transfer was requested"
|
|
),
|
|
),
|
|
(
|
|
"scheduled_datetime",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Scheduled transfer time", null=True
|
|
),
|
|
),
|
|
(
|
|
"actual_datetime",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Actual transfer time", null=True
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("REQUESTED", "Requested"),
|
|
("APPROVED", "Approved"),
|
|
("SCHEDULED", "Scheduled"),
|
|
("IN_PROGRESS", "In Progress"),
|
|
("COMPLETED", "Completed"),
|
|
("CANCELLED", "Cancelled"),
|
|
("DELAYED", "Delayed"),
|
|
],
|
|
default="REQUESTED",
|
|
help_text="Transfer status",
|
|
max_length=20,
|
|
),
|
|
),
|
|
("reason", models.TextField(help_text="Reason for transfer")),
|
|
(
|
|
"priority",
|
|
models.CharField(
|
|
choices=[
|
|
("ROUTINE", "Routine"),
|
|
("URGENT", "Urgent"),
|
|
("EMERGENT", "Emergent"),
|
|
("STAT", "STAT"),
|
|
],
|
|
default="ROUTINE",
|
|
help_text="Transfer priority",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"transport_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("WHEELCHAIR", "Wheelchair"),
|
|
("STRETCHER", "Stretcher"),
|
|
("BED", "Hospital Bed"),
|
|
("AMBULATORY", "Walking"),
|
|
("AMBULANCE", "Ambulance"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Method of transport",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"equipment_needed",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Equipment needed for transfer",
|
|
),
|
|
),
|
|
(
|
|
"supplies_needed",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Supplies needed for transfer",
|
|
),
|
|
),
|
|
(
|
|
"patient_condition",
|
|
models.CharField(
|
|
choices=[
|
|
("STABLE", "Stable"),
|
|
("UNSTABLE", "Unstable"),
|
|
("CRITICAL", "Critical"),
|
|
("IMPROVING", "Improving"),
|
|
("DETERIORATING", "Deteriorating"),
|
|
],
|
|
help_text="Patient condition at time of transfer",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"vital_signs",
|
|
models.JSONField(
|
|
blank=True, default=dict, help_text="Vital signs at transfer"
|
|
),
|
|
),
|
|
(
|
|
"handoff_report",
|
|
models.TextField(
|
|
blank=True, help_text="Nursing handoff report", null=True
|
|
),
|
|
),
|
|
(
|
|
"medications_transferred",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Medications transferred with patient",
|
|
),
|
|
),
|
|
(
|
|
"delay_reason",
|
|
models.TextField(
|
|
blank=True, help_text="Reason for any delays", null=True
|
|
),
|
|
),
|
|
(
|
|
"complications",
|
|
models.TextField(
|
|
blank=True,
|
|
help_text="Any complications during transfer",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"notes",
|
|
models.TextField(
|
|
blank=True, help_text="Additional transfer notes", null=True
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"admission",
|
|
models.ForeignKey(
|
|
help_text="Associated admission",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="transfers",
|
|
to="inpatients.admission",
|
|
),
|
|
),
|
|
(
|
|
"approved_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Staff member who approved transfer",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="approved_transfers",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"completed_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Staff member who completed transfer",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="completed_transfers",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"from_bed",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Source bed",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="transfers_from",
|
|
to="inpatients.bed",
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
help_text="Patient being transferred",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="transfers",
|
|
to="patients.patientprofile",
|
|
),
|
|
),
|
|
(
|
|
"requested_by",
|
|
models.ForeignKey(
|
|
help_text="Staff member who requested transfer",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="requested_transfers",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"to_bed",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Destination bed",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="transfers_to",
|
|
to="inpatients.bed",
|
|
),
|
|
),
|
|
(
|
|
"transport_team",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Transport team members",
|
|
related_name="transport_assignments",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"from_ward",
|
|
models.ForeignKey(
|
|
help_text="Source ward",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="transfers_from",
|
|
to="inpatients.ward",
|
|
),
|
|
),
|
|
(
|
|
"to_ward",
|
|
models.ForeignKey(
|
|
help_text="Destination ward",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="transfers_to",
|
|
to="inpatients.ward",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Transfer",
|
|
"verbose_name_plural": "Transfers",
|
|
"db_table": "inpatients_transfer",
|
|
"ordering": ["-requested_datetime"],
|
|
},
|
|
),
|
|
migrations.AddField(
|
|
model_name="bed",
|
|
name="ward",
|
|
field=models.ForeignKey(
|
|
help_text="Ward containing this bed",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="beds",
|
|
to="inpatients.ward",
|
|
),
|
|
),
|
|
migrations.AddField(
|
|
model_name="admission",
|
|
name="current_ward",
|
|
field=models.ForeignKey(
|
|
help_text="Current ward assignment",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="current_admissions",
|
|
to="inpatients.ward",
|
|
),
|
|
),
|
|
migrations.CreateModel(
|
|
name="DischargeSummary",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"summary_id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
help_text="Unique summary identifier",
|
|
unique=True,
|
|
),
|
|
),
|
|
("discharge_date", models.DateField(help_text="Discharge date")),
|
|
("discharge_time", models.TimeField(help_text="Discharge time")),
|
|
(
|
|
"length_of_stay",
|
|
models.PositiveIntegerField(
|
|
help_text="Total length of stay in days"
|
|
),
|
|
),
|
|
(
|
|
"admission_diagnosis",
|
|
models.TextField(help_text="Admission diagnosis"),
|
|
),
|
|
(
|
|
"final_diagnosis",
|
|
models.TextField(help_text="Final/discharge diagnosis"),
|
|
),
|
|
(
|
|
"secondary_diagnoses",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Secondary diagnoses"
|
|
),
|
|
),
|
|
(
|
|
"procedures_performed",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Procedures performed during stay",
|
|
),
|
|
),
|
|
(
|
|
"hospital_course",
|
|
models.TextField(help_text="Summary of hospital course"),
|
|
),
|
|
(
|
|
"complications",
|
|
models.TextField(
|
|
blank=True, help_text="Complications during stay", null=True
|
|
),
|
|
),
|
|
(
|
|
"discharge_medications",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Medications at discharge"
|
|
),
|
|
),
|
|
(
|
|
"medication_changes",
|
|
models.TextField(
|
|
blank=True, help_text="Changes to medications", null=True
|
|
),
|
|
),
|
|
(
|
|
"activity_restrictions",
|
|
models.TextField(
|
|
blank=True, help_text="Activity restrictions", null=True
|
|
),
|
|
),
|
|
(
|
|
"diet_instructions",
|
|
models.TextField(
|
|
blank=True, help_text="Diet instructions", null=True
|
|
),
|
|
),
|
|
(
|
|
"wound_care",
|
|
models.TextField(
|
|
blank=True, help_text="Wound care instructions", null=True
|
|
),
|
|
),
|
|
(
|
|
"special_instructions",
|
|
models.TextField(
|
|
blank=True,
|
|
help_text="Special discharge instructions",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"follow_up_appointments",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Scheduled follow-up appointments",
|
|
),
|
|
),
|
|
(
|
|
"follow_up_instructions",
|
|
models.TextField(
|
|
blank=True, help_text="Follow-up care instructions", null=True
|
|
),
|
|
),
|
|
(
|
|
"warning_signs",
|
|
models.TextField(
|
|
blank=True, help_text="Warning signs to watch for", null=True
|
|
),
|
|
),
|
|
(
|
|
"when_to_call",
|
|
models.TextField(
|
|
blank=True,
|
|
help_text="When to call healthcare provider",
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"discharge_disposition",
|
|
models.CharField(
|
|
choices=[
|
|
("HOME", "Home"),
|
|
("HOME_HEALTH", "Home with Health Services"),
|
|
("NURSING_HOME", "Nursing Home"),
|
|
("REHAB_FACILITY", "Rehabilitation Facility"),
|
|
("HOSPICE", "Hospice"),
|
|
("TRANSFER", "Transfer to Another Hospital"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Discharge disposition",
|
|
max_length=30,
|
|
),
|
|
),
|
|
(
|
|
"discharge_location",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Specific discharge location",
|
|
max_length=200,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"transportation_arranged",
|
|
models.BooleanField(
|
|
default=False, help_text="Transportation arranged for discharge"
|
|
),
|
|
),
|
|
(
|
|
"transportation_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("PRIVATE", "Private Vehicle"),
|
|
("TAXI", "Taxi"),
|
|
("AMBULANCE", "Ambulance"),
|
|
("MEDICAL_TRANSPORT", "Medical Transport"),
|
|
("PUBLIC_TRANSPORT", "Public Transportation"),
|
|
("WALKING", "Walking"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Method of transportation",
|
|
max_length=30,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"durable_medical_equipment",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Durable medical equipment provided",
|
|
),
|
|
),
|
|
(
|
|
"supplies_provided",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Medical supplies provided"
|
|
),
|
|
),
|
|
(
|
|
"education_provided",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Patient education topics covered",
|
|
),
|
|
),
|
|
(
|
|
"education_materials",
|
|
models.JSONField(
|
|
blank=True,
|
|
default=list,
|
|
help_text="Educational materials provided",
|
|
),
|
|
),
|
|
(
|
|
"patient_understanding",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("EXCELLENT", "Excellent"),
|
|
("GOOD", "Good"),
|
|
("FAIR", "Fair"),
|
|
("POOR", "Poor"),
|
|
],
|
|
help_text="Patient understanding of instructions",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"social_worker_involved",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Social worker involved in discharge planning",
|
|
),
|
|
),
|
|
(
|
|
"case_manager_involved",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Case manager involved in discharge planning",
|
|
),
|
|
),
|
|
(
|
|
"readmission_risk",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("LOW", "Low Risk"),
|
|
("MODERATE", "Moderate Risk"),
|
|
("HIGH", "High Risk"),
|
|
("VERY_HIGH", "Very High Risk"),
|
|
],
|
|
help_text="Risk of readmission",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"patient_satisfaction",
|
|
models.PositiveIntegerField(
|
|
blank=True,
|
|
help_text="Patient satisfaction score (1-10)",
|
|
null=True,
|
|
validators=[
|
|
django.core.validators.MinValueValidator(1),
|
|
django.core.validators.MaxValueValidator(10),
|
|
],
|
|
),
|
|
),
|
|
(
|
|
"summary_completed",
|
|
models.BooleanField(
|
|
default=False, help_text="Discharge summary completed"
|
|
),
|
|
),
|
|
(
|
|
"summary_signed",
|
|
models.BooleanField(
|
|
default=False, help_text="Discharge summary signed"
|
|
),
|
|
),
|
|
(
|
|
"patient_copy_provided",
|
|
models.BooleanField(
|
|
default=False, help_text="Copy provided to patient"
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"admission",
|
|
models.OneToOneField(
|
|
help_text="Associated admission",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="discharge_summary",
|
|
to="inpatients.admission",
|
|
),
|
|
),
|
|
(
|
|
"created_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who created the summary",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="created_discharge_summaries",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"discharge_planner",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Discharge planner",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="planned_discharges",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"discharging_physician",
|
|
models.ForeignKey(
|
|
help_text="Discharging physician",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="physician_discharges",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"primary_nurse",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Primary nurse",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="primary_nurse_discharges",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Discharge Summary",
|
|
"verbose_name_plural": "Discharge Summaries",
|
|
"db_table": "inpatients_discharge_summary",
|
|
"ordering": ["-discharge_date"],
|
|
"indexes": [
|
|
models.Index(
|
|
fields=["admission"], name="inpatients__admissi_0ccfc4_idx"
|
|
),
|
|
models.Index(
|
|
fields=["discharge_date"], name="inpatients__dischar_275061_idx"
|
|
),
|
|
models.Index(
|
|
fields=["discharging_physician"],
|
|
name="inpatients__dischar_8244b8_idx",
|
|
),
|
|
],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="SurgerySchedule",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"surgery_id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
help_text="Unique surgery identifier",
|
|
unique=True,
|
|
),
|
|
),
|
|
(
|
|
"procedure_name",
|
|
models.CharField(
|
|
help_text="Name of surgical procedure", max_length=200
|
|
),
|
|
),
|
|
(
|
|
"procedure_code",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="CPT or ICD procedure code",
|
|
max_length=20,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"surgery_type",
|
|
models.CharField(
|
|
choices=[
|
|
("ELECTIVE", "Elective"),
|
|
("URGENT", "Urgent"),
|
|
("EMERGENT", "Emergent"),
|
|
("TRAUMA", "Trauma"),
|
|
("TRANSPLANT", "Transplant"),
|
|
("CARDIAC", "Cardiac"),
|
|
("NEUROSURGERY", "Neurosurgery"),
|
|
("ORTHOPEDIC", "Orthopedic"),
|
|
("GENERAL", "General Surgery"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Type of surgery",
|
|
max_length=30,
|
|
),
|
|
),
|
|
(
|
|
"scheduled_date",
|
|
models.DateField(help_text="Scheduled surgery date"),
|
|
),
|
|
(
|
|
"scheduled_start_time",
|
|
models.TimeField(help_text="Scheduled start time"),
|
|
),
|
|
(
|
|
"estimated_duration_minutes",
|
|
models.PositiveIntegerField(
|
|
help_text="Estimated duration in minutes"
|
|
),
|
|
),
|
|
(
|
|
"operating_room",
|
|
models.CharField(
|
|
help_text="Operating room assignment", max_length=20
|
|
),
|
|
),
|
|
(
|
|
"or_block_time",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="OR block time assignment",
|
|
max_length=50,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"anesthesia_type",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("GENERAL", "General Anesthesia"),
|
|
("REGIONAL", "Regional Anesthesia"),
|
|
("LOCAL", "Local Anesthesia"),
|
|
("SPINAL", "Spinal Anesthesia"),
|
|
("EPIDURAL", "Epidural Anesthesia"),
|
|
("MAC", "Monitored Anesthesia Care"),
|
|
("SEDATION", "Conscious Sedation"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Type of anesthesia",
|
|
max_length=30,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"preop_diagnosis",
|
|
models.TextField(help_text="Pre-operative diagnosis"),
|
|
),
|
|
(
|
|
"preop_orders",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Pre-operative orders"
|
|
),
|
|
),
|
|
(
|
|
"consent_obtained",
|
|
models.BooleanField(
|
|
default=False, help_text="Surgical consent obtained"
|
|
),
|
|
),
|
|
(
|
|
"consent_date",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Date consent was obtained", null=True
|
|
),
|
|
),
|
|
(
|
|
"special_equipment",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Special equipment needed"
|
|
),
|
|
),
|
|
(
|
|
"implants_needed",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Implants or devices needed"
|
|
),
|
|
),
|
|
(
|
|
"blood_products",
|
|
models.JSONField(
|
|
blank=True, default=list, help_text="Blood products needed"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("SCHEDULED", "Scheduled"),
|
|
("CONFIRMED", "Confirmed"),
|
|
("PREP", "Pre-operative Prep"),
|
|
("IN_PROGRESS", "In Progress"),
|
|
("COMPLETED", "Completed"),
|
|
("CANCELLED", "Cancelled"),
|
|
("POSTPONED", "Postponed"),
|
|
("DELAYED", "Delayed"),
|
|
],
|
|
default="SCHEDULED",
|
|
help_text="Surgery status",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"actual_start_time",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Actual start time", null=True
|
|
),
|
|
),
|
|
(
|
|
"actual_end_time",
|
|
models.DateTimeField(
|
|
blank=True, help_text="Actual end time", null=True
|
|
),
|
|
),
|
|
(
|
|
"actual_duration_minutes",
|
|
models.PositiveIntegerField(
|
|
blank=True, help_text="Actual duration in minutes", null=True
|
|
),
|
|
),
|
|
(
|
|
"postop_diagnosis",
|
|
models.TextField(
|
|
blank=True, help_text="Post-operative diagnosis", null=True
|
|
),
|
|
),
|
|
(
|
|
"procedure_performed",
|
|
models.TextField(
|
|
blank=True, help_text="Actual procedure performed", null=True
|
|
),
|
|
),
|
|
(
|
|
"complications",
|
|
models.TextField(
|
|
blank=True, help_text="Intraoperative complications", null=True
|
|
),
|
|
),
|
|
(
|
|
"recovery_location",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("PACU", "Post-Anesthesia Care Unit"),
|
|
("ICU", "Intensive Care Unit"),
|
|
("WARD", "Regular Ward"),
|
|
("SAME_DAY", "Same Day Surgery"),
|
|
("HOME", "Home"),
|
|
("OTHER", "Other"),
|
|
],
|
|
help_text="Post-operative recovery location",
|
|
max_length=50,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"priority",
|
|
models.CharField(
|
|
choices=[
|
|
("ROUTINE", "Routine"),
|
|
("URGENT", "Urgent"),
|
|
("EMERGENT", "Emergent"),
|
|
("STAT", "STAT"),
|
|
],
|
|
default="ROUTINE",
|
|
help_text="Surgery priority",
|
|
max_length=20,
|
|
),
|
|
),
|
|
(
|
|
"surgery_notes",
|
|
models.TextField(blank=True, help_text="Surgery notes", null=True),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"admission",
|
|
models.ForeignKey(
|
|
help_text="Associated admission",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="surgeries",
|
|
to="inpatients.admission",
|
|
),
|
|
),
|
|
(
|
|
"anesthesiologist",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Anesthesiologist",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="inpatient_anesthesia_cases",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"assistant_surgeons",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Assistant surgeons",
|
|
related_name="assistant_surgeries",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"circulating_nurse",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Circulating nurse",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="inpatient_circulating_cases",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"created_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="User who created the surgery schedule",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="created_surgeries",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
help_text="Patient undergoing surgery",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="surgeries",
|
|
to="patients.patientprofile",
|
|
),
|
|
),
|
|
(
|
|
"primary_surgeon",
|
|
models.ForeignKey(
|
|
help_text="Primary surgeon",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="primary_surgeries",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"scrub_nurse",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Scrub nurse",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="inpatient_scrub_cases",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
help_text="Organization tenant",
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="surgery_schedules",
|
|
to="core.tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Surgery Schedule",
|
|
"verbose_name_plural": "Surgery Schedules",
|
|
"db_table": "inpatients_surgery_schedule",
|
|
"ordering": ["scheduled_date", "scheduled_start_time"],
|
|
"indexes": [
|
|
models.Index(
|
|
fields=["tenant", "status"],
|
|
name="inpatients__tenant__ba70e0_idx",
|
|
),
|
|
models.Index(
|
|
fields=["patient"], name="inpatients__patient_7254b1_idx"
|
|
),
|
|
models.Index(
|
|
fields=["admission"], name="inpatients__admissi_cb9ef2_idx"
|
|
),
|
|
models.Index(
|
|
fields=["scheduled_date"], name="inpatients__schedul_43b664_idx"
|
|
),
|
|
models.Index(
|
|
fields=["primary_surgeon"],
|
|
name="inpatients__primary_5238a2_idx",
|
|
),
|
|
models.Index(
|
|
fields=["operating_room"], name="inpatients__operati_2eaa06_idx"
|
|
),
|
|
],
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ward",
|
|
index=models.Index(
|
|
fields=["tenant", "ward_type"], name="inpatients__tenant__338f37_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ward",
|
|
index=models.Index(
|
|
fields=["specialty"], name="inpatients__special_149fd4_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ward",
|
|
index=models.Index(
|
|
fields=["is_active", "is_accepting_admissions"],
|
|
name="inpatients__is_acti_7dc57f_idx",
|
|
),
|
|
),
|
|
migrations.AlterUniqueTogether(
|
|
name="ward",
|
|
unique_together={("tenant", "ward_id")},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="transfer",
|
|
index=models.Index(
|
|
fields=["admission", "status"], name="inpatients__admissi_08e4ca_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="transfer",
|
|
index=models.Index(
|
|
fields=["patient"], name="inpatients__patient_9e7d37_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="transfer",
|
|
index=models.Index(
|
|
fields=["from_ward", "to_ward"], name="inpatients__from_wa_466f5f_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="transfer",
|
|
index=models.Index(
|
|
fields=["requested_datetime"], name="inpatients__request_2b3b18_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="transfer",
|
|
index=models.Index(
|
|
fields=["priority"], name="inpatients__priorit_4b9e10_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="bed",
|
|
index=models.Index(
|
|
fields=["ward", "status"], name="inpatients__ward_id_87bbcc_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="bed",
|
|
index=models.Index(
|
|
fields=["current_patient"], name="inpatients__current_3e5415_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="bed",
|
|
index=models.Index(
|
|
fields=["bed_type", "room_type"], name="inpatients__bed_typ_7caad7_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="bed",
|
|
index=models.Index(fields=["status"], name="inpatients__status_e98d75_idx"),
|
|
),
|
|
migrations.AlterUniqueTogether(
|
|
name="bed",
|
|
unique_together={("ward", "bed_number")},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="admission",
|
|
index=models.Index(
|
|
fields=["tenant", "status"], name="inpatients__tenant__71213b_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="admission",
|
|
index=models.Index(
|
|
fields=["patient", "status"], name="inpatients__patient_87f767_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="admission",
|
|
index=models.Index(
|
|
fields=["current_ward"], name="inpatients__current_8e363a_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="admission",
|
|
index=models.Index(
|
|
fields=["admission_datetime"], name="inpatients__admissi_632f0b_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="admission",
|
|
index=models.Index(
|
|
fields=["attending_physician"], name="inpatients__attendi_19fb85_idx"
|
|
),
|
|
),
|
|
]
|