Commit Graph

144 Commits

Author SHA1 Message Date
edad388ea8 feat(orders): добавить WYSIWYG редактор для резюме заказа
Интеграция библиотеки Quill.js для форматирования текста в поле
резюме заказа. Добавлено отображение резюме в списке заказов с
возможностью раскрытия длинного текста. Обновлен вид резюме
в детальной странице заказа для поддержки HTML-разметки.
2026-01-16 18:46:04 +03:00
14188fbac4 feat(orders): добавить поле резюме заказа
Добавлено текстовое поле `summary` в модель `Order` для хранения краткого
описания заказа на естественном языке.

Обновлена форма `OrderForm` с добавлением виджета textarea, плейсхолдера и
стилей. В шаблоны `order_form.html` и `order_detail.html` добавлены элементы
для ввода и отображения резюме заказа. Создана соответствующая миграция.
2026-01-15 18:39:05 +03:00
2ef537fff6 Добавлена возможность выбора анонимного системного клиента в форме заказа
- Убрана фильтрация системного клиента из результатов поиска (api_search_customers)
- Добавлен флаг is_system_customer в результаты API поиска
- Создан новый API endpoint api_get_system_customer для быстрого получения системного клиента
- Добавлена кнопка 'Аноним' для быстрого выбора системного клиента
- Системный клиент выделяется жёлтым цветом и иконкой инкогнито в выпадающем списке
- Улучшена компактность результатов поиска (уменьшен шрифт до 13px)
- Изменены пропорции полей: клиент 9 колонок, статус 3 колонки (было 6:6)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 12:54:56 +03:00
2369cfc997 feat(ui): улучшения UX для промокодов и форм заказа
- Добавлена кнопка копирования промокода в клипборд с визуальной обратной связью
- Улучшено отображение ошибок валидации в форме заказа (is-invalid класс)
- Добавлен флаг _draftFieldsFilled для корректной обработки пустого черновика
- Убран value="1" для quantity чтобы избежать конфликтов с draft-data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-11 19:07:19 +03:00
4ea01b8269 fix(inventory, orders, pos): удалена зависимость от django-simple-history для tenant-моделей
- Добавлен pre_save сигнал для Order вместо django-simple-history
- Переписаны все функции signals.py без использования instance.history
- Заменены .username на .name|default:.email для CustomUser в шаблонах
- Исправлен CSRF-токен в POS для работы с CSRF_USE_SESSIONS=True

Теперь создание заказов работает корректно в мультитенантной архитектуре.
2026-01-10 17:21:00 +03:00
2aba3d2404 Улучшения в тестах переходов статусов заказов
- Исправлены комментарии и форматирование в signals.py
- Улучшена читаемость кода в models.py
- Обновлены шаблоны форм статусов
- Доработаны тесты переходов статусов
2026-01-05 21:30:25 +03:00
d148df2149 Добавлена поддержка флага is_from_showcase в форму заказа
- orders/forms.py: добавлено поле is_from_showcase в OrderItemForm
  * HiddenInput widget
  * Устанавливается через JavaScript для showcase_kit
- orders/templates/orders/order_form.html: JavaScript логика
  * Автоматическое определение showcase_kit при загрузке черновика
  * Установка is_from_showcase=true для витринных комплектов
  * Консольное логирование для отладки
- Флаг используется backend для вызова reserve_for_order()
2026-01-05 01:38:44 +03:00
d87e6a4e65 Финальная очистка кода order_form.html 2026-01-02 19:48:02 +03:00
00224ba5e6 Удалены избыточные логи из order_form.html
- Убраны детальные console.log при загрузке товаров из черновика

- Оставлены только критичные логи ошибок

- Код стал чище и компактнее
2026-01-02 19:11:21 +03:00
676cfad401 Исправлено отображение единиц продажи при открытии отложенного заказа
- Добавлена функция loadAndDisplaySalesUnitsFromHidden для загрузки UI единиц продажи из черновика

- При загрузке товара из черновика теперь автоматически отображается и устанавливается сохранённая единица продажи

- Теперь при открытии отложенного заказа с 0.3 кг корректно отображается килограмм, а не базовая единица
2026-01-02 18:41:16 +03:00
2995710a3e Исправлена передача единиц продажи при создании отложенного заказа из POS
- В terminal.js добавлена передача sales_unit_id в данные черновика заказа

- В order_form.html добавлено заполнение поля sales_unit при предзаполнении из черновика

- Теперь при создании отложенного заказа с товаром в единицах продажи сохраняется корректная единица измерения
2026-01-02 18:33:51 +03:00
e831c4fb6e feat(products): реализована система единиц продажи на фронтенде
Добавлена полноценная интеграция единиц измерения (UoM) для продажи
товаров в разных единицах с автоматическим пересчётом цен и остатков.

## Основные изменения:

### Backend
- Расширен API поиска товаров (api_views.py): добавлена сериализация sales_units
- Создан новый endpoint get_product_sales_units_api для загрузки единиц с остатками
- Добавлено поле sales_unit в OrderItemForm и SaleForm с валидацией
- Созданы CRUD views для управления единицами продажи (uom_views.py)
- Обновлена ProductForm: использует base_unit вместо устаревшего unit

### Frontend
- Создан модуль sales-units.js с функциями для работы с единицами
- Интегрирован в select2-product-search.js: автозагрузка единиц при выборе товара
- Добавлены контейнеры для единиц в order_form.html и sale_form.html
- Реализовано автоматическое обновление цены при смене единицы продажи
- При выборе базовой единицы цена возвращается к базовой цене товара

### UI
- Добавлены страницы управления единицами продажи в навбар
- Созданы шаблоны: sales_unit_list.html, sales_unit_form.html, sales_unit_delete.html
- Добавлены фильтры по товару, единице, активности и дефолтности

## Исправленные ошибки:
- Порядок инициализации: обработчики устанавливаются ДО триггера события change
- Цена корректно обновляется при выборе единицы продажи
- При выборе "Базовая единица" возвращается базовая цена товара

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-02 12:35:01 +03:00
54f362eb23 Добавлено управление выбором даты через календарь в компонент фильтрации по диапазону дат 2025-12-29 01:36:39 +03:00
d66ea020f6 Добавлено подключение обработчиков для кнопок "Сегодня", "Завтра" и "Сбросить" в компоненте фильтрации по датам 2025-12-29 01:31:14 +03:00
1f8fd54c10 Добавлена проверка на транзакции кошелька при удалении заказа
Удаление заказа теперь блокируется если есть связанные
WalletTransaction (on_delete=PROTECT).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 00:37:27 +03:00
07829f867b Защита удаления заказов и улучшение интерфейса клиентов
Orders:
- Удаление разрешено только для черновиков (draft)
- Запрет удаления заказов с оплатой (amount_paid > 0)
- Кнопка "Удалить" скрыта для недопустимых заказов

Customers:
- Inline-редактирование полей клиента
- Улучшен дизайн карточки клиента
- Добавлена история заказов и кошелька

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 23:59:57 +03:00
56850e790e feat(orders): добавить отображение статуса возврата, изменяющего, автосохранения и требований к фото в шаблоне order_detail
Добавлены условные блоки для отображения:
- значка "Возвращен" при возврате заказа
- информации об изменяющем заказ пользователе
- времени последнего автосохранения для черновиков
- требований к фотографиям товара и вручения

Это улучшает детализацию страницы заказа, соответствуя новым полям модели Order.
2025-12-25 16:22:49 +03:00
642b9551de Добавлены поля needs_product_photo и needs_delivery_photo в модель Order с toggle switches в форме 2025-12-25 12:26:09 +03:00
2f8a421e64 Улучшение модели Recipient: PhoneNumberField и поле notes
- Заменено поле phone с CharField на PhoneNumberField для автоматической нормализации телефонов
- Убран регион BY, установлен region=None для универсальности (поддержка номеров разных стран)
- Добавлено поле notes для дополнительной информации о получателе (мессенджеры, соцсети и т.д.)
- Улучшена логика поиска существующих получателей:
  * Использование нормализованного телефона из PhoneNumberField
  * Регистронезависимый поиск по имени (name__iexact)
  * Обновление notes при нахождении существующего получателя
- Обновлена форма OrderForm для работы с PhoneNumberField и новым полем notes
- Обновлен шаблон order_form.html для отображения нового поля
- Созданы миграции для изменений модели
2025-12-25 11:44:18 +03:00
298d797286 Исправление проблем с сохранением адреса, получателя и даты доставки
- Исправлено: адрес теперь сохраняется для черновиков заказов
- Исправлено: получатель корректно предзаполняется при редактировании заказа
- Исправлено: адрес при редактировании отображается в режиме 'новый' для возможности редактирования
- Исправлено: дата доставки корректно предзаполняется при редактировании заказа
- Исправлено: при редактировании получателя обновляется существующий объект вместо создания нового
- Улучшена логика обработки Delivery для черновиков (создание с опциональными полями)
- Улучшена логика обновления получателя через загрузку заказа из БД с select_related
2025-12-25 00:30:27 +03:00
98470c83af Рефакторинг блока доставки: объединение с датой/временем, упрощение структуры адреса, вынос получателя, авто-выбор склада по умолчанию 2025-12-24 22:51:14 +03:00
61ce3f550d Улучшен интерфейс ввода даты и времени доставки
- Исправлены имена полей времени (time_from/time_to вместо delivery_time_start/end)
- Поля времени сделаны необязательными (дата остается обязательной)
- Добавлен улучшенный UI с быстрыми кнопками для даты и времени
- Поля ввода расположены в один ряд, кнопки быстрого выбора ниже
- Добавлены CSS и JS файлы для улучшенного интерфейса
- Обновлена валидация: время необязательно, но если указано одно - должно быть и другое
2025-12-24 18:25:20 +03:00
d62caa924b Упрощение системы получателей доставки
- Удалено избыточное поле customer_is_recipient из модели Order
- Добавлено свойство @property is_customer_recipient для обратной совместимости
- Заменены радиокнопки recipient_mode на чекбокс 'Другой получатель' в форме
- Добавлено поле recipient_source для выбора между историей и новым получателем
- Обновлен AddressService.process_recipient_from_form() для работы с чекбоксом
- Обновлены шаблоны: order_form.html (чекбокс вместо радиокнопок) и order_detail.html
- Удалено customer_is_recipient из admin и demo команды
- Создана миграция для удаления поля customer_is_recipient

Логика упрощена: recipient is None = получатель = покупатель, иначе - отдельный получатель
2025-12-24 17:54:57 +03:00
d29c736252 refactor(orders): clean up order form structure and improve script loading 2025-12-23 21:12:53 +03:00
b1d5ebb6df refactor(orders): extract unified transaction form to reusable module
Moved payment/refund form logic from order_form.html to a dedicated
unified_transaction_form.js module for better code organization.

Changes:
- Created unified_transaction_form.js with initUnifiedTransactionForm() (~233 lines)
  - Dual mode: payment and refund switching
  - Dynamic form action and field names
  - Payment method selection with validation
  - Wallet balance limits for account_balance method
  - Amount constraints based on mode
  - Real-time UI updates and validation

- Updated order_form.html:
  - Added unified_transaction_form.js include
  - Added initialization call with Django template data
  - Removed inline transaction form code (~175 lines)
  - Passes URLs and amounts via options

Benefits:
- Cleaner template (175 lines removed)
- Reusable transaction form logic
- Easier to test and maintain
- Configurable via options or data-attributes
- No duplication between payment/refund modes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 16:36:41 +03:00
5de1ae9bb9 refactor(orders): extract form cleanup to reusable module
Moved empty order items cleanup logic from order_form.html to a dedicated
order_form_cleanup.js module for better code organization.

Changes:
- Created order_form_cleanup.js with initOrderFormCleanup() function (~136 lines)
  - Automatically removes empty order item forms before submit
  - Handles both new and saved forms differently
  - Updates TOTAL_FORMS and reindexes remaining forms
  - Compatible with Django formsets

- Updated order_form.html:
  - Added order_form_cleanup.js include
  - Added initialization call for #order-form
  - Removed inline cleanup code (~111 lines)

Benefits:
- Cleaner template (111 lines removed)
- Reusable across other formset-based forms
- Easier to test and maintain
- Consistent with other extracted modules

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 16:10:57 +03:00
98501c1c26 refactor(products): extract Order Item Select2 to reusable module
Moved order item selection logic from order_form.html to select2-product-search.js
for better code reusability and maintainability.

Changes:
- Extended select2-product-search.js with initOrderItemSelect2() function (~87 lines)
  - Wraps initProductSelect2 for order item context
  - Handles product/kit selection and form field updates
  - Manages custom price indicators
  - Supports data-ajax-url attribute for URL configuration

- Updated order_form.html:
  - Added data-ajax-url to order item select elements
  - Removed inline initOrderItemSelect2 function (~73 lines)
  - Updated dependency check to use initOrderItemSelect2

Benefits:
- No code duplication - reuses existing initProductSelect2
- Cleaner template (79 lines removed)
- Consistent with existing patterns
- Easy to maintain in one place

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 15:30:09 +03:00
fb4f14f475 refactor(orders): extract Customer Select2 to separate module
Extracted customer selection and creation functionality from order_form.html
to a reusable customer_select2.js module for better maintainability.

Changes:
- Created customer_select2.js (~450 lines) with IIFE pattern
  - AJAX customer search with Select2 integration
  - Smart parsing of email/phone/name from search input
  - Modal-based customer creation with validation
  - Toast notifications system
  - Auto-initialization via data-attributes
  - Global function exports for backward compatibility

- Updated order_form.html:
  - Added CSRF meta-tag for token access
  - Added data-attributes to customer select element
  - Included customer_select2.js script
  - Removed ~370 lines of inline JavaScript

Benefits:
- Improved code organization and readability
- Reusable across other pages requiring customer selection
- Better browser caching for static JS
- Consistent with existing select2-product-search.js pattern

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 15:18:02 +03:00
6669d47cdf feat(orders): add recipient management and enhance order forms
- Introduced Recipient model to manage order recipients separately from customers.
- Updated Order model to link to Recipient, replacing recipient_name and recipient_phone fields.
- Enhanced OrderForm to include recipient selection modes: customer, history, and new.
- Added AJAX endpoint to fetch recipient history for customers.
- Updated admin interface to manage recipients and display recipient information in order details.
- Refactored address handling to accommodate new recipient logic.
- Improved demo order creation to include random recipients.
2025-12-23 00:08:41 +03:00
ec02360eac Оптимизация страницы детального просмотра заказа: перемещение блока товаров вверх, добавление статуса в заголовок, оптимизация SQL-запросов 2025-12-21 12:57:54 +03:00
e54d7d04d7 feat: Добавлены команды управления данными тенантов и исправлены фильтры по статусу товаров
Добавлено:
- Команда clear_tenant_data для полной очистки данных тенанта без удаления схемы
  * Очищает все таблицы через TRUNCATE CASCADE
  * Сбрасывает ID-последовательности
  * Сохраняет схему БД и запись Client
  * Поддержка флага --noinput для автоматизации

- Команда init_tenant_data для инициализации системных данных тенанта
  * Создаёт системного клиента (АНОНИМНЫЙ ПОКУПАТЕЛЬ для POS)
  * Создаёт 8 системных статусов заказов
  * Создаёт 5 системных способов оплаты
  * Поддержка флага --reset для пересоздания данных

Исправлено:
- Заменены устаревшие фильтры is_active на status='active' для Product и ProductKit
  * products/views/category_views.py: исправлены фильтры в build_category_tree и get_context_data
  * products/services/kit_pricing.py: исправлены фильтры при получении товаров из variant_group
  * products/models/kits.py: исправлен фильтр в get_available_products
  * Устранена ошибка FieldError при работе со списком категорий

Улучшено:
- Команда clear_tenant_data теперь предлагает пользователю инициализировать системные данные после очистки
- Добавлена детальная информация о процессе очистки и инициализации данных
2025-12-12 04:58:26 +03:00
2d253584ba Добавлена обработка ValidationError в AJAX API и Bootstrap alert на странице списка заказов
Проблема:
На странице списка заказов (order_list) при изменении статуса 'на лету':
- ValidationError показывался через alert() - страшно
- Сообщение содержало служебные элементы
- Статус всё равно менялся визуально (нет отката)

Решение Backend (views.py):
- В set_order_status добавлена обработка ValidationError ПЕРЕД ValueError
- Извлекается чистое сообщение (e.messages[0] или str(e))
- Возвращается JSON: {success: false, error: 'чистое сообщение'}

Решение Frontend (order_list.html):
- Добавлен контейнер для динамических Bootstrap alert
- Создана функция showAlert() для показа красивых alert-danger
- При ошибке:
  * Показывается Bootstrap alert с иконкой
  * Прокрутка к верху страницы
  * Автоскрытие через 5 секунд
  * Возврат select к предыдущему значению (откат визуально)
- Больше НЕТ страшных alert()

Теперь пользователь видит:
[красный Bootstrap alert вверху страницы]
⚠️ Заказ 134 был отменён, товары проданы в другом заказе.
Невозможно изменить статус. Для новой продажи создайте новый заказ.
[X]

User-friendly на обеих страницах (форма редактирования + список)!
2025-12-12 00:18:09 +03:00
1d97da0d3e Исправлено обновление TOTAL_FORMS при удалении формы через крестик 2025-12-09 00:59:20 +03:00
6230e0fc5d Добавлено логирование в select2:clear для отладки 2025-12-09 00:58:11 +03:00
33533e6268 Исправлено удаление пустых форм: пересчёт индексов и TOTAL_FORMS 2025-12-09 00:53:03 +03:00
91383a2bf7 Добавлены подробные логи в скрипт очистки пустых форм для отладки 2025-12-09 00:51:16 +03:00
347f2357fd Убрано автозаполнение quantity=1 из шаблона пустой формы товара 2025-12-09 00:47:12 +03:00
364012b114 Исправлено: при очистке Select2 теперь также очищается поле количества 2025-12-09 00:43:26 +03:00
bdfb89115a Автоматическая очистка полностью пустых форм товаров перед валидацией заказа 2025-12-09 00:40:33 +03:00
34fa5d12eb Рефакторинг расчёта суммы заказа: упрощена структура и убраны избыточные логи 2025-12-09 00:29:49 +03:00
e32254e62d Сделана функция updateOrderItemsTotal глобальной для доступа из AJAX колбэков 2025-12-09 00:17:13 +03:00
0f22520ecc Добавлены логи для отладки пересчёта суммы товаров 2025-12-09 00:15:36 +03:00
e021c68beb Добавлен автоматический пересчёт суммы товаров после загрузки из черновика 2025-12-09 00:14:07 +03:00
12204bd34a Добавлен механизм отложенного заполнения полей с ожиданием рендеринга формсета 2025-12-09 00:00:20 +03:00
27b988dda7 Исправлена загрузка товаров из черновика через прямое заполнение скрытых полей 2025-12-08 20:06:31 +03:00
2735d745a1 Добавлено детальное логирование загрузки товаров в формсет 2025-12-08 19:22:58 +03:00
8805e3ad41 Добавлена автозагрузка товаров в Select2 при создании заказа из POS 2025-12-08 19:04:04 +03:00
9dab280def Рабочие изменения: улучшения UI, настройки и бэкенд авторизации
Собрал накопившиеся изменения из рабочей директории:

UI улучшения:
- customer_detail.html: Расширен интерфейс детальной страницы клиента
- order_detail.html: Добавлены элементы отображения деталей заказа
- order_list.html: Улучшена визуализация списка заказов

Бэкенд:
- customers/views.py: Доработаны представления для работы с клиентами
- products/views/product_views.py: Минорные правки
- user_roles/auth_backend.py: Добавлен кастомный бэкенд авторизации

Настройки:
- myproject/settings.py: Обновлены конфигурации
- .gitignore: Добавлен для игнорирования служебных файлов
- requirements.txt: Удален (вероятно заменен на poetry/pipenv)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 01:08:53 +03:00
dcfb76121d SECURITY: Защита критичных полей системных статусов от редактирования
Заблокировал изменение полей is_positive_end и is_negative_end для
системных статусов заказов, так как эти флаги используются в сигналах
inventory для управления резервированием и списанием товаров со склада.

Что изменено:
- OrderStatusForm: Добавлена блокировка (disabled=True) для полей
  is_positive_end и is_negative_end при редактировании системных статусов
- status_form.html: Заменено информационное предупреждение на красное
  с детальным описанием заблокированных полей и их влияния на систему

Почему это критично:
Эти флаги проверяются в 3 сигналах inventory/signals.py:
1. rollback_sale_on_status_change - откатывает продажи при уходе от 'completed'
2. release_reservations_on_cancellation - освобождает резервы при отмене
3. reserve_stock_on_uncancellation - резервирует при восстановлении заказа

Случайное изменение флагов может привести к:
- Неправильному освобождению резервов товара
- Двойному резервированию
- Блокировке товара навсегда
- Списанию товара для отмененных заказов

Разрешено редактировать для системных статусов: name, label, color, description

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 01:07:15 +03:00
702d42e943 Removed 'Not set' status option from order list dropdown 2025-12-01 12:19:16 +03:00