requireAdmin(); $db = Database::getInstance(); $appTitle = $db->getSetting('app_title', 'UniFi Voucher System'); I18n::init(); // AJAX: Statistiken if (isset($_GET['ajax_stats'])) { header('Content-Type: application/json'); $syncFirst = isset($_GET['sync']) && $_GET['sync'] == '1'; try { $sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1"); $siteData = []; $totalStats = ['total' => 0, 'valid' => 0, 'used' => 0, 'expired' => 0]; $syncErrors = []; if ($syncFirst) { foreach ($sites as $site) { try { $ctrl = new UniFiController($site['unifi_controller_url'], $site['unifi_username'], $site['unifi_password'], $site['site_id']); $ctrl->syncVouchersToDatabase($db, $site['id']); } catch (Exception $e) { $syncErrors[$site['id']] = $e->getMessage(); } } $db->execute("INSERT INTO settings (setting_key,setting_value) VALUES ('last_cron_sync',NOW()) ON DUPLICATE KEY UPDATE setting_value=NOW()"); } foreach ($sites as $site) { $ss = $db->fetchOne("SELECT COUNT(*) as total, SUM(CASE WHEN status='valid' THEN 1 ELSE 0 END) as valid, SUM(CASE WHEN status='used' THEN 1 ELSE 0 END) as used, SUM(CASE WHEN status='expired' THEN 1 ELSE 0 END) as expired FROM vouchers WHERE site_id=?", [$site['id']]); $siteData[] = ['site_id' => $site['id'], 'site_name' => $site['name'], 'stats' => ['total' => (int)($ss['total']??0), 'valid' => (int)($ss['valid']??0), 'used' => (int)($ss['used']??0), 'expired' => (int)($ss['expired']??0)], 'error' => $syncErrors[$site['id']] ?? null]; $totalStats['total'] += (int)($ss['total']??0); $totalStats['valid'] += (int)($ss['valid']??0); $totalStats['used'] += (int)($ss['used']??0); $totalStats['expired'] += (int)($ss['expired']??0); } $lastSync = $db->getSetting('last_cron_sync', ''); echo json_encode(['success' => true, 'synced' => $syncFirst, 'sites' => $siteData, 'total' => $totalStats, 'last_sync' => $lastSync ? date('d.m.Y H:i:s', strtotime($lastSync)) : null, 'timestamp' => date('H:i:s')]); } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); } exit; } $stats = [ 'total_sites' => $db->fetchOne("SELECT COUNT(*) as count FROM sites WHERE is_active=1")['count'], 'total_users' => $db->fetchOne("SELECT COUNT(*) as count FROM users WHERE is_active=1")['count'], 'total_vouchers_today' => $db->fetchOne("SELECT COUNT(*) as count FROM vouchers WHERE DATE(created_at)=CURDATE()")['count'], ]; $sites = $db->fetchAll("SELECT * FROM sites WHERE is_active=1"); $voucherStats = $db->fetchOne("SELECT COUNT(*) as total, SUM(CASE WHEN status='valid' THEN 1 ELSE 0 END) as valid, SUM(CASE WHEN status='used' THEN 1 ELSE 0 END) as used, SUM(CASE WHEN status='expired' THEN 1 ELSE 0 END) as expired FROM vouchers"); $siteStats = []; foreach ($sites as $site) { $siteStats[$site['id']] = $db->fetchOne("SELECT COUNT(*) as total, SUM(CASE WHEN status='valid' THEN 1 ELSE 0 END) as valid, SUM(CASE WHEN status='used' THEN 1 ELSE 0 END) as used, SUM(CASE WHEN status='expired' THEN 1 ELSE 0 END) as expired FROM vouchers WHERE site_id=?", [$site['id']]); } $lastCronSync = $db->getSetting('last_cron_sync', ''); $chartData = []; for ($i = 6; $i >= 0; $i--) { $date = date('Y-m-d', strtotime("-$i days")); $count = $db->fetchOne("SELECT COUNT(*) as count FROM vouchers WHERE DATE(created_at)=?", [$date])['count']; $chartData[] = ['date' => date('d.m', strtotime($date)), 'count' => $count]; } $topUsers = $db->fetchAll("SELECT u.name, u.email, COUNT(v.id) as voucher_count FROM users u LEFT JOIN vouchers v ON u.id=v.user_id WHERE v.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY u.id ORDER BY voucher_count DESC LIMIT 5"); $recentVouchers = $db->fetchAll("SELECT v.*, s.name as site_name, u.name as user_name FROM vouchers v LEFT JOIN sites s ON v.site_id=s.id LEFT JOIN users u ON v.user_id=u.id ORDER BY v.created_at DESC LIMIT 10"); $currentPage = 'dashboard'; ?> <?= __('dashboard_title') ?> – <?= htmlspecialchars($appTitle) ?>
🟢
🟡
🔴
📊

🔴

0,'valid'=>0,'used'=>0,'expired'=>0]; ?>

📊

🏆

📋

Live