Исправлены две критические проблемы с автосохранением и восстановлением
данных при перезагрузке страницы редактирования заказа:
1. ПРОБЛЕМА: Адрес доставки не восстанавливался после перезагрузки
РЕШЕНИЕ (forms.py):
- Добавлена инициализация полей адреса в OrderForm.__init__()
- Поля заполняются из order.delivery_address при редактировании
- Инициализируются все поля: улица, дом, квартира, подъезд, этаж, домофон, инструкции
2. ПРОБЛЕМА: Цены и количество товаров не сохранялись через автосохранение
РЕШЕНИЕ (draft_service.py):
- Добавлена обработка items в DraftOrderService.update_draft()
- Автосохранение теперь обновляет/создаёт/удаляет позиции заказа
- Сохраняются: product/product_kit, quantity, price, is_custom_price
- Корректно определяется is_custom_price через сравнение с оригинальной ценой
Логика обработки items:
- Существующие позиции обновляются (product, quantity, price)
- Новые позиции создаются
- Лишние позиции удаляются
- Поддержка как товаров (product_id), так и комплектов (product_kit_id)
Теперь при перезагрузке страницы:
✅ Адрес доставки полностью восстанавливается во всех полях
✅ Товары сохраняются с правильными ценами и количествами
✅ Изменённые цены корректно отмечаются бейджем "Изменена"
✅ Все данные синхронизируются между автосохранением и базой данных
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Упрощена логика системы путём замены отдельной сущности "Магазин"
на универсальную сущность "Склад", которая может использоваться
как точка самовывоза.
Изменения:
- Расширена модель Warehouse: добавлены адрес, контакты, флаг is_pickup_point
- Модель Order: поле pickup_shop заменено на pickup_warehouse
- Обновлены все формы, сервисы, views, admin для работы со складами
- Обновлены шаблоны HTML и JavaScript код
- Удалено приложение shops полностью
- Пересозданы миграции БД
- Обновлён навбар (удалена ссылка на магазины)
Преимущества:
- Упрощена архитектура системы
- Единая точка управления складами и точками самовывоза
- Интеграция с системой инвентаризации
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Features:
- Created OrderStatus model for managing statuses per tenant
- Added system-level statuses: draft, new, confirmed, in_assembly, in_delivery, completed, return, cancelled
- Implemented CRUD views for managing order statuses
- Created OrderStatusService with status transitions and business logic hooks
- Updated Order model to use ForeignKey to OrderStatus
- Added is_returned flag for tracking returned orders
- Updated filters to work with new OrderStatus model
- Created management command for status initialization
- Added HTML templates for status list, form, and confirmation
- Fixed views.py to use OrderStatus instead of removed STATUS_CHOICES
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Изменения:
1. **Стоимость доставки (автоматическая/ручная)**:
- Добавлено поле `is_custom_delivery_cost` в модель Order для отслеживания ручной стоимости
- Создан сервис DeliveryCostCalculator для автоматического расчета стоимости доставки
- Реализована логика: бесплатная доставка от 100 руб., иначе 15 руб.
- В форме поле "Ручная стоимость доставки" - если заполнено, используется ручная стоимость, если пустое - автоматический расчет
- Добавлены методы Order.get_delivery_cost(), set_delivery_cost(), reset_delivery_cost(), recalculate_delivery_cost()
2. **Исправление бага выбора клиента в Select2**:
- Удален избыточный обработчик события select2:opening, который блокировал клики
- Добавлены проверки на наличие e.params.data в обработчиках select2:selecting и select2:select
- Теперь выбор клиента работает корректно, создается черновик заказа и происходит редирект
3. **Опциональные поля адреса**:
- Поля recipient_name, street, building_number в модели Address сделаны необязательными (blank=True, null=True)
- Обновлены методы __str__ и full_address для безопасной работы с None значениями
4. **UI улучшения**:
- Удалена звездочка обязательности с полей адреса
- Добавлена подсказка под полем ручной стоимости доставки о правилах автоматического расчета
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Основные изменения:
### 1. Исправлена логика выбора режима адреса
- Переместил функцию initAddressModeToggle() из jQuery блока в отдельную функцию
- Теперь инициализация адреса работает независимо от jQuery
- Добавлены подробные логи в консоль для отладки ([ADDRESS MODE] префикс)
### 2. Добавлены CSS классы для управления видимостью
- address-history-mode: display: none !important (по умолчанию скрыт)
- address-new-mode: display: none !important (по умолчанию скрыт)
- .visible класс переводит элементы на display: block !important
- Использование classList.add/remove вместо inline styles
### 3. Исправлены стили полей формы (OrderForm)
- Добавлена явная обработка для Select полей - получают form-select
- Поле "Статус" и другие Select теперь имеют правильные стили Bootstrap
- Разделена логика для RadioSelect, Select и остальных полей
### 4. Улучшена отладка
- Добавлены console.log сообщения на каждом этапе инициализации
- Префикс [ADDRESS MODE] помогает отличить логи системы адреса от других
## Технические детали:
- Address сервис использует метод format_address_for_display() для красивого вывода
- AJAX endpoint get_customer_address_history() загружает адреса клиента
- Три режима адреса: history (из истории), new (новый адрес), empty (без адреса)
- Режим empty выбирается по умолчанию
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Проблема: Select2 не инициализировалась корректно, так как конфликтовал с общим инициализатором Select2
Решение:
- Удален класс select2 из поля customer в форме (orders/forms.py)
- Select2 для customer теперь инициализируется отдельно с AJAX поиском
- Используется стандартный Django ID для поля (id_customer)
- Правильно обработаны все ссылки на $customerSelect в JavaScript
Теперь поиск работает корректно:
- Поиск по имени, телефону (любой формат) и email
- Быстрое создание клиента без перезагрузки страницы
- Автоматическое заполнение формы при создании
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Добавлен параметр format для виджетов DateInput и TimeInput, что позволяет корректно отображать сохраненные значения даты и времени в HTML5 полях формы.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Проблемы:
- Отображались лишние пустые формы (extra=1)
- Новые формы не инициализировали Select2 корректно
- Неудобное удаление через checkbox
Исправления:
1. forms.py:
- Изменен OrderItemFormSet: extra=0, min_num=0
- Формы добавляются только через JavaScript
2. order_form.html:
- Добавлен шаблон пустой формы (#empty-form-template)
- Заменен checkbox "Удалить" на кнопку с иконкой
- Полностью переписана логика добавления/удаления форм
- Добавлена валидация: нельзя удалить единственную позицию
- Скрытые формы (DELETE=true) визуально помечаются
- Автодобавление первой формы при пустом formset
- Валидация перед отправкой: минимум 1 товар
Результат:
- При создании заказа отображается только 1 пустая форма
- Кнопка "Добавить товар" корректно создает новые формы
- Select2 работает в каждой новой форме
- Кнопка "Удалить" работает корректно
- Единственную позицию удалить нельзя
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Forms (orders/forms.py):
- TemporaryKitForm: упрощенная форма для временного комплекта (название + описание)
- TemporaryKitItemForm: форма для компонента временного комплекта
- TemporaryKitItemFormSet: formset для управления компонентами
Views (orders/views.py):
- create_temporary_kit: AJAX endpoint для создания временного комплекта
* Принимает JSON с названием, описанием и списком компонентов
* Создает комплект с is_temporary=True
* Связывает с заказом если указан order_id
* Автоматически пересчитывает цену
* Возвращает JSON с данными созданного комплекта
URLs (orders/urls.py):
- /orders/temporary-kits/create/ - endpoint для создания
Теперь можно создавать временные комплекты через AJAX запрос.
Следующий шаг - UI в форме заказа.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Добавлено поле is_custom_price в модель OrderItem для отслеживания ручных изменений
- Добавлены свойства original_price и price_difference для отображения оригинальной цены и разницы
- Поле цены теперь редактируемое (убран атрибут readonly)
- Добавлены визуальные индикаторы: бейдж "Изменена" и информация об оригинальной цене
- JavaScript автоматически отслеживает изменения цены и устанавливает флаг is_custom_price
- В детальном просмотре заказа показывается информация о кастомных ценах с разницей
- Цена товара в каталоге не изменяется - изменения только для конкретного заказа
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>