feat: add partner management and withdrawal admin pages

- Admin partners page: list partners, view applications, approve/reject
- Admin partner detail: stats, commission management, campaign assignment
- Admin withdrawals page: list with risk scoring, status filters including cancelled
- Admin withdrawal detail: fraud analysis, approve/reject/complete actions
- Partner API client with full TypeScript interfaces
- Withdrawal API client with admin and user endpoints
- Referral page: partner application form, withdrawal balance and history
- Navigation: partners and withdrawals in admin panel marketing group
- i18n: full translations for ru, en, zh, fa locales
- Neutral fallbacks for unknown status badges
This commit is contained in:
Fringg
2026-02-17 09:51:48 +03:00
parent e0dd21fd0b
commit 779fbf0dc6
13 changed files with 3322 additions and 15 deletions

View File

@@ -679,7 +679,69 @@
"referral_subscription_renewal": "Продление подписки реферала",
"referral_bonus": "Бонус за реферала"
},
"disabled": "Реферальная программа временно отключена"
"disabled": "Реферальная программа временно отключена",
"partner": {
"becomePartner": "Стать партнером",
"becomePartnerDesc": "Подайте заявку на партнерскую программу, чтобы получить повышенную комиссию и возможность вывода заработка.",
"applyButton": "Подать заявку",
"applyTitle": "Заявка на партнерство",
"applyDesc": "Заполните форму ниже для подачи заявки на партнерскую программу. Все поля необязательные.",
"underReview": "Заявка на рассмотрении",
"underReviewDesc": "Ваша заявка на партнерство рассматривается. Мы уведомим вас, когда будет принято решение.",
"submittedAt": "Подана {{date}}",
"partnerStatus": "Партнер",
"active": "Активен",
"commissionInfo": "Ваша партнерская комиссия составляет {{percent}}%",
"rejected": "Заявка отклонена",
"reapplyButton": "Подать заново",
"applying": "Отправка...",
"submitApplication": "Отправить заявку",
"applyError": "Не удалось отправить заявку. Попробуйте снова.",
"fields": {
"companyName": "Название компании",
"companyNamePlaceholder": "Название вашей компании или бренда",
"telegramChannel": "Telegram-канал",
"telegramChannelPlaceholder": "@вашканал",
"websiteUrl": "Сайт",
"websiteUrlPlaceholder": "https://example.com",
"description": "Описание",
"descriptionPlaceholder": "Расскажите о вашей аудитории и планах продвижения...",
"expectedReferrals": "Ожидаемое количество рефералов в месяц",
"expectedReferralsPlaceholder": "Примерное количество в месяц"
}
},
"withdrawal": {
"title": "Вывод средств",
"goToWithdrawal": "Вывести",
"available": "Доступно",
"totalEarned": "Всего заработано",
"withdrawn": "Выведено",
"spent": "Потрачено на услуги",
"pending": "В обработке",
"requestButton": "Запросить вывод",
"minAmount": "Минимальная сумма вывода: {{amount}}",
"history": "История выводов",
"noHistory": "Запросов на вывод пока нет",
"requestTitle": "Запрос на вывод",
"requestDesc": "Доступно для вывода: {{available}}",
"requesting": "Отправка...",
"submitRequest": "Отправить запрос",
"requestError": "Не удалось создать запрос на вывод. Попробуйте снова.",
"fields": {
"amount": "Сумма (копейки)",
"amountPlaceholder": "Введите сумму в копейках",
"amountHint": "Введите сумму в копейках (100 копеек = 1 {{currency}})",
"paymentDetails": "Реквизиты для оплаты",
"paymentDetailsPlaceholder": "Номер карты, адрес кошелька или другие реквизиты..."
},
"status": {
"pending": "В обработке",
"approved": "Одобрен",
"completed": "Завершен",
"rejected": "Отклонен",
"cancelled": "Отменен"
}
}
},
"support": {
"title": "Поддержка",
@@ -796,7 +858,9 @@
"promoGroups": "Группы скидок",
"trafficUsage": "Расход трафика",
"updates": "Обновления",
"pinnedMessages": "Закреплённые"
"pinnedMessages": "Закреплённые",
"partners": "Партнёры",
"withdrawals": "Выводы"
},
"panel": {
"title": "Панель администратора",
@@ -821,7 +885,9 @@
"promoGroupsDesc": "Группы скидок для пользователей",
"trafficUsageDesc": "Трафик пользователей по нодам",
"updatesDesc": "Версии бота и кабинета",
"pinnedMessagesDesc": "Управление закреплёнными сообщениями"
"pinnedMessagesDesc": "Управление закреплёнными сообщениями",
"partnersDesc": "Управление заявками партнёров и комиссиями",
"withdrawalsDesc": "Проверка и обработка заявок на вывод"
},
"trafficUsage": {
"title": "Расход трафика",
@@ -2243,6 +2309,153 @@
"loadError": "Не удалось загрузить кампанию",
"updateError": "Не удалось сохранить изменения"
},
"withdrawals": {
"title": "Выводы средств",
"subtitle": "Управление заявками на вывод",
"noData": "Нет заявок на вывод",
"risk": "Риск:",
"overview": {
"pendingCount": "Ожидают",
"pendingAmount": "Сумма ожидания",
"approvedCount": "Одобрено",
"completedCount": "Выполнено"
},
"filter": {
"all": "Все",
"pending": "Ожидание",
"approved": "Одобрено",
"rejected": "Отклонено",
"completed": "Выполнено"
},
"status": {
"pending": "Ожидание",
"approved": "Одобрено",
"rejected": "Отклонено",
"completed": "Выполнено",
"cancelled": "Отменено"
},
"detail": {
"title": "Заявка на вывод",
"loadError": "Не удалось загрузить детали заявки",
"userInfo": "Информация о пользователе",
"username": "Имя пользователя",
"telegramId": "Telegram ID",
"balance": "Баланс",
"totalReferrals": "Всего рефералов",
"totalEarnings": "Общий заработок",
"createdAt": "Создано",
"paymentDetails": "Реквизиты для оплаты",
"noPaymentDetails": "Реквизиты не указаны",
"riskAnalysis": "Анализ рисков",
"riskScore": "Оценка риска",
"riskLevel": {
"low": "Низкий",
"medium": "Средний",
"high": "Высокий",
"critical": "Критический"
},
"flags": "Флаги",
"balanceStats": "Статистика баланса",
"referralDeposits": "Депозиты рефералов",
"suspiciousReferrals": "Подозрительные рефералы",
"earningsByReason": "Доходы по причинам",
"adminComment": "Комментарий администратора",
"processedAt": "Обработано",
"approve": "Одобрить",
"approving": "Одобрение...",
"reject": "Отклонить",
"rejecting": "Отклонение...",
"complete": "Отметить как выполнено",
"completing": "Завершение...",
"rejectTitle": "Отклонить заявку?",
"rejectDescription": "При необходимости добавьте комментарий с причиной отклонения.",
"commentPlaceholder": "Причина отклонения (необязательно)...",
"confirmReject": "Подтвердить отклонение"
}
},
"partners": {
"title": "Партнёры",
"subtitle": "Управление партнёрами и заявками",
"totalPartners": "Всего партнёров",
"pendingApplications": "Заявок на рассмотрении",
"totalReferrals": "Всего рефералов",
"totalEarnings": "Всего заработано",
"tabs": {
"partners": "Партнёры",
"applications": "Заявки"
},
"noPartners": "Партнёров пока нет",
"noApplications": "Нет заявок на рассмотрении",
"commission": "{{percent}}% комиссия",
"referrals": "{{count}} рефералов",
"actions": {
"approve": "Одобрить",
"reject": "Отклонить"
},
"applicationFields": {
"website": "Сайт",
"channel": "Канал",
"description": "Описание",
"expectedReferrals": "Ожидаемых рефералов/мес"
},
"approveDialog": {
"title": "Одобрить заявку",
"description": "Одобрить партнёрскую заявку от {{name}}",
"commissionLabel": "Комиссия (%)"
},
"rejectDialog": {
"title": "Отклонить заявку",
"description": "Отклонить партнёрскую заявку от {{name}}",
"commentLabel": "Комментарий (необязательно)",
"commentPlaceholder": "Причина отклонения..."
}
},
"partnerDetail": {
"title": "Детали партнёра",
"loadError": "Не удалось загрузить данные партнёра",
"status": {
"approved": "Активен",
"pending": "На рассмотрении",
"rejected": "Отклонён",
"none": "Не партнёр"
},
"stats": {
"totalReferrals": "Всего рефералов",
"paidReferrals": "Оплативших",
"activeReferrals": "Активных",
"conversionRate": "Конверсия"
},
"earnings": {
"title": "Заработок",
"allTime": "За всё время",
"today": "Сегодня",
"week": "За неделю",
"month": "За месяц"
},
"commission": {
"title": "Комиссия",
"update": "Изменить"
},
"campaigns": {
"title": "Привязанные кампании",
"noCampaigns": "Нет привязанных кампаний",
"active": "Активна",
"inactive": "Неактивна"
},
"dangerZone": {
"title": "Опасная зона",
"revokeButton": "Отозвать партнёрский статус"
},
"commissionDialog": {
"title": "Изменить комиссию",
"description": "Установите новый процент комиссии для этого партнёра.",
"label": "Комиссия (%)"
},
"revokeDialog": {
"title": "Отозвать статус партнёра?",
"description": "Это лишит партнёра привилегий. Партнёр больше не будет получать комиссию от рефералов."
}
},
"promocodes": {
"title": "Промокоды",
"subtitle": "Управление промокодами и группами скидок",