470 lines
19 KiB
Python
470 lines
19 KiB
Python
# Generated by Django 5.2.7 on 2025-10-27 10:50
|
|
|
|
import simple_history.models
|
|
import uuid
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = []
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="Appointment",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"appointment_number",
|
|
models.CharField(
|
|
editable=False,
|
|
max_length=20,
|
|
unique=True,
|
|
verbose_name="Appointment Number",
|
|
),
|
|
),
|
|
("service_type", models.CharField(max_length=200, verbose_name="Service Type")),
|
|
("scheduled_date", models.DateField(verbose_name="Scheduled Date")),
|
|
("scheduled_time", models.TimeField(verbose_name="Scheduled Time")),
|
|
(
|
|
"duration",
|
|
models.PositiveIntegerField(
|
|
default=30, help_text="Duration in minutes", verbose_name="Duration"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("BOOKED", "Booked"),
|
|
("CONFIRMED", "Confirmed"),
|
|
("RESCHEDULED", "Rescheduled"),
|
|
("CANCELLED", "Cancelled"),
|
|
("NO_SHOW", "No Show"),
|
|
("ARRIVED", "Arrived"),
|
|
("IN_PROGRESS", "In Progress"),
|
|
("COMPLETED", "Completed"),
|
|
],
|
|
default="BOOKED",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"confirmation_sent_at",
|
|
models.DateTimeField(
|
|
blank=True, null=True, verbose_name="Confirmation Sent At"
|
|
),
|
|
),
|
|
(
|
|
"confirmation_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("SMS", "SMS"),
|
|
("WHATSAPP", "WhatsApp"),
|
|
("EMAIL", "Email"),
|
|
("PHONE", "Phone Call"),
|
|
("IN_PERSON", "In Person"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Confirmation Method",
|
|
),
|
|
),
|
|
(
|
|
"arrival_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Arrival Time"),
|
|
),
|
|
(
|
|
"start_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Start Time"),
|
|
),
|
|
("end_at", models.DateTimeField(blank=True, null=True, verbose_name="End Time")),
|
|
(
|
|
"reschedule_reason",
|
|
models.TextField(blank=True, verbose_name="Reschedule Reason"),
|
|
),
|
|
(
|
|
"reschedule_count",
|
|
models.PositiveIntegerField(default=0, verbose_name="Reschedule Count"),
|
|
),
|
|
("cancel_reason", models.TextField(blank=True, verbose_name="Cancellation Reason")),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
(
|
|
"finance_cleared",
|
|
models.BooleanField(default=False, verbose_name="Finance Cleared"),
|
|
),
|
|
(
|
|
"consent_verified",
|
|
models.BooleanField(default=False, verbose_name="Consent Verified"),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Appointment",
|
|
"verbose_name_plural": "Appointments",
|
|
"ordering": ["-scheduled_date", "-scheduled_time"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="AppointmentConfirmation",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"token",
|
|
models.CharField(
|
|
editable=False,
|
|
max_length=64,
|
|
unique=True,
|
|
verbose_name="Confirmation Token",
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("PENDING", "Pending"),
|
|
("CONFIRMED", "Confirmed"),
|
|
("DECLINED", "Declined"),
|
|
("EXPIRED", "Expired"),
|
|
],
|
|
default="PENDING",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"confirmation_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("LINK", "Confirmation Link"),
|
|
("SMS", "SMS Reply"),
|
|
("PHONE", "Phone Call"),
|
|
("IN_PERSON", "In Person"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Confirmation Method",
|
|
),
|
|
),
|
|
(
|
|
"confirmed_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Confirmed At"),
|
|
),
|
|
(
|
|
"confirmed_by_ip",
|
|
models.GenericIPAddressField(
|
|
blank=True, null=True, verbose_name="Confirmed By IP"
|
|
),
|
|
),
|
|
(
|
|
"confirmed_by_user_agent",
|
|
models.TextField(blank=True, verbose_name="Confirmed By User Agent"),
|
|
),
|
|
("expires_at", models.DateTimeField(verbose_name="Expires At")),
|
|
("sent_at", models.DateTimeField(blank=True, null=True, verbose_name="Sent At")),
|
|
(
|
|
"reminder_count",
|
|
models.PositiveIntegerField(default=0, verbose_name="Reminder Count"),
|
|
),
|
|
(
|
|
"last_reminder_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Last Reminder At"),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Appointment Confirmation",
|
|
"verbose_name_plural": "Appointment Confirmations",
|
|
"ordering": ["-created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="AppointmentReminder",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"reminder_type",
|
|
models.CharField(
|
|
choices=[("SMS", "SMS"), ("WHATSAPP", "WhatsApp"), ("EMAIL", "Email")],
|
|
max_length=20,
|
|
verbose_name="Reminder Type",
|
|
),
|
|
),
|
|
("scheduled_for", models.DateTimeField(verbose_name="Scheduled For")),
|
|
("sent_at", models.DateTimeField(blank=True, null=True, verbose_name="Sent At")),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("SCHEDULED", "Scheduled"),
|
|
("SENT", "Sent"),
|
|
("FAILED", "Failed"),
|
|
("CANCELLED", "Cancelled"),
|
|
],
|
|
default="SCHEDULED",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Appointment Reminder",
|
|
"verbose_name_plural": "Appointment Reminders",
|
|
"ordering": ["scheduled_for"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="HistoricalAppointment",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
db_index=True, default=uuid.uuid4, editable=False, verbose_name="ID"
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Created At"),
|
|
),
|
|
(
|
|
"updated_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Updated At"),
|
|
),
|
|
(
|
|
"appointment_number",
|
|
models.CharField(
|
|
db_index=True,
|
|
editable=False,
|
|
max_length=20,
|
|
verbose_name="Appointment Number",
|
|
),
|
|
),
|
|
("service_type", models.CharField(max_length=200, verbose_name="Service Type")),
|
|
("scheduled_date", models.DateField(verbose_name="Scheduled Date")),
|
|
("scheduled_time", models.TimeField(verbose_name="Scheduled Time")),
|
|
(
|
|
"duration",
|
|
models.PositiveIntegerField(
|
|
default=30, help_text="Duration in minutes", verbose_name="Duration"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("BOOKED", "Booked"),
|
|
("CONFIRMED", "Confirmed"),
|
|
("RESCHEDULED", "Rescheduled"),
|
|
("CANCELLED", "Cancelled"),
|
|
("NO_SHOW", "No Show"),
|
|
("ARRIVED", "Arrived"),
|
|
("IN_PROGRESS", "In Progress"),
|
|
("COMPLETED", "Completed"),
|
|
],
|
|
default="BOOKED",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"confirmation_sent_at",
|
|
models.DateTimeField(
|
|
blank=True, null=True, verbose_name="Confirmation Sent At"
|
|
),
|
|
),
|
|
(
|
|
"confirmation_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("SMS", "SMS"),
|
|
("WHATSAPP", "WhatsApp"),
|
|
("EMAIL", "Email"),
|
|
("PHONE", "Phone Call"),
|
|
("IN_PERSON", "In Person"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Confirmation Method",
|
|
),
|
|
),
|
|
(
|
|
"arrival_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Arrival Time"),
|
|
),
|
|
(
|
|
"start_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Start Time"),
|
|
),
|
|
("end_at", models.DateTimeField(blank=True, null=True, verbose_name="End Time")),
|
|
(
|
|
"reschedule_reason",
|
|
models.TextField(blank=True, verbose_name="Reschedule Reason"),
|
|
),
|
|
(
|
|
"reschedule_count",
|
|
models.PositiveIntegerField(default=0, verbose_name="Reschedule Count"),
|
|
),
|
|
("cancel_reason", models.TextField(blank=True, verbose_name="Cancellation Reason")),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
(
|
|
"finance_cleared",
|
|
models.BooleanField(default=False, verbose_name="Finance Cleared"),
|
|
),
|
|
(
|
|
"consent_verified",
|
|
models.BooleanField(default=False, verbose_name="Consent Verified"),
|
|
),
|
|
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
|
("history_date", models.DateTimeField(db_index=True)),
|
|
("history_change_reason", models.CharField(max_length=100, null=True)),
|
|
(
|
|
"history_type",
|
|
models.CharField(
|
|
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "historical Appointment",
|
|
"verbose_name_plural": "historical Appointments",
|
|
"ordering": ("-history_date", "-history_id"),
|
|
"get_latest_by": ("history_date", "history_id"),
|
|
},
|
|
bases=(simple_history.models.HistoricalChanges, models.Model),
|
|
),
|
|
migrations.CreateModel(
|
|
name="Provider",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("is_available", models.BooleanField(default=True, verbose_name="Is Available")),
|
|
(
|
|
"max_daily_appointments",
|
|
models.PositiveIntegerField(default=20, verbose_name="Max Daily Appointments"),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Provider",
|
|
"verbose_name_plural": "Providers",
|
|
"ordering": ["user__last_name", "user__first_name"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Room",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("name", models.CharField(max_length=100, verbose_name="Name")),
|
|
("room_number", models.CharField(max_length=20, verbose_name="Room Number")),
|
|
("is_available", models.BooleanField(default=True, verbose_name="Is Available")),
|
|
],
|
|
options={
|
|
"verbose_name": "Room",
|
|
"verbose_name_plural": "Rooms",
|
|
"ordering": ["clinic", "room_number"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Schedule",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"day_of_week",
|
|
models.IntegerField(
|
|
choices=[
|
|
(0, "Sunday"),
|
|
(1, "Monday"),
|
|
(2, "Tuesday"),
|
|
(3, "Wednesday"),
|
|
(4, "Thursday"),
|
|
(5, "Friday"),
|
|
(6, "Saturday"),
|
|
],
|
|
verbose_name="Day of Week",
|
|
),
|
|
),
|
|
("start_time", models.TimeField(verbose_name="Start Time")),
|
|
("end_time", models.TimeField(verbose_name="End Time")),
|
|
(
|
|
"slot_duration",
|
|
models.PositiveIntegerField(
|
|
default=30,
|
|
help_text="Duration of each appointment slot in minutes",
|
|
verbose_name="Slot Duration (minutes)",
|
|
),
|
|
),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
],
|
|
options={
|
|
"verbose_name": "Schedule",
|
|
"verbose_name_plural": "Schedules",
|
|
"ordering": ["provider", "day_of_week", "start_time"],
|
|
},
|
|
),
|
|
]
|