# Generated by Django 5.2.7 on 2025-10-27 10:50 import django.db.models.deletion import uuid from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ("core", "0001_initial"), ] operations = [ migrations.CreateModel( name="MessageTemplate", 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")), ( "code", models.CharField( help_text="Unique identifier for this template (e.g., 'appointment_reminder')", max_length=100, unique=True, verbose_name="Template Code", ), ), ("name", models.CharField(max_length=200, verbose_name="Template Name")), ( "channel", models.CharField( choices=[("SMS", "SMS"), ("WHATSAPP", "WhatsApp"), ("EMAIL", "Email")], max_length=20, verbose_name="Channel", ), ), ( "subject", models.CharField( blank=True, help_text="For email only", max_length=200, verbose_name="Subject", ), ), ("body_en", models.TextField(verbose_name="Body (English)")), ("body_ar", models.TextField(blank=True, verbose_name="Body (Arabic)")), ( "variables", models.JSONField( default=list, help_text="List of variable names that can be used in the template (e.g., ['patient_name', 'appointment_date'])", verbose_name="Variables", ), ), ("is_active", models.BooleanField(default=True, verbose_name="Is Active")), ( "tenant", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="%(app_label)s_%(class)s_related", to="core.tenant", verbose_name="Tenant", ), ), ], options={ "verbose_name": "Message Template", "verbose_name_plural": "Message Templates", "ordering": ["channel", "name"], }, ), migrations.CreateModel( name="Message", 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")), ( "channel", models.CharField( choices=[("SMS", "SMS"), ("WHATSAPP", "WhatsApp"), ("EMAIL", "Email")], max_length=20, verbose_name="Channel", ), ), ( "recipient", models.CharField( help_text="Phone number or email address", max_length=200, verbose_name="Recipient", ), ), ("subject", models.CharField(blank=True, max_length=200, verbose_name="Subject")), ("body", models.TextField(verbose_name="Body")), ( "variables_used", models.JSONField( default=dict, help_text="Variables and their values used to render this message", verbose_name="Variables Used", ), ), ( "status", models.CharField( choices=[ ("QUEUED", "Queued"), ("SENT", "Sent"), ("DELIVERED", "Delivered"), ("FAILED", "Failed"), ("BOUNCED", "Bounced"), ("READ", "Read"), ], default="QUEUED", max_length=20, verbose_name="Status", ), ), ("sent_at", models.DateTimeField(blank=True, null=True, verbose_name="Sent At")), ( "delivered_at", models.DateTimeField(blank=True, null=True, verbose_name="Delivered At"), ), ( "provider_message_id", models.CharField( blank=True, help_text="Message ID from the provider (Twilio, etc.)", max_length=200, verbose_name="Provider Message ID", ), ), ( "provider_response", models.JSONField( blank=True, default=dict, help_text="Full response from the messaging provider", verbose_name="Provider Response", ), ), ("error_message", models.TextField(blank=True, verbose_name="Error Message")), ("retry_count", models.PositiveIntegerField(default=0, verbose_name="Retry Count")), ( "tenant", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="%(app_label)s_%(class)s_related", to="core.tenant", verbose_name="Tenant", ), ), ( "template", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="messages", to="notifications.messagetemplate", verbose_name="Template", ), ), ], options={ "verbose_name": "Message", "verbose_name_plural": "Messages", "ordering": ["-created_at"], }, ), migrations.CreateModel( name="NotificationPreference", 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")), ("sms_enabled", models.BooleanField(default=True, verbose_name="SMS Enabled")), ( "whatsapp_enabled", models.BooleanField(default=True, verbose_name="WhatsApp Enabled"), ), ("email_enabled", models.BooleanField(default=True, verbose_name="Email Enabled")), ( "appointment_reminders", models.BooleanField(default=True, verbose_name="Appointment Reminders"), ), ( "appointment_confirmations", models.BooleanField(default=True, verbose_name="Appointment Confirmations"), ), ( "results_notifications", models.BooleanField(default=True, verbose_name="Results Notifications"), ), ( "billing_notifications", models.BooleanField(default=True, verbose_name="Billing Notifications"), ), ( "marketing_communications", models.BooleanField(default=False, verbose_name="Marketing Communications"), ), ( "preferred_language", models.CharField( choices=[("en", "English"), ("ar", "Arabic")], default="en", max_length=5, verbose_name="Preferred Language", ), ), ( "preferred_channel", models.CharField( choices=[("SMS", "SMS"), ("WHATSAPP", "WhatsApp"), ("EMAIL", "Email")], default="SMS", max_length=20, verbose_name="Preferred Channel", ), ), ( "patient", models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, related_name="notification_preferences", to="core.patient", verbose_name="Patient", ), ), ], options={ "verbose_name": "Notification Preference", "verbose_name_plural": "Notification Preferences", }, ), migrations.CreateModel( name="MessageLog", 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")), ( "event_type", models.CharField( choices=[ ("CREATED", "Created"), ("QUEUED", "Queued"), ("SENDING", "Sending"), ("SENT", "Sent"), ("DELIVERED", "Delivered"), ("FAILED", "Failed"), ("BOUNCED", "Bounced"), ("READ", "Read"), ("RETRY", "Retry"), ], max_length=20, verbose_name="Event Type", ), ), ("details", models.JSONField(blank=True, default=dict, verbose_name="Details")), ( "message", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="logs", to="notifications.message", verbose_name="Message", ), ), ], options={ "verbose_name": "Message Log", "verbose_name_plural": "Message Logs", "ordering": ["created_at"], "indexes": [ models.Index( fields=["message", "created_at"], name="notificatio_message_6c0b7e_idx" ), models.Index( fields=["event_type", "created_at"], name="notificatio_event_t_55d6ba_idx" ), ], }, ), migrations.AddIndex( model_name="message", index=models.Index( fields=["status", "created_at"], name="notificatio_status_82620d_idx" ), ), migrations.AddIndex( model_name="message", index=models.Index(fields=["channel", "status"], name="notificatio_channel_75d7dd_idx"), ), migrations.AddIndex( model_name="message", index=models.Index( fields=["recipient", "created_at"], name="notificatio_recipie_c0566a_idx" ), ), migrations.AddIndex( model_name="message", index=models.Index( fields=["tenant", "created_at"], name="notificatio_tenant__4ef7bb_idx" ), ), migrations.AddIndex( model_name="message", index=models.Index( fields=["provider_message_id"], name="notificatio_provide_b5ba29_idx" ), ), ]