requireAdmin(); I18n::init(); $db = Database::getInstance(); $appTitle = $db->getSetting('app_title', 'UniFi Voucher System'); // Zeitraum (Tage) $days = max(1, min(365, (int)($_GET['days'] ?? 30))); // CSV-Export if (isset($_GET['export'])) { $auth->requireAdmin(); header('Content-Type: text/csv; charset=utf-8'); $fn = 'report-' . $_GET['export'] . '-' . date('Y-m-d') . '.csv'; header('Content-Disposition: attachment; filename="' . $fn . '"'); $out = fopen('php://output', 'w'); fprintf($out, "\xEF\xBB\xBF"); // UTF-8 BOM für Excel if ($_GET['export'] === 'per_site') { fputcsv($out, ['Site', 'Gesamt', 'Gültig', 'Verwendet', 'Abgelaufen']); $rows = $db->fetchAll( "SELECT s.name, COUNT(v.id) total, SUM(v.status='valid') valid, SUM(v.status='used') used, SUM(v.status='expired') expired FROM sites s LEFT JOIN vouchers v ON v.site_id=s.id GROUP BY s.id ORDER BY total DESC" ); foreach ($rows as $r) fputcsv($out, [$r['name'], (int)$r['total'], (int)$r['valid'], (int)$r['used'], (int)$r['expired']]); } elseif ($_GET['export'] === 'per_user') { fputcsv($out, ['Benutzer', 'E-Mail', 'Voucher erstellt']); $rows = $db->fetchAll( "SELECT u.name, u.email, COUNT(v.id) c FROM users u LEFT JOIN vouchers v ON v.user_id=u.id GROUP BY u.id ORDER BY c DESC" ); foreach ($rows as $r) fputcsv($out, [$r['name'], $r['email'], (int)$r['c']]); } else { // daily fputcsv($out, ['Datum', 'Erstellte Voucher']); $rows = $db->fetchAll( "SELECT DATE(created_at) d, COUNT(*) c FROM vouchers WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL ? DAY) GROUP BY DATE(created_at) ORDER BY d", [$days] ); foreach ($rows as $r) fputcsv($out, [$r['d'], (int)$r['c']]); } fclose($out); exit; } // Kennzahlen $totals = $db->fetchOne( "SELECT COUNT(*) total, SUM(status='valid') valid, SUM(status='used') used, SUM(status='expired') expired FROM vouchers" ); $inPeriod = (int)($db->fetchOne( "SELECT COUNT(*) c FROM vouchers WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL ? DAY)", [$days] )['c'] ?? 0); $perSite = $db->fetchAll( "SELECT s.name, COUNT(v.id) total, SUM(v.status='valid') valid, SUM(v.status='used') used, SUM(v.status='expired') expired FROM sites s LEFT JOIN vouchers v ON v.site_id=s.id GROUP BY s.id ORDER BY total DESC" ); $perUser = $db->fetchAll( "SELECT u.name, COUNT(v.id) c FROM users u LEFT JOIN vouchers v ON v.user_id=u.id GROUP BY u.id HAVING c > 0 ORDER BY c DESC LIMIT 10" ); $daily = $db->fetchAll( "SELECT DATE(created_at) d, COUNT(*) c FROM vouchers WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL ? DAY) GROUP BY DATE(created_at) ORDER BY d", [$days] ); $chartLabels = array_map(fn($r) => date('d.m', strtotime($r['d'])), $daily); $chartData = array_map(fn($r) => (int)$r['c'], $daily); $csrf = $auth->getCsrfToken(); $currentPage = 'reports'; $adminBase = ''; ?> Reporting – <?= htmlspecialchars($appTitle) ?>
CSV (täglich) CSV (pro Site) CSV (pro Nutzer)
Vouchers gesamt
Gültig
Verwendet
In Tagen erstellt

Erstellte Voucher ( Tage)

Pro Site

SiteGesamtGültigVerwendetAbgelaufen

Top-Nutzer

BenutzerVoucher erstellt
Keine Daten