requireAdmin(); $db = Database::getInstance(); $appTitle = $db->getSetting('app_title', 'UniFi Voucher System'); I18n::init(); // CSV-Export if (isset($_GET['export_csv']) && isset($_GET['site_id'])) { if (!$auth->validateCsrfToken($_GET['token'] ?? '')) { http_response_code(403); exit(__('error_csrf')); } $siteId = (int)$_GET['site_id']; $site = $db->fetchOne("SELECT * FROM sites WHERE id=? AND is_active=1", [$siteId]); if (!$site) { http_response_code(404); exit; } $rows = $db->fetchAll("SELECT voucher_code,voucher_name,max_uses,expire_minutes,status,used_count,created_at,expires_at FROM vouchers WHERE site_id=? ORDER BY created_at DESC", [$siteId]); $filename = 'vouchers_' . preg_replace('/[^a-z0-9]/i','_',$site['name']) . '_' . date('Ymd_His') . '.csv'; header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $filename . '"'); $out = fopen('php://output','w'); fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF)); fputcsv($out,['Code','Name','Max. Geräte','Gültigkeit (Min)','Status','Genutzt','Erstellt','Läuft ab'],';'); foreach ($rows as $r) { fputcsv($out,[$r['voucher_code'],$r['voucher_name'],$r['max_uses'],$r['expire_minutes'],$r['status'],$r['used_count'],$r['created_at'],$r['expires_at']??''],';'); } fclose($out); exit; } // AJAX: Vouchers laden 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'=>__('error_site_not_found')]); exit; } if ($syncFirst) { try { $ctrl = new UniFiController($site['unifi_controller_url'],$site['unifi_username'],$site['unifi_password'],$site['site_id']); $ctrl->syncVouchersToDatabase($db,$siteId); $db->execute("INSERT INTO settings (setting_key,setting_value) VALUES ('last_cron_sync',NOW()) ON DUPLICATE KEY UPDATE setting_value=NOW()"); } catch (Exception $e) { error_log("Sync error: ".$e->getMessage()); } } $dbVouchers = $db->fetchAll("SELECT * FROM vouchers WHERE site_id=? ORDER BY created_at DESC", [$siteId]); $vouchers = []; foreach ($dbVouchers as $v) { $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' => strtotime($v['created_at']), 'expire_time' => $v['expires_at'] ? strtotime($v['expires_at']) : 0, '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'=>__('error_csrf')]); exit; } try { $voucherId = $_POST['voucher_id']; $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'=>__('error_site_not_found')]); exit; } $ctrl = new UniFiController($site['unifi_controller_url'],$site['unifi_username'],$site['unifi_password'],$site['site_id']); if ($ctrl->deleteVoucher($voucherId)) { $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; } $sites = $db->fetchAll("SELECT * FROM sites WHERE is_active=1 ORDER BY name"); $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',''); $currentPage = 'vouchers'; ?>
= __('vouchers_subtitle') ?>
= __('vouchers_select_hint') ?>