feat(discounts): добавлено комбинирование скидок по режимам

Добавлено поле combine_mode с тремя режимами:
- stack - складывать с другими скидками
- max_only - применять только максимальную
- exclusive - отменяет все остальные скидки

Изменения:
- Модель Discount: добавлено поле combine_mode
- Calculator: новый класс DiscountCombiner, методы возвращают списки скидок
- Applier: создание нескольких DiscountApplication записей
- Admin: отображение combine_mode с иконками
- POS API: возвращает списки применённых скидок
- POS UI: отображение нескольких скидок с иконками режимов

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 12:56:38 +03:00
parent 293f3b58cb
commit f57e639dbe
9 changed files with 715 additions and 223 deletions

View File

@@ -18,6 +18,12 @@ class BaseDiscount(models.Model):
('category', 'На категорию товаров'),
]
COMBINE_MODE_CHOICES = [
('stack', 'Складывать (суммировать)'),
('max_only', 'Только максимум'),
('exclusive', 'Исключающая (отменяет остальные)'),
]
name = models.CharField(
max_length=200,
verbose_name="Название скидки"

View File

@@ -48,6 +48,15 @@ class Discount(BaseDiscount):
help_text="Применяется автоматически при выполнении условий"
)
# Режим объединения с другими скидками
combine_mode = models.CharField(
max_length=20,
choices=BaseDiscount.COMBINE_MODE_CHOICES,
default='max_only',
verbose_name="Режим объединения",
help_text="stack = суммировать с другими, max_only = применить максимальную, exclusive = отменить остальные"
)
class Meta:
verbose_name = "Скидка"
verbose_name_plural = "Скидки"