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

Проблема:
При попытке продажи 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

@@ -199,15 +199,13 @@ class ShowcaseManager:
'message': f'Продано {sold_count} экз.'
}
except IntegrityError as e:
# Защита от двойной продажи сработала на уровне БД
if 'sold_order_item' in str(e) or 'UNIQUE' in str(e):
return {
'success': False,
'sold_count': 0,
'message': 'Один из экземпляров уже был продан. Обновите список витринных букетов.'
}
raise
except ValidationError as e:
# Ошибка валидации (например, экземпляр уже продан)
return {
'success': False,
'sold_count': 0,
'message': str(e)
}
@staticmethod
def sell_from_showcase(product_kit, showcase, customer, payment_method='cash_to_courier',