diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 0c5ec48..3fe6649 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -212,6 +212,7 @@ def pos_terminal(request): if cached_cart_data: # Валидируем товары и комплекты в корзине from products.models import Product, ProductKit + from inventory.models import ShowcaseItem for cart_key, item in cached_cart_data.items(): try: @@ -227,17 +228,28 @@ def pos_terminal(request): # Витринный комплект - проверяем существование И актуальность блокировки kit = ProductKit.objects.get(id=item['id']) - # Проверяем, что блокировка всё ещё активна для этого пользователя - has_valid_lock = Reservation.objects.filter( - product_kit=kit, - locked_by_user=request.user, - cart_lock_expires_at__gt=timezone.now(), - status='reserved' - ).exists() + # Получаем showcase_item_ids из корзины (если есть) + showcase_item_ids = item.get('showcase_item_ids', []) - if has_valid_lock: - cart_data[cart_key] = item - # Если блокировка истекла - не добавляем в корзину (товар доступен другим) + if showcase_item_ids: + # Проверяем, что все указанные ShowcaseItem заблокированы на текущего пользователя + locked_items = ShowcaseItem.objects.filter( + id__in=showcase_item_ids, + product_kit=kit, + status='in_cart', + locked_by_user=request.user, + cart_lock_expires_at__gt=timezone.now() + ) + + locked_count = locked_items.count() + + if locked_count > 0: + # Обновляем количество на актуальное (на случай если часть блокировок истекла) + item['qty'] = locked_count + item['showcase_item_ids'] = list(locked_items.values_list('id', flat=True)) + cart_data[cart_key] = item + # Если ни один не заблокирован - не добавляем в корзину + # Если showcase_item_ids отсутствует - не добавляем (устаревший формат) except (Product.DoesNotExist, ProductKit.DoesNotExist): # Товар или комплект удален - пропускаем continue