- inventory/views/showcase.py: фильтр .exclude(status='reserved')
* Витринные букеты со статусом 'reserved' не отображаются в POS
* Защита от конфликтов: один букет - один заказ
- pos/views.py: фильтр .exclude(showcase_items__status='reserved')
* Showcase комплекты без доступных букетов скрыты в POS
* Фильтрация на уровне queryset для производительности
- Консистентная видимость витрины для всех кассиров
Проблема: при создании тенанта автоматически создаются дефолтные
Склад и Витрина. Если пользователь удалит их, система может сломаться:
POS, создание заказов и резервирование перестанут работать.
Решение: реализована строгая валидация + мягкое удаление для витрин.
Изменения в inventory/views/warehouse.py:
- Добавлена валидация перед деактивацией склада:
* Блокировка деактивации последнего активного склада
* Проверка ненулевых остатков товаров
* Проверка активных резервов
* Предупреждение при деактивации дефолтного склада
Изменения в inventory/views/showcase.py:
- ShowcaseListView: по умолчанию показывает только активные витрины
- ShowcaseDeleteView: изменена логика с жесткого на мягкое удаление
- Добавлена валидация перед деактивацией витрины:
* Блокировка деактивации последней активной витрины склада
* Проверка активных резервов
* Проверка физических экземпляров комплектов (ShowcaseItem)
* Предупреждение при деактивации дефолтной витрины
Изменения в inventory/forms_showcase.py:
- Проверка уникальности названия витрины учитывает только активные
Изменения в inventory/admin.py:
- ShowcaseAdmin: добавлены методы delete_model() и delete_queryset()
для блокировки удаления последней витрины через админку
- WarehouseAdmin: добавлены методы delete_model() и delete_queryset()
для блокировки удаления последнего склада через админку
Преимущества:
✅ Система не сломается - всегда есть хотя бы один активный склад/витрина
✅ Данные в безопасности - мягкое удаление для обеих сущностей
✅ Понятные сообщения об ошибках для пользователя
✅ Защита работает как в UI, так и в Django Admin
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add is_default field to Showcase model with unique constraint per warehouse
- Implement Showcase.save() to ensure only one default per warehouse
- Add SetDefaultShowcaseView for AJAX-based default selection
- Update ShowcaseForm to include is_default checkbox
- Add interactive checkbox UI in showcase list with AJAX functionality
- Update POS API to return showcase.is_default instead of warehouse.is_default
- Update terminal.js to auto-select showcase based on its is_default flag
- Add migration for is_default field
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented complete web interface for managing showcases (display areas for ready-made bouquets) with:
**Backend:**
- ShowcaseForm with validation (unique name per warehouse)
- ShowcaseListView with filtering by warehouse and status
- ShowcaseCreateView, ShowcaseUpdateView with success messages
- ShowcaseDeleteView with active reservation validation
- URL routes: list, create, edit, delete
**Frontend:**
- List page with warehouse grouping, active reservations count
- Responsive table with filters (warehouse, status)
- Create/edit form with Bootstrap styling
- Delete confirmation with active reservations check
- Breadcrumb navigation
**Features:**
✅ One warehouse can have multiple showcases (ForeignKey relationship)
✅ Unique showcase names within each warehouse
✅ Display active reservation counts for each showcase
✅ Prevent deletion if showcase has active reservations
✅ Auto-select default warehouse when creating showcase
✅ Navigation link added to main navbar between "Касса" and "Склад"
✅ Active state highlighting in navigation
**Files created:**
- inventory/forms_showcase.py (ShowcaseForm)
- inventory/views/showcase.py (4 CBV views)
- inventory/templates/inventory/showcase/ (list, form, delete templates)
**Files modified:**
- inventory/urls.py (added showcase routes)
- inventory/forms.py (added Showcase import)
- templates/navbar.html (added "Витрины" link)
URL structure:
/inventory/showcases/ - list
/inventory/showcases/create/ - create
/inventory/showcases/<id>/edit/ - edit
/inventory/showcases/<id>/delete/ - delete
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>