6ff01c4119
- employees: last_seen, internal_number, default_page_size; управление-команды - locations: категория/куратор/ответственный аптеки, seed должностей; Location.__str__ показывает номер аптеки (не только адрес) - hiring: HiringRequest (заявки на найм) + тесты (7) - utilities: UtilityReading (показания счётчиков по аптекам) - visit_manager: правки Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
5.1 KiB
Python
60 lines
5.1 KiB
Python
# Generated by Django 6.0.3 on 2026-07-08 23:14
|
|
|
|
import core.utils.validators
|
|
import django.core.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 = [
|
|
('core', '0002_connector_config'),
|
|
('it_manager', '0006_equipment_brand_to_directory'),
|
|
('locations', '0003_pharmacy_status'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='HiringRequest',
|
|
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)),
|
|
('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='По батькові')),
|
|
('candidate_email', models.EmailField(blank=True, max_length=254, verbose_name='Особистий email кандидата')),
|
|
('candidate_phone', models.CharField(blank=True, max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Телефон кандидата')),
|
|
('user_location_type', models.CharField(choices=[('pharmacy', 'Аптека'), ('warehouse', 'Склад'), ('office', 'Офіс')], max_length=20, verbose_name='Тип локації')),
|
|
('hire_date', models.DateField(default=django.utils.timezone.localdate, verbose_name='Дата виходу')),
|
|
('trial_days', models.PositiveSmallIntegerField(choices=[(1, '1 дн.'), (2, '2 дн.'), (3, '3 дн.'), (4, '4 дн.'), (5, '5 дн.')], default=3, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)], verbose_name='Термін випробування, днів')),
|
|
('access_note', models.TextField(blank=True, verbose_name='Примітка щодо доступів')),
|
|
('status', models.CharField(choices=[('trial', 'На випробуванні'), ('approved', 'Затверджено'), ('rejected', 'Відхилено')], default='trial', max_length=10, verbose_name='Статус')),
|
|
('decision_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата рішення')),
|
|
('decision_note', models.TextField(blank=True, verbose_name='Коментар до рішення')),
|
|
('decision_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hiring_requests_decided', to=settings.AUTH_USER_MODEL, verbose_name='Рішення прийняв')),
|
|
('department', models.ForeignKey(blank=True, limit_choices_to={'directory_type__code': 'department', 'is_active': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hiring_requests_department', to='core.directory', verbose_name='Відділ')),
|
|
('employee', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hiring_request', to=settings.AUTH_USER_MODEL, verbose_name='Обліковий запис')),
|
|
('granted_ticket', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hiring_requests', to='it_manager.ticket', verbose_name='Заявка в IT')),
|
|
('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='hiring_requests_post', to='core.directory', verbose_name='Посада')),
|
|
('requested_access', models.ManyToManyField(blank=True, limit_choices_to={'directory_type__code': 'access_system', 'is_active': True}, related_name='hiring_requests_access', to='core.directory', verbose_name='Потрібні доступи')),
|
|
('requested_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='hiring_requests_submitted', to=settings.AUTH_USER_MODEL, verbose_name='Подав HR')),
|
|
('user_pharmacy', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hiring_requests', to='locations.pharmacy', verbose_name='Аптека')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Заявка на найм',
|
|
'verbose_name_plural': 'Заявки на найм',
|
|
'ordering': ['-created_at'],
|
|
'indexes': [models.Index(fields=['status'], name='hiring_hiri_status_3e18a8_idx')],
|
|
},
|
|
),
|
|
]
|