# Generated by Django 5.2.17 on 2026-09-27 20:21

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 = [
        ('inventory', '0006_reservation_integrity'),
        ('organization', '0002_userorganizationassignment'),
        ('parts', '0001_initial'),
        ('service', '0006_handover_closure'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='PartsDisposition',
            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)),
                ('kind', models.CharField(choices=[('CONSUMED', 'Consumed in repair'), ('RETURNED', 'Returned unused')], max_length=16)),
                ('quantity', models.PositiveIntegerField()),
                ('recorded_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('note', models.TextField(blank=True, max_length=2000)),
            ],
        ),
        migrations.CreateModel(
            name='PartsIssue',
            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)),
                ('issued_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('note', models.TextField(blank=True, max_length=2000)),
            ],
            options={
                'permissions': [('issue_parts', 'Issue reserved job parts'), ('consume_parts', 'Consume issued parts in repair'), ('return_parts', 'Return unused issued parts')],
            },
        ),
        migrations.RemoveConstraint(
            model_name='inventorylocation',
            name='inventory_location_type_valid',
        ),
        migrations.RemoveConstraint(
            model_name='serializedstockunit',
            name='inventory_unit_state_location',
        ),
        migrations.RemoveConstraint(
            model_name='stockmovement',
            name='inventory_movement_kind_endpoints',
        ),
        migrations.AlterField(
            model_name='inventorylocation',
            name='location_type',
            field=models.CharField(choices=[('WAREHOUSE', 'Warehouse'), ('STORE', 'Service-center store'), ('QUARANTINE', 'Quarantine'), ('DEFECTIVE', 'Defective'), ('TRANSIT', 'In transit (managed by transfer)'), ('CUSTODY', 'Job custody (managed by issue)')], max_length=16),
        ),
        migrations.AlterField(
            model_name='serializedstockunit',
            name='state',
            field=models.CharField(choices=[('IN_CUSTODY', 'In job custody'), ('CONSUMED', 'Consumed in repair'), ('REGISTERED', 'Registered, not yet received'), ('IN_STOCK', 'In stock'), ('IN_TRANSIT', 'In transit')], default='REGISTERED', max_length=16),
        ),
        migrations.AlterField(
            model_name='stockmovement',
            name='destination',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='incoming_movements', to='inventory.inventorylocation'),
        ),
        migrations.AlterField(
            model_name='stockmovement',
            name='kind',
            field=models.CharField(choices=[('RECEIPT', 'Receipt'), ('MOVE', 'Location movement'), ('CONSUME', 'Repair consumption')], max_length=16),
        ),
        migrations.AddConstraint(
            model_name='inventorylocation',
            constraint=models.CheckConstraint(condition=models.Q(('location_type__in', ['WAREHOUSE', 'STORE', 'QUARANTINE', 'DEFECTIVE', 'TRANSIT', 'CUSTODY'])), name='inventory_location_type_valid'),
        ),
        migrations.AddConstraint(
            model_name='serializedstockunit',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('current_location__isnull', True), ('current_movement__isnull', True), ('state', 'REGISTERED')), models.Q(('current_location__isnull', False), ('current_movement__isnull', False), ('state__in', ['IN_STOCK', 'IN_TRANSIT', 'IN_CUSTODY'])), models.Q(('current_location__isnull', True), ('current_movement__isnull', False), ('state', 'CONSUMED')), _connector='OR'), name='inventory_unit_state_location'),
        ),
        migrations.AddConstraint(
            model_name='stockmovement',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('destination__isnull', False), ('kind', 'RECEIPT'), ('source__isnull', True)), models.Q(('destination__isnull', False), ('kind', 'MOVE'), ('source__isnull', False)), models.Q(('destination__isnull', True), ('kind', 'CONSUME'), ('source__isnull', False)), _connector='OR'), name='inventory_movement_kind_endpoints'),
        ),
        migrations.AddField(
            model_name='partsdisposition',
            name='actor',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='partsdisposition',
            name='movement',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='inventory.stockmovement'),
        ),
        migrations.AddField(
            model_name='partsdisposition',
            name='repair_action',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='service.servicerepairaction'),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='custody_location',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='inventory.inventorylocation'),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='engineer_assignment',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.serviceengineerassignment'),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='issuer',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='movement',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='inventory.stockmovement'),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='recipient',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='reservation',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='issue', to='inventory.stockreservation'),
        ),
        migrations.AddField(
            model_name='partsissue',
            name='service_case',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.servicecase'),
        ),
        migrations.AddField(
            model_name='partsdisposition',
            name='issue',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='dispositions', to='inventory.partsissue'),
        ),
        migrations.AddConstraint(
            model_name='partsdisposition',
            constraint=models.CheckConstraint(condition=models.Q(('quantity__gte', 1), ('quantity__lte', 1000000000)), name='inventory_disposition_qty'),
        ),
        migrations.AddConstraint(
            model_name='partsdisposition',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('kind', 'CONSUMED'), ('repair_action__isnull', False)), models.Q(('kind', 'RETURNED'), ('repair_action', None)), _connector='OR'), name='inventory_disposition_kind'),
        ),
    ]
