feat(api, agents, i18n): enhance settlement features and multi-language support

Added new types and API functions for settlement period summaries and credit ledgers, improving the management of agent settlements. Updated the admin console to reflect these changes, enhancing user experience with better navigation and data presentation. Additionally, expanded multi-language support by incorporating new translations in English, Nepali, and Chinese for settlement-related terms, ensuring consistency across the platform.
This commit is contained in:
2026-06-05 18:00:59 +08:00
parent 65eaeecf8c
commit af982bb9f7
73 changed files with 4307 additions and 2494 deletions

View File

@@ -17,6 +17,7 @@
"rulesPlaysTitle": "Play rules",
"rulesOddsTitle": "Odds & rebate",
"rulesOddsDescription": "Odds matrix and rebate rates on one page, sharing the same odds version line.",
"rulesOddsDescriptionShort": "Pick a play on the left, edit odds and rebate on the right, then save and publish.",
"riskCapTitle": "Risk cap rules"
},
"hub": {
@@ -411,6 +412,16 @@
"oddsConfig": "Odds"
},
"currentSelection": "Selection: {{category}} / {{play}}",
"playSelectPlaceholder": "Select play type",
"readOnlyBanner": "This version is read-only. Create a draft to edit odds and rebate.",
"table": {
"prizeScope": "Prize scope",
"multiplier": "Odds multiplier"
},
"draftBar": {
"unsaved": "Unsaved changes",
"saved": "Changes kept in local draft"
},
"playGroups": {
"bigSmall": "Big / small",
"combo4": "4D position",
@@ -420,10 +431,13 @@
},
"summary": {
"title": "Summary",
"version": "Version",
"contextTitle": "Version & tips",
"version": "Editing version",
"activeVersion": "Active version",
"statusLabel": "Status",
"readOnlyTag": "Read-only",
"readOnlyHint": "This version is read-only. Create a draft to make changes.",
"draftHint": "Save draft changes before publishing; publish affects new tickets only.",
"activeHint": "This version is active; new tickets use these settings."
},
"tabs": {

View File

@@ -27,6 +27,7 @@
"playerAllPlayersHint": "If no player is selected, the reconcile job will cover all players in the chosen date range.",
"createSummaryAll": "A manual reconcile will run for all players from {{from}} to {{to}}.",
"createSummaryPlayer": "A manual reconcile will run for player {{player}} from {{from}} to {{to}}.",
"createSummaryPending": "Choose a complete reconcile date range before creating a job.",
"jobsTitle": "Reconcile jobs",
"jobsDesc": "Use the action on the right to open paginated item details.",
"refresh": "Refresh",

View File

@@ -1,5 +1,50 @@
{
"title": "Settlement center",
"subtitle": "Period close, bill confirm, and payments",
"subtitleList": "Period list: open/close periods; summary columns included — use row actions for bills and bet ledger.",
"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"
},
"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": "Credit-line settlement",
"statusRunning": "Period open",
@@ -9,18 +54,16 @@
"subnav": {
"label": "Settlement center navigation"
},
"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": {
"aria": "Settlement center navigation",
"group": {
"hub": "Workbench",
"finance": "Finance",
"ledger": "Ledger",
"bills": "Bills"
},
"overview": "Overview",
"periods": "Periods",
"ledger": "Account ledger",
"bills": "Bills",
"ledger": "Account ledger",
"creditLedger": "Credit ledger",
"playerBills": "Player bills",
"agentBills": "Agent bills",
@@ -33,6 +76,7 @@
},
"filters": {
"period": "Period",
"statusAll": "All",
"allPeriods": "All periods",
"statusOpen": "Open",
"statusClosed": "Closed",
@@ -54,7 +98,9 @@
"badDebtIntro": "Bad debt write-off entries linked to original bills."
},
"creditLedger": {
"intro": "In-period credit holds, bill payments, adjustments, and bad debt. Use ⋯ on a row to confirm, record payment, adjust, reverse, or write off (when a bill is linked).",
"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",
@@ -83,9 +129,16 @@
"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",
"settlement_confirm": "Period confirm"
"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"
}
},
"columns": {
@@ -132,6 +185,51 @@
"viewBill": "View bill",
"billDetail": "Bill detail"
},
"billDisplay": {
"settlementFlow": "Who pays whom",
"settlementAmount": "Settlement amount",
"pays": "Pays",
"paysShort": "Pays",
"howAmountWorks": "How the amount is calculated",
"playerBreakdownIntro": "Players settle only with their direct agent: net = win/loss rebate.",
"agentBreakdownIntro": "Agents settle only with their upline: net = team net own share profit.",
"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": "{{agent}} share kept",
"agentShareKeepHint": "Profit retained at this tier by share ratio",
"agentNet": "{{agent}} pays upline",
"agentNetReceive": "Upline pays {{agent}}",
"billOwner": "Bill owner",
"billCounterparty": "Counterparty",
"unpaidPendingConfirm": "Confirm the bill before recording payment",
"unpaidAwaitingPayment": "Record offline payment",
"fullySettled": "Fully settled this period",
"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",
@@ -144,18 +242,34 @@
"optional": "Optional",
"billStatus": "Bill status",
"dateRange": "Date range",
"rowPosted": "Posted",
"category": {
"all": "All",
"credit": "Credit holds",
"payment": "Payments",
"adjustment": "Adjust / reverse",
"badDebt": "Bad debt",
"actionable": "Needs action"
}
"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",
@@ -179,12 +293,12 @@
"badDebt": { "title": "Bad debt" }
},
"empty": {
"noSite": "Select an integration site.",
"noPeriods": "Open and close a period under Periods first.",
"noSite": "Select a site.",
"noPeriods": "Close the current period first.",
"noClosed": "Close a period to generate bills.",
"noBadDebt": "No bad debt write-offs yet.",
"noCreditLedger": "No credit ledger rows in this period. Check credit players placed bets and the period date range.",
"billsNeedClose": "Share bills appear after period close. If credit ledger has rows but bills are empty, settle draws then close the period."
"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"

View File

@@ -3,9 +3,9 @@
"subnavLabel": "Wallet sub pages",
"subnavTransactions": "Main-site wallet txns",
"subnavTransferOrders": "Main-site transfers",
"scopeHint": "This area is for main-site wallet mode (wallet txns and transfers). For credit-line bet holds and settlement entries, see",
"scopeHintSettlementLink": "Settlement center → Credit ledger",
"scopeHintSettlement": "Settlement center → Credit ledger",
"scopeHint": "This area is for main-site wallet mode (wallet txns and transfers). For credit-line period settlement, see",
"scopeHintSettlementLink": "Settlement center",
"scopeHintSettlement": "Settlement center",
"ledgerChannel": "Ledger",
"ledgerCredit": "Credit ledger",
"ledgerWallet": "Wallet txn",