Конкретно пересмотрел логику работы. Легаси вынесена в архив
All checks were successful
Deploy MES Core / deploy (push) Successful in 13s
All checks were successful
Deploy MES Core / deploy (push) Successful in 13s
This commit is contained in:
18
shiftflow/migrations/0020_dealitem_due_date.py
Normal file
18
shiftflow/migrations/0020_dealitem_due_date.py
Normal 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='Плановая отгрузка'),
|
||||
),
|
||||
]
|
||||
35
shiftflow/migrations/0021_workitem.py
Normal file
35
shiftflow/migrations/0021_workitem.py
Normal 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': 'План работ',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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='Должность'),
|
||||
),
|
||||
]
|
||||
@@ -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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
45
shiftflow/migrations/0024_dealdeliverybatch_dealbatchitem.py
Normal file
45
shiftflow/migrations/0024_dealdeliverybatch_dealbatchitem.py
Normal 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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
18
shiftflow/migrations/0025_dealbatchitem_started_qty.py
Normal file
18
shiftflow/migrations/0025_dealbatchitem_started_qty.py
Normal 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='Запущено в производство, шт'),
|
||||
),
|
||||
]
|
||||
18
shiftflow/migrations/0026_dealdeliverybatch_is_default.py
Normal file
18
shiftflow/migrations/0026_dealdeliverybatch_is_default.py
Normal 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='Дефолтная партия (остаток)'),
|
||||
),
|
||||
]
|
||||
17
shiftflow/migrations/0027_remove_dealitem_due_date.py
Normal file
17
shiftflow/migrations/0027_remove_dealitem_due_date.py
Normal 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',
|
||||
),
|
||||
]
|
||||
20
shiftflow/migrations/0028_alter_productiontask_material.py
Normal file
20
shiftflow/migrations/0028_alter_productiontask_material.py
Normal 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='Материал'),
|
||||
),
|
||||
]
|
||||
18
shiftflow/migrations/0029_deal_due_date.py
Normal file
18
shiftflow/migrations/0029_deal_due_date.py
Normal 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='Срок отгрузки'),
|
||||
),
|
||||
]
|
||||
@@ -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='Статус'),
|
||||
),
|
||||
]
|
||||
30
shiftflow/migrations/0031_procurementrequirement.py
Normal file
30
shiftflow/migrations/0031_procurementrequirement.py
Normal 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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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='Потребность (к закупке), шт'),
|
||||
),
|
||||
]
|
||||
@@ -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С'),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user