Добавлена функциональность витрин для POS: модели, сервисы, UI

- Создана модель Showcase (витрина) привязанная к складу
- Расширена Reservation для поддержки витринных резервов
- Добавлены поля в OrderItem для маркировки витринных продаж
- Реализован ShowcaseManager с методами резервирования, продажи и разбора
- Обновлён админ-интерфейс для управления витринами
- Добавлена кнопка Витрина в POS (категории) и API для просмотра
- Добавлена кнопка На витрину в панели действий POS
- Миграции готовы к применению
This commit is contained in:
2025-11-16 21:12:22 +03:00
parent e98bf3cfb4
commit 8f6acfb364
12 changed files with 653 additions and 13 deletions

View File

@@ -0,0 +1,44 @@
# Generated by Django 5.0.10 on 2025-11-16 18:07
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0003_showcase_reservation_showcase_and_more'),
('orders', '0002_initial'),
('products', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='historicalorderitem',
name='is_from_showcase',
field=models.BooleanField(default=False, help_text='True если товар продан с витрины', verbose_name='С витрины'),
),
migrations.AddField(
model_name='historicalorderitem',
name='showcase',
field=models.ForeignKey(blank=True, db_constraint=False, help_text='Витрина, с которой был продан товар', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='inventory.showcase', verbose_name='Витрина'),
),
migrations.AddField(
model_name='orderitem',
name='is_from_showcase',
field=models.BooleanField(default=False, help_text='True если товар продан с витрины', verbose_name='С витрины'),
),
migrations.AddField(
model_name='orderitem',
name='showcase',
field=models.ForeignKey(blank=True, help_text='Витрина, с которой был продан товар', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='order_items', to='inventory.showcase', verbose_name='Витрина'),
),
migrations.AddIndex(
model_name='orderitem',
index=models.Index(fields=['is_from_showcase'], name='orders_orde_is_from_32d8f7_idx'),
),
migrations.AddIndex(
model_name='orderitem',
index=models.Index(fields=['showcase'], name='orders_orde_showcas_aa97bd_idx'),
),
]

View File

@@ -683,6 +683,23 @@ class OrderItem(models.Model):
help_text="True если цена была изменена вручную при создании заказа"
)
# Витринные продажи
is_from_showcase = models.BooleanField(
default=False,
verbose_name="С витрины",
help_text="True если товар продан с витрины"
)
showcase = models.ForeignKey(
'inventory.Showcase',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='order_items',
verbose_name="Витрина",
help_text="Витрина, с которой был продан товар"
)
# Временные метки
created_at = models.DateTimeField(
auto_now_add=True,
@@ -699,6 +716,8 @@ class OrderItem(models.Model):
models.Index(fields=['order']),
models.Index(fields=['product']),
models.Index(fields=['product_kit']),
models.Index(fields=['is_from_showcase']),
models.Index(fields=['showcase']),
]
def __str__(self):