# Generated by Django 5.2.17 on 2026-09-30 18:07

import django.db.models.deletion
import django.utils.timezone
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('catalog', '0002_deviceidentificationpolicy'),
        ('communications', '0001_initial'),
        ('organization', '0002_userorganizationassignment'),
        ('service', '0006_handover_closure'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='ServiceSla',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('policy_snapshot', models.JSONField()),
                ('started_at', models.DateTimeField()),
                ('due_at', models.DateTimeField()),
                ('warning_at', models.DateTimeField()),
                ('enrolled_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('product_category', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='catalog.productcategory')),
                ('service_case', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='sla_record', to='service.servicecase')),
            ],
            options={
                'ordering': ['due_at', 'pk'],
                'permissions': [('view_sla', 'View scoped SLA monitoring and history'), ('monitor_sla', 'Enroll service cases and record SLA escalations')],
                'default_permissions': (),
            },
        ),
        migrations.CreateModel(
            name='SlaEscalation',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('kind', models.CharField(choices=[('DUE_SOON', 'Due soon'), ('OVERDUE', 'Overdue')], max_length=10)),
                ('origin', models.CharField(choices=[('MANUAL', 'Manual'), ('MONITOR', 'Monitor')], max_length=10)),
                ('occurred_at', models.DateTimeField()),
                ('context', models.JSONField()),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('notification_template', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='communications.notificationtemplate')),
                ('sla', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='escalations', to='sla.servicesla')),
            ],
            options={
                'ordering': ['occurred_at', 'pk'],
                'default_permissions': (),
            },
        ),
        migrations.CreateModel(
            name='EscalationCommunication',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('error_code', models.CharField(blank=True, max_length=40)),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('notification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='communications.notification')),
                ('escalation', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='communication_attempts', to='sla.slaescalation')),
            ],
            options={
                'ordering': ['created_at', 'pk'],
                'default_permissions': (),
            },
        ),
        migrations.CreateModel(
            name='SlaPolicy',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('code', models.SlugField(max_length=64)),
                ('name', models.CharField(max_length=150)),
                ('is_active', models.BooleanField(default=True)),
                ('effective_from', models.DateField()),
                ('effective_until', models.DateField(blank=True, null=True)),
                ('target_minutes', models.PositiveIntegerField()),
                ('warning_minutes', models.PositiveIntegerField()),
                ('updated_at', models.DateTimeField(default=django.utils.timezone.now)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('due_soon_template', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sla_due_policies', to='communications.notificationtemplate')),
                ('overdue_template', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sla_overdue_policies', to='communications.notificationtemplate')),
                ('product_category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='catalog.productcategory')),
                ('service_center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='organization.servicecenter')),
                ('updated_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['company_id', 'code'],
                'permissions': [('manage_slapolicy', 'Manage company SLA policies')],
                'default_permissions': (),
            },
        ),
        migrations.AddField(
            model_name='servicesla',
            name='policy',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sla.slapolicy'),
        ),
        migrations.AddConstraint(
            model_name='slaescalation',
            constraint=models.UniqueConstraint(fields=('sla', 'kind'), name='sla_escalation_unique'),
        ),
        migrations.AddConstraint(
            model_name='slaescalation',
            constraint=models.CheckConstraint(condition=models.Q(('kind__in', ['DUE_SOON', 'OVERDUE']), ('origin__in', ['MANUAL', 'MONITOR'])), name='sla_escalation_valid'),
        ),
        migrations.AddConstraint(
            model_name='escalationcommunication',
            constraint=models.UniqueConstraint(condition=models.Q(('notification__isnull', False)), fields=('escalation',), name='sla_one_notification_link'),
        ),
        migrations.AddConstraint(
            model_name='escalationcommunication',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('error_code', 'NOTIFICATION_REQUEST_FAILED'), ('notification', None)), models.Q(('error_code', ''), ('notification__isnull', False)), _connector='OR'), name='sla_communication_result'),
        ),
        migrations.AddConstraint(
            model_name='slapolicy',
            constraint=models.UniqueConstraint(fields=('company', 'code'), name='sla_policy_code_unique'),
        ),
        migrations.AddConstraint(
            model_name='slapolicy',
            constraint=models.CheckConstraint(condition=models.Q(('target_minutes__gte', 1), ('warning_minutes__gte', 0), ('warning_minutes__lte', models.F('target_minutes'))), name='sla_duration_valid'),
        ),
        migrations.AddConstraint(
            model_name='slapolicy',
            constraint=models.CheckConstraint(condition=models.Q(('effective_until', None), ('effective_until__gte', models.F('effective_from')), _connector='OR'), name='sla_effective_range_valid'),
        ),
        migrations.AddConstraint(
            model_name='servicesla',
            constraint=models.CheckConstraint(condition=models.Q(('due_at__gt', models.F('started_at')), ('warning_at__gte', models.F('started_at')), ('warning_at__lte', models.F('due_at'))), name='sla_clock_valid'),
        ),
    ]
