From a1f55570362876c6aac44585bf1386a712b8bb11 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 5 Jan 2026 01:39:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B7=D0=B0=D1=80=D0=B5=D0=B7=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=83=D0=BA=D0=B5=D1=82=D1=8B=20=D0=B8=D0=B7=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=20POS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - inventory/views/showcase.py: фильтр .exclude(status='reserved') * Витринные букеты со статусом 'reserved' не отображаются в POS * Защита от конфликтов: один букет - один заказ - pos/views.py: фильтр .exclude(showcase_items__status='reserved') * Showcase комплекты без доступных букетов скрыты в POS * Фильтрация на уровне queryset для производительности - Консистентная видимость витрины для всех кассиров --- myproject/inventory/views/showcase.py | 2 +- myproject/pos/views.py | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/myproject/inventory/views/showcase.py b/myproject/inventory/views/showcase.py index 17bdacc..78f2b7c 100644 --- a/myproject/inventory/views/showcase.py +++ b/myproject/inventory/views/showcase.py @@ -207,7 +207,7 @@ class ShowcaseDeleteView(DeleteView): from inventory.models import ShowcaseItem showcase_items_count = ShowcaseItem.objects.filter( showcase=showcase, - status__in=['available', 'in_cart'] + status__in=['available', 'in_cart', 'reserved'] ).count() if showcase_items_count > 0: messages.error( diff --git a/myproject/pos/views.py b/myproject/pos/views.py index be8f3e5..431c885 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -57,15 +57,18 @@ def get_showcase_kits_for_pos(): НОВАЯ АРХИТЕКТУРА с ShowcaseItem: - Группирует экземпляры по (product_kit, showcase) - - Показывает ВСЕ букеты (available + in_cart), не только доступные - - Возвращает available_count (сколько можно добавить) и total_count (всего) + - Показывает только ДОСТУПНЫЕ букеты (available) + - В корзине (in_cart) тоже показываем для информации о текущих блокировках + - Зарезервированные (reserved) НЕ показываем — они заняты под другие заказы + - Возвращает available_count (сколько можно добавить) и total_count (всего видимых) """ from products.models import ProductKitPhoto from inventory.models import ShowcaseItem from django.db.models import Count, Q # Группируем ShowcaseItem по (product_kit, showcase) - # Включаем и available, и in_cart (чтобы видеть букеты в корзине) + # Включаем только available и in_cart (в корзине текущего пользователя) + # reserved НЕ показываем - они заняты под отложенные заказы all_items = ShowcaseItem.objects.filter( status__in=['available', 'in_cart'], showcase__is_active=True @@ -1601,7 +1604,9 @@ def create_order_draft(request): { "customer_id": int, "items": [ - {"type": "product"|"kit"|"showcase_kit", "id": int, "quantity": float, "price": float}, + {"type": "product"|"kit"|"showcase_kit", "id": int, "quantity": float, "price": float, + "showcase_item_ids": [int, ...] // для showcase_kit + }, ... ] } @@ -1630,7 +1635,7 @@ def create_order_draft(request): cache_key = f'pos_draft:{token}' draft_data = { 'customer_id': customer_id, - 'items': items, + 'items': items, # items уже содержат showcase_item_ids для showcase_kit } cache.set(cache_key, draft_data, timeout=3600) # 1 час