# Generated by Django 5.2.17 on 2026-09-27 20:03

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', '0004_document_integrity'),
        ('organization', '0002_userorganizationassignment'),
        ('parts', '0001_initial'),
        ('service', '0006_handover_closure'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='PartsRequest',
            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)),
                ('requested_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('note', models.TextField(blank=True, max_length=2000)),
                ('status', models.CharField(choices=[('REQUESTED', 'Requested'), ('APPROVED', 'Approved'), ('CANCELLED', 'Cancelled'), ('REJECTED', 'Rejected'), ('FULFILLED', 'Fulfilled')], default='REQUESTED', max_length=16)),
                ('decided_at', models.DateTimeField(blank=True, null=True)),
                ('reason', models.CharField(blank=True, max_length=500)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('decided_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('requester', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('service_case', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.servicecase')),
            ],
            options={
                'permissions': [('request_parts', 'Request parts for a service job'), ('approve_parts', 'Approve or reject job parts requests'), ('reserve_parts', 'Reserve or release job parts stock')],
            },
        ),
        migrations.CreateModel(
            name='PartsRequestEvent',
            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)),
                ('status', models.CharField(choices=[('REQUESTED', 'Requested'), ('APPROVED', 'Approved'), ('CANCELLED', 'Cancelled'), ('REJECTED', 'Rejected'), ('FULFILLED', 'Fulfilled')], max_length=16)),
                ('reason', models.CharField(blank=True, max_length=500)),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('request', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='events', to='inventory.partsrequest')),
            ],
        ),
        migrations.CreateModel(
            name='PartsRequestLine',
            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)),
                ('quantity', models.PositiveIntegerField()),
                ('request', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='lines', to='inventory.partsrequest')),
                ('spare_part', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parts.sparepart')),
            ],
        ),
        migrations.CreateModel(
            name='StockReservation',
            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)),
                ('quantity', models.PositiveIntegerField()),
                ('reserved_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('status', models.CharField(choices=[('ACTIVE', 'Active'), ('RELEASED', 'Released'), ('ISSUED', 'Issued')], default='ACTIVE', max_length=16)),
                ('ended_at', models.DateTimeField(blank=True, null=True)),
                ('reason', models.CharField(blank=True, max_length=500)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('ended_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('line', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reservations', to='inventory.partsrequestline')),
                ('location', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.inventorylocation')),
                ('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('service_case', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='service.servicecase')),
                ('spare_part', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parts.sparepart')),
            ],
        ),
        migrations.CreateModel(
            name='ReservationUnit',
            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)),
                ('is_active', models.BooleanField(default=True)),
                ('unit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.serializedstockunit')),
                ('reservation', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='units', to='inventory.stockreservation')),
            ],
        ),
        migrations.AddConstraint(
            model_name='partsrequest',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ['REQUESTED', 'APPROVED', 'CANCELLED', 'REJECTED', 'FULFILLED'])), name='inventory_request_status'),
        ),
        migrations.AddConstraint(
            model_name='partsrequest',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('decided_at', None), ('decided_by', None), ('status', 'REQUESTED')), models.Q(models.Q(('status', 'REQUESTED'), _negated=True), ('decided_at__isnull', False), ('decided_by__isnull', False)), _connector='OR'), name='inventory_request_decision'),
        ),
        migrations.AddConstraint(
            model_name='partsrequest',
            constraint=models.UniqueConstraint(fields=('id', 'company'), name='inventory_request_owner'),
        ),
        migrations.AddConstraint(
            model_name='partsrequestevent',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ['REQUESTED', 'APPROVED', 'CANCELLED', 'REJECTED', 'FULFILLED'])), name='inventory_request_event_status'),
        ),
        migrations.AddConstraint(
            model_name='partsrequestline',
            constraint=models.UniqueConstraint(fields=('request', 'spare_part'), name='inventory_request_part_unique'),
        ),
        migrations.AddConstraint(
            model_name='partsrequestline',
            constraint=models.CheckConstraint(condition=models.Q(('quantity__gte', 1), ('quantity__lte', 1000000000)), name='inventory_request_qty'),
        ),
        migrations.AddIndex(
            model_name='stockreservation',
            index=models.Index(fields=['location', 'spare_part', 'status'], name='inventory_reserve_position'),
        ),
        migrations.AddConstraint(
            model_name='stockreservation',
            constraint=models.CheckConstraint(condition=models.Q(('quantity__gte', 1), ('quantity__lte', 1000000000)), name='inventory_reserve_qty'),
        ),
        migrations.AddConstraint(
            model_name='stockreservation',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ['ACTIVE', 'RELEASED', 'ISSUED'])), name='inventory_reserve_status'),
        ),
        migrations.AddConstraint(
            model_name='stockreservation',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('ended_at', None), ('ended_by', None), ('status', 'ACTIVE')), models.Q(('ended_at__isnull', False), ('ended_by__isnull', False), ('status__in', ['RELEASED', 'ISSUED'])), _connector='OR'), name='inventory_reserve_end'),
        ),
        migrations.AddConstraint(
            model_name='stockreservation',
            constraint=models.CheckConstraint(condition=models.Q(('ended_at', None), ('ended_at__gte', models.F('reserved_at')), _connector='OR'), name='inventory_reserve_time'),
        ),
        migrations.AddConstraint(
            model_name='reservationunit',
            constraint=models.UniqueConstraint(fields=('reservation', 'unit'), name='inventory_reservation_unit_unique'),
        ),
        migrations.AddConstraint(
            model_name='reservationunit',
            constraint=models.UniqueConstraint(condition=models.Q(('is_active', True)), fields=('unit',), name='inventory_one_active_unit_reservation'),
        ),
    ]
