# Generated by Django 5.2.17 on 2026-09-27 20:45

import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('inventory', '0009_defective_recovery'),
        ('organization', '0002_userorganizationassignment'),
        ('parts', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='StockAdjustment',
            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_delta', models.IntegerField()),
                ('reason', models.CharField(choices=[('LOSS', 'Physical loss'), ('FOUND', 'Found stock'), ('CORRECTION', 'Documented stock correction'), ('COUNT_VARIANCE', 'Approved physical count variance')], max_length=20)),
            ],
            options={
                'permissions': [('adjust_stock', 'Post controlled stock adjustments')],
            },
        ),
        migrations.CreateModel(
            name='StockCount',
            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=[('DRAFT', 'Draft'), ('COUNTING', 'Counting'), ('RECONCILED', 'Reconciled'), ('CANCELLED', 'Cancelled')], default='DRAFT', max_length=16)),
                ('expected_quantity', models.PositiveIntegerField(blank=True, null=True)),
                ('counted_quantity', models.PositiveIntegerField(blank=True, null=True)),
                ('started_at', models.DateTimeField(blank=True, null=True)),
                ('finished_at', models.DateTimeField(blank=True, null=True)),
                ('note', models.TextField(blank=True, max_length=2000)),
                ('reason', models.CharField(blank=True, max_length=500)),
            ],
            options={
                'permissions': [('count_stock', 'Start and record physical stock counts')],
            },
        ),
        migrations.CreateModel(
            name='StockCountUnit',
            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)),
                ('expected', models.BooleanField(default=False)),
                ('counted', models.BooleanField(default=False)),
            ],
        ),
        migrations.RemoveConstraint(
            model_name='serializedstockunit',
            name='inventory_unit_state_location',
        ),
        migrations.RemoveConstraint(
            model_name='stockmovement',
            name='inventory_movement_kind_endpoints',
        ),
        migrations.AlterField(
            model_name='serializedstockunit',
            name='state',
            field=models.CharField(choices=[('IN_CUSTODY', 'In job custody'), ('CONSUMED', 'Consumed in repair'), ('REMOVED', 'Removed by inventory adjustment'), ('REGISTERED', 'Registered, not yet received'), ('IN_STOCK', 'In stock'), ('IN_TRANSIT', 'In transit')], default='REGISTERED', max_length=16),
        ),
        migrations.AlterField(
            model_name='stockmovement',
            name='kind',
            field=models.CharField(choices=[('RECEIPT', 'Receipt'), ('MOVE', 'Location movement'), ('CONSUME', 'Repair consumption'), ('ADJUST_IN', 'Positive stock adjustment'), ('ADJUST_OUT', 'Negative stock adjustment')], max_length=16),
        ),
        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__in', ['CONSUMED', 'REMOVED'])), _connector='OR'), name='inventory_unit_state_location'),
        ),
        migrations.AddConstraint(
            model_name='stockmovement',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('destination__isnull', False), ('kind__in', ['RECEIPT', 'ADJUST_IN']), ('source__isnull', True)), models.Q(('destination__isnull', False), ('kind', 'MOVE'), ('source__isnull', False)), models.Q(('destination__isnull', True), ('kind__in', ['CONSUME', 'ADJUST_OUT']), ('source__isnull', False)), _connector='OR'), name='inventory_movement_kind_endpoints'),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='actor',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='company',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company'),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='location',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.inventorylocation'),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='movement',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='inventory.stockmovement'),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='spare_part',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parts.sparepart'),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='company',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company'),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='created_by',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='finished_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='location',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.inventorylocation'),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='spare_part',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parts.sparepart'),
        ),
        migrations.AddField(
            model_name='stockcount',
            name='started_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='stockadjustment',
            name='count',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='adjustments', to='inventory.stockcount'),
        ),
        migrations.AddField(
            model_name='stockcountunit',
            name='count',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='units', to='inventory.stockcount'),
        ),
        migrations.AddField(
            model_name='stockcountunit',
            name='unit',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.serializedstockunit'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.UniqueConstraint(condition=models.Q(('status', 'COUNTING')), fields=('location', 'spare_part'), name='inventory_one_count_per_position'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ['DRAFT', 'COUNTING', 'RECONCILED', 'CANCELLED'])), name='inventory_count_status'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('counted_quantity', None), ('expected_quantity', None), ('finished_at', None), ('finished_by', None), ('started_at', None), ('started_by', None), ('status', 'DRAFT')), models.Q(('expected_quantity__isnull', False), ('finished_at', None), ('finished_by', None), ('started_at__isnull', False), ('started_by__isnull', False), ('status', 'COUNTING')), models.Q(('counted_quantity__isnull', False), ('expected_quantity__isnull', False), ('finished_at__isnull', False), ('finished_by__isnull', False), ('started_at__isnull', False), ('started_by__isnull', False), ('status', 'RECONCILED')), models.Q(('finished_at__isnull', False), ('finished_by__isnull', False), ('status', 'CANCELLED')), _connector='OR'), name='inventory_count_evidence'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.CheckConstraint(condition=models.Q(('expected_quantity', None), ('expected_quantity__lte', 1000000000), _connector='OR'), name='inventory_count_expected_bound'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.CheckConstraint(condition=models.Q(('counted_quantity', None), ('counted_quantity__lte', 1000000000), _connector='OR'), name='inventory_count_observed_bound'),
        ),
        migrations.AddConstraint(
            model_name='stockcount',
            constraint=models.CheckConstraint(condition=models.Q(('started_at', None), ('finished_at', None), ('finished_at__gte', models.F('started_at')), _connector='OR'), name='inventory_count_time'),
        ),
        migrations.AddConstraint(
            model_name='stockadjustment',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('quantity_delta', 0), _negated=True), ('quantity_delta__gte', -1000000000), ('quantity_delta__lte', 1000000000)), name='inventory_adjustment_delta'),
        ),
        migrations.AddConstraint(
            model_name='stockadjustment',
            constraint=models.CheckConstraint(condition=models.Q(('reason__in', ['LOSS', 'FOUND', 'CORRECTION', 'COUNT_VARIANCE'])), name='inventory_adjustment_reason'),
        ),
        migrations.AddConstraint(
            model_name='stockadjustment',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('count__isnull', False), ('reason', 'COUNT_VARIANCE')), models.Q(models.Q(('reason', 'COUNT_VARIANCE'), _negated=True), ('count', None)), _connector='OR'), name='inventory_adjustment_count'),
        ),
        migrations.AddConstraint(
            model_name='stockadjustment',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('reason', 'LOSS'), _negated=True), ('quantity_delta__lt', 0), _connector='OR'), name='inventory_loss_direction'),
        ),
        migrations.AddConstraint(
            model_name='stockadjustment',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('reason', 'FOUND'), _negated=True), ('quantity_delta__gt', 0), _connector='OR'), name='inventory_found_direction'),
        ),
        migrations.AddConstraint(
            model_name='stockcountunit',
            constraint=models.UniqueConstraint(fields=('count', 'unit'), name='inventory_count_unit_unique'),
        ),
    ]
