requireAdmin();
$db = Database::getInstance();
$appTitle = $db->getSetting('app_title', 'UniFi Voucher System');
// AJAX: Voucher abrufen (immer aus DB, optional vorher Live-Sync)
if (isset($_GET['ajax_get_vouchers']) && isset($_GET['site_id'])) {
header('Content-Type: application/json');
try {
$siteId = (int)$_GET['site_id'];
$syncFirst = isset($_GET['sync']) && $_GET['sync'] == '1';
$site = $db->fetchOne("SELECT * FROM sites WHERE id = ? AND is_active = 1", [$siteId]);
if (!$site) {
echo json_encode(['success' => false, 'message' => 'Site nicht gefunden oder inaktiv']);
exit;
}
// Bei sync=1: Erst Live-Daten holen und in DB speichern
if ($syncFirst) {
try {
$controller = new UniFiController(
$site['unifi_controller_url'],
$site['unifi_username'],
$site['unifi_password'],
$site['site_id']
);
$controller->syncVouchersToDatabase($db, $siteId);
// Last sync time aktualisieren
$db->execute(
"INSERT INTO settings (setting_key, setting_value) VALUES ('last_cron_sync', NOW())
ON DUPLICATE KEY UPDATE setting_value = NOW()"
);
} catch (Exception $e) {
// Sync-Fehler loggen, aber trotzdem DB-Daten zurückgeben
error_log("Sync error for site {$siteId}: " . $e->getMessage());
}
}
// Immer aus Datenbank abrufen
$dbVouchers = $db->fetchAll(
"SELECT * FROM vouchers WHERE site_id = ? ORDER BY created_at DESC",
[$siteId]
);
$vouchers = [];
foreach ($dbVouchers as $v) {
$expireTime = $v['expires_at'] ? strtotime($v['expires_at']) : 0;
$createTime = strtotime($v['created_at']);
$vouchers[] = [
'_id' => $v['unifi_voucher_id'] ?? $v['id'],
'code' => str_replace('-', '', $v['voucher_code']),
'formatted_code' => $v['voucher_code'],
'note' => $v['voucher_name'],
'quota' => (int)$v['max_uses'],
'used' => (int)($v['used_count'] ?? 0),
'duration' => (int)$v['expire_minutes'],
'create_time' => $createTime,
'expire_time' => $expireTime,
'status' => $v['status'] ?? 'valid',
'db_id' => $v['id']
];
}
$lastSync = $db->getSetting('last_cron_sync', '');
echo json_encode([
'success' => true,
'vouchers' => $vouchers,
'site_name' => $site['name'],
'count' => count($vouchers),
'synced' => $syncFirst,
'last_sync' => $lastSync ? date('d.m.Y H:i:s', strtotime($lastSync)) : null
]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'message' => 'Fehler: ' . $e->getMessage()]);
}
exit;
}
// AJAX: Voucher löschen
if (isset($_POST['ajax_delete']) && isset($_POST['voucher_id']) && isset($_POST['site_id'])) {
header('Content-Type: application/json');
if (!$auth->validateCsrfToken($_POST['csrf_token'] ?? '')) {
echo json_encode(['success' => false, 'message' => 'Ungültiges Sicherheits-Token']);
exit;
}
try {
$voucherId = $_POST['voucher_id']; // UniFi _id (String)
$siteId = (int)$_POST['site_id'];
$site = $db->fetchOne("SELECT * FROM sites WHERE id = ? AND is_active = 1", [$siteId]);
if (!$site) {
echo json_encode(['success' => false, 'message' => 'Site nicht gefunden oder inaktiv']);
exit;
}
$controller = new UniFiController(
$site['unifi_controller_url'],
$site['unifi_username'],
$site['unifi_password'],
$site['site_id']
);
$result = $controller->deleteVoucher($voucherId);
if ($result) {
// Auch aus Datenbank löschen
$db->execute("DELETE FROM vouchers WHERE unifi_voucher_id = ? AND site_id = ?", [$voucherId, $siteId]);
echo json_encode(['success' => true, 'message' => 'Voucher erfolgreich gelöscht!']);
} else {
echo json_encode(['success' => false, 'message' => 'Voucher konnte nicht gelöscht werden']);
}
} catch (Exception $e) {
echo json_encode(['success' => false, 'message' => 'Fehler: ' . $e->getMessage()]);
}
exit;
}
// Alle aktiven Sites abrufen
$sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1 ORDER BY name");
// Voucher-Statistiken aus DB pro Site
$siteStats = [];
foreach ($sites as $site) {
$stats = $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']]
);
$siteStats[$site['id']] = $stats;
}
// Letzte Synchronisation
$lastCronSync = $db->getSetting('last_cron_sync', '');
$currentUser = $auth->getCurrentUser();
$faviconUrl = $db->getSetting('favicon_url', '');
?>
Live Voucher-Verwaltung - = htmlspecialchars($appTitle) ?>
Keine aktiven Sites vorhanden
Bitte fügen Sie zuerst eine Site hinzu oder aktivieren Sie eine vorhandene.
Sites verwalten
Bitte wählen Sie eine Site aus, um die Vouchers zu laden.