feat(discounts, orders): рефакторинг системы скидок - единый источник правды

- Добавлен combine_mode в форму создания/редактирования скидок
- Добавлена колонка "Объединение" в список скидок с иконками
- Добавлен фильтр по режиму объединения скидок
- Добавлена валидация: только одна exclusive скидка на заказ
- Удалены дублирующие поля из Order и OrderItem:
  - applied_discount, applied_promo_code, discount_amount
- Скидки теперь хранятся только в DiscountApplication
- Добавлены свойства для обратной совместимости

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 13:46:02 +03:00
parent cd758a0645
commit c070e42cab
9 changed files with 192 additions and 112 deletions

View File

@@ -1573,11 +1573,6 @@ def pos_checkout(request):
discount_amount = min(discount_value, order.subtotal)
discount_name = f'Произвольная скидка {discount_value} руб.'
order.discount_amount = discount_amount
order.applied_promo_code = discount_name # Сохраняем название в поле промокода
order.save(update_fields=['discount_amount', 'applied_promo_code'])
order.calculate_total()
# Создаем запись о применении в истории скидок
from discounts.models import DiscountApplication
DiscountApplication.objects.create(
@@ -1589,6 +1584,9 @@ def pos_checkout(request):
customer=customer,
applied_by=request.user
)
# Пересчитываем total_amount (использует DiscountApplication)
order.calculate_total()
elif manual_discount_id:
from discounts.services.applier import DiscountApplier
from discounts.models import Discount