diff --git a/frontend/src/features/billing/PaidUntilBadge.tsx b/frontend/src/features/billing/PaidUntilBadge.tsx
index 2684e0b..5779ce5 100644
--- a/frontend/src/features/billing/PaidUntilBadge.tsx
+++ b/frontend/src/features/billing/PaidUntilBadge.tsx
@@ -6,10 +6,27 @@ const RED_THRESHOLD_DAYS = 3
const YELLOW_THRESHOLD_DAYS = 7
/** Цветовая индикация оплаченного периода: зелёный — обычный запас, жёлтый — ≤7 дней, красный —
- * ≤3 дней или уже истекло. Общий компонент для дашборда пользователя и списка пользователей в админке. */
-export function PaidUntilBadge({ paidUntil }: { paidUntil: string | null }) {
+ * ≤3 дней или уже истекло. Общий компонент для дашборда пользователя и списка пользователей в админке.
+ *
+ * `pendingReview` — есть заявка на оплату, ожидающая решения админа (`PaymentRequestStatus.AwaitingConfirmation`):
+ * конфиги не гасятся, пока админ не решит (см. BillingService), поэтому вместо тревожного "Истекло"
+ * показываем нейтральный статус — пользователю незачем переживать за то, что от него не зависит. */
+export function PaidUntilBadge({
+ paidUntil,
+ pendingReview,
+}: {
+ paidUntil: string | null
+ pendingReview?: boolean
+}) {
const { t } = useTranslation()
+ if (pendingReview)
+ return (
+
+ {t('billing.pendingReviewShort')}
+
+ )
+
if (!paidUntil) return {t('billing.neverPaidShort')}
const days = getDaysRemaining(paidUntil)
diff --git a/frontend/src/routes/billing.tsx b/frontend/src/routes/billing.tsx
index cd947db..6451cde 100644
--- a/frontend/src/routes/billing.tsx
+++ b/frontend/src/routes/billing.tsx
@@ -63,7 +63,12 @@ function BillingContent() {
? t('billing.paidUntil', { date: new Date(data.paidUntil).toLocaleDateString() })
: t('billing.neverPaid')}
- {data.paidUntil && }
+ {data.paidUntil && (
+
+ )}
diff --git a/frontend/src/routes/dashboard.tsx b/frontend/src/routes/dashboard.tsx
index 75b717a..dd93da0 100644
--- a/frontend/src/routes/dashboard.tsx
+++ b/frontend/src/routes/dashboard.tsx
@@ -45,7 +45,10 @@ function ConfigsList() {
{billingStatusQuery.data?.billingEnabled && (
{t('billing.paidUntilLabel')}
-
+
)}
diff --git a/frontend/src/shared/lib/i18n.ts b/frontend/src/shared/lib/i18n.ts
index 69c5862..0fb722a 100644
--- a/frontend/src/shared/lib/i18n.ts
+++ b/frontend/src/shared/lib/i18n.ts
@@ -114,6 +114,8 @@ const resources = {
daysRemaining: '{{count}} дн.',
hoursMinutesRemaining: '{{hours}} ч {{minutes}} мин',
minutesRemaining: '{{count}} мин',
+ pendingReviewShort: 'На проверке',
+ pendingReviewHint: 'Оплата отправлена на проверку администратору — доступ не будет приостановлен, пока заявка не решена.',
newRequest: 'Оформить оплату',
period: 'Период',
periods: {
@@ -638,6 +640,8 @@ const resources = {
daysRemaining: '{{count}}d',
hoursMinutesRemaining: '{{hours}}h {{minutes}}m',
minutesRemaining: '{{count}}m',
+ pendingReviewShort: 'Under review',
+ pendingReviewHint: 'Payment sent for admin review — access will not be suspended until the request is decided.',
newRequest: 'Set up payment',
period: 'Period',
periods: {