prepare("SELECT * FROM admin_users WHERE username = ? AND status = 'active'");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['admin_id'] = $user['id'];
$_SESSION['admin_username'] = $user['username'];
$_SESSION['admin_email'] = $user['email'];
$_SESSION['admin_role'] = $user['role'];
$_SESSION['admin_name'] = $user['full_name'];
$updateStmt = $pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?");
$updateStmt->execute([$user['id']]);
logActivity($user['id'], 'login', 'User logged in successfully');
header('Location: index.php');
exit;
} else {
$error = 'Invalid username or password';
}
} catch (Exception $e) {
error_log("Login error: " . $e->getMessage());
$error = 'An error occurred. Please try again.';
}
}
}
// ============ SHOW LOGIN FORM ============
?>
Login - Relevant Reflex Admin
RELEVANT REFLEX
Admin Portal
🛠
Panel Management System
Manage members, projects, clients, invoices, fieldwork, and survey operations from a single unified dashboard.
Member & Panel Management
Client & Project Operations
Invoice & Finance Tracking
Fieldwork & Survey Monitoring
Welcome Back!
Sign in to your admin account to continue.
⚠
🛡
This is a secure admin area. All login attempts are logged and monitored. Unauthorized access is strictly prohibited.
0, 'members_active' => 0, 'members_verified' => 0,
'members_inactive' => 0, 'members_new' => 0, 'members_new_verified' => 0,
'members_mobile_verified' => 0,
'members_spam_done' => 0,
// Compliance
'compliance_full' => 0, 'compliance_email' => 0, 'compliance_mobile' => 0,
'compliance_profiler' => 0, 'compliance_upi' => 0,
// SEC Classification
'sec_a' => 0, 'sec_b' => 0, 'sec_c' => 0, 'sec_d' => 0, 'sec_e' => 0, 'sec_unknown' => 0,
// Points economy
'points_circulation' => 0, 'points_total_earned' => 0, 'points_total_redeemed' => 0,
'points_earned_period' => 0, 'points_redeemed_period' => 0,
// Redemptions
'redemptions_pending' => 0, 'redemptions_completed' => 0, 'redemptions_total' => 0,
'redemptions_pending_value' => 0, 'redemptions_period' => 0, 'redemptions_paid_period' => 0,
// Tickets
'tickets_total' => 0, 'tickets_open' => 0, 'tickets_pending' => 0,
'tickets_resolved' => 0, 'tickets_closed' => 0,
'tickets_member' => 0, 'tickets_partner' => 0, 'tickets_client' => 0,
'tickets_period' => 0,
// Affiliates
'affiliates_total' => 0, 'affiliates_active' => 0,
'affiliates_total_signups' => 0, 'affiliates_verified_signups' => 0,
'affiliates_total_commission' => 0, 'affiliates_commission_balance' => 0,
'affiliates_total_rewards_paid' => 0,
'affiliates_clicks_period' => 0, 'affiliates_signups_period' => 0,
'partner_redemptions_pending' => 0, 'partner_redemptions_pending_value' => 0,
// Clients
'clients_total' => 0, 'clients_active' => 0,
// Projects
'projects_total' => 0, 'projects_live' => 0, 'projects_created' => 0,
'projects_targeted' => 0, 'projects_onhold' => 0, 'projects_closed' => 0,
'projects_period' => 0,
// Survey URLs
'urls_total' => 0, 'urls_available' => 0, 'urls_sent' => 0,
'urls_complete' => 0, 'urls_screenout' => 0, 'urls_quotafull' => 0,
'completes_period' => 0,
// Member Availability (non-closed projects)
'avail_available' => 0, 'avail_selected' => 0, 'avail_assigned' => 0,
'avail_invited' => 0, 'avail_started' => 0, 'avail_completed' => 0,
'avail_screenout' => 0, 'avail_other_term' => 0,
'avail_live_projects' => 0,
// Finance
'invoices_total' => 0, 'invoices_invoiced' => 0, 'invoices_paid' => 0,
'invoices_due' => 0, 'invoices_overdue' => 0, 'invoices_critical' => 0,
'revenue_total_inr' => 0, 'revenue_paid_inr' => 0, 'revenue_outstanding_inr' => 0,
'revenue_invoiced_inr' => 0, 'revenue_due_inr' => 0, 'revenue_overdue_inr' => 0,
'revenue_critical_inr' => 0, 'revenue_period_inr' => 0,
// Admin
'admins_active' => 0,
// Referral acquisition (verified)
'referrals_members_verified' => 0, 'referrals_members_verified_period' => 0,
'referrals_affiliates_verified' => 0, 'referrals_affiliates_verified_period' => 0,
];
$recent_activities = $recent_tickets = $recent_members_list = $recent_projects = [];
// Get DB connections
$pdo = null;
$panelPdo = null;
try {
$pdo = getDBConnection();
$pdo->exec("SET time_zone = '+05:30'");
} catch (Exception $e) { error_log("Dashboard shop DB error: " . $e->getMessage()); }
try {
$panelPdo = getPanelDBConnection();
$panelPdo->exec("SET time_zone = '+05:30'");
} catch (Exception $e) { error_log("Dashboard panel DB error: " . $e->getMessage()); }
// ─── MEMBERS ───
if ($panelPdo) {
try {
$d['members_total'] = (int)$panelPdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
$d['members_active'] = (int)$panelPdo->query("SELECT COUNT(*) FROM users WHERE status='active'")->fetchColumn();
$d['members_verified'] = (int)$panelPdo->query("SELECT COUNT(*) FROM users WHERE email_verified=1")->fetchColumn();
$d['members_inactive'] = (int)$panelPdo->query("SELECT COUNT(*) FROM users WHERE status='inactive'")->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COUNT(*) FROM users WHERE created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['members_new'] = (int)$stmt->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COUNT(*) FROM users WHERE email_verified=1 AND created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['members_new_verified'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard members error: " . $e->getMessage()); }
try {
$d['members_mobile_verified'] = (int)$panelPdo->query("SELECT COUNT(*) FROM mobile_verifications WHERE is_verified=1")->fetchColumn();
$d['members_spam_done'] = (int)$panelPdo->query("SELECT COUNT(*) FROM users WHERE spam_notice_done = 1")->fetchColumn();
} catch (Exception $e) { /* table may not exist */ }
// ─── MEMBER COMPLIANCE ───
// Base: active email-verified members
try {
$base = $d['members_verified'] > 0 ? $d['members_verified'] : 1;
// Email verified = members_verified (already have it)
$d['compliance_email'] = $d['members_verified'];
// Mobile verified (among active verified users)
$d['compliance_mobile'] = (int)$panelPdo->query("
SELECT COUNT(DISTINCT u.id) FROM users u
INNER JOIN mobile_verifications mv ON u.id = mv.user_id AND mv.is_verified = 1
WHERE u.status = 'active' AND u.email_verified = 1
")->fetchColumn();
// All profiler sections completed (10 main sections)
$d['compliance_profiler'] = (int)$panelPdo->query("
SELECT COUNT(*) FROM (
SELECT user_id FROM profiler_completion
WHERE is_completed = 1 AND section != 'household_classification'
GROUP BY user_id HAVING COUNT(DISTINCT section) >= 10
) pc
INNER JOIN users u ON u.id = pc.user_id
WHERE u.status = 'active' AND u.email_verified = 1
")->fetchColumn();
// UPI set up
$d['compliance_upi'] = (int)$panelPdo->query("
SELECT COUNT(DISTINCT u.id) FROM users u
INNER JOIN user_profiler up ON u.id = up.user_id
AND up.section = 'profile' AND up.question_id = 'upi_id'
AND up.response IS NOT NULL AND up.response != '' AND up.response != '\"\"'
WHERE u.status = 'active' AND u.email_verified = 1
")->fetchColumn();
// Full compliance: all 4 conditions met
$d['compliance_full'] = (int)$panelPdo->query("
SELECT COUNT(DISTINCT u.id) FROM users u
INNER JOIN mobile_verifications mv ON u.id = mv.user_id AND mv.is_verified = 1
INNER JOIN user_profiler upi ON u.id = upi.user_id
AND upi.section = 'profile' AND upi.question_id = 'upi_id'
AND upi.response IS NOT NULL AND upi.response != '' AND upi.response != '\"\"'
INNER JOIN (
SELECT user_id FROM profiler_completion
WHERE is_completed = 1 AND section != 'household_classification'
GROUP BY user_id HAVING COUNT(DISTINCT section) >= 10
) pc ON u.id = pc.user_id
WHERE u.status = 'active' AND u.email_verified = 1
")->fetchColumn();
} catch (Exception $e) { error_log("Dashboard compliance error: " . $e->getMessage()); }
// SEC Classification counts
try {
$secStmt = $panelPdo->query("SELECT isec_class, COUNT(*) as c FROM users WHERE status='active' AND email_verified=1 GROUP BY isec_class");
while ($row = $secStmt->fetch()) {
$cls = $row['isec_class'];
$cnt = (int)$row['c'];
if ($cls === null || $cls === '') { $d['sec_unknown'] += $cnt; }
elseif (isset($d['sec_' . strtolower($cls)])) { $d['sec_' . strtolower($cls)] = $cnt; }
}
} catch (Exception $e) { /* isec_class column may not exist yet */ }
}
// ─── REFERRAL ACQUISITION (members + affiliates, email-verified) ───
if ($panelPdo) {
try {
// Member-driven referrals (rrpanel.member_referral_clicks)
$d['referrals_members_verified'] = (int)$panelPdo->query("
SELECT COUNT(*) FROM member_referral_clicks WHERE email_verified = 1
")->fetchColumn();
$stmt = $panelPdo->prepare("
SELECT COUNT(*) FROM member_referral_clicks
WHERE email_verified = 1 AND verified_at BETWEEN ? AND ?
");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['referrals_members_verified_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard member referrals error: " . $e->getMessage()); }
}
if ($pdo) {
try {
// Affiliate-driven referrals (rrshop.affiliate_signups)
$d['referrals_affiliates_verified'] = (int)$pdo->query("
SELECT COUNT(*) FROM affiliate_signups WHERE email_verified = 1
")->fetchColumn();
$stmt = $pdo->prepare("
SELECT COUNT(*) FROM affiliate_signups
WHERE email_verified = 1 AND verified_at BETWEEN ? AND ?
");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['referrals_affiliates_verified_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard affiliate referrals error: " . $e->getMessage()); }
}
// ─── POINTS ECONOMY ───
if ($panelPdo) {
try {
$d['points_circulation'] = (int)$panelPdo->query("SELECT COALESCE(SUM(points),0) FROM user_points")->fetchColumn();
$d['points_total_earned'] = (int)$panelPdo->query("SELECT COALESCE(SUM(total_earned),0) FROM user_points")->fetchColumn();
$d['points_total_redeemed'] = (int)$panelPdo->query("SELECT COALESCE(SUM(total_redeemed),0) FROM user_points")->fetchColumn();
} catch (Exception $e) { error_log("Dashboard user_points error: " . $e->getMessage()); }
try {
$stmt = $panelPdo->prepare("SELECT COALESCE(SUM(amount),0) FROM point_transactions WHERE type='credit' AND created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['points_earned_period'] = (int)$stmt->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COALESCE(SUM(amount),0) FROM point_transactions WHERE type='debit' AND created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['points_redeemed_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard point_transactions error: " . $e->getMessage()); }
}
// ─── REDEMPTIONS ───
if ($panelPdo) {
try {
$d['redemptions_pending'] = (int)$panelPdo->query("SELECT COUNT(*) FROM redemption_requests WHERE status='pending'")->fetchColumn();
$d['redemptions_completed'] = (int)$panelPdo->query("SELECT COUNT(*) FROM redemption_requests WHERE status='completed'")->fetchColumn();
$d['redemptions_total'] = (int)$panelPdo->query("SELECT COUNT(*) FROM redemption_requests")->fetchColumn();
$d['redemptions_pending_value'] = (float)$panelPdo->query("SELECT COALESCE(SUM(amount),0) FROM redemption_requests WHERE status='pending'")->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COUNT(*) FROM redemption_requests WHERE created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['redemptions_period'] = (int)$stmt->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COALESCE(SUM(amount),0) FROM redemption_requests WHERE status='completed' AND processed_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['redemptions_paid_period'] = (float)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard redemptions error: " . $e->getMessage()); }
}
// ─── SUPPORT TICKETS ───
if ($panelPdo) {
try {
$d['tickets_total'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets")->fetchColumn();
$d['tickets_open'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE status='open'")->fetchColumn();
$d['tickets_pending'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE status='pending'")->fetchColumn();
$d['tickets_resolved'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE status='resolved'")->fetchColumn();
$d['tickets_closed'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE status='closed'")->fetchColumn();
$d['tickets_member'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE sender_type='member'")->fetchColumn();
$d['tickets_partner'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE sender_type='partner'")->fetchColumn();
$d['tickets_client'] = (int)$panelPdo->query("SELECT COUNT(*) FROM support_tickets WHERE sender_type='client'")->fetchColumn();
$stmt = $panelPdo->prepare("SELECT COUNT(*) FROM support_tickets WHERE created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['tickets_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard tickets error: " . $e->getMessage()); }
}
// ─── AFFILIATES / PARTNERS ───
if ($pdo) {
try {
$d['affiliates_total'] = (int)$pdo->query("SELECT COUNT(*) FROM affiliates")->fetchColumn();
$d['affiliates_active'] = (int)$pdo->query("SELECT COUNT(*) FROM affiliates WHERE status='active'")->fetchColumn();
$d['affiliates_total_signups'] = (int)$pdo->query("SELECT COALESCE(SUM(total_signups),0) FROM affiliates")->fetchColumn();
$d['affiliates_verified_signups'] = (int)$pdo->query("SELECT COALESCE(SUM(total_verified_signups),0) FROM affiliates")->fetchColumn();
$d['affiliates_total_commission'] = (float)$pdo->query("SELECT COALESCE(SUM(total_commission_earned),0) FROM affiliates")->fetchColumn();
$d['affiliates_commission_balance'] = (float)$pdo->query("SELECT COALESCE(SUM(commission_balance),0) FROM affiliates")->fetchColumn();
$d['affiliates_total_rewards_paid'] = (float)$pdo->query("SELECT COALESCE(SUM(total_rewards_paid),0) FROM affiliates")->fetchColumn();
} catch (Exception $e) { error_log("Dashboard affiliates error: " . $e->getMessage()); }
try {
$stmt = $pdo->prepare("SELECT COUNT(*) FROM affiliate_signups WHERE clicked_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['affiliates_clicks_period'] = (int)$stmt->fetchColumn();
$stmt = $pdo->prepare("SELECT COUNT(*) FROM affiliate_signups WHERE signup_completed=1 AND signed_up_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['affiliates_signups_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard affiliate_signups error: " . $e->getMessage()); }
try {
$d['partner_redemptions_pending'] = (int)$pdo->query("SELECT COUNT(*) FROM partner_redemptions WHERE status='pending'")->fetchColumn();
$d['partner_redemptions_pending_value'] = (float)$pdo->query("SELECT COALESCE(SUM(amount),0) FROM partner_redemptions WHERE status='pending'")->fetchColumn();
} catch (Exception $e) { /* partner_redemptions table may not exist */ }
}
// ─── CLIENTS ───
if ($pdo) {
try {
$d['clients_total'] = (int)$pdo->query("SELECT COUNT(*) FROM clients")->fetchColumn();
$d['clients_active'] = (int)$pdo->query("SELECT COUNT(*) FROM clients WHERE status='active'")->fetchColumn();
} catch (Exception $e) { error_log("Dashboard clients error: " . $e->getMessage()); }
}
// ─── PROJECTS ───
if ($pdo) {
try {
$d['projects_total'] = (int)$pdo->query("SELECT COUNT(*) FROM projects")->fetchColumn();
$d['projects_live'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status='Live'")->fetchColumn();
$d['projects_created'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status='Created'")->fetchColumn();
$d['projects_targeted'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status='Targeted'")->fetchColumn();
$d['projects_onhold'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status='On hold'")->fetchColumn();
$d['projects_closed'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status='Closed'")->fetchColumn();
$stmt = $pdo->prepare("SELECT COUNT(*) FROM projects WHERE created_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['projects_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard projects error: " . $e->getMessage()); }
}
// ─── SURVEY URLs ───
if ($pdo) {
try {
$d['urls_total'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls")->fetchColumn();
$d['urls_available'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls WHERE status='available'")->fetchColumn();
$d['urls_sent'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls WHERE status='sent'")->fetchColumn();
$d['urls_complete'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls WHERE status='complete'")->fetchColumn();
$d['urls_screenout'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls WHERE status IN ('earlyscreenout','latescreenout')")->fetchColumn();
$d['urls_quotafull'] = (int)$pdo->query("SELECT COUNT(*) FROM survey_urls WHERE status='quotafull'")->fetchColumn();
$stmt = $pdo->prepare("SELECT COUNT(*) FROM survey_urls WHERE status='complete' AND completed_at BETWEEN ? AND ?");
$stmt->execute([$dateFromSQL, $dateToSQL]);
$d['completes_period'] = (int)$stmt->fetchColumn();
} catch (Exception $e) { error_log("Dashboard survey_urls error: " . $e->getMessage()); }
}
// ─── MEMBER AVAILABILITY (non-closed projects only) ───
if ($pdo) {
try {
// Count non-closed projects
$d['avail_live_projects'] = (int)$pdo->query("SELECT COUNT(*) FROM projects WHERE status NOT IN ('Closed')")->fetchColumn();
// Selected: distinct members in selection_members for non-closed projects
$d['avail_selected'] = (int)$pdo->query("
SELECT COUNT(DISTINCT sm.user_id) FROM selection_members sm
JOIN project_selections ps ON sm.selection_id = ps.id
JOIN projects p ON ps.project_id = p.id
WHERE p.status NOT IN ('Closed')
")->fetchColumn();
// Survey URL stage counts (distinct members per stage, non-closed projects only)
$urlStages = $pdo->query("
SELECT
COUNT(DISTINCT CASE WHEN su.status = 'assigned' THEN su.sent_to_user_id END) as assigned_members,
COUNT(DISTINCT CASE WHEN su.status = 'sent' THEN su.sent_to_user_id END) as sent_members,
COUNT(DISTINCT CASE WHEN su.status = 'clicked' THEN su.sent_to_user_id END) as started_members,
COUNT(DISTINCT CASE WHEN su.status = 'complete' THEN su.sent_to_user_id END) as completed_members,
COUNT(DISTINCT CASE WHEN su.status IN ('earlyscreenout','latescreenout') THEN su.sent_to_user_id END) as screenout_members,
COUNT(DISTINCT CASE WHEN su.status IN ('quotafull','timeout','partial') THEN su.sent_to_user_id END) as other_members
FROM survey_urls su
JOIN projects p ON su.project_id = p.project_id
WHERE p.status NOT IN ('Closed') AND su.sent_to_user_id IS NOT NULL
")->fetch();
if ($urlStages) {
$d['avail_assigned'] = (int)($urlStages['assigned_members'] ?? 0);
$d['avail_invited'] = (int)($urlStages['sent_members'] ?? 0);
$d['avail_started'] = (int)($urlStages['started_members'] ?? 0);
$d['avail_completed'] = (int)($urlStages['completed_members'] ?? 0);
$d['avail_screenout'] = (int)($urlStages['screenout_members'] ?? 0);
$d['avail_other_term'] = (int)($urlStages['other_members'] ?? 0);
}
} catch (Exception $e) { error_log("Dashboard availability error: " . $e->getMessage()); }
// Available: active+verified members NOT in any non-closed project
if ($panelPdo) {
try {
$totalVerifiedActive = (int)$panelPdo->query("SELECT COUNT(*) FROM users WHERE status='active' AND email_verified=1")->fetchColumn();
$d['avail_available'] = max(0, $totalVerifiedActive - $d['avail_selected']);
} catch (Exception $e) { error_log("Dashboard avail_available error: " . $e->getMessage()); }
}
}
// ─── INVOICES / FINANCE (multi-currency → INR) ───
$forexRates = ['INR' => 1.0, 'USD' => 86.50, 'EUR' => 93.00];
if ($pdo) {
try {
try {
$ctx = stream_context_create(['http' => ['timeout' => 3]]);
$rateJson = @file_get_contents('https://api.exchangerate-api.com/v4/latest/USD', false, $ctx);
if ($rateJson) {
$rateData = json_decode($rateJson, true);
if (!empty($rateData['rates']['INR'])) {
$usdToInr = (float)$rateData['rates']['INR'];
$forexRates['USD'] = $usdToInr;
if (!empty($rateData['rates']['EUR'])) {
$forexRates['EUR'] = $usdToInr / (float)$rateData['rates']['EUR'];
}
}
}
} catch (Exception $e) { /* use fallback rates */ }
$d['invoices_total'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices")->fetchColumn();
$d['invoices_invoiced'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices WHERE status='invoiced'")->fetchColumn();
$d['invoices_paid'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices WHERE status='paid'")->fetchColumn();
$d['invoices_due'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices WHERE status='due'")->fetchColumn();
$d['invoices_overdue'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices WHERE status='overdue'")->fetchColumn();
$d['invoices_critical'] = (int)$pdo->query("SELECT COUNT(*) FROM invoices WHERE status IN ('critical','banned')")->fetchColumn();
$amtStmt = $pdo->query("
SELECT status, currency, SUM(total_amount) as amt
FROM invoices
GROUP BY status, currency
");
$amtRows = $amtStmt->fetchAll();
$statusMap = [
'invoiced' => 'revenue_invoiced_inr',
'paid' => 'revenue_paid_inr',
'due' => 'revenue_due_inr',
'overdue' => 'revenue_overdue_inr',
'critical' => 'revenue_critical_inr',
'banned' => 'revenue_critical_inr',
];
foreach ($amtRows as $row) {
$cur = $row['currency'] ?? 'INR';
$rate = $forexRates[$cur] ?? 1.0;
$inr = (float)$row['amt'] * $rate;
$key = $statusMap[$row['status']] ?? null;
if ($key) $d[$key] += $inr;
$d['revenue_total_inr'] += $inr;
}
$d['revenue_outstanding_inr'] = $d['revenue_total_inr'] - $d['revenue_paid_inr'];
$stmt = $pdo->prepare("SELECT currency, SUM(total_amount) as amt FROM invoices WHERE created_at BETWEEN ? AND ? GROUP BY currency");
$stmt->execute([$dateFromSQL, $dateToSQL]);
foreach ($stmt->fetchAll() as $row) {
$rate = $forexRates[$row['currency'] ?? 'INR'] ?? 1.0;
$d['revenue_period_inr'] += (float)$row['amt'] * $rate;
}
} catch (Exception $e) { /* invoices table may not exist */ }
}
// ─── ADMIN USERS ───
if ($pdo) {
try {
$d['admins_active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin_users WHERE status='active'")->fetchColumn();
} catch (Exception $e) { /* */ }
}
// ─── RECENT ACTIVITIES ───
if ($pdo) {
try {
$activitiesStmt = $pdo->query("
SELECT al.*, au.full_name
FROM admin_activity_log al
LEFT JOIN admin_users au ON al.admin_id = au.id
ORDER BY al.created_at DESC LIMIT 15
");
$recent_activities = $activitiesStmt->fetchAll();
} catch (Exception $e) { /* */ }
}
// ─── RECENT TICKETS ───
if ($panelPdo) {
try {
$recentTicketsStmt = $panelPdo->query("SELECT * FROM support_tickets ORDER BY updated_at DESC LIMIT 8");
$recent_tickets = $recentTicketsStmt->fetchAll();
} catch (Exception $e) { /* */ }
}
// ─── RECENT MEMBERS ───
if ($panelPdo) {
try {
$recentMembersStmt = $panelPdo->query("SELECT id, email, gender, email_verified, status, created_at FROM users ORDER BY created_at DESC LIMIT 8");
$recent_members_list = $recentMembersStmt->fetchAll();
} catch (Exception $e) { /* */ }
}
// ─── RECENT PROJECTS ───
if ($pdo) {
try {
$recentProjectsStmt = $pdo->query("
SELECT p.*, c.company_name as client_name FROM projects p
LEFT JOIN clients c ON p.client_id = c.id
ORDER BY p.updated_at DESC LIMIT 8
");
$recent_projects = $recentProjectsStmt->fetchAll();
} catch (Exception $e) { /* */ }
}
// Helper functions
function fmtIST($dt, $fmt = 'd M Y, h:i A') {
if (!$dt) return '—';
try {
$date = new DateTime($dt, new DateTimeZone('Asia/Kolkata'));
return $date->format($fmt);
} catch (Exception $e) {
return date($fmt, strtotime($dt));
}
}
function fmtISTDate($dt) { return fmtIST($dt, 'd M Y'); }
function fmtISTTime($dt) { return fmtIST($dt, 'h:i A'); }
function fmtINR($v) { return '₹' . number_format((float)$v, 2); }
function fmtNum($v) { return number_format((int)$v); }
include 'includes/header.php';
?>
Period: –
0) $alerts[] = ['warn', '💰 ' . fmtNum($d['redemptions_pending']) . ' pending member redemptions (' . fmtINR($d['redemptions_pending_value']) . ')', 'https://relevantreflex.com/support'];
if (($d['partner_redemptions_pending'] ?? 0) > 0) $alerts[] = ['warn', '🤝 ' . fmtNum($d['partner_redemptions_pending']) . ' pending partner redemptions (' . fmtINR($d['partner_redemptions_pending_value']) . ')', 'https://relevantreflex.com/support'];
if (($d['tickets_open'] ?? 0) > 0) $alerts[] = ['info', '🎫 ' . fmtNum($d['tickets_open']) . ' open support tickets', 'https://relevantreflex.com/support'];
if (($d['projects_live'] ?? 0) > 0) $alerts[] = ['info', '🔴 ' . fmtNum($d['projects_live']) . ' live projects', 'https://relevantreflex.com/clients/projects.php'];
?>
Total Members
+ in period
Active Verified
0 ? round($d['members_verified']/$d['members_total']*100) : 0; ?>% of total
Outstanding
unpaid invoices
Revenue (Period)
paid lifetime
Pending Redemptions
value
= 50 ? '#059669' : ($fullPct >= 25 ? '#d97706' : '#dc2626');
?>
Active
0 ? round($d['members_active']/$d['members_total']*100) : 0; ?>% of total
🔗 Referrals by Members — ✓ verified
+ in period
🤝 Referrals by Affiliates — ✓ verified
+ in period
= 70 ? '#059669' : ($m[2] >= 40 ? '#d97706' : '#dc2626');
?>
0 ? round($v / $secTotal * 100, 1) : 0; };
?>
classified · base: active+verified members
📋 Member Availability — non-closed project
Available
Not in any live project
Assigned
URL ready, not sent
Other Term.
Quota/timeout/partial
Excludes closed projects · Counts distinct members
💎 Points Economy & Redemptions
In Circulation
Unredeemed
Earned (Lifetime)
+ period
Redeemed (Lifetime)
period
Support Tickets
Affiliates / Partners
Verified
0 ? round($d['affiliates_verified_signups']/$d['affiliates_total_signups']*100) : 0; ?>% conv
Clicks (period): · Rewards paid (lifetime):
| Project | Client | Status | Updated |
|
|
'green','Closed'=>'gray','On hold'=>'amber','Created'=>'blue','Targeted'=>'blue'][$p['status']] ?? 'gray'; ?>
|
|
No projects yet
| Ticket | Type | Status | Updated |
|
|
'red','pending'=>'amber','resolved'=>'green','closed'=>'gray'][$t['status']] ?? 'gray'; ?>
|
|
No tickets yet
| Email | Gender | Status | Joined |
|
✓
|
|
|
|
No members yet
Admin Users: active
Admin DB: u752449863_rrshop
Panel DB: u752449863_rrpanel
PHP:
Server Time (IST):
Timezone: