Добавлена валидация и логирование для продажи витринных комплектов в POS

Проблема: Продолжает возникать ошибка 'Один из экземпляров уже был продан'
при попытке продажи витринных букетов.

Изменения для диагностики:
1. Добавлена валидация showcase_item_ids ПЕРЕД передачей в sell_showcase_items
2. Проверка что все экземпляры имеют status='in_cart' и locked_by_user=текущий
3. Фильтр по статусу исключает уже проданные/разобранные экземпляры
4. Добавлено детальное логирование:
   - Запрошенные showcase_item_ids
   - Количество найденных заблокированных экземпляров
   - Недостающие IDs если не все найдены

Улучшенное сообщение об ошибке:
Вместо 'уже был продан' теперь 'уже не заблокированы на вас' с просьбой
обновить страницу - более понятно для пользователя.

Логи помогут выявить:
- Передаются ли дубликаты в showcase_item_ids
- Истекают ли блокировки до момента продажи
- Меняется ли статус экземпляров между добавлением в корзину и checkout
This commit is contained in:
2025-12-11 22:18:16 +03:00
parent d5e40bb1c8
commit 37c203a783

View File

@@ -1468,9 +1468,26 @@ def pos_checkout(request):
# Продаём экземпляры через ShowcaseManager
if showcase_item_ids:
# Логируем для отладки
logger.info(f'POS Checkout: попытка продать showcase_item_ids={showcase_item_ids}')
# Проверяем что все экземпляры заблокированы на текущего пользователя
showcase_items = list(ShowcaseItem.objects.filter(
id__in=showcase_item_ids
id__in=showcase_item_ids,
status='in_cart',
locked_by_user=request.user
))
logger.info(f'POS Checkout: найдено {len(showcase_items)} заблокированных экземпляров из {len(showcase_item_ids)} запрошенных')
if len(showcase_items) != len(showcase_item_ids):
# Не все экземпляры доступны
missing_ids = set(showcase_item_ids) - set(item.id for item in showcase_items)
logger.warning(f'POS Checkout: недоступные showcase_item_ids={missing_ids}')
raise ValidationError(
f'Некоторые экземпляры букета уже не заблокированы на вас. '
f'Обновите страницу и попробуйте снова.'
)
if showcase_items:
result = ShowcaseManager.sell_showcase_items(showcase_items, order_item)