Andrey Smakotin
33e33ecbac
Добавлена система Soft Lock для витринных комплектов в POS-терминале
Реализована элегантная блокировка витринных букетов при добавлении в корзину,
предотвращающая многократную продажу одного физического комплекта.
## Изменения в БД:
- Добавлены поля в Reservation: cart_lock_expires_at, locked_by_user, cart_session_id
- Созданы индексы для оптимизации запросов блокировок
- Миграция 0006: добавление полей Soft Lock
## Backend (pos/views.py):
- add_showcase_kit_to_cart: создание блокировки на 30 минут с проверкой конфликтов
- remove_showcase_kit_from_cart: снятие блокировки при удалении из корзины
- get_showcase_kits_api: возврат статусов блокировок (is_locked, locked_by_me)
## Frontend (terminal.js):
- addToCart: AJAX запрос для создания блокировки, запрет qty > 1
- removeFromCart: автоматическое снятие блокировки
- renderCart: желтый фон, badge "1 шт (витрина)", скрыты кнопки +/−
- UI индикация: зеленый badge "В корзине" (свой), красный "Занят" (чужой)
## Автоматизация (inventory/tasks.py):
- cleanup_expired_cart_locks: Celery periodic task (каждые 5 минут)
- Автоматическое освобождение истекших блокировок (30 минут timeout)
- Логирование очистки для мониторинга
## Маршруты (pos/urls.py):
- POST /api/showcase-kits/<id>/add-to-cart/ - создание блокировки
- POST /api/showcase-kits/<id>/remove-from-cart/ - снятие блокировки
## Документация:
- ЗАПУСК.md: инструкция по запуску Celery Beat
Преимущества:
✓ Предотвращает конфликты между кассирами
✓ Автоматическое освобождение при таймауте
✓ Понятный UX с визуальной индикацией
✓ Совместимость с существующей логикой резервирования
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 23:45:34 +03:00
..
2025-11-15 15:30:23 +03:00
2025-11-20 00:07:38 +03:00
2025-11-20 23:45:34 +03:00
2025-11-20 23:45:34 +03:00
2025-11-19 00:53:16 +03:00
2025-11-20 23:45:34 +03:00
2025-11-20 23:03:47 +03:00
2025-11-15 11:11:08 +03:00
2025-11-20 10:52:53 +03:00
2025-11-20 00:07:38 +03:00
2025-11-02 19:04:03 +03:00
2025-11-15 11:31:28 +03:00
2025-10-27 18:20:26 +03:00
2025-10-27 18:20:26 +03:00
2025-11-08 00:04:55 +03:00
2025-11-08 11:08:23 +03:00
2025-11-02 19:04:03 +03:00
2025-11-07 23:49:06 +03:00
2025-10-27 19:13:10 +03:00
2025-11-08 00:04:55 +03:00
2025-10-22 01:11:06 +03:00
2025-10-27 19:13:10 +03:00
2025-11-08 11:08:23 +03:00
2025-11-15 11:11:08 +03:00
2025-11-07 23:49:06 +03:00
2025-11-08 00:04:55 +03:00
2025-11-02 19:04:03 +03:00
2025-10-27 19:13:10 +03:00
2025-10-27 19:13:10 +03:00
2025-10-27 18:20:26 +03:00
2025-10-27 19:13:10 +03:00
2025-11-18 21:29:14 +03:00
2025-11-18 20:54:14 +03:00
2025-11-18 20:54:14 +03:00
2025-11-07 20:18:09 +03:00
2025-11-18 21:29:14 +03:00
2025-11-02 19:04:03 +03:00
2025-11-18 20:54:14 +03:00
2025-11-18 20:54:14 +03:00
2025-11-02 19:04:03 +03:00