Исправлена продажа нескольких экземпляров витринного букета

Проблема:
При попытке продажи 2+ экземпляров одного витринного букета возникала ошибка
IntegrityError, так как поле sold_order_item было OneToOneField.
Это означало что к одному OrderItem мог быть привязан только один ShowcaseItem,
что делало невозможной продажу нескольких экземпляров в одной позиции заказа.

Решение:
1. Изменен тип поля sold_order_item с OneToOneField на ForeignKey
   - Теперь несколько ShowcaseItem могут относиться к одному OrderItem
   - related_name изменен с 'sold_showcase_item' на 'sold_showcase_items'

2. Обновлен метод mark_sold в модели ShowcaseItem
   - Добавлена явная проверка статуса 'sold' перед продажей
   - Генерируется ValidationError если экземпляр уже продан
   - Удален комментарий про OneToOneField защиту

3. Обновлена обработка ошибок в ShowcaseManager.sell_showcase_items
   - Убрана обработка IntegrityError
   - Добавлена обработка ValidationError от mark_sold

4. Создана миграция 0012_change_sold_order_item_to_fk

Теперь можно успешно продавать 2 и более экземпляров одного витринного букета
в рамках одной позиции заказа.
This commit is contained in:
2025-12-11 22:23:41 +03:00
parent 8dc6594334
commit 0d72c36739
3 changed files with 36 additions and 14 deletions

View File

@@ -0,0 +1,20 @@
# Generated by Django 5.0.10 on 2025-12-11 19:23
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0011_add_writeoff_status_to_reservation'),
('orders', '0006_transaction_delete_payment_and_more'),
]
operations = [
migrations.AlterField(
model_name='showcaseitem',
name='sold_order_item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sold_showcase_items', to='orders.orderitem', verbose_name='Позиция заказа (продажа)'),
),
]