131cb27d16
Django project: employees, locations, visit_manager, it_manager, mattermost_connector and stub connectors (ad, mail, portal).
127 lines
9.0 KiB
Python
127 lines
9.0 KiB
Python
# Generated by Django 6.0.3 on 2026-04-06 10:32
|
|
|
|
import core.utils.validators
|
|
import django.db.models.deletion
|
|
import location_field.models.plain
|
|
import uuid
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
('core', '0001_initial'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='Location',
|
|
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)),
|
|
('location_type', models.CharField(choices=[('pharmacy', 'Аптека'), ('warehouse', 'Склад'), ('office', 'Офис')], max_length=20, verbose_name='Тип локации')),
|
|
('street', models.CharField(blank=True, max_length=100, verbose_name='Улица')),
|
|
('house_number', models.CharField(blank=True, max_length=20, verbose_name='Номер дома')),
|
|
('building', models.CharField(blank=True, max_length=20, verbose_name='Корпус/строение')),
|
|
('apartment', models.CharField(blank=True, max_length=20, verbose_name='Помещение/офис')),
|
|
('address', models.CharField(blank=True, help_text='Заполняется автоматически из полей выше', max_length=255, verbose_name='Полный адрес')),
|
|
('location', location_field.models.plain.PlainLocationField(blank=True, default='46.4825,30.7233', max_length=63, verbose_name='Координаты на карте')),
|
|
('is_active', models.BooleanField(default=True, verbose_name='Активна')),
|
|
('comments', models.TextField(blank=True, verbose_name='Комментарии')),
|
|
('location_region', models.ForeignKey(limit_choices_to={'directory_type__code__in': ['region', 'district', 'city', 'city_district'], 'is_active': True}, on_delete=django.db.models.deletion.PROTECT, related_name='region_locations', to='core.directory', verbose_name='Город/район')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Локация',
|
|
'verbose_name_plural': 'Локации',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Pharmacy',
|
|
fields=[
|
|
('location_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='locations.location')),
|
|
('pharmacy_number', models.PositiveIntegerField(help_text='Числовой номер аптеки внутри организации', verbose_name='Номер аптеки')),
|
|
('license_number', models.CharField(blank=True, max_length=50, null=True, verbose_name='Номер лицензии')),
|
|
('license_expiry_date', models.DateField(blank=True, null=True, verbose_name='Дата окончания лицензии')),
|
|
('pharmacists_count', models.PositiveSmallIntegerField(default=1, help_text='Кешированное поле — обновляется при синхронизации', verbose_name='Количество фармацевтов')),
|
|
('phone', models.CharField(blank=True, max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Телефон')),
|
|
('working_hours', models.CharField(default='08:00-20:00', max_length=100, verbose_name='Часы работы')),
|
|
('has_online_ordering', models.BooleanField(default=True, verbose_name='Онлайн заказы')),
|
|
('sync_url', models.URLField(blank=True, help_text='Адрес PPOS: http://192.168.1.10:8000', verbose_name='URL локального сервера')),
|
|
('sync_token', models.CharField(blank=True, help_text='Генерируется автоматически при сохранении, если пусто', max_length=255, verbose_name='Токен синхронизации')),
|
|
('last_synced_at', models.DateTimeField(blank=True, help_text='Заполняется при первой синхронизации с PPOS', null=True, verbose_name='Последняя синхронизация')),
|
|
('head_pharmacist', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='head_pharmacist_at', to=settings.AUTH_USER_MODEL, verbose_name='Заведующий аптекой')),
|
|
('organization', models.ForeignKey(help_text='Юрлицо: АКС, АКС Одесса, Тира, Пентальфа...', limit_choices_to={'directory_type__code': 'organization', 'is_active': True}, on_delete=django.db.models.deletion.PROTECT, related_name='pharmacies', to='core.directory', verbose_name='Организация')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Аптека',
|
|
'verbose_name_plural': 'Аптеки',
|
|
'ordering': ['organization', 'pharmacy_number'],
|
|
},
|
|
bases=('locations.location',),
|
|
),
|
|
migrations.CreateModel(
|
|
name='PharmacyPhone',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('phone', models.CharField(max_length=20, validators=[core.utils.validators.validate_ukrainian_phone], verbose_name='Телефон')),
|
|
('phone_type', models.CharField(choices=[('main', 'Основной'), ('mobile', 'Мобильный')], default='main', max_length=10, verbose_name='Тип')),
|
|
('is_primary', models.BooleanField(default=False, verbose_name='Основной номер')),
|
|
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
|
|
('notes', models.CharField(blank=True, max_length=200, verbose_name='Примечания')),
|
|
('pharmacy', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='phones', to='locations.pharmacy', verbose_name='Аптека')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Телефон аптеки',
|
|
'verbose_name_plural': 'Телефоны аптек',
|
|
'ordering': ['-is_primary', 'phone_type'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='PharmacyHistory',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('changed_field', models.CharField(max_length=50, verbose_name='Изменённое поле')),
|
|
('old_value', models.TextField(blank=True, verbose_name='Старое значение')),
|
|
('new_value', models.TextField(blank=True, verbose_name='Новое значение')),
|
|
('changed_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата изменения')),
|
|
('changed_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Кто изменил')),
|
|
('pharmacy', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history', to='locations.pharmacy', verbose_name='Аптека')),
|
|
],
|
|
options={
|
|
'verbose_name': 'История изменений аптеки',
|
|
'verbose_name_plural': 'История изменений аптек',
|
|
'ordering': ['-changed_at'],
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='location',
|
|
index=models.Index(fields=['location'], name='locations_l_locatio_4beb8b_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='pharmacy',
|
|
index=models.Index(fields=['pharmacy_number'], name='locations_p_pharmac_6fd8df_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='pharmacy',
|
|
index=models.Index(fields=['organization'], name='locations_p_organiz_c5677d_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='pharmacy',
|
|
index=models.Index(fields=['head_pharmacist'], name='locations_p_head_ph_d88025_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='pharmacy',
|
|
index=models.Index(fields=['last_synced_at'], name='locations_p_last_sy_0dc5a0_idx'),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='pharmacy',
|
|
constraint=models.UniqueConstraint(fields=('organization', 'pharmacy_number'), name='unique_pharmacy_number_per_organization'),
|
|
),
|
|
]
|