agdar/appointments/migrations/0001_initial.py
2025-11-02 14:35:35 +03:00

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