Конкретно пересмотрел логику работы. Легаси вынесена в архив
All checks were successful
Deploy MES Core / deploy (push) Successful in 13s

This commit is contained in:
2026-04-13 07:36:57 +03:00
parent 86215c9fa8
commit 28537447f8
80 changed files with 10246 additions and 684 deletions

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-08 03:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0019_alter_employeeprofile_role'),
]
operations = [
migrations.AddField(
model_name='dealitem',
name='due_date',
field=models.DateField(blank=True, null=True, verbose_name='Плановая отгрузка'),
),
]

View File

@@ -0,0 +1,35 @@
# Generated by Django 6.0.3 on 2026-04-08 03:54
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('manufacturing', '0005_assemblypassport_requires_painting_and_more'),
('shiftflow', '0020_dealitem_due_date'),
]
operations = [
migrations.CreateModel(
name='WorkItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('stage', models.CharField(choices=[('cutting', 'Резка'), ('welding', 'Сварка'), ('painting', 'Покраска')], max_length=16, verbose_name='Стадия')),
('quantity_plan', models.PositiveIntegerField(default=0, verbose_name='В план, шт')),
('quantity_done', models.PositiveIntegerField(default=0, verbose_name='Сделано, шт')),
('status', models.CharField(default='planned', max_length=16, verbose_name='Статус')),
('date', models.DateField(default=django.utils.timezone.localdate, verbose_name='Дата')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shiftflow.deal', verbose_name='Сделка')),
('entity', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='Сущность')),
('machine', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='shiftflow.machine', verbose_name='Станок/участок')),
('workshop', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='shiftflow.workshop', verbose_name='Цех')),
],
options={
'verbose_name': 'План работ',
'verbose_name_plural': 'План работ',
},
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 6.0.3 on 2026-04-08 16:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0021_workitem'),
]
operations = [
migrations.AddField(
model_name='employeeprofile',
name='allowed_workshops',
field=models.ManyToManyField(blank=True, to='shiftflow.workshop', verbose_name='Доступные цеха'),
),
migrations.AddField(
model_name='employeeprofile',
name='is_readonly',
field=models.BooleanField(default=False, verbose_name='Только просмотр'),
),
migrations.AlterField(
model_name='employeeprofile',
name='role',
field=models.CharField(choices=[('admin', 'Администратор'), ('technologist', 'Технолог'), ('master', 'Мастер'), ('operator', 'Оператор'), ('clerk', 'Учетчик'), ('observer', 'Наблюдатель'), ('manager', 'Руководитель')], default='operator', max_length=20, verbose_name='Должность'),
),
]

View File

@@ -0,0 +1,39 @@
# Generated by Django 6.0.3 on 2026-04-08 18:00
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('manufacturing', '0006_operation_entityoperation'),
('shiftflow', '0022_employeeprofile_allowed_workshops_and_more'),
]
operations = [
migrations.AddField(
model_name='workitem',
name='operation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='manufacturing.operation', verbose_name='Операция'),
),
migrations.AlterField(
model_name='workitem',
name='stage',
field=models.CharField(blank=True, default='', max_length=32, verbose_name='Стадия'),
),
migrations.CreateModel(
name='DealEntityProgress',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('current_seq', models.PositiveSmallIntegerField(default=1, verbose_name='Текущая операция (порядок)')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shiftflow.deal', verbose_name='Сделка')),
('entity', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='Сущность')),
],
options={
'verbose_name': 'Прогресс по операции',
'verbose_name_plural': 'Прогресс по операциям',
'unique_together': {('deal', 'entity')},
},
),
]

View File

@@ -0,0 +1,45 @@
# Generated by Django 6.0.3 on 2026-04-08 21:33
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('manufacturing', '0007_remove_productentity_route_delete_routestub'),
('shiftflow', '0023_workitem_operation_alter_workitem_stage_and_more'),
]
operations = [
migrations.CreateModel(
name='DealDeliveryBatch',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, default='', max_length=120, verbose_name='Название')),
('due_date', models.DateField(verbose_name='Плановая отгрузка')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Создано')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='delivery_batches', to='shiftflow.deal', verbose_name='Сделка')),
],
options={
'verbose_name': 'Партия поставки',
'verbose_name_plural': 'Партии поставки',
'ordering': ('deal', 'due_date', 'id'),
},
),
migrations.CreateModel(
name='DealBatchItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity', models.PositiveIntegerField(verbose_name='Количество, шт')),
('entity', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='Изделие/деталь')),
('batch', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='shiftflow.dealdeliverybatch', verbose_name='Партия')),
],
options={
'verbose_name': 'Строка партии',
'verbose_name_plural': 'Строки партий',
'ordering': ('batch', 'entity__entity_type', 'entity__drawing_number', 'entity__name', 'id'),
'unique_together': {('batch', 'entity')},
},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-09 04:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0024_dealdeliverybatch_dealbatchitem'),
]
operations = [
migrations.AddField(
model_name='dealbatchitem',
name='started_qty',
field=models.PositiveIntegerField(default=0, verbose_name='Запущено в производство, шт'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-09 10:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0025_dealbatchitem_started_qty'),
]
operations = [
migrations.AddField(
model_name='dealdeliverybatch',
name='is_default',
field=models.BooleanField(default=False, verbose_name='Дефолтная партия (остаток)'),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 6.0.3 on 2026-04-09 10:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0026_dealdeliverybatch_is_default'),
]
operations = [
migrations.RemoveField(
model_name='dealitem',
name='due_date',
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 6.0.3 on 2026-04-09 11:38
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0027_remove_dealitem_due_date'),
('warehouse', '0014_material_mass_per_unit'),
]
operations = [
migrations.AlterField(
model_name='productiontask',
name='material',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='warehouse.material', verbose_name='Материал'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-09 12:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0028_alter_productiontask_material'),
]
operations = [
migrations.AddField(
model_name='deal',
name='due_date',
field=models.DateField(blank=True, null=True, verbose_name='Срок отгрузки'),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 6.0.3 on 2026-04-11 05:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0029_deal_due_date'),
]
operations = [
migrations.AddField(
model_name='workitem',
name='comment',
field=models.TextField(blank=True, default='', verbose_name='Комментарий'),
),
migrations.AlterField(
model_name='item',
name='status',
field=models.CharField(choices=[('work', 'В работе'), ('done', 'Выполнено'), ('partial', 'Частично'), ('leftover', 'Недодел')], default='work', max_length=10, verbose_name='Статус'),
),
migrations.AlterField(
model_name='workitem',
name='status',
field=models.CharField(choices=[('planned', 'В работе'), ('leftover', 'Недодел'), ('done', 'Закрыта')], default='planned', max_length=16, verbose_name='Статус'),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 6.0.3 on 2026-04-11 20:08
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('manufacturing', '0007_remove_productentity_route_delete_routestub'),
('shiftflow', '0030_workitem_comment_alter_item_status_and_more'),
]
operations = [
migrations.CreateModel(
name='ProcurementRequirement',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('required_qty', models.FloatField(verbose_name='Потребность (к закупке)')),
('status', models.CharField(choices=[('to_order', 'К заказу'), ('ordered', 'Заказано'), ('closed', 'Закрыто')], default='to_order', max_length=20, verbose_name='Статус')),
('component', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='manufacturing.productentity', verbose_name='Компонент (покупное/литье)')),
('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shiftflow.deal', verbose_name='Сделка')),
],
options={
'verbose_name': 'Потребность снабжения',
'verbose_name_plural': 'Потребности снабжения',
'unique_together': {('deal', 'component')},
},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.3 on 2026-04-11 20:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0031_procurementrequirement'),
]
operations = [
migrations.AlterField(
model_name='procurementrequirement',
name='required_qty',
field=models.PositiveIntegerField(verbose_name='Потребность (к закупке), шт'),
),
]

View File

@@ -0,0 +1,31 @@
# Generated by Django 6.0.3 on 2026-04-12 09:22
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shiftflow', '0032_alter_procurementrequirement_required_qty'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='cuttingsession',
name='is_synced_1c',
field=models.BooleanField(default=False, verbose_name='Выгружено в 1С'),
),
migrations.AddField(
model_name='cuttingsession',
name='synced_1c_at',
field=models.DateTimeField(blank=True, null=True, verbose_name='Выгружено в 1С (время)'),
),
migrations.AddField(
model_name='cuttingsession',
name='synced_1c_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='synced_cutting_sessions', to=settings.AUTH_USER_MODEL, verbose_name='Выгрузил в 1С'),
),
]