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 элементы для полей:
название, описание, категории, теги и цена со скидкой
- Добавлена валидация и стилизация для каждого поля
- Улучшена структура и читаемость кода шаблона
Добавлена возможность выбора режима "Без адреса (заполнить позже)"
при создании заказа, что позволяет пользователям пропустить шаг
указания адреса доставки на этапе оформления
При нажатии "Пересчитать по актуальным ценам" чекбокс "Установить свою цену (приоритет)"
оставался включенным, из-за чего финальная цена не обновлялась.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Добавлено поле KitItem.unit_price для хранения зафиксированной цены
- Витринные комплекты больше не обновляются при изменении цен товаров
- Добавлен красный индикатор на карточке если цена неактуальна
- Добавлен warning в модалке редактирования с кнопкой "Актуализировать"
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Добавить display_name в CustomUser (name или email)
- Исправить get_showcase_kits_api: заменить username на display_name
- Использовать Case/When с output_field для выбора имени на уровне БД
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>