# Generated by Django 5.2.4 on 2026-04-21 14:53 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="AttendanceAnalysisRun", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("period_start", models.DateField(verbose_name="Начало периода")), ("period_end", models.DateField(verbose_name="Конец периода")), ( "status", models.CharField( choices=[("success", "Успешно"), ("failed", "Ошибка")], default="success", max_length=16, verbose_name="Статус", ), ), ( "schedule_payload", models.JSONField(blank=True, null=True, verbose_name="График"), ), ( "request_payload", models.JSONField(blank=True, default=dict, verbose_name="Запрос"), ), ( "response_payload", models.JSONField(blank=True, default=dict, verbose_name="Ответ"), ), ("error", models.TextField(blank=True, verbose_name="Ошибка")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="Создано"), ), ( "employee", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="attendance_analysis_runs", to=settings.AUTH_USER_MODEL, verbose_name="Сотрудник", ), ), ( "triggered_by", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="triggered_attendance_analysis_runs", to=settings.AUTH_USER_MODEL, verbose_name="Запустил", ), ), ], options={ "verbose_name": "Запуск анализа посещаемости", "verbose_name_plural": "Запуски анализа посещаемости", "ordering": ["-created_at", "-id"], }, ), migrations.CreateModel( name="AttendanceRecord", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("date", models.DateField(verbose_name="Дата")), ( "display_name", models.CharField( blank=True, max_length=255, verbose_name="Имя из анализа" ), ), ( "arrival_time", models.CharField( blank=True, max_length=32, null=True, verbose_name="Время прихода", ), ), ( "departure_time", models.CharField( blank=True, max_length=32, null=True, verbose_name="Время ухода" ), ), ( "work_hours", models.FloatField( blank=True, null=True, verbose_name="Отработано часов" ), ), ( "expected_hours", models.FloatField( blank=True, null=True, verbose_name="Ожидаемо часов" ), ), ( "is_workday", models.BooleanField(default=True, verbose_name="Рабочий день"), ), ( "is_late", models.BooleanField(default=False, verbose_name="Опоздание"), ), ( "late_minutes", models.IntegerField( blank=True, null=True, verbose_name="Минут опоздания" ), ), ( "is_early_leave", models.BooleanField(default=False, verbose_name="Ранний уход"), ), ( "early_leave_minutes", models.IntegerField( blank=True, null=True, verbose_name="Минут раннего ухода" ), ), ( "is_underwork", models.BooleanField(default=False, verbose_name="Недоработка"), ), ( "underwork_hours", models.FloatField( blank=True, null=True, verbose_name="Часов недоработки" ), ), ( "is_overtime", models.BooleanField(default=False, verbose_name="Переработка"), ), ( "overtime_hours", models.FloatField( blank=True, null=True, verbose_name="Часов переработки" ), ), ( "is_absent", models.BooleanField(default=False, verbose_name="Отсутствие"), ), ( "statuses", models.JSONField(blank=True, default=list, verbose_name="Статусы"), ), ( "employee_issues", models.JSONField( blank=True, default=list, verbose_name="Проблемы сотрудника" ), ), ( "technical_issues", models.JSONField( blank=True, default=list, verbose_name="Технические проблемы" ), ), ( "raw_data", models.JSONField( blank=True, default=dict, verbose_name="Исходная запись анализа" ), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="Обновлено"), ), ( "analysis_run", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="records", to="attendance.attendanceanalysisrun", verbose_name="Запуск анализа", ), ), ( "employee", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="attendance_records", to=settings.AUTH_USER_MODEL, verbose_name="Сотрудник", ), ), ], options={ "verbose_name": "Запись посещаемости", "verbose_name_plural": "Записи посещаемости", "ordering": ["-date", "-id"], }, ), migrations.AddIndex( model_name="attendanceanalysisrun", index=models.Index( fields=["employee", "period_start", "period_end"], name="attendance__employe_3d4cb2_idx", ), ), migrations.AddIndex( model_name="attendanceanalysisrun", index=models.Index( fields=["created_at"], name="attendance__created_9a0a3e_idx" ), ), migrations.AddIndex( model_name="attendancerecord", index=models.Index( fields=["employee", "date"], name="attendance__employe_b6a945_idx" ), ), migrations.AddIndex( model_name="attendancerecord", index=models.Index( fields=["analysis_run"], name="attendance__analysi_db7fa7_idx" ), ), migrations.AddConstraint( model_name="attendancerecord", constraint=models.UniqueConstraint( fields=("employee", "date"), name="attendance_record_employee_date_unique", ), ), ]