При изменении цены товара в корзине через модалку, витринный комплект
теперь сохраняется с правильной ценой, а не с ценой из каталога:
- 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>
- Пересчитывать цену в базовые единицы: price * conversion_factor
- Вычислять скидку как разницу между subtotal и total_amount
- Распределять скидку пропорционально долям позиций
- Использовать refresh_from_db() для актуального total_amount
Пример: 20 ед. (коэфф. 5) по 7₽ со скидкой 10% → Sale: 4 шт. по 31.5₽
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Расширяем логику расчёта цены продажи для учёта как скидок на отдельные позиции,
так и скидок на весь заказ. Скидка на заказ распределяется пропорционально доле
каждой позиции в общей сумме заказа.
Изменения внесены в SaleProcessor и сигнал создания продажи при завершении заказа.
Внесены изменения в SaleProcessor и сигнал создания продажи для корректного
расчёта цены с учётом скидки на товар. Теперь при наличии discount_amount
производится пересчёт цены за единицу товара с учётом скидки перед
конвертацией в базовые единицы измерения.
Это исправляет ошибку, при которой скидка не учитывалась в итоговой цене продажи.
- Добавлена реализация метода test_connection() с обработкой различных HTTP статусов
- Реализованы вспомогательные методы _get_api_url() и _get_auth() для работы с API
- Добавлена интеграция WooCommerceService в get_integration_service()
- Настроены поля формы для WooCommerceIntegration в get_form_fields_meta()
fix(inventory): исправить расчет цены продажи в базовых единицах
- Исправлен расчет sale_price в SaleProcessor с учетом conversion_factor_snapshot
- Обновлен расчет цены в сигнале create_sale_on_order_completion для корректной работы с sales_unit
Заменён floatformat на format_decimal в полях input type="number",
чтобы числа всегда использовали точку как десятичный разделитель,
независимо от локали. Это исправляет ошибки парсинга в браузере.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Обновлена логика отображения значений полей в шаблоне discount_form.html
- Теперь корректно обрабатываются значения как для новых, так и для существующих записей
- Устранены проблемы с отображением значений по умолчанию и выбранных опций
- Добавлена проверка на наличие instance.pk для определения режима редактирования
Заменить условный рендеринг {% if %} на фильтр |default:'' для
числовых полей, чтобы значения корректно отображались при
редактировании существующей скидки.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Заменены стандартные формы Django на кастомные HTML элементы для полей:
название, описание, категории, теги и цена со скидкой
- Добавлена валидация и стилизация для каждого поля
- Улучшена структура и читаемость кода шаблона