# Generated by makemigrations for Approval Engine

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ("tenants", "__first__"),
        ("organizations", "__first__"),
        ("iam", "__first__"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ("contenttypes", "0002_remove_content_type_name"),
    ]

    operations = [
        migrations.CreateModel(
            name="ApprovalMatrix",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="created at")),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                ("public_id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, unique=True, verbose_name="public id")),
                ("name", models.CharField(max_length=200, verbose_name="name")),
                ("description", models.TextField(blank=True, default="", verbose_name="description")),
                ("conditions", models.JSONField(blank=True, default=dict, help_text="JSON conditions to match when this matrix should apply.", verbose_name="conditions")),
                ("is_active", models.BooleanField(db_index=True, default=True, verbose_name="active")),
                ("content_type", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="approval_matrices", to="contenttypes.contenttype", verbose_name="entity type")),
                ("tenant", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="approval_matrices", to="tenants.tenant", verbose_name="tenant")),
            ],
            options={
                "verbose_name": "approval matrix",
                "verbose_name_plural": "approval matrices",
                "ordering": ("tenant", "name"),
            },
        ),
        migrations.CreateModel(
            name="ApprovalRequest",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="created at")),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                ("public_id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, unique=True, verbose_name="public id")),
                ("title", models.CharField(max_length=500, verbose_name="title")),
                ("description", models.TextField(blank=True, default="", verbose_name="description")),
                ("approval_type", models.CharField(choices=[("single", "Single Step"), ("multi", "Multi Step"), ("sequential", "Sequential"), ("parallel", "Parallel"), ("conditional", "Conditional")], db_index=True, default="single", max_length=16, verbose_name="approval type")),
                ("status", models.CharField(choices=[("pending", "Pending"), ("in_progress", "In Progress"), ("approved", "Approved"), ("rejected", "Rejected"), ("returned", "Returned"), ("cancelled", "Cancelled"), ("expired", "Expired")], db_index=True, default="pending", max_length=16, verbose_name="status")),
                ("priority", models.CharField(choices=[("low", "Low"), ("medium", "Medium"), ("high", "High"), ("urgent", "Urgent")], db_index=True, default="medium", max_length=10, verbose_name="priority")),
                ("due_date", models.DateTimeField(blank=True, db_index=True, null=True, verbose_name="due date")),
                ("completed_at", models.DateTimeField(blank=True, null=True, verbose_name="completed at")),
                ("is_confidential", models.BooleanField(default=False, verbose_name="confidential")),
                ("object_id", models.PositiveIntegerField(blank=True, null=True, verbose_name="entity id")),
                ("content_type", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="contenttypes.contenttype", verbose_name="entity type")),
                ("matrix", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="requests", to="approval_engine.approvalmatrix", verbose_name="approval matrix")),
                ("organization_node", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="+", to="organizations.organizationnode", verbose_name="organization node")),
                ("requested_by", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="approval_requests_made", to=settings.AUTH_USER_MODEL, verbose_name="requested by")),
                ("tenant", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenants.tenant", verbose_name="tenant")),
            ],
            options={
                "verbose_name": "approval request",
                "verbose_name_plural": "approval requests",
                "ordering": ("-created_at",),
            },
        ),
        migrations.CreateModel(
            name="ApprovalStep",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="created at")),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                ("public_id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, unique=True, verbose_name="public id")),
                ("step_order", models.PositiveSmallIntegerField(verbose_name="step order")),
                ("status", models.CharField(choices=[("pending", "Pending"), ("in_progress", "In Progress"), ("approved", "Approved"), ("rejected", "Rejected"), ("returned", "Returned"), ("skipped", "Skipped"), ("expired", "Expired")], db_index=True, default="pending", max_length=16, verbose_name="status")),
                ("decision", models.CharField(blank=True, choices=[("approve", "Approve"), ("reject", "Reject"), ("return", "Return"), ("request_changes", "Request Changes"), ("delegate", "Delegate"), ("abstain", "Abstain")], max_length=16, null=True, verbose_name="decision")),
                ("decided_at", models.DateTimeField(blank=True, null=True, verbose_name="decided at")),
                ("note", models.TextField(blank=True, default="", verbose_name="note")),
                ("due_date", models.DateTimeField(blank=True, db_index=True, null=True, verbose_name="due date")),
                ("is_parallel", models.BooleanField(default=False, verbose_name="parallel")),
                ("approver", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="approval_steps_assigned", to=settings.AUTH_USER_MODEL, verbose_name="approver")),
                ("approver_org_unit", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="approval_steps", to="organizations.organizationnode", verbose_name="approver org unit")),
                ("approver_role", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="approval_steps", to="iam.role", verbose_name="approver role")),
                ("decided_by", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="approval_decisions_made", to=settings.AUTH_USER_MODEL, verbose_name="decided by")),
                ("request", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="steps", to="approval_engine.approvalrequest", verbose_name="approval request")),
            ],
            options={
                "verbose_name": "approval step",
                "verbose_name_plural": "approval steps",
                "ordering": ("request", "step_order"),
            },
        ),
        migrations.CreateModel(
            name="MatrixApproverConfig",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="created at")),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                ("step_order", models.PositiveSmallIntegerField(default=1, verbose_name="step order")),
                ("is_parallel", models.BooleanField(default=False, verbose_name="parallel")),
                ("is_required", models.BooleanField(default=True, verbose_name="required")),
                ("quorum", models.PositiveSmallIntegerField(default=1, help_text="Required number of approvers.", verbose_name="quorum")),
                ("majority_voting", models.BooleanField(default=False, verbose_name="majority voting")),
                ("approver", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="matrix_approver_configs", to=settings.AUTH_USER_MODEL, verbose_name="approver")),
                ("approver_org_unit", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="matrix_approver_configs", to="organizations.organizationnode", verbose_name="approver org unit")),
                ("approver_role", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="matrix_approver_configs", to="iam.role", verbose_name="approver role")),
                ("matrix", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="approver_configs", to="approval_engine.approvalmatrix", verbose_name="approval matrix")),
            ],
            options={
                "verbose_name": "matrix approver config",
                "verbose_name_plural": "matrix approver configs",
                "ordering": ("matrix", "step_order"),
            },
        ),
    ]
