feat(promocodes): состав промокода чекбоксами — баланс / дни / промогруппа

Форма создания промокода переведена с жёсткого выбора одного типа на режим
«Набор бонусов»: галочками выбирается, что входит в промокод — бонус на
баланс, дни подписки, промогруппа — в любой комбинации. Тип для бэкенда
выводится из выбора (balance / subscription_days / balance_and_days /
promo_group), промогруппа едет через promo_group_id при любом типе (бэкенд
назначает её при активации независимо от типа).

Триал и процентная скидка остаются отдельными режимами: скидка
переиспользует те же колонки с другой семантикой (процент/часы) и не
комбинируется без миграции.

- список и статистика: лейбл/цвет нового типа balance_and_days, у составных
  кодов видны оба значения (+руб и +дни)
- edit-режим восстанавливает чекбоксы из типа и promo_group_id
- унифицирована валидация формы (isValid = список ошибок пуст; для скидки
  0 часов = «до первой покупки» — разрешено, как и было в isValid)
- локали ru/en/fa/zh

Парный PR бэкенда: remnawave-bedolaga-telegram-bot (тип BALANCE_AND_DAYS,
порядок эффектов дни→баланс, валидации, бот-визард).
This commit is contained in:
Case211
2026-07-14 08:52:06 +05:00
parent d7ea3c0635
commit 9ce838bade
8 changed files with 162 additions and 56 deletions

View File

@@ -7,7 +7,8 @@ export type PromoCodeType =
| 'subscription_days'
| 'trial_subscription'
| 'promo_group'
| 'discount';
| 'discount'
| 'balance_and_days';
export interface PromoCode {
id: number;