# Generated by Django 5.2.17 on 2026-09-27 20:27

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):

    dependencies = [
        ('devices', '0003_customer_device_relationship'),
        ('inventory', '0008_usage_integrity'),
        ('organization', '0002_userorganizationassignment'),
        ('service', '0006_handover_closure'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='DefectiveRecovery',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('component_description', models.CharField(max_length=200)),
                ('observed_identifier', models.CharField(blank=True, max_length=128)),
                ('quantity', models.PositiveIntegerField(default=1)),
                ('recovered_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('command_key', models.UUIDField()),
                ('note', models.TextField(blank=True, max_length=2000)),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('device', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='devices.device')),
                ('location', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.inventorylocation')),
                ('repair_action', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.servicerepairaction')),
                ('replacement', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='inventory.partsdisposition')),
                ('service_case', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.servicecase')),
            ],
            options={
                'permissions': [('recover_defective_parts', 'Record removed defective customer components')],
                'constraints': [models.UniqueConstraint(fields=('company', 'command_key'), name='inventory_recovery_command'), models.CheckConstraint(condition=models.Q(('quantity__gte', 1), ('quantity__lte', 1000000000)), name='inventory_recovery_qty'), models.CheckConstraint(condition=models.Q(('observed_identifier', ''), ('quantity', 1), _connector='OR'), name='inventory_recovery_identifier_qty'), models.CheckConstraint(condition=models.Q(('component_description', ''), _negated=True), name='inventory_recovery_description')],
            },
        ),
        migrations.RunSQL(r"""
CREATE FUNCTION inventory_recovery_guard() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
 IF TG_OP<>'INSERT' THEN RAISE EXCEPTION 'Recovery evidence immutable' USING ERRCODE='23514'; END IF;
 IF NOT EXISTS(SELECT 1 FROM service_servicecase WHERE id=NEW.service_case_id AND company_id=NEW.company_id AND device_id=NEW.device_id)
  OR NOT EXISTS(SELECT 1 FROM inventory_inventorylocation WHERE id=NEW.location_id AND company_id=NEW.company_id AND location_type IN ('QUARANTINE','DEFECTIVE'))
  OR NOT EXISTS(SELECT 1 FROM service_servicerepairaction a JOIN service_servicerepairexecution e ON e.id=a.repair_execution_id WHERE a.id=NEW.repair_action_id AND e.service_case_id=NEW.service_case_id)
  OR (NEW.replacement_id IS NOT NULL AND NOT EXISTS(SELECT 1 FROM inventory_partsdisposition d JOIN inventory_partsissue i ON i.id=d.issue_id
    WHERE d.id=NEW.replacement_id AND d.kind='CONSUMED' AND d.repair_action_id=NEW.repair_action_id AND i.service_case_id=NEW.service_case_id))
 THEN RAISE EXCEPTION 'Recovery ownership/evidence inconsistent' USING ERRCODE='23514'; END IF;
 RETURN NEW;
END $$;
CREATE TRIGGER inventory_recovery_guard BEFORE INSERT OR UPDATE OR DELETE ON inventory_defectiverecovery FOR EACH ROW EXECUTE FUNCTION inventory_recovery_guard();
""", "DROP TRIGGER inventory_recovery_guard ON inventory_defectiverecovery; DROP FUNCTION inventory_recovery_guard();"),
    ]
