Исключены зарезервированные букеты из отображения в 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:
@@ -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(
|
||||
|
||||
@@ -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 час
|
||||
|
||||
|
||||
Reference in New Issue
Block a user