Исключены зарезервированные букеты из отображения в POS

- inventory/views/showcase.py: фильтр .exclude(status='reserved')
  * Витринные букеты со статусом 'reserved' не отображаются в POS
  * Защита от конфликтов: один букет - один заказ
- pos/views.py: фильтр .exclude(showcase_items__status='reserved')
  * Showcase комплекты без доступных букетов скрыты в POS
  * Фильтрация на уровне queryset для производительности
- Консистентная видимость витрины для всех кассиров
This commit is contained in:
2026-01-05 01:39:14 +03:00
parent 7cab70e8b0
commit a1f5557036
2 changed files with 11 additions and 6 deletions

View File

@@ -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(

View File

@@ -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 час