Убрано поле скидки из системы для последующей реализации полноценной системы скидок.
Изменения:
- Удалено поле discount_amount из модели Order
- Убрано из формы OrderForm
- Удалено из шаблонов order_form.html и order_detail.html
- Убрано из админки OrderAdmin
- Обновлен метод calculate_total() (без вычитания скидки)
В будущем будет создана отдельная модель Discount с промокодами, процентными скидками и автоматическими акциями.
ВАЖНО: После этого коммита нужно создать и применить миграцию:
python manage.py makemigrations orders -n remove_discount_amount
python manage.py migrate orders
- Добавлен префикс 'payments' для PaymentFormSet во всех представлениях
- Добавлен атрибут form='order-form' для динамически создаваемых полей платежей
- Убрано переопределение has_changed() в PaymentForm (использует стандартную логику Django)
- Автоматическая установка created_by для новых платежей
- Автоматический пересчёт payment_status при изменении суммы заказа
- Автоматическая обработка переплаты с возвратом в кошелёк клиента
- Убран весь отладочный код
Проблема: Платежи не сохранялись при создании/редактировании заказа.
Причины:
1. JavaScript функция addNewPayment() использовала неправильный метод
замены __prefix__. При clone().innerHTML.replace() атрибуты name
оставались с буквальным "__prefix__" вместо номера формы.
2. PaymentForm не переопределял has_changed(), из-за чего Django formset
считал заполненные формы "пустыми" и не сохранял их.
Исправления:
- order_form.html: Переписана addNewPayment() - теперь клонирует
template.content, конвертирует в HTML строку, делает replace,
и только потом парсит обратно в DOM элемент
- forms.py: Добавлен метод PaymentForm.has_changed() который правильно
определяет что форма заполнена если указан payment_method ИЛИ amount
- views.py: Добавлена отладочная информация для диагностики проблем
с formset (TODO: удалить после тестирования)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed PaymentForm.clean() validation that was preventing payments from
being saved on new orders. The validation required order to exist, but
during creation self.instance.order is None until formset is saved.
Changes:
- Removed hard requirement for order in PaymentForm.clean()
- Wallet balance checks now only run when order exists
- Empty payment forms still allowed (for deletion in formset)
- Basic amount validation maintained
This fixes the issue where payments wouldn't persist when creating
a new order, even though no validation errors were shown to user.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The error occurred because:
1. OrderForm.save(commit=False) was calling reset_delivery_cost()
2. reset_delivery_cost() uses DeliveryCostCalculator which accesses order.items
3. But items don't exist yet when order is not saved to DB
Solution:
- OrderForm.save() now only calls reset_delivery_cost() when commit=True
- order_create() explicitly calls reset_delivery_cost() AFTER saving items
- This ensures items exist in DB before delivery cost calculation
Error was: 'Order' instance needs to have a primary key value before this relationship can be used.
- Removed autosave.js (665 lines) and draft-creator.js (441 lines)
- Removed draft_service.py (~500 lines) and DraftOrderService
- Removed AJAX endpoints: autosave and create-draft
- Updated order_create() to add is_create_page flag
- Updated order_update() to finalize drafts without DraftOrderService
- Added get_new_status() method to OrderStatusService
- Updated order_form.html:
- Removed old JS includes
- Added beforeunload warning for unsaved data
- Updated buttons: separate buttons for create/draft/finalize
- Total code reduction: ~1600 lines (92% removed)
New workflow:
- /orders/create/ - user fills form, chooses button
- /orders/<id>/edit/ - simple editing without autosave
- beforeunload warning when leaving page (except on submit)
- Modified order_create view to read customer from GET parameter
- Pass preselected_customer to template context
- Template renders select with preselected option for Select2
- Fixed draft creation timing with callback after Select2 initialization
- Auto-create draft when customer is preselected from URL
- Graceful handling if customer not found or invalid ID
- Добавлено поле wallet_balance в модель Customer
- Создана модель WalletTransaction для истории операций
- Реализован сервис WalletService с методами:
* add_overpayment - автоматическое зачисление переплаты
* pay_with_wallet - оплата заказа из кошелька
* adjust_balance - ручная корректировка баланса
- Интеграция с Payment.save() для автоматической обработки переплат
- UI для оплаты из кошелька в деталях заказа
- Отображение баланса и долга на странице клиента
- Админка с inline транзакций и запретом ручного создания
- Добавлен способ оплаты account_balance
- Миграция 0004 для customers приложения
Adds proper initialization for checkbox fields on page load:
- address_confirm_with_recipient (Уточнить адрес у получателя)
- customer_is_recipient (Покупатель является получателем)
These fields are already tracked by autosave.js and properly saved
by backend, but were not displaying saved values after page reload.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixes deletion functionality for order items across frontend and backend:
- Remove restriction preventing deletion of last item
- Add confirmation dialog before deletion
- Properly track and send deleted item IDs to backend via autosave
- Update backend to handle item deletion by ID instead of index
- Fix visual feedback: deleted items are hidden immediately
- Auto-recalculate total sum after deletion
Technical changes:
- order_form.html: Add confirmation dialog, trigger autosave on delete
- autosave.js: Collect deleted item IDs, send to backend
- draft_service.py: Process deleted_item_ids, update items by ID
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлена проблема с пропаданием цен товаров при автосохранении и
перезагрузке страницы.
ПРОБЛЕМА:
- При автосохранении пустые поля цен отправлялись как '0'
- Backend сохранял 0 в базу данных
- При перезагрузке страницы поля цен оставались пустыми
- Итоговая сумма товаров показывала 0.00 руб.
РЕШЕНИЕ 1 - Backend (draft_service.py):
- Изменена логика обработки цен в update_draft()
- Если цена пустая или равна 0, используется actual_price из каталога
- Добавлена корректная обработка price_raw перед конвертацией в Decimal
- Улучшена логика определения is_custom_price
Логика обработки цены:
1. Получаем price_raw из items_data
2. Если price_raw пустой или 0 → используем original_price из каталога
3. Если price_raw заполнен → используем его и сравниваем с original_price
4. is_custom_price = True только если разница больше 0.01
РЕШЕНИЕ 2 - Frontend (order_form.html):
- Добавлена fallback логика в шаблоне для отображения цены
- Если item_form.instance.price пустой/None/0 → показываем actual_price
- Используется inline условие {% if %} для проверки наличия цены
- Отдельная логика для product и product_kit
Теперь работает корректно:
✅ При выборе товара цена автоматически заполняется из каталога
✅ Автосохранение сохраняет правильную цену (из каталога или изменённую)
✅ При перезагрузке страницы цены отображаются корректно
✅ Итоговая сумма товаров рассчитывается правильно
✅ Бейдж "Изменена" показывается только для реально изменённых цен
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлены две критические проблемы с автосохранением и восстановлением
данных при перезагрузке страницы редактирования заказа:
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>
Исправлена проблема с автосохранением полей адреса доставки. Теперь адрес
сохраняется при заполнении любого поля, а не только при наличии улицы и
номера дома.
Изменения в Backend (address_service.py):
- Изменена логика валидации в process_address_from_form()
- Теперь адрес сохраняется если заполнено хотя бы одно поле
- Удалено жёсткое требование заполнения street и building_number
- Проверяем наличие данных во всех полях адреса
Изменения в Frontend (autosave.js):
- Переработана логика сбора данных адреса
- address_mode='new' устанавливается при заполнении любого поля адреса
- Все непустые поля адреса отправляются на сервер
- Используется более элегантный подход с Object.values() и .some()
Теперь автосохранение работает корректно:
- Заполнение поля "Улица" → автосохранение срабатывает
- Заполнение "Номер дома" → автосохранение срабатывает
- Заполнение любого другого поля адреса → автосохранение срабатывает
- После перезагрузки страницы все данные восстанавливаются
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлена проблема с отображением бейджа "Изменена" для существующих
товаров в заказе. Теперь при загрузке страницы для всех существующих
позиций устанавливается атрибут data-original-price с актуальной ценой
из каталога, что позволяет корректно отслеживать изменения цены.
Изменения:
- Добавлена условная логика рендеринга поля price с атрибутом data-original-price
- Для товаров используется item_form.instance.product.actual_price
- Для комплектов используется item_form.instance.product_kit.actual_price
- Бейдж "Изменена" теперь работает одинаково для всех форм
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Добавлено отображение общей суммы всех товаров в заказе с автоматическим
обновлением в реальном времени при изменении количества, цены, добавлении
или удалении товаров.
Изменения:
- HTML: Добавлен блок отображения итоговой суммы товаров под списком позиций
- JavaScript: Реализованы функции calculateOrderItemsTotal() и updateOrderItemsTotal()
- Интеграция: Подключены слушатели событий на поля quantity и price
- Обновление суммы происходит при:
* Изменении количества или цены товара
* Добавлении новой позиции
* Удалении позиции
* Загрузке страницы
Сумма автоматически исключает удалённые формы и корректно обрабатывает
пустые значения. Форматирование: 2 знака после запятой.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed from table to card-based design for better space efficiency
- Reduced padding and margins to fit 15+ statuses on screen without scrolling
- Minimized font sizes and icon sizes for compact display
- Added proper styling for edit and delete buttons with hover effects
- Improved visual hierarchy with color indicators and badges
- Maintained all functionality while improving UX
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Создана модель Showcase (витрина) привязанная к складу
- Расширена Reservation для поддержки витринных резервов
- Добавлены поля в OrderItem для маркировки витринных продаж
- Реализован ShowcaseManager с методами резервирования, продажи и разбора
- Обновлён админ-интерфейс для управления витринами
- Добавлена кнопка Витрина в POS (категории) и API для просмотра
- Добавлена кнопка На витрину в панели действий POS
- Миграции готовы к применению
Изменения:
- Заменено жёсткое кодирование статусов ('draft', 'new' и т.д.) на динамическое отображение из OrderStatus объекта
- Теперь статусы берут цвет (color) и название (label/name) из модели OrderStatus
- Обновлена логика отображения статуса оплаты: заменено payment_status на is_paid и amount_paid
- Добавлены иконки для наглядности (check-circle, exclamation-circle, x-circle)
- Для частичной оплаты теперь показывается сумма уже оплаченного
Это позволяет:
- Добавлять новые статусы без изменения шаблона
- Менять цвета статусов через admin панель
- Использовать правильные поля из модели Order
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Реализована трёхуровневая система статусов товаров и комплектов:
- active (Активный) - товар доступен для продажи
- archived (Архивный) - скрыт, можно восстановить в следующем сезоне
- discontinued (Снят) - морально устарел, готов к удалению
Изменения:
1. Модели (BaseProductEntity, Product, ProductKit):
- Заменено поле is_deleted (Boolean) на status (CharField)
- Добавлены архивные метаданные (archived_at, archived_by)
- Обновлены методы: archive(), restore(), discontinue(), delete()
- Уникальное ограничение изменено на conditional (status='active')
2. Менеджеры (ActiveManager, SoftDeleteQuerySet):
- Полиморфная поддержка обеих систем (status и is_active)
- Использует hasattr() для совместимости с наследниками
- Методы: archive(), restore(), discontinue(), archived_only(), active_only()
3. Формы (ProductForm, ProductKitForm):
- Включены поле status в формы
- Валидация уникальности по status='active'
- CSS классы для статус-селектора
4. Admin панель:
- DeletedFilter переименован в StatusFilter с тремя опциями
- get_status_display() с цветным отображением статуса
- Actions: restore_items, hard_delete_selected, delete_selected
- Readonly поля для архивирования
5. Представления:
- ProductListView: фильтр status вместо is_active
- CombinedProductListView: поддержка фильтра status для товаров и комплектов
- API views обновлены для работы со статусом
6. Шаблоны:
- product_form.html: form.status вместо form.is_active
- productkit_create.html: form.status вместо form.is_active
- productkit_edit.html: form.status вместо form.is_active
7. Миграции:
- Удалены все старые миграции (чистый перезапуск по требованию пользователя)
- Создана новая миграция 0001_initial с полной структурой status-системы
- Удален старый код преобразования is_deleted -> status
Проведённые проверки:
- Django system check passed ✓
- Полиморфные менеджеры работают с обеими системами
- Уникальные ограничения корректно работают с условиями
- История заказов сохраняется даже после архивирования товара (django-simple-history)
🤖 Generated with 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>
Проблема 1: Ошибка 500 при создании черновика заказа
- Поле status в модели Order является ForeignKey на OrderStatus
- В коде использовались строковые значения 'draft' и 'new' вместо объектов
- Это приводило к TypeError при создании/обновлении заказов
Решение:
- В DraftOrderService.create_draft: добавлен get_or_create для статуса 'draft'
- В DraftOrderService.finalize_draft: добавлен get_or_create для статуса 'new'
- В DraftOrderService.get_user_drafts: заменен фильтр status='draft' на status__code='draft'
- В DraftOrderService.delete_old_drafts: заменен фильтр status='draft' на status__code='draft'
- В cleanup_draft_orders.py: исправлен фильтр в режиме dry-run
Проблема 2: Отсутствие автосохранения при изменении статуса
- Поле status не отслеживалось в autosave.js
- При смене статуса заказ не сохранялся автоматически
Решение:
- Добавлено поле 'select[name="status"]' в список отслеживаемых полей
- Добавлен сбор значения статуса в функции collectFormData
- Добавлено 'status': 'orders.OrderStatus' в fk_fields для обработки на сервере
Дополнительно:
- Добавлено автосохранение полей адреса доставки (улица, дом, квартира и т.д.)
- Добавлено автосохранение полей получателя (имя, телефон)
- Добавлена автоматическая установка address_mode='new' при наличии адреса
Файлы:
- orders/services/draft_service.py
- orders/management/commands/cleanup_draft_orders.py
- orders/static/orders/js/autosave.js
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated terminology across the order status management system to use 'исход сделки' (deal outcome) instead of 'конец' (end) for better clarity and professional language.
Changes:
- Fixed AttributeError in order_status_list view by removing attempt to set read-only property orders_count
- Updated OrderStatus model verbose_name fields for is_positive_end and is_negative_end
- Updated status form template badges and preview JavaScript
- Updated status list table header
- Created migration for verbose_name changes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add OrderStatusAdmin to admin panel with custom display methods
- Implement color preview, order badge, and order count displays
- Protect system statuses from deletion and code modification
- Add orders_count property to OrderStatus model
- Create migration to translate status names to Russian
- Use format_html for safe HTML rendering in admin
🤖 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>
- Удалена проверка is_draft() при добавлении товаров в заказ
- Удалена проверка is_draft() при удалении товаров из заказа
- Теперь можно редактировать состав заказа не только в черновиках
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Кнопка создания заказа вынесена за пределы формы (правильная семантика)
- Добавлена адаптивная верстка для кнопок фильтров:
* На мобильных: кнопки в колонку на всю ширину
* На планшетах+: кнопки в строку
- Добавлен отступ для пагинации (mt-4)
- Колонка "Создан" скрыта на мобильных устройствах (d-none d-md-table-cell)
- Улучшено использование пространства на всех размерах экранов
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Уменьшены все отступы и padding для экономии вертикального пространства
- Уменьшены размеры кнопок навигации (36px → 30px)
- Уменьшены размеры кнопок дней (70px → 60px)
- Уменьшены все шрифты внутри календаря
- Обновлен расчет количества отображаемых дней (минимум 7)
- Календарь теперь занимает всю доступную ширину и показывает больше дат
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Удален заголовок страницы для экономии места
- Кнопка создания заказа перенесена в блок фильтров под календарь
- Кнопка теперь занимает всю ширину для удобства использования
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Фильтры и календарь остаются в стандартном контейнере
- Таблица вынесена в container-fluid с адаптивными отступами
- Уменьшены padding карточки таблицы для максимального использования пространства
- Сохранена адаптивность для всех размеров экранов
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Изменения:
### 1. ProductKit - расчет цены для вариантов товаров
- Добавлена обработка variant_group в методах расчета base_price
- Теперь учитываются варианты товаров при расчете стоимости комплекта
### 2. DraftOrderService - упрощение логики автосохранения
- Удалена проверка is_draft() при обновлении (позволяет обновлять заказы в других статусах)
- Улучшена документация метода update_draft
### 3. Шаблоны и скрипты
- Обновлены шаблоны форм создания/редактирования комплектов
- Обновлены скрипты автосохранения
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Изменен порядок секций формы: товары перемещены выше доставки
- Добавлена защита от двойного создания клиента
- Улучшена валидация при создании клиента с детализацией ошибок
- Добавлен индикатор загрузки при сохранении клиента
- Исправлена логика обработки специальной опции создания клиента
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлена ошибка AttributeError при создании нового клиента.
Адреса теперь привязаны к заказам, а не к клиентам.
- Удалено обращение к customer.addresses в customer_detail view
- Убрана секция "Адреса доставки" из шаблона customer_detail.html
- Исправлена команда create_demo_orders для работы с новой структурой
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Проблема: После переключения между "С доставкой" и "Самовывоз" и автосохранения, при перезагрузке страницы всегда отображался "Самовывоз", независимо от фактически сохраненного значения.
Изменения:
1. **orders/templates/orders/order_form.html**:
- Переписана инициализация управления типом доставки
- Код вынесен из jQuery document.ready в отдельный DOMContentLoaded обработчик
- Разделена логика синхронизации:
* syncDeliveryTypeFromRadio() - для обработки кликов пользователя
* syncUIFromCheckbox() - для инициализации UI из значения чекбокса
- Исправлен рендеринг скрытого чекбокса is_delivery с явным атрибутом checked
- Удалена лишняя закрывающая скобка, вызывавшая JS ошибку
- Удален дублирующийся обработчик select2:opening для выбора клиента
2. **orders/services/draft_service.py**:
- Добавлена явная конвертация boolean полей (is_delivery, customer_is_recipient, is_anonymous)
- Обработка различных типов данных (bool, string, None) в единый boolean
- Добавлено логирование для отладки is_delivery (временно)
Результат: Тип доставки теперь корректно сохраняется через автосохранение и восстанавливается при перезагрузке страницы.
🤖 Generated with [Claude Code](https://claude.com/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>
- Удален выбор режима адреса (История/Новый/Пусто)
- Поля адреса теперь показаны сразу под кнопками доставки
- Создана новая секция "Получатель" под полями адреса с бордюром сверху
- Перемещен чекбокс "Покупатель является получателем" в секцию Получатель
- Поля получателя (имя и телефон) теперь в той же секции
- Удалены CSS стили для скрытого/видимого режимов адреса
- Удалена функция initAddressModeToggle()
- Упрощена UX: доставка → адрес → получатель
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Все поля ввода адреса доставки теперь расположены под кнопками "С ДОСТАВКОЙ" / "САМОВЫВОЗ"
- Поля адреса скрыты когда выбран вариант "САМОВЫВОЗ"
- Поля адреса видны только когда выбрана "С ДОСТАВКОЙ"
- Переименован div с id="delivery-fields" на id="delivery-mode-fields" для лучшей организации
- Обновлена функция syncDeliveryType() для управления видимостью полей доставки
- Улучшена структура формы для лучшей UX
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Увеличен padding-top контейнера с pt-4 до pt-5 для большего отступа от шапки
- Метка "Статус:" теперь расположена слева от поля выбора
- Все элементы в строке заголовка выровнены по нижней базовой линии (align-items-end)
- Используется flexbox (d-flex gap-2) для горизонтального выравнивания
- Все элементы заголовка (Название, Статус, Кнопка) находятся на одной линии
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Статус заказа теперь отображается в один ряд с заголовком и кнопкой "Назад к списку"
- Статус размещен перед кнопкой "Назад к списку" (слева от неё)
- Добавлен больший отступ от шапки сайта (pt-4)
- Удален статус из карточки "Основная информация" для уменьшения дублирования
- Используется align-items-center для визуального выравнивания элементов
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Изменения:
### 1. Переорганизация формы
- Блок "Дата и время доставки" перенесен между "Основная информация" и "Доставка"
- Создан отдельный card с полями:
- Дата (delivery_date)
- Время от (delivery_time_start)
- Время до (delivery_time_end)
### 2. Новый порядок блоков формы
1. Основная информация (Клиент, Статус)
2. Дата и время доставки (новое расположение)
3. Доставка (тип доставки, адрес, самовывоз)
4. Товары в заказе
### 3. Преимущества
- Пользователь сначала выбирает дату/время, потом способ доставки
- Более логичная последовательность заполнения формы
- Улучшенный UX
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Изменения:
### 1. UI Улучшения
- Заменен чекбокс "С доставкой" на две кнопки: "С ДОСТАВКОЙ" и "САМОВЫВОЗ"
- Кнопки расположены в один ряд, используют btn-group Bootstrap
- Первая кнопка активна по умолчанию (С ДОСТАВКОЙ)
- Добавлены иконки: truck (доставка), shop (самовывоз)
- Чекбокс скрыт, видны только две кнопки
### 2. Функциональность
- Две кнопки работают как radio buttons (только одна может быть активна)
- При выборе кнопки синхронизируется скрытое поле is_delivery (Django form)
- Показываются/скрываются соответствующие блоки:
- "С ДОСТАВКОЙ" → блок адреса доставки
- "САМОВЫВОЗ" → блок с точками самовывоза
### 3. JavaScript логика
- Новая функция syncDeliveryType() синхронизирует состояние кнопок с полем is_delivery
- При клике на кнопку обновляется скрытое поле для отправки на сервер
- Логи в консоль для отладки
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>