From 2d1f8b78ad4ef6e8ee7ef3cae0964a86b020e003 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Thu, 8 Jan 2026 22:11:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B2=20inventory:=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8,=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inventory/migrations/0001_initial.py | 15 ++++++---- .../inventory/migrations/0002_initial.py | 19 +++++++----- .../migrations/0003_sale_pending_fields.py | 30 ------------------- ...004_add_reserved_status_to_showcaseitem.py | 18 ----------- ...d_original_order_item_id_to_reservation.py | 18 ----------- myproject/inventory/models.py | 14 ++++----- 6 files changed, 27 insertions(+), 87 deletions(-) delete mode 100644 myproject/inventory/migrations/0003_sale_pending_fields.py delete mode 100644 myproject/inventory/migrations/0004_add_reserved_status_to_showcaseitem.py delete mode 100644 myproject/inventory/migrations/0005_add_original_order_item_id_to_reservation.py diff --git a/myproject/inventory/migrations/0001_initial.py b/myproject/inventory/migrations/0001_initial.py index 38de300..81891f8 100644 --- a/myproject/inventory/migrations/0001_initial.py +++ b/myproject/inventory/migrations/0001_initial.py @@ -1,8 +1,8 @@ -# Generated by Django 5.0.10 on 2026-01-03 23:23 +# Generated by Django 5.0.10 on 2026-01-08 15:58 import django.db.models.deletion import phonenumber_field.modelfields -from django.conf import settings +from decimal import Decimal from django.db import migrations, models @@ -11,7 +11,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('accounts', '0001_initial'), ] operations = [ @@ -71,6 +71,7 @@ class Migration(migrations.Migration): ('converted_at', models.DateTimeField(blank=True, help_text='Дата преобразования в продажу или списание', null=True, verbose_name='Дата преобразования')), ('cart_lock_expires_at', models.DateTimeField(blank=True, help_text='Время истечения блокировки в корзине (для витринных комплектов)', null=True, verbose_name='Блокировка корзины истекает')), ('cart_session_id', models.CharField(blank=True, help_text='Дополнительная идентификация сессии для надежности', max_length=100, null=True, verbose_name='ID сессии корзины')), + ('original_order_item_id', models.IntegerField(blank=True, db_index=True, help_text='Для витринных резервов: ID OrderItem, которому изначально принадлежал резерв (защита от кражи)', null=True, verbose_name='ID исходной позиции заказа')), ('quantity_base', models.DecimalField(blank=True, decimal_places=6, help_text='Количество в единицах хранения товара', max_digits=10, null=True, verbose_name='Количество в базовых единицах')), ], options={ @@ -90,6 +91,8 @@ class Migration(migrations.Migration): ('processed', models.BooleanField(default=False, verbose_name='Обработана (FIFO применена)')), ('quantity_base', models.DecimalField(blank=True, decimal_places=6, help_text='Количество в единицах хранения товара (для списания со склада)', max_digits=10, null=True, verbose_name='Количество в базовых единицах')), ('unit_name_snapshot', models.CharField(blank=True, default='', help_text='Название единицы продажи на момент продажи', max_length=100, verbose_name='Название единицы (snapshot)')), + ('is_pending_cost', models.BooleanField(default=False, help_text="True если продажа создана без партий (продажа 'в минус')", verbose_name='Ожидает себестоимости')), + ('pending_quantity', models.DecimalField(decimal_places=3, default=Decimal('0'), help_text='Количество, ожидающее привязки к партиям при приёмке', max_digits=10, verbose_name='Ожидающее количество')), ], options={ 'verbose_name': 'Продажа', @@ -130,7 +133,7 @@ class Migration(migrations.Migration): name='ShowcaseItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.CharField(choices=[('available', 'Доступен'), ('in_cart', 'В корзине'), ('sold', 'Продан'), ('dismantled', 'Разобран')], db_index=True, default='available', max_length=20, verbose_name='Статус')), + ('status', models.CharField(choices=[('available', 'Доступен'), ('in_cart', 'В корзине'), ('reserved', 'Зарезервирован'), ('sold', 'Продан'), ('dismantled', 'Разобран')], db_index=True, default='available', max_length=20, verbose_name='Статус')), ('sold_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата продажи')), ('cart_lock_expires_at', models.DateTimeField(blank=True, null=True, verbose_name='Блокировка истекает')), ('cart_session_id', models.CharField(blank=True, max_length=100, null=True, verbose_name='ID сессии корзины')), @@ -322,8 +325,8 @@ class Migration(migrations.Migration): ('confirmed_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата проведения')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Создан')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Обновлён')), - ('confirmed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_incoming_documents', to=settings.AUTH_USER_MODEL, verbose_name='Провёл')), - ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_incoming_documents', to=settings.AUTH_USER_MODEL, verbose_name='Создал')), + ('confirmed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_incoming_documents', to='accounts.customuser', verbose_name='Провёл')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_incoming_documents', to='accounts.customuser', verbose_name='Создал')), ], options={ 'verbose_name': 'Документ поступления', diff --git a/myproject/inventory/migrations/0002_initial.py b/myproject/inventory/migrations/0002_initial.py index d15329d..623af8b 100644 --- a/myproject/inventory/migrations/0002_initial.py +++ b/myproject/inventory/migrations/0002_initial.py @@ -1,7 +1,6 @@ -# Generated by Django 5.0.10 on 2026-01-03 23:23 +# Generated by Django 5.0.10 on 2026-01-08 15:58 import django.db.models.deletion -from django.conf import settings from django.db import migrations, models @@ -10,11 +9,11 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('accounts', '0001_initial'), ('inventory', '0001_initial'), ('orders', '0001_initial'), ('products', '0001_initial'), ('user_roles', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -46,7 +45,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='reservation', name='locked_by_user', - field=models.ForeignKey(blank=True, help_text='Кассир, который добавил комплект в корзину', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cart_locks', to=settings.AUTH_USER_MODEL, verbose_name='Заблокировано пользователем'), + field=models.ForeignKey(blank=True, help_text='Кассир, который добавил комплект в корзину', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cart_locks', to='accounts.customuser', verbose_name='Заблокировано пользователем'), ), migrations.AddField( model_name='reservation', @@ -96,7 +95,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='showcaseitem', name='locked_by_user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='locked_showcase_items', to=settings.AUTH_USER_MODEL, verbose_name='Заблокировано пользователем'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='locked_showcase_items', to='accounts.customuser', verbose_name='Заблокировано пользователем'), ), migrations.AddField( model_name='showcaseitem', @@ -156,7 +155,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='transformation', name='employee', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transformations', to=settings.AUTH_USER_MODEL, verbose_name='Сотрудник'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transformations', to='accounts.customuser', verbose_name='Сотрудник'), ), migrations.AddField( model_name='transformationinput', @@ -258,12 +257,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='writeoffdocument', name='confirmed_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_writeoff_documents', to=settings.AUTH_USER_MODEL, verbose_name='Провёл'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_writeoff_documents', to='accounts.customuser', verbose_name='Провёл'), ), migrations.AddField( model_name='writeoffdocument', name='created_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_writeoff_documents', to=settings.AUTH_USER_MODEL, verbose_name='Создал'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_writeoff_documents', to='accounts.customuser', verbose_name='Создал'), ), migrations.AddField( model_name='writeoffdocument', @@ -399,6 +398,10 @@ class Migration(migrations.Migration): model_name='sale', index=models.Index(fields=['order'], name='inventory_s_order_i_7d13ea_idx'), ), + migrations.AddIndex( + model_name='sale', + index=models.Index(fields=['is_pending_cost'], name='inventory_s_is_pend_81a3db_idx'), + ), migrations.AddIndex( model_name='inventory', index=models.Index(fields=['document_number'], name='inventory_i_documen_8df782_idx'), diff --git a/myproject/inventory/migrations/0003_sale_pending_fields.py b/myproject/inventory/migrations/0003_sale_pending_fields.py deleted file mode 100644 index 5cabd4b..0000000 --- a/myproject/inventory/migrations/0003_sale_pending_fields.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.0.10 on 2026-01-04 06:53 - -from decimal import Decimal -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0002_initial'), - ('orders', '0002_initial'), - ('products', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='sale', - name='is_pending_cost', - field=models.BooleanField(default=False, help_text="True если продажа создана без партий (продажа 'в минус')", verbose_name='Ожидает себестоимости'), - ), - migrations.AddField( - model_name='sale', - name='pending_quantity', - field=models.DecimalField(decimal_places=3, default=Decimal('0'), help_text='Количество, ожидающее привязки к партиям при приёмке', max_digits=10, verbose_name='Ожидающее количество'), - ), - migrations.AddIndex( - model_name='sale', - index=models.Index(fields=['is_pending_cost'], name='inventory_s_is_pend_81a3db_idx'), - ), - ] diff --git a/myproject/inventory/migrations/0004_add_reserved_status_to_showcaseitem.py b/myproject/inventory/migrations/0004_add_reserved_status_to_showcaseitem.py deleted file mode 100644 index a716469..0000000 --- a/myproject/inventory/migrations/0004_add_reserved_status_to_showcaseitem.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.10 on 2026-01-04 21:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0003_sale_pending_fields'), - ] - - operations = [ - migrations.AlterField( - model_name='showcaseitem', - name='status', - field=models.CharField(choices=[('available', 'Доступен'), ('in_cart', 'В корзине'), ('reserved', 'Зарезервирован'), ('sold', 'Продан'), ('dismantled', 'Разобран')], db_index=True, default='available', max_length=20, verbose_name='Статус'), - ), - ] diff --git a/myproject/inventory/migrations/0005_add_original_order_item_id_to_reservation.py b/myproject/inventory/migrations/0005_add_original_order_item_id_to_reservation.py deleted file mode 100644 index 0b41770..0000000 --- a/myproject/inventory/migrations/0005_add_original_order_item_id_to_reservation.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.10 on 2026-01-05 10:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('inventory', '0004_add_reserved_status_to_showcaseitem'), - ] - - operations = [ - migrations.AddField( - model_name='reservation', - name='original_order_item_id', - field=models.IntegerField(blank=True, db_index=True, help_text='Для витринных резервов: ID OrderItem, которому изначально принадлежал резерв (защита от кражи)', null=True, verbose_name='ID исходной позиции заказа'), - ), - ] diff --git a/myproject/inventory/models.py b/myproject/inventory/models.py index 4d713f6..8685d8e 100644 --- a/myproject/inventory/models.py +++ b/myproject/inventory/models.py @@ -463,7 +463,7 @@ class Reservation(models.Model): help_text="Время истечения блокировки в корзине (для витринных комплектов)" ) locked_by_user = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, related_name='cart_locks', @@ -626,7 +626,7 @@ class ShowcaseItem(models.Model): # === SOFT LOCK для корзины === locked_by_user = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, @@ -1087,7 +1087,7 @@ class WriteOffDocument(models.Model): # Аудит created_by = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, @@ -1096,7 +1096,7 @@ class WriteOffDocument(models.Model): ) confirmed_by = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, @@ -1317,7 +1317,7 @@ class IncomingDocument(models.Model): # Аудит created_by = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, @@ -1326,7 +1326,7 @@ class IncomingDocument(models.Model): ) confirmed_by = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True, @@ -1491,7 +1491,7 @@ class Transformation(models.Model): ) employee = models.ForeignKey( - settings.AUTH_USER_MODEL, + 'accounts.CustomUser', on_delete=models.SET_NULL, null=True, blank=True,