Commit Graph

836 Commits

Author SHA1 Message Date
9a7c0728f0 feat(ui): improve product search and inventory interaction
- Добавить двойной клик по товару в поисковике для быстрого добавления
- Добавить автофокус и селект на поле ввода количества при добавлении товара в инвентарь
- Вынести логику поиска товара по ID в отдельный метод _findProductById для переиспользования
2026-01-26 23:40:27 +03:00
67ad0e50ee feat(ui): improve product search and document info section UI
- 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
2026-01-26 22:58:20 +03:00
32bc0d2c39 feat(ui): add collapsible section for inventory information with toggle animation
- 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.
2026-01-26 21:00:57 +03:00
f140469a56 feat: Add initial views for the orders application. 2026-01-26 19:59:23 +03:00
d947f4eee7 style(ui): increase toast notification delay from 3 to 5 seconds 2026-01-26 18:39:07 +03:00
5700314b10 feat(ui): replace alert notifications with toast messages
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()
2026-01-26 17:44:03 +03:00
b24a0d9f21 feat: Add UI for inventory transfer list and detail views. 2026-01-25 16:44:54 +03:00
034be20a5a feat: add showcase manager service 2026-01-25 15:28:41 +03:00
f75e861bb8 feat: Add new inventory and POS components, including a script to reproduce a POS checkout sale price bug. 2026-01-25 15:26:57 +03:00
5a66d492c8 feat: Add product kit views. 2026-01-25 00:52:03 +03:00
6cd0a945de feat: Add product kit creation view and its corresponding template. 2026-01-25 00:50:38 +03:00
41e6c33683 feat: Add Product Kit creation and editing functionality with new views and templates. 2026-01-25 00:09:45 +03:00
bf399996b8 fix(products): remove obsolete delete methods from ProductKit
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>
2026-01-24 21:52:32 +03:00
2bc70968c3 fix(pos): restrict quantity editing for showcase kits in cart edit modal
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>
2026-01-24 14:49:02 +03:00
38fbf36731 feat(pos): add write-off functionality for showcase kits
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
2026-01-24 03:21:56 +03:00
9c91a99189 refactor(pos): simplify showcase kit default name
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>
2026-01-24 01:54:58 +03:00
1eec8b1cd5 chore(pos): remove debug logs from showcase date feature
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 01:44:56 +03:00
977ee91fee feat(pos): add editable showcase creation date for kits
- 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>
2026-01-24 01:37:27 +03:00
fce8d9eb6e fix(products): correct kit-update URL to productkit-update in category list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 00:00:46 +03:00
5070913346 fix(products): correct URL name for kit detail in category list template
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>
2026-01-23 23:53:49 +03:00
87f6484258 fix(products): update kit price calculation to use actual_price instead of get_sale_price() 2026-01-23 23:51:09 +03:00
14c1a4f804 chore(config): enable debug mode in Django settings 2026-01-23 23:48:23 +03:00
adbbd7539b fix(orders): ensure modified_by field is set correctly for CustomUser instances
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)
2026-01-23 23:28:49 +03:00
5ec5ee48d4 feat(integrations): add dynamic OpenRouter model loading
- 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>
2026-01-23 18:16:12 +03:00
3aac83474b refactor(ai): improve bouquet name balancing and normalization
- 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
2026-01-23 17:44:02 +03:00
4a624d5fef feat(ai): улучшить требования к генерации названий букетов
- Изменить требование к количеству слов на равную пропорцию 2, 3 или 4 слов
- Добавить новые требования к качеству названий
- Добавить примеры хороших названий для лучшего понимания
- Улучшить структуру и читаемость запроса к AI-сервису
2026-01-23 15:25:25 +03:00
9ddf54f398 refactor(ai): улучшить архитектуру генератора названий букетов
- Добавить константы для параметров генерации
- Улучшить валидацию входных параметров
- Оптимизировать выбор AI-сервиса
- Реализовать нормализацию регистра названий
- Добавить обработку ошибок при сохранении в базу данных
- Улучшить логику фильтрации нежелательных префиксов
- Рефакторить метод generate_and_store для лучшей читаемости
2026-01-23 15:18:51 +03:00
84cfc5cd47 Улучшение генератора названий для букетов
- Добавлена функциональность для кнопок 'ВЗЯТЬ' и 'УДАЛИТЬ'
- Реализовано получение и удаление названий из базы данных
- Исправлена фильтрация названий
- Исправлена проблема с обработчиками событий
2026-01-23 14:10:00 +03:00
59f7a7c520 feat: add OpenRouter AI service integration 2026-01-22 22:11:39 +03:00
22e300394b Исправление ошибки POS: разрешено добавление в корзину для PlatformAdmin (использование session_id вместо пользователя). Включены изменения по AI названиям букетов. 2026-01-22 20:29:05 +03:00
01873be15d feat(products): добавить генератор названий букетов с ai и тесты
- Добавить модуль ai с генератором названий букетов
- Обновить __init__.py для экспорта нового сервиса
- Добавить тесты для проверки работы генератора
2026-01-22 12:12:57 +03:00
036b9d1634 feat(products): добавить загрузку изображений по URL для комплектов
Добавлена возможность загружать фотографии комплекта по прямой ссылке
на формах создания и редактирования. JavaScript скачивает изображение
и добавляет его как файл в форму для отправки на сервер.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:24:42 +03:00
391d48640b fix(products): исправить калькулятор цены и выбор единицы продажи при создании комплекта
- Добавить объявление salesUnitSelect в calculateFinalPrice
- Добавить обновление Select2 после загрузки единиц продажи
- Добавить вызов updateSalesUnitsOptions при выборе товара
- Получать цену единицы продажи из DOM option элемента
- Исправить опечатку в заголовке списка товаров

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 22:45:36 +03:00
07a9de040f feat(orders): добавить фильтр для показа завершённых заказов
Добавлен новый булевый фильтр "show_all_orders" в OrderFilter, позволяющий отображать все заказы, включая завершённые и отменённые. Обновлён шаблон order_list.html с добавлением тумблера для автоматической отправки формы при переключении фильтра. Фильтр по умолчанию показывает только активные заказы.
2026-01-21 21:16:58 +03:00
622c544182 feat(inventory): добавить столбец текущей цены продажи и inline-редактирование количества
- Добавлен столбец "Текущая цена продажи" в таблицу позиций документа поступления
- Цена продажи отображается с учётом скидок и возможностью inline-редактирования для владельца и менеджера
- Реализовано inline-редактирование количества при клике на значение
- Добавлены стили для интерактивных элементов

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 19:54:35 +03:00
ffc5f4cfc1 feat(inventory): учитывать коэффициент конверсии при резервировании компонентов комплектов
Добавлены поля original_sales_unit и conversion_factor в KitItemSnapshot для хранения
единиц продажи и коэффициентов конверсии на момент создания снимка. Обновлена логика
резервирования запасов для корректного расчета количества в базовых единицах.

Изменения в шаблоне редактирования комплектов для сохранения выбранных единиц продажи
при обновлении списка опций.

BREAKING CHANGE: Изменена структура данных в KitItemSnapshot, требуется миграция базы данных.
2026-01-21 11:05:00 +03:00
e138a28475 Исправление ошибок в редактировании комплектов: валидация, верстка, расчет цены 2026-01-21 10:16:37 +03:00
2dc36b3d01 fix(inventory): создавать Sale после применения скидок в POS checkout
Добавлен механизм 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>
2026-01-21 01:05:22 +03:00
1e4b7598ae refactor(tests): удалить проверку истории переходов в test_order_status_transitions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 00:38:42 +03:00
2620eea779 feat(products): сделать base_unit nullable для товаров
Разрешить создание товаров без базовой единицы измерения.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 00:37:11 +03:00
1071f3cacc fix(inventory): учитывать скидки при расчёте цены продажи с единицами измерения
- Пересчитывать цену в базовые единицы: 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>
2026-01-21 00:35:43 +03:00
6b327fa7e0 fix(inventory): учитывать скидки на позицию и заказ при расчёте цены продажи
Расширяем логику расчёта цены продажи для учёта как скидок на отдельные позиции,
так и скидок на весь заказ. Скидка на заказ распределяется пропорционально доле
каждой позиции в общей сумме заказа.

Изменения внесены в SaleProcessor и сигнал создания продажи при завершении заказа.
2026-01-20 23:40:27 +03:00
0938878e67 fix(inventory): учитывать скидку при расчёте цены продажи
Внесены изменения в SaleProcessor и сигнал создания продажи для корректного
расчёта цены с учётом скидки на товар. Теперь при наличии discount_amount
производится пересчёт цены за единицу товара с учётом скидки перед
конвертацией в базовые единицы измерения.

Это исправляет ошибку, при которой скидка не учитывалась в итоговой цене продажи.
2026-01-20 23:20:55 +03:00
9cd3796527 feat(woocommerce): реализовать проверку соединения с WooCommerce API
- Добавлена реализация метода 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
2026-01-20 23:05:18 +03:00
271ac66098 fix(forms): использовать format_decimal для input type=number
Заменён floatformat на format_decimal в полях input type="number",
чтобы числа всегда использовали точку как десятичный разделитель,
независимо от локали. Это исправляет ошибки парсинга в браузере.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 01:20:50 +03:00
0b5db0c2e6 fix(discounts): исправить предзаполнение полей формы скидки при редактировании
- Обновлена логика отображения значений полей в шаблоне discount_form.html
- Теперь корректно обрабатываются значения как для новых, так и для существующих записей
- Устранены проблемы с отображением значений по умолчанию и выбранных опций
- Добавлена проверка на наличие instance.pk для определения режима редактирования
2026-01-20 00:54:38 +03:00
4b384ef359 fix(kits): не допускать отрицательного количества комплектов
Добавить проверку min_available <= 0 и возвращать 0 в таких случаях,
вместо того чтобы возвращать отрицательное значение после int().
2026-01-19 23:35:09 +03:00
d76fd2e7b2 fix(discounts): исправить предзаполнение полей при редактировании
Заменить условный рендеринг {% if %} на фильтр |default:'' для
числовых полей, чтобы значения корректно отображались при
редактировании существующей скидки.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:31:43 +03:00
0b35b80ee7 refactor(ui): заменить стандартные формы на кастомные html элементы
- Заменены стандартные формы Django на кастомные HTML элементы для полей:
  название, описание, категории, теги и цена со скидкой
- Добавлена валидация и стилизация для каждого поля
- Улучшена структура и читаемость кода шаблона
2026-01-19 23:19:14 +03:00
229fb18440 fix(orders): разрешить создание заказа без адреса
Добавлена возможность выбора режима "Без адреса (заполнить позже)"
при создании заказа, что позволяет пользователям пропустить шаг
указания адреса доставки на этапе оформления
2026-01-19 23:04:08 +03:00