From 29c9ed1a40bad95b187fabd81098a795d4c096da Mon Sep 17 00:00:00 2001 From: Fringg Date: Thu, 6 Aug 2026 02:53:02 +0300 Subject: [PATCH] =?UTF-8?q?fix(promocodes):=20=D1=87=D0=B5=D0=BA=D0=B1?= =?UTF-8?q?=D0=BE=D0=BA=D1=81=D1=8B=20=D0=BD=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=D0=BC,=20=D1=82=D1=80=D0=B0=D1=84=D0=B8=D0=BA=20=D0=B2?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дополнения к PR #543 при мерже. С появлением трафика тип balance_and_days перестал означать «есть и баланс, и дни»: теперь он стоит у любого набора с трафиком, в том числе с нулевым балансом и нулём дней. Две поверхности этого не учитывали. Форма редактирования поднимала галочки «Баланс» и «Дни» по ТИПУ. Код с одним трафиком открывался с двумя чужими галочками на нулях, валидация требовала «больше 0», и Сохранить не работало — админ не мог поправить даже число активаций, ничего не меняя по сути. Хуже того, подсказка прямо предлагает вписать сумму: сделав это, админ молча превращал код на 50 ГБ в код на 50 ГБ плюс 100 рублей. Галочки теперь выводятся по значениям — ровно так, как сам автор уже сделал для трафика строкой ниже. Список промокодов печатал составляющие тоже по типу, поэтому код с одним трафиком показывался как «+0 ₽ +0 дн.» и ни слова про гигабайты: админ при разборе списка видел код, который якобы не даёт ничего. Теперь каждая составляющая показывается по своему значению, и добавлена строка трафика — ключ form.gb автор уже завёл во всех четырёх локалях. Дробный ввод не трогал: поведение общее с полями баланса и дней и от этого PR не зависит. --- src/pages/AdminPromocodeCreate.tsx | 11 +++++++++-- src/pages/AdminPromocodes.tsx | 25 ++++++++++++++++++------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/pages/AdminPromocodeCreate.tsx b/src/pages/AdminPromocodeCreate.tsx index f24c39a..56f703c 100644 --- a/src/pages/AdminPromocodeCreate.tsx +++ b/src/pages/AdminPromocodeCreate.tsx @@ -87,8 +87,15 @@ export default function AdminPromocodeCreate() { setMode(data.type); } else { setMode('bonus_set'); - setIncludeBalance(data.type === 'balance' || data.type === 'balance_and_days'); - setIncludeDays(data.type === 'subscription_days' || data.type === 'balance_and_days'); + // Галочки поднимаем по ЗНАЧЕНИЯМ, а не по типу. С появлением трафика + // balance_and_days перестал означать «есть и баланс, и дни»: этот тип + // теперь у любого набора с трафиком, в том числе с нулевым балансом и + // нулём дней. По типу такой код открывался бы с двумя чужими галочками + // на нулях, валидация требовала бы «больше 0», и Сохранить не работало + // бы, пока админ их не снимет, — а подсказка толкает вместо этого + // вписать сумму и молча добавить коду бонус, которого в нём не было. + setIncludeBalance(data.type === 'balance' || (data.balance_bonus_rubles || 0) > 0); + setIncludeDays(data.type === 'subscription_days' || (data.subscription_days || 0) > 0); // Промогруппа комбинируется с любым составом (bэкенд назначает её // независимо от типа), поэтому чекбокс — по факту наличия группы setIncludeGroup(data.type === 'promo_group' || !!data.promo_group_id); diff --git a/src/pages/AdminPromocodes.tsx b/src/pages/AdminPromocodes.tsx index 924dc29..d4bb5e1 100644 --- a/src/pages/AdminPromocodes.tsx +++ b/src/pages/AdminPromocodes.tsx @@ -196,16 +196,27 @@ export default function AdminPromocodes() { {/* Info line */}
- {(promo.type === 'balance' || promo.type === 'balance_and_days') && ( - - +{promo.balance_bonus_rubles} {t('admin.promocodes.form.rub')} - - )} + {/* Составляющие показываем по значению, а не по типу: + balance_and_days теперь стоит и у набора, где баланса + или дней нет вовсе, — иначе в списке висело бы «+0 ₽ + +0 дн.» у кода, который на самом деле раздаёт трафик. */} + {(promo.type === 'balance' || promo.type === 'balance_and_days') && + promo.balance_bonus_rubles > 0 && ( + + +{promo.balance_bonus_rubles} {t('admin.promocodes.form.rub')} + + )} {(promo.type === 'subscription_days' || promo.type === 'trial_subscription' || - promo.type === 'balance_and_days') && ( + promo.type === 'balance_and_days') && + promo.subscription_days > 0 && ( + + +{promo.subscription_days} {t('admin.promocodes.form.days')} + + )} + {promo.type === 'balance_and_days' && (promo.traffic_gb || 0) > 0 && ( - +{promo.subscription_days} {t('admin.promocodes.form.days')} + +{promo.traffic_gb} {t('admin.promocodes.form.gb')} )} {promo.type === 'discount' && (