Marwan Alwali 2780a2dc7c update
2025-09-16 15:10:57 +03:00

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"
),
),
]