# Generated by Django 5.2.17 on 2026-09-03 00:09

import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('customers', '0004_notificationpreference_email_enabled_and_more'),
        ('support', '0001_initial'),
        ('tenancy', '0004_staffprofile'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='ComplaintAttachment',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('file_name', models.CharField(max_length=255)),
                ('file_url', models.CharField(max_length=500)),
                ('file_size_bytes', models.PositiveIntegerField(default=0)),
                ('mime_type', models.CharField(blank=True, max_length=100)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
            ],
            options={
                'db_table': 'support_complaint_attachment',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='ComplaintInternalNote',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('note', models.TextField()),
                ('is_internal', models.BooleanField(default=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
            ],
            options={
                'db_table': 'support_complaint_internal_note',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='ComplaintSLAPolicy',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('priority', models.CharField(choices=[('LOW', 'Low'), ('MEDIUM', 'Medium'), ('HIGH', 'High'), ('CRITICAL', 'Critical')], max_length=20)),
                ('response_target_minutes', models.PositiveIntegerField(default=60)),
                ('resolution_target_hours', models.PositiveIntegerField(default=24)),
                ('escalation_threshold_hours', models.PositiveIntegerField(default=12)),
                ('is_active', models.BooleanField(default=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
            options={
                'db_table': 'support_complaint_sla_policy',
                'ordering': ['priority'],
            },
        ),
        migrations.CreateModel(
            name='ComplaintTimeline',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('event_type', models.CharField(max_length=50)),
                ('previous_value', models.CharField(blank=True, max_length=100)),
                ('new_value', models.CharField(blank=True, max_length=100)),
                ('summary', models.CharField(max_length=255)),
                ('notes', models.TextField(blank=True)),
                ('metadata', models.JSONField(blank=True, default=dict)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
            ],
            options={
                'db_table': 'support_complaint_timeline',
                'ordering': ['-created_at'],
            },
        ),
        migrations.AddField(
            model_name='complaint',
            name='assigned_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='assigned_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_by_support_complaints', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaint',
            name='assigned_to',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_support_complaints', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaint',
            name='customer_confirmation',
            field=models.CharField(choices=[('PENDING', 'Pending Confirmation'), ('CONFIRMED', 'Customer Confirmed'), ('REJECTED', 'Reopened / Rejected by Customer')], default='PENDING', max_length=20),
        ),
        migrations.AddField(
            model_name='complaint',
            name='customer_confirmed_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='customer_feedback_notes',
            field=models.TextField(blank=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='customer_feedback_rating',
            field=models.PositiveSmallIntegerField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='diagnosis_category',
            field=models.CharField(blank=True, max_length=100),
        ),
        migrations.AddField(
            model_name='complaint',
            name='escalated_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='escalated_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='escalated_support_complaints', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaint',
            name='escalated_to',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='escalated_to_support_complaints', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaint',
            name='escalation_level',
            field=models.PositiveSmallIntegerField(default=0),
        ),
        migrations.AddField(
            model_name='complaint',
            name='escalation_reason',
            field=models.TextField(blank=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='first_response_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='is_escalated',
            field=models.BooleanField(default=False),
        ),
        migrations.AddField(
            model_name='complaint',
            name='is_resolution_sla_breached',
            field=models.BooleanField(default=False),
        ),
        migrations.AddField(
            model_name='complaint',
            name='is_response_sla_breached',
            field=models.BooleanField(default=False),
        ),
        migrations.AddField(
            model_name='complaint',
            name='linked_incident',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='linked_complaints', to='support.incident'),
        ),
        migrations.AddField(
            model_name='complaint',
            name='reassignment_reason',
            field=models.TextField(blank=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='resolution_due_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='resolution_summary',
            field=models.TextField(blank=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='response_due_at',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='complaint',
            name='sla_status',
            field=models.CharField(choices=[('ON_TRACK', 'On Track'), ('DUE_SOON', 'Due Soon'), ('BREACHED', 'SLA Breached'), ('RESOLVED', 'Resolved')], default='ON_TRACK', max_length=20),
        ),
        migrations.AddField(
            model_name='complaint',
            name='source',
            field=models.CharField(choices=[('CUSTOMER_PORTAL', 'Customer Portal'), ('PHONE', 'Phone Call'), ('WHATSAPP', 'WhatsApp'), ('SMS', 'SMS'), ('WALK_IN', 'Walk-in Desk'), ('STAFF', 'Staff Registered'), ('SYSTEM', 'System Automated'), ('OTHER', 'Other')], default='STAFF', max_length=30),
        ),
        migrations.AlterField(
            model_name='complaint',
            name='category',
            field=models.CharField(choices=[('CONNECTIVITY', 'Connectivity'), ('SPEED', 'Speed'), ('BILLING', 'Billing'), ('DEVICE', 'Device'), ('INSTALLATION', 'Installation'), ('ROUTER_ISSUE', 'Router Issue'), ('ONU_ISSUE', 'ONU / Optical Issue'), ('FIBER_CABLE_DAMAGE', 'Fiber / Cable Damage'), ('POWER_ISSUE', 'Power / Adapter Issue'), ('PAYMENT_RELATED', 'Payment Related'), ('CONFIGURATION', 'Configuration'), ('OTHER', 'Other')], default='CONNECTIVITY', max_length=40),
        ),
        migrations.AlterField(
            model_name='complaint',
            name='status',
            field=models.CharField(choices=[('OPEN', 'Open'), ('NEW', 'New'), ('ACKNOWLEDGED', 'Acknowledged'), ('ASSIGNED', 'Assigned'), ('IN_PROGRESS', 'In Progress'), ('WAITING_CUSTOMER', 'Waiting for Customer'), ('WAITING_PARTS', 'Waiting for Parts'), ('ESCALATED', 'Escalated'), ('RESOLVED', 'Resolved'), ('CUSTOMER_CONFIRMED', 'Customer Confirmed'), ('CLOSED', 'Closed'), ('CANCELLED', 'Cancelled')], default='OPEN', max_length=30),
        ),
        migrations.AddIndex(
            model_name='complaint',
            index=models.Index(fields=['organization', 'assigned_to'], name='complaint_org_assigned_idx'),
        ),
        migrations.AddIndex(
            model_name='complaint',
            index=models.Index(fields=['organization', 'sla_status'], name='complaint_org_sla_idx'),
        ),
        migrations.AddField(
            model_name='complaintattachment',
            name='complaint',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments_list', to='support.complaint'),
        ),
        migrations.AddField(
            model_name='complaintattachment',
            name='organization',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_records', to='tenancy.organization'),
        ),
        migrations.AddField(
            model_name='complaintattachment',
            name='uploaded_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_complaint_attachments', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaintinternalnote',
            name='author',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_internal_notes', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complaintinternalnote',
            name='complaint',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='internal_notes_list', to='support.complaint'),
        ),
        migrations.AddField(
            model_name='complaintinternalnote',
            name='organization',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_records', to='tenancy.organization'),
        ),
        migrations.AddField(
            model_name='complaintslapolicy',
            name='organization',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_records', to='tenancy.organization'),
        ),
        migrations.AddField(
            model_name='complainttimeline',
            name='actor',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_timeline_events', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='complainttimeline',
            name='complaint',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='timeline_events', to='support.complaint'),
        ),
        migrations.AddField(
            model_name='complainttimeline',
            name='organization',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_records', to='tenancy.organization'),
        ),
        migrations.AddIndex(
            model_name='complaintinternalnote',
            index=models.Index(fields=['organization', 'complaint'], name='complaint_note_org_cmp_idx'),
        ),
        migrations.AddConstraint(
            model_name='complaintslapolicy',
            constraint=models.UniqueConstraint(fields=('organization', 'priority'), name='unique_sla_policy_per_priority_org'),
        ),
        migrations.AddIndex(
            model_name='complainttimeline',
            index=models.Index(fields=['organization', 'complaint'], name='complaint_time_org_cmp_idx'),
        ),
        migrations.AddIndex(
            model_name='complainttimeline',
            index=models.Index(fields=['organization', 'created_at'], name='complaint_time_org_dt_idx'),
        ),
    ]
