Добавлена поддержка черновиков заказов (Этап 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>
This commit is contained in:
2025-11-08 18:26:24 +03:00
parent 848b6b1574
commit dc8604732f
4 changed files with 337 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.0.10 on 2025-11-08 15:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('orders', '0004_orderitem_is_custom_price'),
]
operations = [
migrations.AddField(
model_name='historicalorder',
name='last_autosave_at',
field=models.DateTimeField(blank=True, help_text='Время последнего автоматического сохранения черновика', null=True, verbose_name='Последнее автосохранение'),
),
migrations.AddField(
model_name='order',
name='last_autosave_at',
field=models.DateTimeField(blank=True, help_text='Время последнего автоматического сохранения черновика', null=True, verbose_name='Последнее автосохранение'),
),
migrations.AlterField(
model_name='historicalorder',
name='status',
field=models.CharField(choices=[('draft', 'Черновик'), ('new', 'Новый'), ('confirmed', 'Подтвержден'), ('in_assembly', 'В сборке'), ('in_delivery', 'В доставке'), ('delivered', 'Доставлен'), ('cancelled', 'Отменен')], default='new', max_length=20, verbose_name='Статус заказа'),
),
migrations.AlterField(
model_name='order',
name='status',
field=models.CharField(choices=[('draft', 'Черновик'), ('new', 'Новый'), ('confirmed', 'Подтвержден'), ('in_assembly', 'В сборке'), ('in_delivery', 'В доставке'), ('delivered', 'Доставлен'), ('cancelled', 'Отменен')], default='new', max_length=20, verbose_name='Статус заказа'),
),
]