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

@@ -652,7 +652,69 @@
"referral_subscription_renewal": "Referral Subscription Renewal",
"referral_bonus": "Referral Bonus"
},
"disabled": "Referral program is currently disabled"
"disabled": "Referral program is currently disabled",
"partner": {
"becomePartner": "Become a Partner",
"becomePartnerDesc": "Apply for the partner program to get higher commission rates and the ability to withdraw your earnings.",
"applyButton": "Apply",
"applyTitle": "Partner Application",
"applyDesc": "Fill out the form below to apply for our partner program. All fields are optional.",
"underReview": "Application Under Review",
"underReviewDesc": "Your partner application is being reviewed. We'll notify you once a decision is made.",
"submittedAt": "Submitted on {{date}}",
"partnerStatus": "Partner",
"active": "Active",
"commissionInfo": "Your partner commission rate is {{percent}}%",
"rejected": "Application Rejected",
"reapplyButton": "Reapply",
"applying": "Submitting...",
"submitApplication": "Submit Application",
"applyError": "Failed to submit application. Please try again.",
"fields": {
"companyName": "Company Name",
"companyNamePlaceholder": "Your company or brand name",
"telegramChannel": "Telegram Channel",
"telegramChannelPlaceholder": "@yourchannel",
"websiteUrl": "Website URL",
"websiteUrlPlaceholder": "https://example.com",
"description": "Description",
"descriptionPlaceholder": "Tell us about your audience and how you plan to promote...",
"expectedReferrals": "Expected Monthly Referrals",
"expectedReferralsPlaceholder": "Estimated number per month"
}
},
"withdrawal": {
"title": "Withdrawal",
"goToWithdrawal": "Withdraw",
"available": "Available",
"totalEarned": "Total Earned",
"withdrawn": "Withdrawn",
"spent": "Spent on Services",
"pending": "Pending",
"requestButton": "Request Withdrawal",
"minAmount": "Minimum withdrawal amount: {{amount}}",
"history": "Withdrawal History",
"noHistory": "No withdrawal requests yet",
"requestTitle": "Request Withdrawal",
"requestDesc": "Available for withdrawal: {{available}}",
"requesting": "Submitting...",
"submitRequest": "Submit Request",
"requestError": "Failed to create withdrawal request. Please try again.",
"fields": {
"amount": "Amount (kopeks)",
"amountPlaceholder": "Enter amount in kopeks",
"amountHint": "Enter the amount in kopeks (100 kopeks = 1 {{currency}})",
"paymentDetails": "Payment Details",
"paymentDetailsPlaceholder": "Card number, wallet address, or other payment info..."
},
"status": {
"pending": "Pending",
"approved": "Approved",
"completed": "Completed",
"rejected": "Rejected",
"cancelled": "Cancelled"
}
}
},
"support": {
"title": "Support",
@@ -775,7 +837,9 @@
"promoGroups": "Discount Groups",
"trafficUsage": "Traffic Usage",
"updates": "Updates",
"pinnedMessages": "Pinned Messages"
"pinnedMessages": "Pinned Messages",
"partners": "Partners",
"withdrawals": "Withdrawals"
},
"panel": {
"title": "Admin Panel",
@@ -800,7 +864,9 @@
"promoGroupsDesc": "Discount groups for users",
"trafficUsageDesc": "Per-user traffic by nodes",
"updatesDesc": "Bot & cabinet versions",
"pinnedMessagesDesc": "Manage pinned messages for users"
"pinnedMessagesDesc": "Manage pinned messages for users",
"partnersDesc": "Manage partner applications and commissions",
"withdrawalsDesc": "Review and process withdrawal requests"
},
"trafficUsage": {
"title": "Traffic Usage",
@@ -1721,6 +1787,153 @@
"loadError": "Failed to load campaign",
"updateError": "Failed to save changes"
},
"withdrawals": {
"title": "Withdrawals",
"subtitle": "Manage withdrawal requests",
"noData": "No withdrawal requests",
"risk": "Risk:",
"overview": {
"pendingCount": "Pending",
"pendingAmount": "Pending amount",
"approvedCount": "Approved",
"completedCount": "Completed"
},
"filter": {
"all": "All",
"pending": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"completed": "Completed"
},
"status": {
"pending": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"completed": "Completed",
"cancelled": "Cancelled"
},
"detail": {
"title": "Withdrawal",
"loadError": "Failed to load withdrawal details",
"userInfo": "User Information",
"username": "Username",
"telegramId": "Telegram ID",
"balance": "Balance",
"totalReferrals": "Total referrals",
"totalEarnings": "Total earnings",
"createdAt": "Created",
"paymentDetails": "Payment Details",
"noPaymentDetails": "No payment details provided",
"riskAnalysis": "Risk Analysis",
"riskScore": "Risk score",
"riskLevel": {
"low": "Low",
"medium": "Medium",
"high": "High",
"critical": "Critical"
},
"flags": "Flags",
"balanceStats": "Balance Statistics",
"referralDeposits": "Referral Deposits",
"suspiciousReferrals": "Suspicious Referrals",
"earningsByReason": "Earnings by Reason",
"adminComment": "Admin Comment",
"processedAt": "Processed at",
"approve": "Approve",
"approving": "Approving...",
"reject": "Reject",
"rejecting": "Rejecting...",
"complete": "Mark as Completed",
"completing": "Completing...",
"rejectTitle": "Reject withdrawal?",
"rejectDescription": "Optionally add a comment explaining the reason for rejection.",
"commentPlaceholder": "Reason for rejection (optional)...",
"confirmReject": "Confirm Rejection"
}
},
"partners": {
"title": "Partners",
"subtitle": "Partner management and applications",
"totalPartners": "Total partners",
"pendingApplications": "Pending applications",
"totalReferrals": "Total referrals",
"totalEarnings": "Total earnings",
"tabs": {
"partners": "Partners",
"applications": "Applications"
},
"noPartners": "No partners yet",
"noApplications": "No pending applications",
"commission": "{{percent}}% commission",
"referrals": "{{count}} referrals",
"actions": {
"approve": "Approve",
"reject": "Reject"
},
"applicationFields": {
"website": "Website",
"channel": "Channel",
"description": "Description",
"expectedReferrals": "Expected referrals/mo"
},
"approveDialog": {
"title": "Approve Application",
"description": "Approve partner application from {{name}}",
"commissionLabel": "Commission (%)"
},
"rejectDialog": {
"title": "Reject Application",
"description": "Reject partner application from {{name}}",
"commentLabel": "Comment (optional)",
"commentPlaceholder": "Reason for rejection..."
}
},
"partnerDetail": {
"title": "Partner Details",
"loadError": "Failed to load partner details",
"status": {
"approved": "Active",
"pending": "Pending",
"rejected": "Rejected",
"none": "Not a partner"
},
"stats": {
"totalReferrals": "Total referrals",
"paidReferrals": "Paid referrals",
"activeReferrals": "Active referrals",
"conversionRate": "Conversion"
},
"earnings": {
"title": "Earnings",
"allTime": "All time",
"today": "Today",
"week": "This week",
"month": "This month"
},
"commission": {
"title": "Commission",
"update": "Update"
},
"campaigns": {
"title": "Assigned Campaigns",
"noCampaigns": "No campaigns assigned",
"active": "Active",
"inactive": "Inactive"
},
"dangerZone": {
"title": "Danger Zone",
"revokeButton": "Revoke Partner Status"
},
"commissionDialog": {
"title": "Update Commission",
"description": "Set a new commission percentage for this partner.",
"label": "Commission (%)"
},
"revokeDialog": {
"title": "Revoke Partner Status?",
"description": "This will remove partner privileges. The partner will no longer earn commissions from referrals."
}
},
"promocodes": {
"title": "Promo Codes",
"subtitle": "Manage promo codes and discount groups",