Исключены зарезервированные букеты из отображения в 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
|
from inventory.models import ShowcaseItem
|
||||||
showcase_items_count = ShowcaseItem.objects.filter(
|
showcase_items_count = ShowcaseItem.objects.filter(
|
||||||
showcase=showcase,
|
showcase=showcase,
|
||||||
status__in=['available', 'in_cart']
|
status__in=['available', 'in_cart', 'reserved']
|
||||||
).count()
|
).count()
|
||||||
if showcase_items_count > 0:
|
if showcase_items_count > 0:
|
||||||
messages.error(
|
messages.error(
|
||||||
|
|||||||
@@ -57,15 +57,18 @@ def get_showcase_kits_for_pos():
|
|||||||
|
|
||||||
НОВАЯ АРХИТЕКТУРА с ShowcaseItem:
|
НОВАЯ АРХИТЕКТУРА с ShowcaseItem:
|
||||||
- Группирует экземпляры по (product_kit, showcase)
|
- Группирует экземпляры по (product_kit, showcase)
|
||||||
- Показывает ВСЕ букеты (available + in_cart), не только доступные
|
- Показывает только ДОСТУПНЫЕ букеты (available)
|
||||||
- Возвращает available_count (сколько можно добавить) и total_count (всего)
|
- В корзине (in_cart) тоже показываем для информации о текущих блокировках
|
||||||
|
- Зарезервированные (reserved) НЕ показываем — они заняты под другие заказы
|
||||||
|
- Возвращает available_count (сколько можно добавить) и total_count (всего видимых)
|
||||||
"""
|
"""
|
||||||
from products.models import ProductKitPhoto
|
from products.models import ProductKitPhoto
|
||||||
from inventory.models import ShowcaseItem
|
from inventory.models import ShowcaseItem
|
||||||
from django.db.models import Count, Q
|
from django.db.models import Count, Q
|
||||||
|
|
||||||
# Группируем ShowcaseItem по (product_kit, showcase)
|
# Группируем ShowcaseItem по (product_kit, showcase)
|
||||||
# Включаем и available, и in_cart (чтобы видеть букеты в корзине)
|
# Включаем только available и in_cart (в корзине текущего пользователя)
|
||||||
|
# reserved НЕ показываем - они заняты под отложенные заказы
|
||||||
all_items = ShowcaseItem.objects.filter(
|
all_items = ShowcaseItem.objects.filter(
|
||||||
status__in=['available', 'in_cart'],
|
status__in=['available', 'in_cart'],
|
||||||
showcase__is_active=True
|
showcase__is_active=True
|
||||||
@@ -1601,7 +1604,9 @@ def create_order_draft(request):
|
|||||||
{
|
{
|
||||||
"customer_id": int,
|
"customer_id": int,
|
||||||
"items": [
|
"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}'
|
cache_key = f'pos_draft:{token}'
|
||||||
draft_data = {
|
draft_data = {
|
||||||
'customer_id': customer_id,
|
'customer_id': customer_id,
|
||||||
'items': items,
|
'items': items, # items уже содержат showcase_item_ids для showcase_kit
|
||||||
}
|
}
|
||||||
cache.set(cache_key, draft_data, timeout=3600) # 1 час
|
cache.set(cache_key, draft_data, timeout=3600) # 1 час
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user