Files
ACORE/apps/employees/migrations/0001_initial.py
T
lokses 131cb27d16 Initial commit — ACORE pharmacy network management system
Django project: employees, locations, visit_manager, it_manager,
mattermost_connector and stub connectors (ad, mail, portal).
2026-05-31 14:21:47 +03:00

111 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Generated by Django 6.0.3 on 2026-04-06 10:32
import core.utils.validators
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):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('core', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='EmployeePermissionOverride',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('override_type', models.CharField(choices=[('grant', 'Выдать'), ('revoke', 'Отозвать')], max_length=10, verbose_name='Тип')),
('valid_from', models.DateField(blank=True, null=True, verbose_name='Действует с')),
('valid_until', models.DateField(blank=True, null=True, verbose_name='Действует до')),
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
('comment', models.TextField(blank=True, verbose_name='Причина / комментарий')),
],
options={
'verbose_name': 'Override разрешения',
'verbose_name_plural': 'Override разрешений',
'ordering': ['employee', 'permission__codename'],
},
),
migrations.CreateModel(
name='PermissionGroup',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('description', models.TextField(blank=True, verbose_name='Описание')),
('is_active', models.BooleanField(default=True, verbose_name='Активна')),
],
options={
'verbose_name': 'Группа разрешений',
'verbose_name_plural': 'Группы разрешений',
'ordering': ['group__name'],
},
),
migrations.CreateModel(
name='Employee',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('username', models.CharField(help_text='Уникальный логин для входа в систему', max_length=150, unique=True, verbose_name='Логин')),
('email', models.EmailField(blank=True, help_text='Рабочий email. Если не указан — генерируется из username@local.domain', max_length=254, null=True, unique=True, verbose_name='Email адрес')),
('role', models.CharField(choices=[('admin', 'Администратор сети'), ('warehouse', 'Сотрудник склада'), ('pharmacist', 'Фармацевт'), ('manager', 'Заведующий аптекой'), ('revisor', 'Ревизор'), ('office', 'Офисный сотрудник')], help_text='Роль определяет права доступа в API', max_length=20, verbose_name='Роль')),
('last_name', models.CharField(max_length=150, verbose_name='Фамилия')),
('first_name', models.CharField(max_length=150, verbose_name='Имя')),
('middle_name', models.CharField(blank=True, max_length=150, verbose_name='Отчество')),
('is_staff', models.BooleanField(default=False, help_text='Доступ в Django admin', verbose_name='Персонал')),
('is_active', models.BooleanField(default=True, help_text='Работает ли сотрудник сейчас', verbose_name='Активный')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Дата создания аккаунта')),
('birth_date', models.DateField(blank=True, null=True, validators=[core.utils.validators.validate_birth_date], verbose_name='Дата рождения')),
('inn_code', models.CharField(blank=True, help_text='Идентификационный номер налогоплательщика', max_length=10, null=True, validators=[core.utils.validators.validate_ukrainian_tax_number], verbose_name='ИНН')),
('phone', models.CharField(blank=True, max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Рабочий телефон')),
('personal_phone', models.CharField(blank=True, max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Личный телефон')),
('personal_email', models.EmailField(blank=True, max_length=254, verbose_name='Личный email')),
('emergency_contact_name', models.CharField(blank=True, max_length=200, verbose_name='Контакт в экстренных случаях')),
('emergency_contact_phone', models.CharField(blank=True, max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Телефон экстренного контакта')),
('emergency_contact_relation', models.CharField(blank=True, max_length=100, verbose_name='Степень родства')),
('user_location_type', models.CharField(blank=True, choices=[('pharmacy', 'Аптека'), ('warehouse', 'Склад'), ('office', 'Офис')], help_text='Где работает: аптека / склад / офис', max_length=20, null=True, verbose_name='Тип локации')),
('hire_date', models.DateField(verbose_name='Дата приёма на работу')),
('termination_date', models.DateField(blank=True, null=True, verbose_name='Дата увольнения')),
('probation_end_date', models.DateField(blank=True, null=True, verbose_name='Конец испытательного срока')),
('photo', models.ImageField(blank=True, null=True, upload_to='employees/photos/%Y/%m/', verbose_name='Фото')),
('mattermost_user_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='ID Mattermost')),
('mattermost_username', models.CharField(blank=True, max_length=50, null=True, verbose_name='Логин Mattermost')),
('mattermost_sync_status', models.CharField(choices=[('pending', 'Ожидает'), ('synced', 'Синхронизирован'), ('error', 'Ошибка'), ('disabled', 'Отключена')], default='pending', max_length=20, verbose_name='Статус синхронизации Mattermost')),
('mattermost_last_sync', models.DateTimeField(blank=True, null=True, verbose_name='Последняя синхронизация Mattermost')),
('mattermost_sync_enabled', models.BooleanField(default=True, verbose_name='Синхронизация Mattermost')),
('ad_user_dn', models.CharField(blank=True, help_text='CN=Ivanov Ivan,OU=Users,DC=company,DC=local', max_length=500, verbose_name='AD User DN')),
('ad_sync_status', models.CharField(choices=[('not_synced', 'Не синхронизирован'), ('synced', 'Синхронизирован'), ('error', 'Ошибка'), ('disabled', 'Отключена')], default='not_synced', max_length=20, verbose_name='Статус синхронизации AD')),
('ad_sync_error', models.TextField(blank=True, verbose_name='Ошибка синхронизации AD')),
('ad_last_sync', models.DateTimeField(blank=True, null=True, verbose_name='Последняя синхронизация AD')),
('ad_sync_enabled', models.BooleanField(default=False, help_text='Только для офисных сотрудников', verbose_name='Синхронизация AD')),
('department', models.ForeignKey(blank=True, help_text='Заполняется для office / warehouse', limit_choices_to={'directory_type__code': 'department', 'is_active': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='department_employees', to='core.directory', verbose_name='Отдел')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subordinates', to=settings.AUTH_USER_MODEL, verbose_name='Руководитель')),
('post', models.ForeignKey(blank=True, limit_choices_to={'directory_type__code': 'post', 'is_active': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='post_employees', to='core.directory', verbose_name='Должность')),
('user_organization', models.ForeignKey(blank=True, help_text='Юрлицо: АКС, АКС Одесса, Тира, Пентальфа...', limit_choices_to={'directory_type__code': 'organization', 'is_active': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='organization_employees', to='core.directory', verbose_name='Организация')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'Сотрудник',
'verbose_name_plural': 'Сотрудники',
},
),
]