feat(agents, config, dashboard, i18n): add agent line provision wizard, site deletion, and site dashboard with multi-language support

Added agent line provision wizard page with permission gating, replacing redirect placeholder. Introduced site deletion API and UI with confirmation dialog in integration sites management. Added new site-scoped dashboard panel showing bet metrics, P/L trends, active players, and quick links. Enhanced chart tooltip to support custom formatters and fix indicator color
This commit is contained in:
2026-06-12 20:47:53 +08:00
parent 24fd7c10bd
commit 6ea0a6feec
48 changed files with 1573 additions and 629 deletions

View File

@@ -163,6 +163,8 @@
"account": "खाता सेटिङ",
"integration": "मुख्य साइट एकीकरण",
"agents": "एजेन्ट लाइन",
"agent_list": "एजेन्ट सूची",
"settlement_center": "सेटलमेन्ट केन्द्र",
"config": "सञ्चालन कन्फिगरेसन"
},
"sidebar": {

View File

@@ -153,6 +153,32 @@
"riskMonitor": "जोखिम निगरानी",
"systemSettings": "प्रणाली सेटिङ"
},
"site": {
"title": "साइट सारांश",
"subtitle": "{{name}} · यो साइट",
"todayBet": "आजको बाजी",
"todayProfit": "आजको नाफा/नोक्सान",
"sevenDayTitle": "पछिल्लो ७ दिन",
"sevenDayProfit": "७-दिने नाफा/नोक्सान",
"profitScopeHint": "साइट दायरा: बाजी माइनस भुक्तानी",
"activePlayersToday": "आज सक्रिय खेलाडी",
"betOrdersTodayHint": "आज {{count}} अर्डर",
"pendingBills": "बाँकी बिल",
"pendingUnpaid": "नतिरेको {{amount}}",
"latestBetAt": "पछिल्लो बाजी {{time}}",
"noBetToday": "आज अहिलेसम्म बाजी छैन",
"scaleTitle": "साइट परिमाण",
"agentCount": "एजेन्ट नोड",
"playerCount": "खेलाडी संख्या",
"topAgentToday": "आजको शीर्ष एजेन्ट: {{name}} ({{amount}})",
"quickLinks": {
"tickets": "टिकट",
"players": "खेलाडी",
"reports": "रिपोर्ट",
"agents": "एजेन्ट",
"bills": "सेटलमेन्ट"
}
},
"warnings": {
"drawPermission": "यो खातासँग ड्रअ/ड्यासबोर्ड हेर्ने अनुमति छैन। वित्तीय र जोखिम डाटा फिर्ता आएन।",
"walletPermission": "यो खातासँग वालेट मिलान हेर्ने अनुमति छैन। असामान्य ट्रान्सफर संख्या फिर्ता आएन।",

View File

@@ -0,0 +1,402 @@
{
"title": "सेटलमेन्ट केन्द्र",
"subtitle": "अवधि बन्द, बिल पुष्टि र भुक्तानी",
"subtitleList": "अवधि सूची: खोल्नुहोस्/बन्द गर्नुहोस्; सारांश स्तम्भहरू समावेश — बिल र बेट लेजरका लागि पङ्क्ति कार्य प्रयोग गर्नुहोस्।",
"period": {
"title": "Period",
"statusCompleted": "Completed",
"pipelineShare": "{{count}} ledger entries",
"billTodo": "Pending {{p}} · Awaiting {{a}}",
"openTitle": "Open period",
"openBtn": "Open period",
"closeNeedLedger": "No ledger activity yet. Complete draw settlement first.",
"closeDialogTitle": "Close period",
"closeDialogDesc": "Summarize {{range}} and generate bills.",
"closeDialogShare": "{{count}} ledger entries",
"closeDialogUnsettled": "{{count}} tickets still unsettled",
"closeDialogIrreversible": "Cannot undo. Use adjustments or reversals to fix errors.",
"closeDialogConfirm": "Close period",
"closeDialogEmpty": "No share ledger this period; closing will not generate bills."
},
"periodDetail": {
"back": "Back to periods",
"notFound": "Period not found or site changed. Go back to the list."
},
"periodTable": {
"title": "Periods",
"statusFilter": "Status",
"range": "Period",
"ledgerCount": "Ledger",
"pending": "Pending",
"awaiting": "Awaiting",
"shareLedger": "Share ledger",
"gameWinLoss": "Win/loss total",
"platformWinLoss": "Platform win/loss",
"agentWinLoss": "Agent win/loss",
"basicRebate": "Rebate total",
"unsettledTickets": "Unsettled tickets",
"openReportHint": "Open period: share/win-loss from in-period ledger; bill count updates after close.",
"viewDetail": "View details",
"close": "Close",
"closeNow": "Close now",
"hasOpen": "Period {{range}} is open. Close it before opening a new one.",
"emptyOpenHint": "No periods yet. Click Open period in the toolbar.",
"emptyReadOnly": "No period records.",
"emptyFiltered": "No rows match the filter. Reset filters.",
"emptyFilteredOpen": "The open period is hidden by the filter. Choose All or Open.",
"readOnlyHint": "Bound agent accounts cannot open or close site periods."
},
"header": {
"subtitle": "क्रेडिट-लाइन सेटलमेन्ट",
"statusRunning": "अवधि खुला",
"statusIdle": "कुनै खुला अवधि छैन",
"statusCompleted": "अवधि पूरा भयो"
},
"subnav": {
"label": "सेटलमेन्ट केन्द्र नेभिगेसन"
},
"workbench": {
"viewPeriod": "Period",
"closePreset": "Close · {{label}}",
"closeNoData": "Close failed: no share ledger in period. Run credit game settlement first.",
"openPeriodPipeline": "Open {{range}} · {{share}} share entries"
},
"nav": {
"periods": "अवधिहरू",
"bills": "बिलहरू",
"operations": "भुक्तानी र समायोजन",
"ledger": "लेजर",
"creditLedger": "क्रेडिट लेजर",
"playerBills": "Player bills",
"agentBills": "Agent bills",
"pendingConfirm": "Pending confirm",
"awaitingPayment": "Awaiting payment",
"payments": "Payment log",
"adjustments": "Adjust / reverse",
"badDebt": "Bad debt",
"reports": "Period reports"
},
"operations": {
"hint": "Payment registration, bad-debt write-offs, and adjustments. Player credit movements are under Account ledger.",
"adjustmentsTitle": "Adjustments / reversals / bad debt",
"loadFailed": "Failed to load payment and adjustment records",
"operationType": "Operation type",
"filterAllTypes": "All types",
"typePayment": "Payment",
"keyword": "Keyword",
"keywordPh": "Method, reason, proof, payer/payee"
},
"filters": {
"period": "Period",
"statusAll": "All",
"allPeriods": "All periods",
"statusOpen": "Open",
"statusClosed": "Closed",
"statusCompleted": "Completed"
},
"overview": {
"pendingConfirm": "Pending confirm",
"awaitingPayment": "Awaiting payment",
"totalUnpaid": "Total unpaid",
"openPeriod": "Open period",
"creditLedger": "Credit ledger (in period)",
"shareLedger": "Share ledger (in period)",
"pipelineHint": "Bills are created after period close; counts below are in-period activity."
},
"ledger": {
"groupIntro": "In-period money movements: credit holds, bill payments, adjustments, and bad debt. Share bills after close are under Bills.",
"paymentsIntro": "Confirmed bill payments (payment_records). Register from bill detail; this page is the period-wide log.",
"adjustmentsIntro": "Bill adjustments and reversals (settlement_adjustments).",
"badDebtIntro": "Bad debt write-off entries linked to original bills."
},
"creditLedger": {
"periodIntro": "Credit-line bets in this period: bet hold and draw settlement (merged per ticket).",
"emptyPeriod": "No bet ledger entries in this period. Ensure credit players placed bets and draws were settled.",
"intro": "Ledger entries for the selected period.",
"columns": {
"txn": "Txn ID",
"player": "Player",
"reason": "Type",
"ref": "Reference",
"amount": "Amount",
"channel": "Channel",
"status": "Status",
"time": "Time"
},
"channelCredit": "Credit line",
"viewPlayer": "Player detail",
"entryKind": {
"adjustment": "Adjustment"
},
"status": {
"posted": "Posted"
},
"actions": {
"viewPlayer": "Player detail",
"viewBill": "Bill detail",
"confirm": "Confirm bill",
"confirmDesc": "After confirm, the bill moves to awaiting payment.",
"payment": "Record payment",
"adjustment": "Adjust",
"reversal": "Reverse",
"badDebt": "Bad debt"
},
"reason": {
"payment_record": "Bill payment",
"bet_hold": "Bet hold",
"game_settlement": "Draw settlement",
"game_settlement_win": "Draw settlement credit",
"bet_hold_release": "Hold release",
"game_settlement_loss": "Draw settlement debit",
"settlement_payout": "Settlement payout",
"settlement_confirm": "Period confirm",
"adjustment": "Adjustment",
"reversal": "Reversal",
"bad_debt": "Bad debt",
"share_ledger": "Share ledger",
"freezeAmount": "Hold {{amount}}"
}
},
"columns": {
"period": "Period",
"type": "Type",
"owner": "Owner",
"counterparty": "Counterparty",
"gross": "Win/loss",
"net": "Net",
"paid": "Paid",
"unpaid": "Unpaid",
"status": "Status",
"billId": "Bill ID",
"payer": "Payer",
"payee": "Payee",
"amount": "Amount",
"method": "Method",
"time": "Time",
"summary": "Summary",
"detail": "Detail",
"adjustmentType": "Type",
"originalBill": "Original bill",
"reason": "Reason",
"badDebtAmount": "Write-off",
"playerAccount": "Player account",
"playerId": "Player ID",
"directAgent": "Direct agent",
"superiorAgent": "Upline agent",
"play": "Play",
"drawNo": "Draw no."
},
"billStatus": {
"pending_confirm": "Pending confirm",
"confirmed": "Confirmed",
"partial_paid": "Partial paid",
"settled": "Settled",
"overdue": "Overdue",
"reversed": "Reversed"
},
"billType": {
"adjustment": "Adjustment",
"reversal": "Reversal",
"badDebt": "Bad debt write-off"
},
"adjustmentType": {
"adjustment": "Adjustment",
"reversal": "Reversal",
"bad_debt": "Bad debt"
},
"paymentStatus": {
"pending": "Pending",
"confirmed": "Confirmed"
},
"actions": {
"detail": "Detail",
"viewBill": "View bill",
"billDetail": "Bill detail"
},
"billDisplay": {
"settlementFlow": "Who pays whom",
"settlementAmount": "Settlement amount",
"pays": "Pays",
"paysShort": "Pays",
"howAmountWorks": "Breakdown",
"payerLabel": "Payer",
"payeeLabel": "Payee",
"playerBreakdownIntro": "Players settle only with their direct agent: net = win/loss rebate.",
"agentBreakdownIntro": "Agents settle only with their upline: net = team net downline share own share.",
"playerGross": "Game win/loss",
"playerLostHint": "Player lost; owes agent",
"playerWonHint": "Player won; agent owes player",
"playerNet": "Player net payable",
"playerNetReceive": "Agent pays player",
"teamGross": "Team game win/loss",
"teamGrossHint": "Includes this agent and all downline players",
"teamGrossShort": "Team",
"playerGrossShort": "Player",
"teamRebate": "Team rebate",
"teamNet": "Team net",
"rebate": "Rebate",
"agentShareKeep": "Share kept at this tier",
"agentShareKeepHint": "Profit retained at this tier by share ratio",
"agentDownlineShare": "Downline share",
"agentDownlineShareHint": "Profit retained by downline agents (see breakdown below)",
"agentDownlineShareItem": "{{agent}} kept",
"agentNet": "Pay {{counterparty}}",
"agentNetReceive": "{{counterparty}} pays this tier",
"billOwner": "Bill owner",
"billCounterparty": "Counterparty",
"unpaidPendingConfirm": "Confirm the bill before recording payment",
"unpaidAwaitingPayment": "Record offline payment",
"fullySettled": "Fully settled this period",
"confirmHint": "Confirm the bill before recording payment.",
"recordReceiptFrom": "Record receipt ({{payer}} → {{payee}})",
"recordPayoutTo": "Record payout ({{payer}} → {{payee}})",
"rebateAllocationsHint": "How rebate is allocated across agent tiers.",
"payment": "Payment",
"flowHint": {
"playerPayAgent": "Player should settle with the direct agent",
"agentPayPlayer": "Direct agent should settle with the player",
"agentPayUpstream": "This agent should settle with upline / platform",
"upstreamPayAgent": "Upline / platform should settle with this agent",
"adjustment": "Adjustment settles separately and keeps the original bill relation",
"badDebt": "Write off unpaid amount and archive it as bad debt",
"reversal": "Reverse the original bill impact according to reversal rules",
"generic": "Apply payment or adjustment based on this bill relation"
},
"hierarchyHint": "One period creates multiple bills: players pay their agent first; each agent keeps share profit and remits the rest upline. Gross win/loss may match across rows while settlement amounts step down."
},
"ledgerPanel": {
"search": "Search",
"searchBtn": "Search",
"reset": "Reset filters",
"refresh": "Refresh page",
"filterAll": "Any",
"playerAccount": "Player account",
"playerAccountPh": "Username or site player ID",
"playerId": "Player ID",
"optional": "Optional",
"billStatus": "Bill status",
"dateRange": "Date range",
"rowPosted": "Posted"
},
"billsPanel": {
"intro": "Share bills after period close. Filter by type or status; open detail to confirm or record payment.",
"hierarchyHint": "One period creates multiple bills: players pay their agent first; each agent keeps share profit and remits the rest upline. Gross win/loss may match across rows while settlement amounts step down.",
"quickFilter": {
"title": "Which settlement layer do you want to review",
"desc": "Choose player or agent settlement first, then narrow by status or bill id.",
"allTitle": "All bills",
"allHint": "View player, agent, adjustment, and bad debt bills together",
"playerTitle": "Player settlement",
"playerHint": "Credit settlement between players and their direct agent",
"agentTitle": "Agent settlement",
"agentHint": "Tier settlement between agents and their upline / platform"
},
"activeHint": {
"all": "Current focus: all settlement documents in this period",
"player": "Current focus: credit settlement between players and direct agents",
"agent": "Current focus: payments between agents and their upline / platform"
},
"layer": {
"player": "Player vs direct agent",
"agent": "Agent vs upline / platform",
"adjustment": "Settlement adjustment",
"badDebt": "Bad debt archive",
"reversal": "Historical bill reversal",
"generic": "Settlement supporting document"
},
"category": {
"all": "All",
"player": "Player bills",
"agent": "Agent bills",
"pendingConfirm": "Pending confirm",
"awaitingPayment": "Awaiting payment"
},
"billId": "Bill ID",
"ownerKeyword": "Owner / counterparty",
"ownerKeywordPh": "Player account or agent name",
"status": "Bill status",
"billType": "Bill type",
"filterAll": "All statuses",
"filterAllTypes": "All types",
"filterAdjustment": "Adjust / reverse",
"optional": "Optional",
"searchBtn": "Search",
"reset": "Reset",
"refresh": "Refresh",
"clientFilterHint": "Owner filter: showing {{shown}} / {{total}}",
"emptyFiltered": "No bills match the filter. Try All statuses or reset.",
"emptyClosed": "Period closed but no bills. Often no settled credit tickets in range.",
"rowHint": {
"playerOwner": "Player owner",
"agentOwner": "Agent owner",
"adjustmentOwner": "Adjustment owner",
"badDebtOwner": "Bad debt owner",
"reversalOwner": "Reversal owner",
"playerUpline": "Player's upline agent",
"agentUpline": "Settlement upline"
}
},
"panels": {
"overview": {
"title": "Overview"
},
"ledger": {
"title": "Account ledger"
},
"bills": {
"title": "Bills"
},
"creditLedger": {
"title": "Credit ledger"
},
"playerBills": {
"title": "Player bills"
},
"agentBills": {
"title": "Agent bills"
},
"pendingConfirm": {
"title": "Pending confirm"
},
"awaiting": {
"title": "Awaiting payment"
},
"payments": {
"title": "Payment log"
},
"adjustments": {
"title": "Adjust / reverse"
},
"reports": {
"title": "Period reports"
},
"badDebt": {
"title": "Bad debt"
},
"workbench": {
"title": "Workbench"
}
},
"empty": {
"noSite": "Select a site.",
"noPeriods": "Close the current period first.",
"noClosed": "Close a period to generate bills.",
"noBadDebt": "No bad debt records.",
"noCreditLedger": "No ledger entries in this period.",
"billsNeedClose": "Bills are created after period close."
},
"periods": {
"loadFailed": "Failed to load periods"
},
"toast": {
"periodClosed": "Period closed",
"periodClosedUnsettled": "Period closed; {{count}} ticket(s) still unsettled."
},
"errors": {
"loadBills": "Failed to load bills",
"loadPayments": "Failed to load payments",
"loadAdjustments": "Failed to load adjustments",
"loadBadDebt": "Failed to load bad debt records",
"loadCreditLedger": "Failed to load credit ledger"
}
}