- Исправлена логика установки useSalePrice при загрузке данных комплекта
- Исправлено сохранение sale_price при снятии чекбокса 'Установить свою цену'
- Исправлено сохранение измененных цен товаров в составе комплекта (unit_price)
- Добавлен блок предупреждения о неактуальных ценах с функцией пересчета
- Улучшена логика агрегации товаров при сохранении комплекта
Добавлено ограничение на уровне базы данных и валидация форм для обеспечения,
что у товара может быть только одна единица продажи с флагом "по умолчанию".
Переработан интерфейс маркетинговых флагов и единиц продажи для улучшения UX.
Основные изменения:
- Добавлен UniqueConstraint в модель ProductSalesUnit для валидации на уровне БД
- Создан BaseProductSalesUnitFormSet с кастомной валидацией формы
- Обновлен метод save() для корректной обработки новых и существующих записей
- Добавлена транзакционная обертка в представлениях ProductCreateView и ProductUpdateView
- Переработан блок маркетинговых флагов с карточным дизайном и интерактивными переключателями
- Переработан блок единиц продажи в табличный вид с улучшенным UX
- Добавлена клиентская логика для взаимного исключения чекбоксов "По умолчанию
Добавлен `modal-dialog-scrollable` для корректной прокрутки содержимого модального окна.
Реализован flex-контейнер с фиксированным хедером и футером, контент прокручивается в середине.
Убран жесткий `max-height` у списка единиц продажи, теперь высота адаптируется автоматически.
Футер закреплен внизу с `position: sticky` для постоянной видимости кнопок действий.
- добавлена кнопка редактирования комплектов с индикатором устаревшей цены
- реализовано редактирование цен товаров в комплекте через inline-поля ввода
- добавлена автовыбор витрины по умолчанию при создании комплекта
- улучшена генерация названия комплекта по умолчанию
- исправлены поля API для совместимости с сервером (kit_name, qty, name)
- добавлен глобальный доступ к showcaseManager из terminal.js
- При поиске из режима "Витрина" показываются товары И витринные комплекты
- При поиске из других категорий - только обычные товары и комплекты
- При очистке поиска возвращается к предыдущему режиму (витрина или категория)
- Добавлена визуальная индикация глобального поиска (подсветка "Все товары")
Изменения:
- terminal.js: добавлена переменная wasShowcaseViewBeforeSearch,
обновлены renderProducts(), обработчики поиска
- views.py: get_items_api() игнорирует category_id при search_query
- При поиске (3+ символа) ищет по всем товарам и комплектам, игнорируя выбранную категорию
- Даже в режиме "Витрина" поиск переключается на глобальный по всем товарам
- Добавлена визуальная индикация: кнопка "Все товары" подсвечивается при активном поиске
- При очистке поиска возвращается к товарам выбранной категории или витрине
Изменения:
- terminal.js: loadItems(), renderProducts(), updateSearchIndicator(), обработчики поиска
- views.py: get_items_api() - игнорирование category_id при search_query
- При поиске (3+ символа) ищет по всем товарам и комплектам, игнорируя выбранную категорию
- Добавлена визуальная индикация: кнопка "Все товары" подсвечивается при активном поиске
- При очистке поиска возвращается к товарам выбранной категории
- Витринные комплекты не участвуют в глобальном поиске
Изменения:
- terminal.js: loadItems(), updateSearchIndicator(), обработчики поиска
- views.py: get_items_api() - игнорирование category_id при search_query
- Updated order creation and update logic to allow saving orders without a delivery address or date, regardless of order status.
- Removed strict validation for delivery fields in the Delivery model, enabling more flexible order handling.
- Adjusted order form to reflect changes in required fields for delivery information.
- Updated price aggregation logic in update_product_kit to include unit prices.
- Improved terminal.js to allow inline editing of product prices in the kit.
- Added parsePrice function for consistent price parsing across the application.
- Ensured that the correct price is saved when creating or updating product kits.
При изменении цены товара в корзине через модалку, витринный комплект
теперь сохраняется с правильной ценой, а не с ценой из каталога:
- terminal.js: передача unit_price при создании витринного комплекта
- views.py: обработка и сохранение unit_price из корзины в KitItem
- kits.py: использование item.unit_price в ProductKit.save() при расчёте base_price
- Добавить двойной клик по товару в поисковике для быстрого добавления
- Добавить автофокус и селект на поле ввода количества при добавлении товара в инвентарь
- Вынести логику поиска товара по ID в отдельный метод _findProductById для переиспользования
- Collapse incoming document info by default with toggle animation
- Add inline cost price editing in incoming document items
- Make product search picker more compact (smaller inputs, reduced padding)
- Display new inventory lines at the top of the table
- Update product search picker styling for better visual hierarchy
- Wrap inventory information table in Bootstrap collapse component
- Add toggle button with chevron icon indicating collapse state
- Implement JavaScript to animate chevron icon on collapse/expand
- Set inventory information to be collapsed by default for cleaner UI
This change improves the user interface by reducing clutter on the inventory detail page, allowing users to focus on the most important information first and expand additional details as needed.
Add toast notification functionality using Bootstrap Toasts and update
checkout success/error handling to use toast messages instead of alert boxes.
**Changes:**
- Add `showToast` function to `terminal.js`
- Add toast container and templates to `terminal.html`
- Replace alert() calls in handleCheckoutSubmit with showToast()
Remove custom delete() and hard_delete() methods that referenced
non-existent is_deleted/deleted_at fields. ProductKit now uses
the correct implementation from BaseProductEntity which uses
status='discontinued' for soft delete.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
For showcase kits (showcase_kit type), the quantity field is now disabled
in the cart item edit modal since these are pre-assembled physical items
with reservations. Price editing remains available.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add support for writing off showcase kits by creating a write-off document with components, converting reservations, and updating statuses.
- Add `write_off_from_showcase` static method to ShowcaseManager
- Add API endpoint `/pos/api/product-kits/<int:kit_id>/write-off/`
- Add write-off button to POS terminal UI
- Implement confirmation dialog with detailed information
- Add redirect to write-off document detail page after success
The write-off process includes:
1. Creating a write-off document in draft state
2. Converting existing reservations to write-off document items
3. Marking the showcase item as dismantled
4. Setting the product kit status to discontinued (if not already)
Breaking Changes: No
Replace datetime-based naming with simple "Витринный букет XXX" format,
where XXX is a random 3-digit number (100-999). Date is now handled by
the separate showcase_created_at field.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add showcase_created_at field to ProductKit model
- Display days ago as badge in product card (0 дней, 1 день, etc.)
- Add date input field in edit modal
- Auto-set current date/time for new showcase kits
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed 'products:kit-detail' to 'products:productkit-detail' in category_list.html
to fix NoReverseMatch error when rendering category tree with kits.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add type check for request.user being CustomUser instance before setting order.modified_by field
in order_create and order_update views to prevent errors when user is not a CustomUser (e.g., admin user)
- Remove hardcoded OPENROUTER_MODEL_CHOICES from openrouter.py
- Add API endpoint /integrations/openrouter/models/ to fetch models dynamically
- Models loaded from OpenRouter API with free models (':free') at top
- Update OpenRouterIntegration model_name field (remove choices, blank=True)
- Add async buildForm() with dynamic_choices support
- Show asterisks (********) for saved API keys with helpful placeholder
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Filter names by word count (2, 3, 4 words) for balanced distribution
- Remove duplicates per word count category
- Merge names in 2:3:4 proportion to ensure equal representation
- Update normalization to lowercase all words except first letter of first word
- Replace simple deduplication with structured balancing logic
- Изменить требование к количеству слов на равную пропорцию 2, 3 или 4 слов
- Добавить новые требования к качеству названий
- Добавить примеры хороших названий для лучшего понимания
- Улучшить структуру и читаемость запроса к AI-сервису
- Добавлена функциональность для кнопок 'ВЗЯТЬ' и 'УДАЛИТЬ'
- Реализовано получение и удаление названий из базы данных
- Исправлена фильтрация названий
- Исправлена проблема с обработчиками событий
Добавлена возможность загружать фотографии комплекта по прямой ссылке
на формах создания и редактирования. JavaScript скачивает изображение
и добавляет его как файл в форму для отправки на сервер.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Добавить объявление salesUnitSelect в calculateFinalPrice
- Добавить обновление Select2 после загрузки единиц продажи
- Добавить вызов updateSalesUnitsOptions при выборе товара
- Получать цену единицы продажи из DOM option элемента
- Исправить опечатку в заголовке списка товаров
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Добавлен новый булевый фильтр "show_all_orders" в OrderFilter, позволяющий отображать все заказы, включая завершённые и отменённые. Обновлён шаблон order_list.html с добавлением тумблера для автоматической отправки формы при переключении фильтра. Фильтр по умолчанию показывает только активные заказы.
- Добавлен столбец "Текущая цена продажи" в таблицу позиций документа поступления
- Цена продажи отображается с учётом скидок и возможностью inline-редактирования для владельца и менеджера
- Реализовано inline-редактирование количества при клике на значение
- Добавлены стили для интерактивных элементов
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Добавлены поля original_sales_unit и conversion_factor в KitItemSnapshot для хранения
единиц продажи и коэффициентов конверсии на момент создания снимка. Обновлена логика
резервирования запасов для корректного расчета количества в базовых единицах.
Изменения в шаблоне редактирования комплектов для сохранения выбранных единиц продажи
при обновлении списка опций.
BREAKING CHANGE: Изменена структура данных в KitItemSnapshot, требуется миграция базы данных.
Добавлен механизм skip_sale_creation на базе thread-local storage
для управления моментом создания Sale через сигнал.
Проблема: сигнал create_sale_on_order_completion срабатывал при
Order.objects.create(status=completed) до применения скидок.
Решение: пропускать сигнал во время создания заказа, затем явно
создавать Sale после применения всех скидок через order.save().
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>