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!

🛡

This is a secure admin area. All login attempts are logged and monitored. Unauthorized access is strictly prohibited.

Need help? Contact Support
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'; ?>

Dashboard

·

Today 7D 30D 90D MTD YTD | to
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
Live Projects
total · +
Completes
+ in period
Outstanding
unpaid invoices
Revenue (Period)
paid lifetime
Pending Redemptions
value
Open Tickets
pending · +
👥 Panel Members — health & compliance
View All →
= 50 ? '#059669' : ($fullPct >= 25 ? '#d97706' : '#dc2626'); ?>
Total
+ period
Active
0 ? round($d['members_active']/$d['members_total']*100) : 0; ?>% of total
Inactive
 
Fully Compliant
%
of
🔗 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; }; ?>
SEC A
%
SEC B
%
SEC C
%
SEC D
%
SEC E
%
Unknown
%
classified · base: active+verified members
📋 Member Availability non-closed project
Available
Not in any live project
Selected
In selections
Assigned
URL ready, not sent
Invited
Email sent
Started
Clicked link
Completed
Survey done
Screen Out
Early/late
Other Term.
Quota/timeout/partial
Excludes closed projects · Counts distinct members
💎 Points Economy & Redemptions
In Circulation
Unredeemed
Earned (Lifetime)
+ period
Redeemed (Lifetime)
period
Pending Redemp.
Period Redemp.
paid
🎫 Support & 🤝 Affiliates
Support → Affiliates →
Support Tickets
Open
+ period
Pending
 
Resolved
 
Closed
 
Total
M: P: C:
Affiliates / Partners
Active
of total
Total Signups
+ period
Verified
0 ? round($d['affiliates_verified_signups']/$d['affiliates_total_signups']*100) : 0; ?>% conv
Commission
Bal:
Pending Redemp.
Clicks (period): · Rewards paid (lifetime):
📊 Clients, Projects & Fieldwork
Clients →
Active Clients
of
Total Projects
+ period
Live
 
On Hold
 
Closed
Created: · Targ:
Survey URLs
available
Completes
+ period
Screen Outs
QF: · Sent:
💰 Finance USD: ₹ · EUR: ₹
View Finance →
Total Invoiced
· +
Paid
invoice
Outstanding
unpaid
Invoiced
Due
Overdue
Critical / Banned
Recent Projects
View All →
ProjectClientStatusUpdated

'green','Closed'=>'gray','On hold'=>'amber','Created'=>'blue','Targeted'=>'blue'][$p['status']] ?? 'gray'; ?>

No projects yet

Recent Support Tickets
Manage →
TicketTypeStatusUpdated

'red','pending'=>'amber','resolved'=>'green','closed'=>'gray'][$t['status']] ?? 'gray'; ?>

No tickets yet

Recent Members
View All →
EmailGenderStatusJoined

No members yet

Admin Activity Log
AdminActionTime (IST)

No activity yet

Admin Users: active Admin DB: u752449863_rrshop Panel DB: u752449863_rrpanel PHP: Server Time (IST): Timezone: