Commit Graph

12 Commits

Author SHA1 Message Date
4a4bd437b9 refactor: Заменить сущность Магазин (Shop) на Склад (Warehouse)
Упрощена логика системы путём замены отдельной сущности "Магазин"
на универсальную сущность "Склад", которая может использоваться
как точка самовывоза.

Изменения:
- Расширена модель 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>
2025-11-14 23:50:30 +03:00
d3ac875a0e fix: Исправлена работа черновиков заказов и добавлено автосохранение статуса
Проблема 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>
2025-11-14 23:00:24 +03:00
c7875f147c Implement flexible order status management system
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>
2025-11-13 16:29:50 +03:00
5fb6c0a2cb Разрешено редактирование товаров в заказах любого статуса
- Удалена проверка is_draft() при добавлении товаров в заказ
- Удалена проверка is_draft() при удалении товаров из заказа
- Теперь можно редактировать состав заказа не только в черновиках

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 17:09:06 +03:00
46578382b0 Улучшения в моделях заказов и комплектов
## Изменения:

### 1. ProductKit - расчет цены для вариантов товаров
- Добавлена обработка variant_group в методах расчета base_price
- Теперь учитываются варианты товаров при расчете стоимости комплекта

### 2. DraftOrderService - упрощение логики автосохранения
- Удалена проверка is_draft() при обновлении (позволяет обновлять заказы в других статусах)
- Улучшена документация метода update_draft

### 3. Шаблоны и скрипты
- Обновлены шаблоны форм создания/редактирования комплектов
- Обновлены скрипты автосохранения

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 11:34:06 +03:00
8cc8cd1339 Исправлена персистентность типа доставки при автосохранении
Проблема: После переключения между "С доставкой" и "Самовывоз" и автосохранения, при перезагрузке страницы всегда отображался "Самовывоз", независимо от фактически сохраненного значения.

Изменения:

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>
2025-11-11 16:59:24 +03:00
885ac839e2 Реализована система управления стоимостью доставки и исправлен баг выбора клиента
Изменения:

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>
2025-11-11 15:48:50 +03:00
ddbb4f963b Исправлена отображение полей адреса и стили формы заказа
## Основные изменения:

### 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>
2025-11-11 02:49:25 +03:00
f7305bae11 Добавлена конвертация даты и времени при автосохранении черновика
Добавлен парсинг строковых значений в объекты date и time для полей delivery_date, delivery_time_start и delivery_time_end, чтобы форма корректно отображала сохраненные значения.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 12:21:58 +03:00
af0c0189ba Исправлена обработка числовых полей при автосохранении черновика
Добавлена конвертация строковых значений в Decimal для полей delivery_cost и discount_amount, чтобы избежать ошибки типа при автосохранении.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 12:18:54 +03:00
95b7f44105 Исправлена обработка ForeignKey полей в DraftOrderService
Добавлена правильная обработка ForeignKey полей (customer, delivery_address, pickup_shop)
при обновлении черновика. Теперь ID конвертируются в объекты моделей перед присваиванием.

Исправляет ошибку: Cannot assign "1": "Order.customer" must be a "Customer" instance.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 00:21:39 +03:00
dc8604732f Добавлена поддержка черновиков заказов (Этап 1/3)
Реализован базовый функционал для работы с черновиками заказов.
Это первый этап из трех для полной реализации автосохранения.

Изменения:

1. Модель Order (orders/models.py):
   - Добавлен статус 'draft' в STATUS_CHOICES
   - Добавлено поле last_autosave_at для отслеживания автосохранения
   - Добавлен метод is_draft() для проверки статуса черновика

2. Миграция (0005_add_draft_support.py):
   - Добавление поля last_autosave_at в Order
   - Добавление статуса 'draft' в choices

3. Service Layer (orders/services/draft_service.py):
   - Класс DraftOrderService с методами:
     * create_draft() - создание нового черновика
     * update_draft() - обновление существующего черновика
     * add_item_to_draft() - добавление товара в черновик
     * remove_item_from_draft() - удаление товара из черновика
     * finalize_draft() - завершение черновика (draft → new)
     * get_user_drafts() - получение черновиков пользователя
     * delete_old_drafts() - очистка старых черновиков
   - Вся бизнес-логика инкапсулирована в сервисный слой

Архитектурные решения:
- Использование service layer pattern для изоляции бизнес-логики
- Транзакционность всех операций с черновиками
- Автоматический пересчет итоговой суммы при изменении товаров
- Связь временных комплектов с черновиками через FK

Следующие этапы (в следующих коммитах):
- Этап 2: AJAX endpoints и модификация views
- Этап 3: JavaScript автосохранение и UI

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:26:24 +03:00