# Generated by Django 5.2.11 on 2026-02-11 17:02

import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0012_alter_user_first_name_max_length'),
        ('tenant', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='ProcessDefinition',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('slug', models.SlugField(help_text='شناسه یکتا برای URL', max_length=100, verbose_name='شناسه')),
                ('name', models.CharField(help_text='نام نمایشی فرآیند', max_length=255, verbose_name='نام')),
                ('description', models.TextField(blank=True, null=True, verbose_name='توضیحات')),
                ('bpmn_xml', models.TextField(help_text='محتوای BPMN 2.0 XML', verbose_name='BPMN XML')),
                ('metadata', models.JSONField(blank=True, default=dict, help_text='اطلاعات اضافی مانند tags و category', verbose_name='متادیتا')),
                ('version', models.PositiveIntegerField(default=1, verbose_name='نسخه')),
                ('is_deployed', models.BooleanField(default=False, help_text='فقط نسخه\u200cهای منتشر شده قابل اجرا هستند', verbose_name='منتشر شده')),
                ('is_active', models.BooleanField(default=True, verbose_name='فعال')),
                ('deployed_at', models.DateTimeField(blank=True, null=True, verbose_name='تاریخ انتشار')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='تاریخ بروزرسانی')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_process_definitions', to=settings.AUTH_USER_MODEL, verbose_name='ایجادکننده')),
                ('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='tenant.tenant')),
            ],
            options={
                'verbose_name': 'تعریف فرآیند',
                'verbose_name_plural': 'تعریف فرآیندها',
                'db_table': 'workflow_process_definition',
                'ordering': ['-created_at'],
                'permissions': [('deploy_processdefinition', 'انتشار فرآیند')],
            },
        ),
        migrations.CreateModel(
            name='ProcessInstance',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('business_key', models.CharField(blank=True, help_text='شناسه منحصر به فرد کسب\u200cوکار (مثلاً شماره درخواست)', max_length=255, null=True, verbose_name='کلید کسب\u200cوکار')),
                ('status', models.CharField(choices=[('running', 'در حال اجرا'), ('completed', 'تکمیل شده'), ('cancelled', 'لغو شده'), ('failed', 'با خطا'), ('suspended', 'معلق')], default='running', max_length=20, verbose_name='وضعیت')),
                ('context', models.JSONField(blank=True, default=dict, help_text='داده\u200cهایی که در شروع فرآیند ارسال شده', verbose_name='داده\u200cهای اولیه')),
                ('current_element_ids', models.JSONField(blank=True, default=list, help_text='لیست element IDهای فعال در BPMN', verbose_name='المان\u200cهای فعلی')),
                ('started_at', models.DateTimeField(auto_now_add=True, verbose_name='زمان شروع')),
                ('completed_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان پایان')),
                ('cancelled_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان لغو')),
                ('error_message', models.TextField(blank=True, null=True, verbose_name='پیام خطا')),
                ('definition', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='instances', to='workflow.processdefinition', verbose_name='تعریف فرآیند')),
                ('started_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='started_process_instances', to=settings.AUTH_USER_MODEL, verbose_name='شروع\u200cکننده')),
                ('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='tenant.tenant')),
            ],
            options={
                'verbose_name': 'نمونه فرآیند',
                'verbose_name_plural': 'نمونه\u200cهای فرآیند',
                'db_table': 'workflow_process_instance',
                'ordering': ['-started_at'],
                'permissions': [('start_processinstance', 'شروع فرآیند'), ('cancel_processinstance', 'لغو فرآیند'), ('view_all_instances', 'مشاهده همه نمونه\u200cها')],
            },
        ),
        migrations.CreateModel(
            name='ProcessVariable',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('name', models.CharField(max_length=255, verbose_name='نام متغیر')),
                ('type', models.CharField(default='string', help_text='string, number, boolean, object, array', max_length=50, verbose_name='نوع داده')),
                ('value', models.JSONField(blank=True, null=True, verbose_name='مقدار')),
                ('scope', models.CharField(blank=True, help_text='Element ID برای scope محلی، خالی برای global', max_length=255, null=True, verbose_name='محدوده')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='زمان ایجاد')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='زمان بروزرسانی')),
                ('instance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='variables', to='workflow.processinstance', verbose_name='نمونه فرآیند')),
            ],
            options={
                'verbose_name': 'متغیر فرآیند',
                'verbose_name_plural': 'متغیرهای فرآیند',
                'db_table': 'workflow_process_variable',
            },
        ),
        migrations.CreateModel(
            name='SLADefinition',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('task_definition_key', models.CharField(help_text='کلید task در BPMN که SLA برای آن تعریف شده', max_length=255, verbose_name='کلید وظیفه')),
                ('duration_value', models.PositiveIntegerField(verbose_name='مدت زمان')),
                ('duration_unit', models.CharField(choices=[('minutes', 'دقیقه'), ('hours', 'ساعت'), ('days', 'روز'), ('weeks', 'هفته')], default='hours', max_length=20, verbose_name='واحد زمان')),
                ('action_on_violation', models.CharField(choices=[('notify', 'اطلاع\u200cرسانی'), ('escalate', 'Escalation'), ('reassign', 'تخصیص مجدد')], default='notify', max_length=20, verbose_name='اقدام در صورت نقض')),
                ('escalation_config', models.JSONField(blank=True, default=dict, help_text='تنظیمات اضافی مانند گیرندگان notification', verbose_name='تنظیمات Escalation')),
                ('is_active', models.BooleanField(default=True, verbose_name='فعال')),
                ('definition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sla_definitions', to='workflow.processdefinition', verbose_name='تعریف فرآیند')),
            ],
            options={
                'verbose_name': 'تعریف SLA',
                'verbose_name_plural': 'تعریف\u200cهای SLA',
                'db_table': 'workflow_sla_definition',
            },
        ),
        migrations.CreateModel(
            name='Task',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('task_definition_key', models.CharField(help_text='کلید task در BPMN', max_length=255, verbose_name='کلید تعریف')),
                ('element_id', models.CharField(help_text='شناسه element در BPMN XML', max_length=255, verbose_name='شناسه المان')),
                ('task_type', models.CharField(choices=[('user_task', 'وظیفه کاربری'), ('service_task', 'وظیفه سرویس'), ('script_task', 'وظیفه اسکریپت')], default='user_task', max_length=20, verbose_name='نوع وظیفه')),
                ('name', models.CharField(max_length=255, verbose_name='نام')),
                ('description', models.TextField(blank=True, null=True, verbose_name='توضیحات')),
                ('form_data', models.JSONField(blank=True, default=dict, help_text='JSON Schema برای فرم کاربر', verbose_name='تعریف فرم')),
                ('input_variables', models.JSONField(blank=True, default=dict, verbose_name='متغیرهای ورودی')),
                ('output_variables', models.JSONField(blank=True, default=dict, verbose_name='متغیرهای خروجی')),
                ('status', models.CharField(choices=[('created', 'ایجاد شده'), ('assigned', 'تخصیص داده شده'), ('claimed', 'گرفته شده'), ('completed', 'تکمیل شده'), ('cancelled', 'لغو شده'), ('failed', 'با خطا')], default='created', max_length=20, verbose_name='وضعیت')),
                ('priority', models.PositiveIntegerField(default=50, help_text='از 0 تا 100، عدد بالاتر = اولویت بیشتر', verbose_name='اولویت')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='زمان ایجاد')),
                ('claimed_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان گرفتن')),
                ('completed_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان تکمیل')),
                ('due_date', models.DateTimeField(blank=True, null=True, verbose_name='مهلت')),
                ('error_message', models.TextField(blank=True, null=True, verbose_name='پیام خطا')),
                ('assignee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_workflow_tasks', to=settings.AUTH_USER_MODEL, verbose_name='مسئول')),
                ('instance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='workflow.processinstance', verbose_name='نمونه فرآیند')),
                ('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='tenant.tenant')),
            ],
            options={
                'verbose_name': 'وظیفه',
                'verbose_name_plural': 'وظایف',
                'db_table': 'workflow_task',
                'ordering': ['-priority', '-created_at'],
                'permissions': [('claim_task', 'گرفتن وظیفه'), ('complete_task', 'تکمیل وظیفه'), ('delegate_task', 'واگذاری وظیفه'), ('reassign_task', 'تخصیص مجدد'), ('view_all_tasks', 'مشاهده همه وظایف')],
            },
        ),
        migrations.CreateModel(
            name='SLAViolation',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('expected_completion', models.DateTimeField(verbose_name='زمان مورد انتظار')),
                ('violation_time', models.DateTimeField(auto_now_add=True, verbose_name='زمان نقض')),
                ('is_resolved', models.BooleanField(default=False, verbose_name='حل شده')),
                ('resolved_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان حل')),
                ('sla_definition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='violations', to='workflow.sladefinition', verbose_name='تعریف SLA')),
                ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sla_violations', to='workflow.task', verbose_name='وظیفه')),
            ],
            options={
                'verbose_name': 'نقض SLA',
                'verbose_name_plural': 'نقض\u200cهای SLA',
                'db_table': 'workflow_sla_violation',
            },
        ),
        migrations.CreateModel(
            name='ProcessHistory',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('event_type', models.CharField(choices=[('instance_started', 'فرآیند شروع شد'), ('instance_completed', 'فرآیند تکمیل شد'), ('instance_cancelled', 'فرآیند لغو شد'), ('instance_failed', 'فرآیند با خطا مواجه شد'), ('instance_suspended', 'فرآیند معلق شد'), ('instance_resumed', 'فرآیند ادامه یافت'), ('task_created', 'وظیفه ایجاد شد'), ('task_assigned', 'وظیفه تخصیص یافت'), ('task_claimed', 'وظیفه گرفته شد'), ('task_unclaimed', 'وظیفه آزاد شد'), ('task_completed', 'وظیفه تکمیل شد'), ('task_delegated', 'وظیفه واگذار شد'), ('task_failed', 'وظیفه با خطا مواجه شد'), ('variable_changed', 'متغیر تغییر کرد'), ('sla_violated', 'SLA نقض شد')], max_length=50, verbose_name='نوع رویداد')),
                ('element_id', models.CharField(blank=True, max_length=255, null=True, verbose_name='شناسه المان')),
                ('old_value', models.JSONField(blank=True, null=True, verbose_name='مقدار قبلی')),
                ('new_value', models.JSONField(blank=True, null=True, verbose_name='مقدار جدید')),
                ('comment', models.TextField(blank=True, null=True, verbose_name='توضیحات')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='زمان')),
                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='workflow_history', to=settings.AUTH_USER_MODEL, verbose_name='کاربر')),
                ('instance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history', to='workflow.processinstance', verbose_name='نمونه فرآیند')),
                ('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='history', to='workflow.task', verbose_name='وظیفه')),
            ],
            options={
                'verbose_name': 'تاریخچه فرآیند',
                'verbose_name_plural': 'تاریخچه فرآیندها',
                'db_table': 'workflow_process_history',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='TaskAssignment',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('assignment_type', models.CharField(choices=[('candidate', 'کاندید'), ('assignee', 'مسئول'), ('delegated', 'واگذار شده')], default='candidate', max_length=20, verbose_name='نوع تخصیص')),
                ('is_active', models.BooleanField(default=True, verbose_name='فعال')),
                ('assigned_at', models.DateTimeField(auto_now_add=True, verbose_name='زمان تخصیص')),
                ('unassigned_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان لغو تخصیص')),
                ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='workflow_task_assignments', to='auth.group', verbose_name='گروه')),
                ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='workflow.task', verbose_name='وظیفه')),
                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='workflow_task_assignments', to=settings.AUTH_USER_MODEL, verbose_name='کاربر')),
            ],
            options={
                'verbose_name': 'تخصیص وظیفه',
                'verbose_name_plural': 'تخصیص\u200cهای وظیفه',
                'db_table': 'workflow_task_assignment',
            },
        ),
        migrations.AddIndex(
            model_name='processdefinition',
            index=models.Index(fields=['tenant', 'slug'], name='workflow_pr_tenant__7b2550_idx'),
        ),
        migrations.AddIndex(
            model_name='processdefinition',
            index=models.Index(fields=['tenant', 'is_deployed'], name='workflow_pr_tenant__3cfb52_idx'),
        ),
        migrations.AddIndex(
            model_name='processdefinition',
            index=models.Index(fields=['tenant', 'is_active'], name='workflow_pr_tenant__8a18b7_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='processdefinition',
            unique_together={('tenant', 'slug', 'version')},
        ),
        migrations.AddIndex(
            model_name='processinstance',
            index=models.Index(fields=['tenant', 'status'], name='workflow_pr_tenant__c78868_idx'),
        ),
        migrations.AddIndex(
            model_name='processinstance',
            index=models.Index(fields=['tenant', 'business_key'], name='workflow_pr_tenant__c38e48_idx'),
        ),
        migrations.AddIndex(
            model_name='processinstance',
            index=models.Index(fields=['definition'], name='workflow_pr_definit_e29fa9_idx'),
        ),
        migrations.AddIndex(
            model_name='processinstance',
            index=models.Index(fields=['started_by'], name='workflow_pr_started_36c3de_idx'),
        ),
        migrations.AddIndex(
            model_name='processvariable',
            index=models.Index(fields=['instance', 'name'], name='workflow_pr_instanc_69e87c_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='processvariable',
            unique_together={('instance', 'name', 'scope')},
        ),
        migrations.AlterUniqueTogether(
            name='sladefinition',
            unique_together={('definition', 'task_definition_key')},
        ),
        migrations.AddIndex(
            model_name='task',
            index=models.Index(fields=['tenant', 'status'], name='workflow_ta_tenant__057dce_idx'),
        ),
        migrations.AddIndex(
            model_name='task',
            index=models.Index(fields=['instance'], name='workflow_ta_instanc_acdc94_idx'),
        ),
        migrations.AddIndex(
            model_name='task',
            index=models.Index(fields=['assignee', 'status'], name='workflow_ta_assigne_0a0571_idx'),
        ),
        migrations.AddIndex(
            model_name='task',
            index=models.Index(fields=['due_date'], name='workflow_ta_due_dat_3d2359_idx'),
        ),
        migrations.AddIndex(
            model_name='task',
            index=models.Index(fields=['task_definition_key'], name='workflow_ta_task_de_7df406_idx'),
        ),
        migrations.AddIndex(
            model_name='slaviolation',
            index=models.Index(fields=['task'], name='workflow_sl_task_id_96818f_idx'),
        ),
        migrations.AddIndex(
            model_name='slaviolation',
            index=models.Index(fields=['is_resolved'], name='workflow_sl_is_reso_468572_idx'),
        ),
        migrations.AddIndex(
            model_name='processhistory',
            index=models.Index(fields=['instance', 'created_at'], name='workflow_pr_instanc_e8c8b8_idx'),
        ),
        migrations.AddIndex(
            model_name='processhistory',
            index=models.Index(fields=['event_type'], name='workflow_pr_event_t_55b921_idx'),
        ),
        migrations.AddIndex(
            model_name='taskassignment',
            index=models.Index(fields=['task'], name='workflow_ta_task_id_730e6e_idx'),
        ),
        migrations.AddIndex(
            model_name='taskassignment',
            index=models.Index(fields=['user', 'is_active'], name='workflow_ta_user_id_f8421a_idx'),
        ),
        migrations.AddIndex(
            model_name='taskassignment',
            index=models.Index(fields=['group', 'is_active'], name='workflow_ta_group_i_2602dc_idx'),
        ),
    ]
