{"id":1554,"date":"2026-03-16T09:23:59","date_gmt":"2026-03-16T09:23:59","guid":{"rendered":"https:\/\/cricketpromo.com\/?page_id=1554"},"modified":"2026-03-16T09:39:58","modified_gmt":"2026-03-16T09:39:58","slug":"bj_rms","status":"publish","type":"page","link":"https:\/\/cricketpromo.com\/ur\/bj_rms\/","title":{"rendered":"bj_rms"},"content":{"rendered":"
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\r\n\r\n\r\n \r\n \r\n Betjee Pakistan - Risk Management System<\/title>\r\n\r\n <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/PapaParse\/5.4.1\/papaparse.min.js\"><\/script>\r\n <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\r\n <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\r\n\r\n <style>\r\n :root {\r\n --bg: #0a0e1a;\r\n --card: #111827;\r\n --card2: #1a2236;\r\n --border: #1e293b;\r\n --t1: #f1f5f9;\r\n --t2: #94a3b8;\r\n --blue: #3b82f6;\r\n --green: #10b981;\r\n --red: #ef4444;\r\n --yellow: #f59e0b;\r\n --purple: #8b5cf6;\r\n --orange: #f97316;\r\n --cyan: #06b6d4;\r\n }\r\n\r\n * { margin: 0; padding: 0; box-sizing: border-box; }\r\n\r\n body {\r\n background: var(--bg);\r\n color: var(--t1);\r\n font-family: \"Segoe UI\", system-ui, sans-serif;\r\n }\r\n\r\n .header {\r\n background: linear-gradient(135deg, #1e1b4b, #0f172a 50%, #0c1220);\r\n padding: 20px 30px;\r\n border-bottom: 1px solid var(--border);\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n\r\n .header h1 {\r\n font-size: 22px;\r\n font-weight: 700;\r\n background: linear-gradient(135deg, var(--blue), var(--cyan));\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n }\r\n\r\n .header .sub { color: var(--t2); font-size: 13px; margin-top: 2px; }\r\n\r\n .btn {\r\n padding: 8px 16px;\r\n border-radius: 8px;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 13px;\r\n font-weight: 600;\r\n transition: all 0.2s;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n\r\n .btn-p { background: var(--blue); color: #fff; }\r\n .btn-p:hover { background: #2563eb; }\r\n .btn-g { background: var(--green); color: #fff; }\r\n .btn-g:hover { background: #059669; }\r\n .btn-r { background: var(--red); color: #fff; }\r\n\r\n .nav {\r\n background: var(--card);\r\n border-bottom: 1px solid var(--border);\r\n padding: 0 30px;\r\n display: flex;\r\n overflow-x: auto;\r\n }\r\n\r\n .nav-item {\r\n padding: 14px 20px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: var(--t2);\r\n border-bottom: 2px solid transparent;\r\n white-space: nowrap;\r\n transition: all 0.2s;\r\n }\r\n\r\n .nav-item:hover { color: var(--t1); background: rgba(59, 130, 246, 0.05); }\r\n .nav-item.active { color: var(--blue); border-bottom-color: var(--blue); }\r\n\r\n .container { padding: 24px 30px; }\r\n .section { display: none; }\r\n .section.active { display: block; }\r\n\r\n .kpi-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: 16px;\r\n margin-bottom: 24px;\r\n }\r\n\r\n .kpi-card {\r\n background: var(--card);\r\n border: 1px solid var(--border);\r\n border-radius: 12px;\r\n padding: 20px;\r\n transition: all 0.2s;\r\n }\r\n\r\n .kpi-card:hover {\r\n border-color: var(--blue);\r\n transform: translateY(-2px);\r\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n .kpi-label {\r\n font-size: 12px;\r\n color: var(--t2);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-bottom: 8px;\r\n }\r\n\r\n .kpi-value { font-size: 26px; font-weight: 700; }\r\n\r\n .chart-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));\r\n gap: 20px;\r\n margin-bottom: 24px;\r\n }\r\n\r\n .chart-card {\r\n background: var(--card);\r\n border: 1px solid var(--border);\r\n border-radius: 12px;\r\n padding: 20px;\r\n }\r\n\r\n .chart-card h3 { font-size: 15px; font-weight: 600; margin-bottom: 16px; }\r\n .chart-container { position: relative; height: 280px; }\r\n\r\n .badge {\r\n padding: 3px 10px;\r\n border-radius: 20px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n display: inline-block;\r\n }\r\n\r\n .badge-critical { background: rgba(220, 38, 38, 0.15); color: #fca5a5; border: 1px solid rgba(220, 38, 38, 0.3); }\r\n .badge-high { background: rgba(249, 115, 22, 0.15); color: #fdba74; border: 1px solid rgba(249, 115, 22, 0.3); }\r\n .badge-medium { background: rgba(234, 179, 8, 0.15); color: #fde047; border: 1px solid rgba(234, 179, 8, 0.3); }\r\n .badge-low { background: rgba(59, 130, 246, 0.15); color: #93c5fd; border: 1px solid rgba(59, 130, 246, 0.3); }\r\n .badge-normal { background: rgba(16, 185, 129, 0.15); color: #6ee7b7; border: 1px solid rgba(16, 185, 129, 0.3); }\r\n .badge-fraud { background: rgba(220, 38, 38, 0.25); color: #fca5a5; border: 1px solid rgba(220, 38, 38, 0.5); }\r\n\r\n .tw {\r\n background: var(--card);\r\n border: 1px solid var(--border);\r\n border-radius: 12px;\r\n overflow: hidden;\r\n margin-bottom: 24px;\r\n }\r\n\r\n .tw-h {\r\n padding: 16px 20px;\r\n border-bottom: 1px solid var(--border);\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n }\r\n\r\n .tw-h h3 { font-size: 15px; font-weight: 600; }\r\n .ts { overflow-x: auto; max-height: 600px; overflow-y: auto; }\r\n\r\n table { width: 100%; border-collapse: collapse; font-size: 12px; }\r\n\r\n th {\r\n background: #0f172a;\r\n padding: 10px 14px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--t2);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n font-size: 11px;\r\n position: sticky;\r\n top: 0;\r\n z-index: 1;\r\n }\r\n\r\n td { padding: 10px 14px; border-top: 1px solid var(--border); }\r\n tr:hover { background: var(--card2); }\r\n\r\n .tr { text-align: right; }\r\n .tg { color: var(--green); }\r\n .tre { color: var(--red); }\r\n\r\n .sb,\r\n .fs {\r\n background: #0f172a;\r\n border: 1px solid var(--border);\r\n border-radius: 8px;\r\n padding: 8px 14px;\r\n color: var(--t1);\r\n font-size: 13px;\r\n outline: none;\r\n }\r\n\r\n .sb { width: 250px; }\r\n .sb:focus, .fs:focus { border-color: var(--blue); }\r\n .sb::placeholder { color: #475569; }\r\n\r\n .risk-summary {\r\n display: grid;\r\n grid-template-columns: repeat(5, 1fr);\r\n gap: 12px;\r\n margin-bottom: 24px;\r\n }\r\n\r\n .rc {\r\n padding: 16px;\r\n border-radius: 10px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n }\r\n\r\n .rc:hover { transform: scale(1.03); }\r\n .rc .cnt { font-size: 32px; font-weight: 700; }\r\n .rc .lbl { font-size: 12px; margin-top: 4px; opacity: 0.8; }\r\n\r\n .rc-c { background: linear-gradient(135deg, rgba(220, 38, 38, 0.2), rgba(220, 38, 38, 0.05)); border: 1px solid rgba(220, 38, 38, 0.3); color: #fca5a5; }\r\n .rc-h { background: linear-gradient(135deg, rgba(249, 115, 22, 0.2), rgba(249, 115, 22, 0.05)); border: 1px solid rgba(249, 115, 22, 0.3); color: #fdba74; }\r\n .rc-m { background: linear-gradient(135deg, rgba(234, 179, 8, 0.2), rgba(234, 179, 8, 0.05)); border: 1px solid rgba(234, 179, 8, 0.3); color: #fde047; }\r\n .rc-l { background: linear-gradient(135deg, rgba(59, 130, 246, 0.2), rgba(59, 130, 246, 0.05)); border: 1px solid rgba(59, 130, 246, 0.3); color: #93c5fd; }\r\n .rc-n { background: linear-gradient(135deg, rgba(16, 185, 129, 0.2), rgba(16, 185, 129, 0.05)); border: 1px solid rgba(16, 185, 129, 0.3); color: #6ee7b7; }\r\n\r\n .flag-tag {\r\n display: inline-block;\r\n padding: 2px 7px;\r\n margin: 1px 2px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n background: rgba(139, 92, 246, 0.15);\r\n color: #c4b5fd;\r\n border: 1px solid rgba(139, 92, 246, 0.3);\r\n }\r\n\r\n .alert-bar {\r\n background: linear-gradient(135deg, rgba(220, 38, 38, 0.15), rgba(220, 38, 38, 0.05));\r\n border: 1px solid rgba(220, 38, 38, 0.3);\r\n border-radius: 10px;\r\n padding: 14px 20px;\r\n margin-bottom: 20px;\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n }\r\n\r\n .alert-bar .txt { font-size: 13px; color: #fca5a5; }\r\n .alert-bar .txt strong { color: #fff; }\r\n\r\n .fr {\r\n display: flex;\r\n gap: 10px;\r\n margin-bottom: 16px;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n }\r\n\r\n .upload-screen {\r\n min-height: calc(100vh - 80px);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 40px;\r\n }\r\n\r\n .upload-title { font-size: 28px; font-weight: 700; margin-bottom: 8px; text-align: center; }\r\n .upload-sub { color: var(--t2); font-size: 14px; margin-bottom: 40px; text-align: center; }\r\n\r\n .upload-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 16px;\r\n max-width: 1050px;\r\n width: 100%;\r\n margin-bottom: 30px;\r\n }\r\n\r\n .upload-slot {\r\n background: var(--card);\r\n border: 2px dashed #334155;\r\n border-radius: 12px;\r\n padding: 24px;\r\n text-align: center;\r\n transition: all 0.3s;\r\n cursor: pointer;\r\n position: relative;\r\n min-height: 160px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .upload-slot:hover { border-color: var(--blue); background: var(--card2); }\r\n .upload-slot.loaded { border-color: var(--green); border-style: solid; background: rgba(16, 185, 129, 0.05); }\r\n\r\n .upload-slot .icon { font-size: 32px; margin-bottom: 10px; }\r\n .upload-slot .name { font-size: 14px; font-weight: 600; margin-bottom: 4px; }\r\n .upload-slot .desc { font-size: 11px; color: var(--t2); }\r\n\r\n .upload-slot .status { font-size: 12px; margin-top: 8px; font-weight: 600; }\r\n .upload-slot .status.ok { color: var(--green); }\r\n .upload-slot .status.pending { color: var(--t2); }\r\n\r\n .upload-slot input {\r\n position: absolute;\r\n inset: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n }\r\n\r\n .upload-actions { display: flex; gap: 16px; align-items: center; margin-top: 10px; }\r\n\r\n .btn-launch {\r\n padding: 14px 40px;\r\n border-radius: 12px;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 16px;\r\n font-weight: 700;\r\n background: linear-gradient(135deg, var(--blue), var(--cyan));\r\n color: #fff;\r\n transition: all 0.2s;\r\n opacity: 0.5;\r\n pointer-events: none;\r\n }\r\n\r\n .btn-launch.ready { opacity: 1; pointer-events: auto; }\r\n .btn-launch.ready:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 8px 25px rgba(59, 130, 246, 0.3);\r\n }\r\n\r\n .upload-note { color: var(--t2); font-size: 12px; margin-top: 20px; text-align: center; }\r\n\r\n .dashboard-wrap { display: none; }\r\n\r\n .login-gate {\r\n min-height: calc(100vh - 80px);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 24px;\r\n }\r\n\r\n .login-card {\r\n width: 100%;\r\n max-width: 420px;\r\n background: var(--card);\r\n border: 1px solid var(--border);\r\n border-radius: 14px;\r\n padding: 24px;\r\n box-shadow: 0 15px 40px rgba(0, 0, 0, 0.35);\r\n }\r\n\r\n .login-card h2 {\r\n font-size: 24px;\r\n margin-bottom: 6px;\r\n }\r\n\r\n .login-card p {\r\n color: var(--t2);\r\n font-size: 13px;\r\n margin-bottom: 16px;\r\n }\r\n\r\n .login-input {\r\n width: 100%;\r\n background: #0f172a;\r\n border: 1px solid var(--border);\r\n color: var(--t1);\r\n border-radius: 10px;\r\n padding: 12px 14px;\r\n margin-bottom: 10px;\r\n outline: none;\r\n font-size: 14px;\r\n }\r\n\r\n .login-input:focus { border-color: var(--blue); }\r\n\r\n .login-btn {\r\n width: 100%;\r\n border: none;\r\n border-radius: 10px;\r\n padding: 12px 14px;\r\n cursor: pointer;\r\n font-weight: 700;\r\n color: #fff;\r\n background: linear-gradient(135deg, var(--blue), var(--cyan));\r\n }\r\n\r\n .login-err {\r\n min-height: 18px;\r\n margin-top: 10px;\r\n color: #fca5a5;\r\n font-size: 12px;\r\n }\r\n\r\n ::-webkit-scrollbar { width: 6px; height: 6px; }\r\n ::-webkit-scrollbar-track { background: var(--bg); }\r\n ::-webkit-scrollbar-thumb { background: #334155; border-radius: 3px; }\r\n\r\n @media (max-width: 768px) {\r\n .kpi-grid { grid-template-columns: repeat(2, 1fr); }\r\n .chart-grid { grid-template-columns: 1fr; }\r\n .risk-summary { grid-template-columns: repeat(3, 1fr); }\r\n .upload-grid { grid-template-columns: 1fr; }\r\n .container { padding: 16px; }\r\n }\r\n <\/style>\r\n<\/head>\r\n<body>\r\n <div class=\"header\">\r\n <div>\r\n <h1>BETJEE PK - Risk Management System<\/h1>\r\n <div class=\"sub\">Player Behavior Tracking & Risk Analysis Dashboard<\/div>\r\n <\/div>\r\n <div style=\"display:flex;align-items:center;gap:10px\">\r\n <span style=\"color:var(--t2);font-size:12px\" id=\"dateLabel\"><\/span>\r\n <button class=\"btn btn-r\" id=\"logoutBtn\" style=\"display:none\" onclick=\"logout()\">Logout<\/button>\r\n <\/div>\r\n <\/div>\r\n\r\n <div id=\"loginGate\" class=\"login-gate\">\r\n <div class=\"login-card\">\r\n <h2>Risk Dashboard Login<\/h2>\r\n <p>Enter your credentials to continue<\/p>\r\n <form onsubmit=\"attemptLogin(event)\" action=\"\">\r\n <input id=\"loginUser\" class=\"login-input\" type=\"text\" placeholder=\"Username\" autocomplete=\"username\" \/>\r\n <input id=\"loginPass\" class=\"login-input\" type=\"password\" placeholder=\"Password\" autocomplete=\"current-password\" \/>\r\n <button type=\"submit\" class=\"login-btn\">Login<\/button>\r\n <input type=\"hidden\" name=\"trp-form-language\" value=\"ur\"\/><\/form>\r\n <div id=\"loginErr\" class=\"login-err\"><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div id=\"appContent\" style=\"display:none\">\r\n <div id=\"uploadScreen\" class=\"upload-screen\">\r\n <div class=\"upload-title\">Upload Daily CSV Files<\/div>\r\n <div class=\"upload-sub\">Drop or click to upload your 6 data files to generate the risk dashboard<\/div>\r\n\r\n <div class=\"upload-grid\">\r\n <div class=\"upload-slot\" id=\"slot-pp\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'pp')\" \/>\r\n <div class=\"icon\">📊<\/div>\r\n <div class=\"name\">Player Performance<\/div>\r\n <div class=\"desc\">playerPerformance.csv<\/div>\r\n <div class=\"status pending\" id=\"status-pp\">Waiting...<\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-slot\" id=\"slot-turnover\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'turnover')\" \/>\r\n <div class=\"icon\">🎰<\/div>\r\n <div class=\"name\">Turnover<\/div>\r\n <div class=\"desc\">turnover.csv<\/div>\r\n <div class=\"status pending\" id=\"status-turnover\">Waiting...<\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-slot\" id=\"slot-bonus\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'bonus')\" \/>\r\n <div class=\"icon\">🎁<\/div>\r\n <div class=\"name\">Bonus<\/div>\r\n <div class=\"desc\">bonus.csv<\/div>\r\n <div class=\"status pending\" id=\"status-bonus\">Waiting...<\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-slot\" id=\"slot-deposit\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'deposit')\" \/>\r\n <div class=\"icon\">💵<\/div>\r\n <div class=\"name\">Deposit<\/div>\r\n <div class=\"desc\">deposit.csv<\/div>\r\n <div class=\"status pending\" id=\"status-deposit\">Waiting...<\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-slot\" id=\"slot-withdrawal\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'withdrawal')\" \/>\r\n <div class=\"icon\">💸<\/div>\r\n <div class=\"name\">Withdrawal<\/div>\r\n <div class=\"desc\">withdrawal.csv<\/div>\r\n <div class=\"status pending\" id=\"status-withdrawal\">Waiting...<\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-slot\" id=\"slot-fraud\">\r\n <input type=\"file\" accept=\".csv\" onchange=\"handleFile(this,'fraud')\" \/>\r\n <div class=\"icon\">🚨<\/div>\r\n <div class=\"name\">Fraud Tool<\/div>\r\n <div class=\"desc\">fraudTool.csv<\/div>\r\n <div class=\"status pending\" id=\"status-fraud\">Waiting...<\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"upload-actions\">\r\n <button class=\"btn-launch\" id=\"launchBtn\" onclick=\"launchDashboard()\">Launch Dashboard<\/button>\r\n <\/div>\r\n\r\n <div class=\"upload-note\">Files are processed locally in your browser. No data is sent to any server.<\/div>\r\n <\/div>\r\n\r\n <div class=\"dashboard-wrap\" id=\"dashboardWrap\">\r\n <div class=\"nav\" id=\"mainNav\">\r\n <div class=\"nav-item active\" data-sec=\"overview\">Overview<\/div>\r\n <div class=\"nav-item\" data-sec=\"risk\">Risk Analysis<\/div>\r\n <div class=\"nav-item\" data-sec=\"players\">All Players<\/div>\r\n <div class=\"nav-item\" data-sec=\"deposits\">Deposits<\/div>\r\n <div class=\"nav-item\" data-sec=\"withdrawals\">Withdrawals<\/div>\r\n <div class=\"nav-item\" data-sec=\"bonuses\">Bonuses<\/div>\r\n <div class=\"nav-item\" data-sec=\"turnover\">Turnover<\/div>\r\n <div class=\"nav-item\" data-sec=\"fraud\">Fraud Alerts<\/div>\r\n <div class=\"nav-item\" style=\"margin-left:auto;color:var(--orange)\" onclick=\"resetUpload()\">🔄 Upload New Files<\/div>\r\n <\/div>\r\n\r\n <div class=\"container\">\r\n <div class=\"section active\" id=\"sec-overview\">\r\n <div class=\"alert-bar\" id=\"alertBar\"><\/div>\r\n <div class=\"kpi-grid\" id=\"kpiGrid\"><\/div>\r\n <div class=\"risk-summary\" id=\"riskSummary\"><\/div>\r\n\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Risk Distribution<\/h3><div class=\"chart-container\"><canvas id=\"cRiskDist\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Turnover by Product<\/h3><div class=\"chart-container\"><canvas id=\"cTurnover\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Deposit Payment Methods<\/h3><div class=\"chart-container\"><canvas id=\"cPayment\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Company Profit by Product<\/h3><div class=\"chart-container\"><canvas id=\"cProfit\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n\r\n <div class=\"tw\">\r\n <div class=\"tw-h\">\r\n <h3>Top 20 High-Risk Players<\/h3>\r\n <button class=\"btn btn-g\" onclick=\"exportAllExcel()\">📥 Download Full Excel Report<\/button>\r\n <\/div>\r\n <div class=\"ts\" id=\"topRiskTbl\"><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-risk\">\r\n <div class=\"risk-summary\" id=\"riskSummary2\"><\/div>\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Risk Score Distribution<\/h3><div class=\"chart-container\"><canvas id=\"cRiskScores\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Top Risk Flags<\/h3><div class=\"chart-container\"><canvas id=\"cFlags\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n <div class=\"tw\">\r\n <div class=\"tw-h\">\r\n <h3>Risk-Flagged Players<\/h3>\r\n <div style=\"display:flex;gap:10px;flex-wrap:wrap\">\r\n <select class=\"fs\" id=\"riskFilter\" onchange=\"filterRisk()\">\r\n <option value=\"all\">All Levels<\/option>\r\n <option value=\"Critical\">Critical<\/option>\r\n <option value=\"High\">High<\/option>\r\n <option value=\"Medium\">Medium<\/option>\r\n <option value=\"Low\">Low<\/option>\r\n <\/select>\r\n <input class=\"sb\" id=\"riskSearch\" placeholder=\"Search username...\" oninput=\"filterRisk()\" \/>\r\n <button class=\"btn btn-p\" onclick=\"exportRiskExcel()\">📥 Export Risk Report<\/button>\r\n <\/div>\r\n <\/div>\r\n <div class=\"ts\" id=\"riskTbl\"><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-players\">\r\n <div class=\"fr\">\r\n <input class=\"sb\" id=\"playerSearch\" placeholder=\"Search player...\" oninput=\"filterPlayers()\" style=\"width:300px\" \/>\r\n <select class=\"fs\" id=\"playerRiskFilter\" onchange=\"filterPlayers()\">\r\n <option value=\"all\">All Risk Levels<\/option>\r\n <option value=\"Critical\">Critical<\/option>\r\n <option value=\"High\">High<\/option>\r\n <option value=\"Medium\">Medium<\/option>\r\n <option value=\"Low\">Low<\/option>\r\n <option value=\"Normal\">Normal<\/option>\r\n <\/select>\r\n <button class=\"btn btn-p\" onclick=\"exportPlayersExcel()\">📥 Export All Players<\/button>\r\n <\/div>\r\n <div class=\"tw\"><div class=\"ts\" id=\"allPlayersTbl\"><\/div><\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-deposits\">\r\n <div class=\"kpi-grid\" id=\"depKpis\"><\/div>\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Deposit Status<\/h3><div class=\"chart-container\"><canvas id=\"cDepStatus\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Top 20 Depositors<\/h3><div class=\"chart-container\"><canvas id=\"cTopDep\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-withdrawals\">\r\n <div class=\"kpi-grid\" id=\"wdKpis\"><\/div>\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Withdrawal Risk Assessment<\/h3><div class=\"chart-container\"><canvas id=\"cWdRisk\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Top Withdrawers<\/h3><div class=\"chart-container\"><canvas id=\"cTopWd\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-bonuses\">\r\n <div class=\"kpi-grid\" id=\"bonusKpis\"><\/div>\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Bonus by Category<\/h3><div class=\"chart-container\"><canvas id=\"cBonusCat\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Bonus Status<\/h3><div class=\"chart-container\"><canvas id=\"cBonusStatus\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-turnover\">\r\n <div class=\"chart-grid\">\r\n <div class=\"chart-card\"><h3>Stake by Product<\/h3><div class=\"chart-container\"><canvas id=\"cStake\"><\/canvas><\/div><\/div>\r\n <div class=\"chart-card\"><h3>Bet Count by Product<\/h3><div class=\"chart-container\"><canvas id=\"cBetCount\"><\/canvas><\/div><\/div>\r\n <\/div>\r\n <div class=\"tw\">\r\n <div class=\"tw-h\"><h3>Top Winners (Highest Player P&L)<\/h3><\/div>\r\n <div class=\"ts\" id=\"topWinnersTbl\"><\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <div class=\"section\" id=\"sec-fraud\">\r\n <div class=\"alert-bar\">\r\n <div style=\"font-size:20px\">⚠️<\/div>\r\n <div class=\"txt\"><strong id=\"fraudCnt\"><\/strong> players flagged in fraud monitoring tool<\/div>\r\n <\/div>\r\n <div class=\"tw\">\r\n <div class=\"tw-h\">\r\n <h3>Fraud Tool - Flagged Players<\/h3>\r\n <button class=\"btn btn-r\" onclick=\"exportFraudExcel()\">📥 Export Fraud Report<\/button>\r\n <\/div>\r\n <div class=\"ts\" id=\"fraudTbl\"><\/div>\r\n <\/div>\r\n <\/div>\r\n <\/div>\r\n <\/div>\r\n <\/div>\r\n\r\n <script>\r\n const AUTH_USER = \"bj_rms_admin\";\r\n const AUTH_PASS = \"admin1234\";\r\n const AUTH_KEY = \"bj_rms_auth_ok\";\r\n\r\n const FILES = { pp: null, turnover: null, bonus: null, deposit: null, withdrawal: null, fraud: null };\r\n const LABELS = { pp: \"Player Performance\", turnover: \"Turnover\", bonus: \"Bonus\", deposit: \"Deposit\", withdrawal: \"Withdrawal\", fraud: \"Fraud Tool\" };\r\n\r\n let D = {};\r\n let chartInstances = [];\r\n let navBound = false;\r\n\r\n const n = (v) => parseFloat(v) || 0;\r\n const fmt = (v) => (isNaN(v) ? \"0\" : Number(v).toLocaleString(\"en-US\", { maximumFractionDigits: 0 }));\r\n const fPKR = (v) => \"PKR \" + fmt(v);\r\n const badge = (level) => '<span class=\"badge badge-' + String(level).toLowerCase() + '\">' + level + \"<\/span>\";\r\n const clsPnl = (v) => (v >= 0 ? \"tg\" : \"tre\");\r\n const flagsHtml = (flags) => {\r\n if (!flags || !flags.length) return \"-\";\r\n return flags.map((f) => '<span class=\"flag-tag\">' + f + \"<\/span>\").join(\" \");\r\n };\r\n\r\n function showAppAfterLogin() {\r\n document.getElementById(\"loginGate\").style.display = \"none\";\r\n document.getElementById(\"appContent\").style.display = \"block\";\r\n document.getElementById(\"logoutBtn\").style.display = \"inline-flex\";\r\n document.getElementById(\"loginErr\").textContent = \"\";\r\n document.getElementById(\"loginPass\").value = \"\";\r\n document.getElementById(\"dateLabel\").textContent = \"\";\r\n }\r\n\r\n function showLoginOnly() {\r\n document.getElementById(\"loginGate\").style.display = \"flex\";\r\n document.getElementById(\"appContent\").style.display = \"none\";\r\n document.getElementById(\"logoutBtn\").style.display = \"none\";\r\n document.getElementById(\"loginUser\").value = \"\";\r\n document.getElementById(\"loginPass\").value = \"\";\r\n document.getElementById(\"dateLabel\").textContent = \"\";\r\n }\r\n\r\n function attemptLogin(e) {\r\n e.preventDefault();\r\n\r\n const user = (document.getElementById(\"loginUser\").value || \"\").trim();\r\n const pass = document.getElementById(\"loginPass\").value || \"\";\r\n const err = document.getElementById(\"loginErr\");\r\n\r\n if (user === AUTH_USER && pass === AUTH_PASS) {\r\n localStorage.setItem(AUTH_KEY, \"1\");\r\n err.textContent = \"\";\r\n showAppAfterLogin();\r\n } else {\r\n err.textContent = \"Invalid username or password.\";\r\n }\r\n }\r\n\r\n function logout() {\r\n localStorage.removeItem(AUTH_KEY);\r\n resetUpload();\r\n showLoginOnly();\r\n }\r\n\r\n function handleFile(input, key) {\r\n const file = input.files && input.files[0];\r\n if (!file) return;\r\n\r\n Papa.parse(file, {\r\n header: true,\r\n skipEmptyLines: true,\r\n complete: function (results) {\r\n FILES[key] = results.data || [];\r\n document.getElementById(\"slot-\" + key).classList.add(\"loaded\");\r\n const st = document.getElementById(\"status-\" + key);\r\n st.textContent = FILES[key].length + \" rows loaded\";\r\n st.className = \"status ok\";\r\n checkReady();\r\n },\r\n error: function () {\r\n FILES[key] = null;\r\n const st = document.getElementById(\"status-\" + key);\r\n st.textContent = \"Error reading file\";\r\n st.className = \"status pending\";\r\n checkReady();\r\n }\r\n });\r\n }\r\n\r\n function checkReady() {\r\n const allLoaded = Object.values(FILES).every((f) => f !== null);\r\n const btn = document.getElementById(\"launchBtn\");\r\n if (allLoaded) btn.classList.add(\"ready\");\r\n else btn.classList.remove(\"ready\");\r\n }\r\n\r\n function destroyCharts() {\r\n chartInstances.forEach((c) => {\r\n try { c.destroy(); } catch (_) {}\r\n });\r\n chartInstances = [];\r\n }\r\n\r\n function resetUpload() {\r\n Object.keys(FILES).forEach((k) => (FILES[k] = null));\r\n\r\n document.querySelectorAll(\".upload-slot\").forEach((s) => s.classList.remove(\"loaded\"));\r\n Object.keys(LABELS).forEach((k) => {\r\n const st = document.getElementById(\"status-\" + k);\r\n st.textContent = \"Waiting...\";\r\n st.className = \"status pending\";\r\n });\r\n\r\n document.querySelectorAll(\".upload-slot input\").forEach((i) => (i.value = \"\"));\r\n document.getElementById(\"launchBtn\").classList.remove(\"ready\");\r\n document.getElementById(\"uploadScreen\").style.display = \"flex\";\r\n document.getElementById(\"dashboardWrap\").style.display = \"none\";\r\n destroyCharts();\r\n }\r\n\r\n function launchDashboard() {\r\n if (!Object.values(FILES).every((f) => f !== null)) return;\r\n processData();\r\n document.getElementById(\"uploadScreen\").style.display = \"none\";\r\n document.getElementById(\"dashboardWrap\").style.display = \"block\";\r\n document.getElementById(\"dateLabel\").textContent = \"Data loaded: \" + new Date().toLocaleDateString();\r\n buildDashboard();\r\n }\r\n\r\n function processData() {\r\n const pp = FILES.pp || [];\r\n const turnover = FILES.turnover || [];\r\n const bonus = FILES.bonus || [];\r\n const deposit = FILES.deposit || [];\r\n const withdrawal = FILES.withdrawal || [];\r\n const fraud = FILES.fraud || [];\r\n\r\n const fraudUsers = new Set(fraud.map((f) => f.Username).filter(Boolean));\r\n\r\n const players = pp.map((r) => {\r\n let score = 0;\r\n const flags = [];\r\n\r\n const dep = n(r[\"Total Deposit\"]);\r\n const wd = n(r[\"Total Withdrawal\"]);\r\n const pnl = n(r[\"Total Profit & Loss\"]);\r\n const bets = n(r[\"Total Number of Bets\"]);\r\n const to = n(r[\"Total Turnover\"]);\r\n const bon = n(r[\"Total Bonus\"]);\r\n const sBets = n(r[\"Sports Bet Count\"]);\r\n const sPnl = n(r[\"Sports Total Profit & Loss\"]);\r\n\r\n if (dep > 0 && wd > dep * 3) { score += 30; flags.push(\"High WD\/Dep Ratio\"); }\r\n else if (dep > 0 && wd > dep * 2) { score += 20; flags.push(\"Elevated WD\/Dep Ratio\"); }\r\n else if (dep > 0 && wd > dep * 1.5) { score += 10; flags.push(\"Moderate WD\/Dep Ratio\"); }\r\n\r\n if (dep > 0 && pnl > dep * 5) { score += 25; flags.push(\"Abnormal Profit\"); }\r\n else if (dep > 0 && pnl > dep * 2) { score += 15; flags.push(\"High Profit\"); }\r\n\r\n if (bets > 0 && to \/ bets > 50000) { score += 20; flags.push(\"High Avg Bet Size\"); }\r\n else if (bets > 0 && to \/ bets > 20000) { score += 10; flags.push(\"Large Avg Bet\"); }\r\n\r\n if (dep > 0 && bon > dep * 0.5) { score += 20; flags.push(\"Bonus Abuse Suspect\"); }\r\n else if (dep > 0 && bon > dep * 0.3) { score += 10; flags.push(\"High Bonus Usage\"); }\r\n\r\n if (bets < 10 && wd > 10000) { score += 25; flags.push(\"Low Activity High WD\"); }\r\n if (sBets > 0 && sBets === bets && sPnl > dep * 2) { score += 20; flags.push(\"Sports Only High Win\"); }\r\n if (dep === 0 && to > 0) { score += 30; flags.push(\"No Deposit Activity\"); }\r\n\r\n let level = \"Normal\";\r\n if (score >= 60) level = \"Critical\";\r\n else if (score >= 40) level = \"High\";\r\n else if (score >= 20) level = \"Medium\";\r\n else if (score >= 10) level = \"Low\";\r\n\r\n return {\r\n username: r.Username || \"\",\r\n reg: r[\"Registration Time\"] || \"\",\r\n firstDep: r[\"First Deposit Time\"] || \"\",\r\n dep, wd, bets, turnover: to, pnl, bonus: bon, score, level, flags,\r\n isFraud: fraudUsers.has(r.Username)\r\n };\r\n });\r\n\r\n players.sort((a, b) => b.score - a.score);\r\n\r\n const riskDist = { Critical: 0, High: 0, Medium: 0, Low: 0, Normal: 0 };\r\n players.forEach((p) => { riskDist[p.level] = (riskDist[p.level] || 0) + 1; });\r\n\r\n const tByP = {};\r\n turnover.forEach((r) => {\r\n const p = r.Product || \"Other\";\r\n if (!tByP[p]) tByP[p] = { stake: 0, bets: 0, profit: 0 };\r\n tByP[p].stake += n(r.Stake);\r\n tByP[p].bets += n(r[\"Bet Count\"]);\r\n tByP[p].profit += n(r[\"Company Profit\"]);\r\n });\r\n const turnoverProducts = Object.entries(tByP).map(([product, v]) => ({ product, ...v }));\r\n\r\n let depApproved = 0, depPending = 0, depDisapproved = 0, depTotal = 0;\r\n const depByPayment = {};\r\n deposit.forEach((r) => {\r\n const s = r.Status || \"\";\r\n if (s === \"Approved\") depApproved++;\r\n else if (s === \"Pending\") depPending++;\r\n else if (s === \"Disapproved\") depDisapproved++;\r\n depTotal += n(r[\"Deposit Amount\"]);\r\n const pt = r[\"To Payment Type\"] || \"Other\";\r\n depByPayment[pt] = (depByPayment[pt] || 0) + n(r[\"Deposit Amount\"]);\r\n });\r\n\r\n let wdIssues = 0, wdNoIssues = 0;\r\n const wdByUser = {};\r\n withdrawal.forEach((r) => {\r\n const rem = r[\"Hold\/ Verified\/ Rejected Remark\"] || \"\";\r\n if (rem.includes(\"Issue\") && !rem.includes(\"No Issue\")) wdIssues++;\r\n if (rem.includes(\"No Issue\")) wdNoIssues++;\r\n\r\n const u = r.Username || \"Unknown\";\r\n if (!wdByUser[u]) wdByUser[u] = { amount: 0, count: 0 };\r\n wdByUser[u].amount += n(r.Amount);\r\n wdByUser[u].count++;\r\n });\r\n\r\n const topWd = Object.entries(wdByUser)\r\n .map(([username, v]) => ({ username, ...v }))\r\n .sort((a, b) => b.amount - a.amount)\r\n .slice(0, 20);\r\n\r\n const bonusByCat = {}, bonusByStatus = {};\r\n bonus.forEach((r) => {\r\n const c = r[\"Bonus Category\"] || \"Other\";\r\n if (!bonusByCat[c]) bonusByCat[c] = { depAmt: 0, bonAmt: 0, count: 0 };\r\n bonusByCat[c].depAmt += n(r[\"Deposit Amount\"]);\r\n bonusByCat[c].bonAmt += n(r[\"Bonus Amount\"]);\r\n bonusByCat[c].count++;\r\n\r\n const s = r.Status || \"Other\";\r\n bonusByStatus[s] = (bonusByStatus[s] || 0) + 1;\r\n });\r\n\r\n const fraudData = fraud.map((r) => ({\r\n username: r.Username || \"\",\r\n name: r[\"Full Name\"] || \"\",\r\n status: r.Status || \"\",\r\n depCount: n(r[\"Lifetime Deposit Count\"]),\r\n depAmt: n(r[\"Lifetime Deposit Amount\"]),\r\n wdCount: n(r[\"Lifetime Withdrawal Count\"]),\r\n wdAmt: n(r[\"Lifetime Withdrawal Amount\"]),\r\n signUpIP: r[\"Sign Up IP\"] || \"\",\r\n lastIP: r[\"Last Login IP\"] || \"\",\r\n lastLogin: r[\"Last Login Time\"] || \"\"\r\n }));\r\n\r\n D = {\r\n players,\r\n riskDist,\r\n turnoverProducts,\r\n depApproved,\r\n depPending,\r\n depDisapproved,\r\n depTotal,\r\n depByPayment,\r\n wdIssues,\r\n wdNoIssues,\r\n wdCount: withdrawal.length,\r\n topWd,\r\n bonusByCat: Object.entries(bonusByCat).map(([cat, v]) => ({ cat, ...v })),\r\n bonusByStatus,\r\n fraudData,\r\n fraudUsers: [...fraudUsers],\r\n totalPlayers: players.length,\r\n totalDep: players.reduce((s, p) => s + p.dep, 0),\r\n totalWd: players.reduce((s, p) => s + p.wd, 0),\r\n totalTO: players.reduce((s, p) => s + p.turnover, 0),\r\n totalPnl: players.reduce((s, p) => s + p.pnl, 0),\r\n totalBets: players.reduce((s, p) => s + p.bets, 0),\r\n totalBonus: players.reduce((s, p) => s + p.bonus, 0)\r\n };\r\n }\r\n\r\n function mkChart(id, cfg) {\r\n const canvas = document.getElementById(id);\r\n const c = new Chart(canvas, cfg);\r\n chartInstances.push(c);\r\n return c;\r\n }\r\n\r\n function buildDashboard() {\r\n destroyCharts();\r\n\r\n Chart.defaults.color = \"#94a3b8\";\r\n Chart.defaults.borderColor = \"#1e293b\";\r\n\r\n document.getElementById(\"alertBar\").innerHTML =\r\n '<div style=\"font-size:20px\">⚠️<\/div>' +\r\n '<div class=\"txt\"><strong>' + D.riskDist.Critical + \" Critical<\/strong> and <strong>\" +\r\n D.riskDist.High + \" High-risk<\/strong> players detected | <strong>\" +\r\n D.fraudData.length + \"<\/strong> fraud-flagged accounts<\/div>\";\r\n\r\n const kpis = [\r\n { l: \"Total Players\", v: fmt(D.totalPlayers), c: \"var(--blue)\" },\r\n { l: \"Total Deposits\", v: fPKR(D.totalDep), c: \"var(--green)\" },\r\n { l: \"Total Withdrawals\", v: fPKR(D.totalWd), c: \"var(--orange)\" },\r\n { l: \"Total Turnover\", v: fPKR(D.totalTO), c: \"var(--cyan)\" },\r\n { l: \"Player P&L\", v: fPKR(D.totalPnl), c: D.totalPnl >= 0 ? \"var(--green)\" : \"var(--red)\" },\r\n { l: \"Total Bets\", v: fmt(D.totalBets), c: \"var(--purple)\" },\r\n { l: \"Total Bonus\", v: fPKR(D.totalBonus), c: \"var(--yellow)\" },\r\n { l: \"Fraud Flagged\", v: D.fraudData.length, c: \"var(--red)\" }\r\n ];\r\n document.getElementById(\"kpiGrid\").innerHTML = kpis\r\n .map((k) => '<div class=\"kpi-card\"><div class=\"kpi-label\">' + k.l + '<\/div><div class=\"kpi-value\" style=\"color:' + k.c + '\">' + k.v + \"<\/div><\/div>\")\r\n .join(\"\");\r\n\r\n const levels = [\"Critical\", \"High\", \"Medium\", \"Low\", \"Normal\"];\r\n const clsMap = { Critical: \"rc-c\", High: \"rc-h\", Medium: \"rc-m\", Low: \"rc-l\", Normal: \"rc-n\" };\r\n const cards = levels\r\n .map((l) => '<div class=\"rc ' + clsMap[l] + '\"><div class=\"cnt\">' + (D.riskDist[l] || 0) + '<\/div><div class=\"lbl\">' + l + \"<\/div><\/div>\")\r\n .join(\"\");\r\n\r\n document.getElementById(\"riskSummary\").innerHTML = cards;\r\n document.getElementById(\"riskSummary2\").innerHTML = cards;\r\n\r\n buildCharts();\r\n buildTables();\r\n buildDepSection();\r\n buildWdSection();\r\n buildBonusSection();\r\n buildTurnoverSection();\r\n buildFraudSection();\r\n bindNav();\r\n }\r\n\r\n function buildCharts() {\r\n const rl = [\"Critical\", \"High\", \"Medium\", \"Low\", \"Normal\"];\r\n const rv = rl.map((l) => D.riskDist[l] || 0);\r\n const rc = [\"#dc2626\", \"#f97316\", \"#eab308\", \"#3b82f6\", \"#10b981\"];\r\n\r\n mkChart(\"cRiskDist\", {\r\n type: \"doughnut\",\r\n data: { labels: rl, datasets: [{ data: rv, backgroundColor: rc, borderWidth: 0 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: \"right\", labels: { padding: 15, usePointStyle: true } } } }\r\n });\r\n\r\n const tl = D.turnoverProducts.map((t) => t.product);\r\n\r\n mkChart(\"cTurnover\", {\r\n type: \"bar\",\r\n data: { labels: tl, datasets: [{ label: \"Stake (PKR)\", data: D.turnoverProducts.map((t) => t.stake), backgroundColor: \"#3b82f6\", borderRadius: 6 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n\r\n const pl = Object.keys(D.depByPayment).filter(Boolean);\r\n const pv = pl.map((k) => D.depByPayment[k]);\r\n const pcs = [\"#3b82f6\", \"#10b981\", \"#f59e0b\", \"#ef4444\", \"#8b5cf6\", \"#06b6d4\", \"#f97316\", \"#ec4899\", \"#6366f1\", \"#14b8a6\"];\r\n\r\n mkChart(\"cPayment\", {\r\n type: \"pie\",\r\n data: { labels: pl, datasets: [{ data: pv, backgroundColor: pcs, borderWidth: 0 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: \"right\", labels: { padding: 10, usePointStyle: true, font: { size: 11 } } } } }\r\n });\r\n\r\n const profitValues = D.turnoverProducts.map((t) => t.profit);\r\n\r\n mkChart(\"cProfit\", {\r\n type: \"bar\",\r\n data: { labels: tl, datasets: [{ label: \"Profit (PKR)\", data: profitValues, backgroundColor: profitValues.map((v) => (v >= 0 ? \"#10b981\" : \"#ef4444\")), borderRadius: 6 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n\r\n const sb = { \"0-9\": 0, \"10-19\": 0, \"20-29\": 0, \"30-39\": 0, \"40-49\": 0, \"50-59\": 0, \"60+\": 0 };\r\n D.players.forEach((p) => {\r\n const s = p.score;\r\n if (s < 10) sb[\"0-9\"]++;\r\n else if (s < 20) sb[\"10-19\"]++;\r\n else if (s < 30) sb[\"20-29\"]++;\r\n else if (s < 40) sb[\"30-39\"]++;\r\n else if (s < 50) sb[\"40-49\"]++;\r\n else if (s < 60) sb[\"50-59\"]++;\r\n else sb[\"60+\"]++;\r\n });\r\n\r\n mkChart(\"cRiskScores\", {\r\n type: \"bar\",\r\n data: { labels: Object.keys(sb), datasets: [{ label: \"Players\", data: Object.values(sb), backgroundColor: [\"#10b981\", \"#3b82f6\", \"#eab308\", \"#eab308\", \"#f97316\", \"#f97316\", \"#dc2626\"], borderRadius: 6 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n\r\n const fc = {};\r\n D.players.forEach((p) => p.flags.forEach((f) => { fc[f] = (fc[f] || 0) + 1; }));\r\n const sf = Object.entries(fc).sort((a, b) => b[1] - a[1]);\r\n\r\n mkChart(\"cFlags\", {\r\n type: \"bar\",\r\n data: { labels: sf.map((f) => f[0]), datasets: [{ label: \"Count\", data: sf.map((f) => f[1]), backgroundColor: \"#8b5cf6\", borderRadius: 6 }] },\r\n options: { indexAxis: \"y\", responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { color: \"#1e293b\" } }, y: { grid: { display: false } } } }\r\n });\r\n }\r\n\r\n function riskRow(p) {\r\n return (\r\n \"<tr>\" +\r\n \"<td><strong>\" + p.username + \"<\/strong><\/td>\" +\r\n \"<td>\" + p.score + \"<\/td>\" +\r\n \"<td>\" + badge(p.level) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.dep) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.wd) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fmt(p.bets) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.turnover) + \"<\/td>\" +\r\n '<td class=\"tr ' + clsPnl(p.pnl) + '\">' + fPKR(p.pnl) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.bonus) + \"<\/td>\" +\r\n \"<td>\" + flagsHtml(p.flags) + \"<\/td>\" +\r\n \"<td>\" + (p.isFraud ? '<span class=\"badge badge-fraud\">FLAGGED<\/span>' : \"-\") + \"<\/td>\" +\r\n \"<\/tr>\"\r\n );\r\n }\r\n\r\n function buildTables() {\r\n let h = '<table><thead><tr><th>Username<\/th><th>Score<\/th><th>Level<\/th><th class=\"tr\">Deposit<\/th><th class=\"tr\">Withdrawal<\/th><th class=\"tr\">Bets<\/th><th class=\"tr\">Turnover<\/th><th class=\"tr\">P&L<\/th><th class=\"tr\">Bonus<\/th><th>Flags<\/th><th>Fraud<\/th><\/tr><\/thead><tbody>';\r\n D.players.slice(0, 20).forEach((p) => { h += riskRow(p); });\r\n h += \"<\/tbody><\/table>\";\r\n document.getElementById(\"topRiskTbl\").innerHTML = h;\r\n\r\n renderRisk(D.players.filter((p) => p.score > 0));\r\n renderPlayers(D.players);\r\n\r\n const topWinners = [...D.players].sort((a, b) => b.pnl - a.pnl).slice(0, 20);\r\n let wh = '<table><thead><tr><th>Username<\/th><th class=\"tr\">Deposit<\/th><th class=\"tr\">Withdrawal<\/th><th class=\"tr\">P&L<\/th><th class=\"tr\">Bets<\/th><th>Risk<\/th><\/tr><\/thead><tbody>';\r\n topWinners.forEach((p) => {\r\n wh += \"<tr>\" +\r\n \"<td><strong>\" + p.username + \"<\/strong><\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.dep) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.wd) + \"<\/td>\" +\r\n '<td class=\"tr ' + clsPnl(p.pnl) + '\">' + fPKR(p.pnl) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fmt(p.bets) + \"<\/td>\" +\r\n \"<td>\" + badge(p.level) + \"<\/td>\" +\r\n \"<\/tr>\";\r\n });\r\n wh += \"<\/tbody><\/table>\";\r\n document.getElementById(\"topWinnersTbl\").innerHTML = wh;\r\n }\r\n\r\n function renderRisk(data) {\r\n let h = '<table><thead><tr><th>Username<\/th><th>Score<\/th><th>Level<\/th><th class=\"tr\">Deposit<\/th><th class=\"tr\">Withdrawal<\/th><th class=\"tr\">Bets<\/th><th class=\"tr\">Turnover<\/th><th class=\"tr\">P&L<\/th><th class=\"tr\">Bonus<\/th><th>Flags<\/th><th>Fraud<\/th><\/tr><\/thead><tbody>';\r\n data.forEach((p) => { h += riskRow(p); });\r\n h += \"<\/tbody><\/table>\";\r\n document.getElementById(\"riskTbl\").innerHTML = h;\r\n }\r\n\r\n function renderPlayers(data) {\r\n let h = '<table><thead><tr><th>Username<\/th><th>Registration<\/th><th>Score<\/th><th>Level<\/th><th class=\"tr\">Deposit<\/th><th class=\"tr\">Withdrawal<\/th><th class=\"tr\">Bets<\/th><th class=\"tr\">Turnover<\/th><th class=\"tr\">P&L<\/th><th class=\"tr\">Bonus<\/th><th>Flags<\/th><th>Fraud<\/th><\/tr><\/thead><tbody>';\r\n data.slice(0, 300).forEach((p) => {\r\n h += \"<tr>\" +\r\n \"<td><strong>\" + p.username + \"<\/strong><\/td>\" +\r\n '<td style=\"font-size:11px\">' + (p.reg || \"\").substring(0, 10) + \"<\/td>\" +\r\n \"<td>\" + p.score + \"<\/td>\" +\r\n \"<td>\" + badge(p.level) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.dep) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.wd) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fmt(p.bets) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.turnover) + \"<\/td>\" +\r\n '<td class=\"tr ' + clsPnl(p.pnl) + '\">' + fPKR(p.pnl) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.bonus) + \"<\/td>\" +\r\n \"<td>\" + flagsHtml(p.flags) + \"<\/td>\" +\r\n \"<td>\" + (p.isFraud ? '<span class=\"badge badge-fraud\">FLAGGED<\/span>' : \"-\") + \"<\/td>\" +\r\n \"<\/tr>\";\r\n });\r\n h += \"<\/tbody><\/table>\";\r\n document.getElementById(\"allPlayersTbl\").innerHTML = h;\r\n }\r\n\r\n function filterRisk() {\r\n const lv = document.getElementById(\"riskFilter\").value;\r\n const q = document.getElementById(\"riskSearch\").value.toLowerCase();\r\n\r\n let d = D.players.filter((p) => p.score > 0);\r\n if (lv !== \"all\") d = d.filter((p) => p.level === lv);\r\n if (q) d = d.filter((p) => p.username.toLowerCase().includes(q));\r\n renderRisk(d);\r\n }\r\n\r\n function filterPlayers() {\r\n const lv = document.getElementById(\"playerRiskFilter\").value;\r\n const q = document.getElementById(\"playerSearch\").value.toLowerCase();\r\n\r\n let d = [...D.players];\r\n if (lv !== \"all\") d = d.filter((p) => p.level === lv);\r\n if (q) d = d.filter((p) => p.username.toLowerCase().includes(q));\r\n renderPlayers(d);\r\n }\r\n\r\n function buildDepSection() {\r\n const kpis = [\r\n { l: \"Total Transactions\", v: fmt(D.depApproved + D.depPending + D.depDisapproved), c: \"var(--blue)\" },\r\n { l: \"Approved\", v: fmt(D.depApproved), c: \"var(--green)\" },\r\n { l: \"Pending\", v: fmt(D.depPending), c: \"var(--yellow)\" },\r\n { l: \"Disapproved\", v: fmt(D.depDisapproved), c: \"var(--red)\" },\r\n { l: \"Total Volume\", v: fPKR(D.depTotal), c: \"var(--cyan)\" }\r\n ];\r\n document.getElementById(\"depKpis\").innerHTML = kpis\r\n .map((k) => '<div class=\"kpi-card\"><div class=\"kpi-label\">' + k.l + '<\/div><div class=\"kpi-value\" style=\"color:' + k.c + '\">' + k.v + \"<\/div><\/div>\")\r\n .join(\"\");\r\n\r\n mkChart(\"cDepStatus\", {\r\n type: \"doughnut\",\r\n data: { labels: [\"Approved\", \"Pending\", \"Disapproved\"], datasets: [{ data: [D.depApproved, D.depPending, D.depDisapproved], backgroundColor: [\"#10b981\", \"#eab308\", \"#ef4444\"], borderWidth: 0 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: \"right\", labels: { padding: 15, usePointStyle: true } } } }\r\n });\r\n\r\n const td = [...D.players].sort((a, b) => b.dep - a.dep).slice(0, 15);\r\n mkChart(\"cTopDep\", {\r\n type: \"bar\",\r\n data: { labels: td.map((d) => d.username), datasets: [{ label: \"Deposit (PKR)\", data: td.map((d) => d.dep), backgroundColor: \"#10b981\", borderRadius: 4 }] },\r\n options: { indexAxis: \"y\", responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { color: \"#1e293b\" } }, y: { grid: { display: false } } } }\r\n });\r\n }\r\n\r\n function buildWdSection() {\r\n const kpis = [\r\n { l: \"Total Withdrawals\", v: fmt(D.wdCount), c: \"var(--blue)\" },\r\n { l: \"With Issues\", v: D.wdIssues, c: \"var(--red)\" },\r\n { l: \"No Issues\", v: D.wdNoIssues, c: \"var(--green)\" },\r\n { l: \"Total Volume\", v: fPKR(D.totalWd), c: \"var(--orange)\" }\r\n ];\r\n document.getElementById(\"wdKpis\").innerHTML = kpis\r\n .map((k) => '<div class=\"kpi-card\"><div class=\"kpi-label\">' + k.l + '<\/div><div class=\"kpi-value\" style=\"color:' + k.c + '\">' + k.v + \"<\/div><\/div>\")\r\n .join(\"\");\r\n\r\n mkChart(\"cWdRisk\", {\r\n type: \"doughnut\",\r\n data: { labels: [\"No Issues\", \"With Issues\", \"Other\"], datasets: [{ data: [D.wdNoIssues, D.wdIssues, Math.max(0, D.wdCount - D.wdNoIssues - D.wdIssues)], backgroundColor: [\"#10b981\", \"#ef4444\", \"#475569\"], borderWidth: 0 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: \"right\", labels: { padding: 15, usePointStyle: true } } } }\r\n });\r\n\r\n mkChart(\"cTopWd\", {\r\n type: \"bar\",\r\n data: { labels: D.topWd.map((d) => d.username), datasets: [{ label: \"WD (PKR)\", data: D.topWd.map((d) => d.amount), backgroundColor: \"#f97316\", borderRadius: 4 }] },\r\n options: { indexAxis: \"y\", responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { color: \"#1e293b\" } }, y: { grid: { display: false } } } }\r\n });\r\n }\r\n\r\n function buildBonusSection() {\r\n const totalBon = D.bonusByCat.reduce((s, b) => s + b.bonAmt, 0);\r\n const totalTx = D.bonusByCat.reduce((s, b) => s + b.count, 0);\r\n\r\n const kpis = [\r\n { l: \"Bonus Transactions\", v: fmt(totalTx), c: \"var(--blue)\" },\r\n { l: \"Total Bonus Amount\", v: fPKR(totalBon), c: \"var(--yellow)\" },\r\n { l: \"Active\", v: fmt(D.bonusByStatus[\"Active\"] || 0), c: \"var(--green)\" },\r\n { l: \"Completed\", v: fmt(D.bonusByStatus[\"Complete\"] || 0), c: \"var(--cyan)\" }\r\n ];\r\n document.getElementById(\"bonusKpis\").innerHTML = kpis\r\n .map((k) => '<div class=\"kpi-card\"><div class=\"kpi-label\">' + k.l + '<\/div><div class=\"kpi-value\" style=\"color:' + k.c + '\">' + k.v + \"<\/div><\/div>\")\r\n .join(\"\");\r\n\r\n mkChart(\"cBonusCat\", {\r\n type: \"bar\",\r\n data: {\r\n labels: D.bonusByCat.map((b) => b.cat),\r\n datasets: [\r\n { label: \"Deposit Amt\", data: D.bonusByCat.map((b) => b.depAmt), backgroundColor: \"#3b82f6\", borderRadius: 4 },\r\n { label: \"Bonus Amt\", data: D.bonusByCat.map((b) => b.bonAmt), backgroundColor: \"#f59e0b\", borderRadius: 4 }\r\n ]\r\n },\r\n options: { responsive: true, maintainAspectRatio: false, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n\r\n const labels = Object.keys(D.bonusByStatus);\r\n mkChart(\"cBonusStatus\", {\r\n type: \"doughnut\",\r\n data: { labels, datasets: [{ data: labels.map((k) => D.bonusByStatus[k]), backgroundColor: [\"#10b981\", \"#3b82f6\", \"#eab308\", \"#ef4444\", \"#8b5cf6\"], borderWidth: 0 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: \"right\", labels: { padding: 15, usePointStyle: true } } } }\r\n });\r\n }\r\n\r\n function buildTurnoverSection() {\r\n mkChart(\"cStake\", {\r\n type: \"bar\",\r\n data: { labels: D.turnoverProducts.map((t) => t.product), datasets: [{ label: \"Stake\", data: D.turnoverProducts.map((t) => t.stake), backgroundColor: \"#06b6d4\", borderRadius: 6 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n\r\n mkChart(\"cBetCount\", {\r\n type: \"bar\",\r\n data: { labels: D.turnoverProducts.map((t) => t.product), datasets: [{ label: \"Bets\", data: D.turnoverProducts.map((t) => t.bets), backgroundColor: \"#8b5cf6\", borderRadius: 6 }] },\r\n options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { grid: { color: \"#1e293b\" } }, x: { grid: { display: false } } } }\r\n });\r\n }\r\n\r\n function buildFraudSection() {\r\n document.getElementById(\"fraudCnt\").textContent = D.fraudData.length;\r\n\r\n let h = '<table><thead><tr><th>Username<\/th><th>Full Name<\/th><th>Status<\/th><th class=\"tr\">Lifetime Deps<\/th><th class=\"tr\">Dep Amt<\/th><th class=\"tr\">Lifetime WDs<\/th><th class=\"tr\">WD Amt<\/th><th>Sign Up IP<\/th><th>Last Login IP<\/th><th>Last Login<\/th><\/tr><\/thead><tbody>';\r\n\r\n D.fraudData.forEach((p) => {\r\n h += \"<tr>\" +\r\n \"<td><strong>\" + p.username + \"<\/strong><\/td>\" +\r\n \"<td>\" + p.name + \"<\/td>\" +\r\n \"<td>\" + badge(p.status === \"Locked\" ? \"Critical\" : \"Normal\") + \"<\/td>\" +\r\n '<td class=\"tr\">' + fmt(p.depCount) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.depAmt) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fmt(p.wdCount) + \"<\/td>\" +\r\n '<td class=\"tr\">' + fPKR(p.wdAmt) + \"<\/td>\" +\r\n '<td style=\"font-size:11px\">' + p.signUpIP + \"<\/td>\" +\r\n '<td style=\"font-size:11px\">' + p.lastIP + \"<\/td>\" +\r\n '<td style=\"font-size:11px\">' + (p.lastLogin || \"\").substring(0, 16) + \"<\/td>\" +\r\n \"<\/tr>\";\r\n });\r\n\r\n h += \"<\/tbody><\/table>\";\r\n document.getElementById(\"fraudTbl\").innerHTML = h;\r\n }\r\n\r\n function bindNav() {\r\n if (navBound) return;\r\n navBound = true;\r\n\r\n document.querySelectorAll(\".nav-item[data-sec]\").forEach((item) => {\r\n item.addEventListener(\"click\", function () {\r\n document.querySelectorAll(\".section\").forEach((s) => s.classList.remove(\"active\"));\r\n document.querySelectorAll(\".nav-item[data-sec]\").forEach((n) => n.classList.remove(\"active\"));\r\n\r\n const sec = document.getElementById(\"sec-\" + this.dataset.sec);\r\n if (sec) sec.classList.add(\"active\");\r\n this.classList.add(\"active\");\r\n });\r\n });\r\n }\r\n\r\n function exportAllExcel() {\r\n const wb = XLSX.utils.book_new();\r\n\r\n const rows = D.players.map((p) => ({\r\n Username: p.username,\r\n Registration: p.reg,\r\n \"Risk Score\": p.score,\r\n \"Risk Level\": p.level,\r\n \"Risk Flags\": p.flags.join(\", \"),\r\n \"Fraud Flagged\": p.isFraud ? \"YES\" : \"NO\",\r\n \"Total Deposit (PKR)\": p.dep,\r\n \"Total Withdrawal (PKR)\": p.wd,\r\n \"Total Bets\": p.bets,\r\n \"Total Turnover (PKR)\": p.turnover,\r\n \"Total P&L (PKR)\": p.pnl,\r\n \"Total Bonus (PKR)\": p.bonus\r\n }));\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(rows), \"All Players Risk\");\r\n\r\n const fr = D.fraudData.map((p) => ({\r\n Username: p.username,\r\n \"Full Name\": p.name,\r\n Status: p.status,\r\n \"Lifetime Deposits\": p.depCount,\r\n \"Deposit Amount\": p.depAmt,\r\n \"Lifetime Withdrawals\": p.wdCount,\r\n \"Withdrawal Amount\": p.wdAmt,\r\n \"Sign Up IP\": p.signUpIP,\r\n \"Last Login IP\": p.lastIP,\r\n \"Last Login\": p.lastLogin\r\n }));\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(fr), \"Fraud Flagged\");\r\n\r\n const sm = [\r\n { Metric: \"Total Players\", Value: D.totalPlayers },\r\n { Metric: \"Total Deposits (PKR)\", Value: D.totalDep },\r\n { Metric: \"Total Withdrawals (PKR)\", Value: D.totalWd },\r\n { Metric: \"Total Turnover (PKR)\", Value: D.totalTO },\r\n { Metric: \"Total P&L (PKR)\", Value: D.totalPnl },\r\n { Metric: \"Total Bets\", Value: D.totalBets },\r\n { Metric: \"Total Bonus (PKR)\", Value: D.totalBonus },\r\n { Metric: \"Critical Risk\", Value: D.riskDist.Critical },\r\n { Metric: \"High Risk\", Value: D.riskDist.High },\r\n { Metric: \"Medium Risk\", Value: D.riskDist.Medium },\r\n { Metric: \"Low Risk\", Value: D.riskDist.Low },\r\n { Metric: \"Normal\", Value: D.riskDist.Normal },\r\n { Metric: \"Fraud Flagged\", Value: D.fraudData.length }\r\n ];\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(sm), \"Summary\");\r\n\r\n XLSX.writeFile(wb, \"BetjeePK_RiskReport_\" + new Date().toISOString().slice(0, 10) + \".xlsx\");\r\n }\r\n\r\n function exportRiskExcel() {\r\n const wb = XLSX.utils.book_new();\r\n const rows = D.players\r\n .filter((p) => p.score > 0)\r\n .map((p) => ({\r\n Username: p.username,\r\n \"Risk Score\": p.score,\r\n \"Risk Level\": p.level,\r\n Flags: p.flags.join(\", \"),\r\n Fraud: p.isFraud ? \"YES\" : \"NO\",\r\n Deposit: p.dep,\r\n Withdrawal: p.wd,\r\n Bets: p.bets,\r\n Turnover: p.turnover,\r\n \"P&L\": p.pnl,\r\n Bonus: p.bonus\r\n }));\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(rows), \"Risk Players\");\r\n XLSX.writeFile(wb, \"BetjeePK_RiskPlayers_\" + new Date().toISOString().slice(0, 10) + \".xlsx\");\r\n }\r\n\r\n function exportPlayersExcel() {\r\n const wb = XLSX.utils.book_new();\r\n const rows = D.players.map((p) => ({\r\n Username: p.username,\r\n Registration: p.reg,\r\n Score: p.score,\r\n Level: p.level,\r\n Flags: p.flags.join(\", \"),\r\n Fraud: p.isFraud ? \"YES\" : \"NO\",\r\n Deposit: p.dep,\r\n Withdrawal: p.wd,\r\n Bets: p.bets,\r\n Turnover: p.turnover,\r\n \"P&L\": p.pnl,\r\n Bonus: p.bonus\r\n }));\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(rows), \"All Players\");\r\n XLSX.writeFile(wb, \"BetjeePK_AllPlayers_\" + new Date().toISOString().slice(0, 10) + \".xlsx\");\r\n }\r\n\r\n function exportFraudExcel() {\r\n const wb = XLSX.utils.book_new();\r\n const rows = D.fraudData.map((p) => ({\r\n Username: p.username,\r\n \"Full Name\": p.name,\r\n Status: p.status,\r\n \"Lifetime Deposits\": p.depCount,\r\n \"Deposit Amount\": p.depAmt,\r\n \"Lifetime Withdrawals\": p.wdCount,\r\n \"Withdrawal Amount\": p.wdAmt,\r\n \"Sign Up IP\": p.signUpIP,\r\n \"Last Login IP\": p.lastIP,\r\n \"Last Login\": p.lastLogin\r\n }));\r\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(rows), \"Fraud Players\");\r\n XLSX.writeFile(wb, \"BetjeePK_FraudReport_\" + new Date().toISOString().slice(0, 10) + \".xlsx\");\r\n }\r\n\r\n document.addEventListener(\"DOMContentLoaded\", function () {\r\n const isAuthed = localStorage.getItem(AUTH_KEY) === \"1\";\r\n if (isAuthed) showAppAfterLogin();\r\n else showLoginOnly();\r\n });\r\n <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Betjee Pakistan – Risk Management System BETJEE PK – Risk Management System Player Behavior Tracking & Risk Analysis Dashboard Logout Risk Dashboard Login Enter your credentials to continue Login Upload Daily CSV Files Drop or click to upload your 6 data files to generate the risk dashboard 📊 Player Performance playerPerformance.csv Waiting… 🎰 Turnover turnover.csv […]<\/p>","protected":false},"author":8,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1554","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/pages\/1554","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/comments?post=1554"}],"version-history":[{"count":7,"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/pages\/1554\/revisions"}],"predecessor-version":[{"id":1563,"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/pages\/1554\/revisions\/1563"}],"wp:attachment":[{"href":"https:\/\/cricketpromo.com\/ur\/wp-json\/wp\/v2\/media?parent=1554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}