getSetting('app_title', 'UniFi Voucher System');
$logoUrl = $db->getSetting('logo_url', '');
$instructionHeader = $db->getSetting('instruction_header', 'So verwenden Sie Ihren Code');
$instructionText = $db->getSetting('instruction_text', '');
$publicAccess = $db->getSetting('public_access', 0);
$printTemplate = $db->getSetting('print_template', '
{APP_TITLE}
WLAN Zugangscode
{VOUCHER_CODE}
Gültig bis: {EXPIRY_DATE} um {EXPIRY_TIME} Uhr
Standort: {SITE_NAME}
Maximale Geräte: {MAX_USES}
{INSTRUCTIONS}
');
// Prüfen ob Login erforderlich - aber nur wenn nicht auf login.php
if (!$publicAccess && !$auth->isLoggedIn()) {
header('Location: login.php');
exit;
}
$error = '';
$success = '';
$voucherCode = '';
$voucherCreated = false;
$voucherData = [];
// Sites abrufen
if ($auth->isLoggedIn()) {
if ($auth->isAdmin()) {
$sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1 ORDER BY name");
} else {
$sites = $db->fetchAll(
"SELECT s.* FROM sites s
INNER JOIN user_site_access usa ON s.id = usa.site_id
WHERE s.is_active = 1 AND usa.user_id = ?
ORDER BY s.name",
[$_SESSION['user_id']]
);
}
} else {
// Öffentlicher Zugriff - nur Sites mit public_access
$sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1 AND public_access = 1 ORDER BY name");
}
// Voucher erstellen
// WICHTIG: create_voucher kommt jetzt aus einem hidden input, nicht vom Button (disabled Buttons werden teils nicht gesendet)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_voucher'])) {
if (!$publicAccess && !$auth->isLoggedIn()) {
$error = 'Sie müssen angemeldet sein';
} elseif ($auth->isLoggedIn() && !$auth->validateCsrfToken($_POST['csrf_token'] ?? '')) {
$error = 'Ungültiges Sicherheits-Token';
} else {
try {
$siteId = (int)($_POST['site_id'] ?? 0);
$voucherName = trim((string)($_POST['voucher_name'] ?? ''));
$maxUses = (int)($_POST['max_uses'] ?? 0);
$sendEmail = isset($_POST['send_email']) && !empty($_POST['recipient_email']);
$recipientEmail = trim((string)($_POST['recipient_email'] ?? ''));
// Validierung
if (empty($voucherName)) {
throw new Exception('Bitte geben Sie einen Voucher-Namen ein');
}
if ($maxUses < 1 || $maxUses > 10) {
throw new Exception('Anzahl der Geräte muss zwischen 1 und 10 liegen');
}
if ($siteId <= 0) {
throw new Exception('Bitte wählen Sie einen Standort');
}
if ($sendEmail && !filter_var($recipientEmail, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Ungültige E-Mail-Adresse');
}
// Site-Zugriff prüfen
if ($auth->isLoggedIn() && !$auth->hasAccessToSite($siteId)) {
throw new Exception('Keine Berechtigung für diese Site');
}
// Site-Daten abrufen
$site = $db->fetchOne("SELECT * FROM sites WHERE id = ? AND is_active = 1", [$siteId]);
if (!$site) {
throw new Exception('Site nicht gefunden');
}
// Voucher-Namen formatieren
$datum = date('Y-m-d');
$fullVoucherName = $datum . '_' . $voucherName;
// UniFi Controller initialisieren
$controller = new UniFiController(
$site['unifi_controller_url'],
$site['unifi_username'],
$site['unifi_password'],
$site['site_id']
);
// Voucher erstellen
$voucher = $controller->createVoucher($fullVoucherName, $maxUses, 480);
if (!is_array($voucher) || empty($voucher['formatted_code']) || empty($voucher['code'])) {
throw new Exception('UniFi hat keinen gültigen Voucher zurückgegeben');
}
$voucherCode = $voucher['formatted_code'];
// In Datenbank speichern
$userId = $auth->isLoggedIn() ? ($_SESSION['user_id'] ?? null) : null;
$db->execute(
"INSERT INTO vouchers (site_id, user_id, voucher_code, voucher_name, max_uses, expire_minutes, unifi_voucher_id)
VALUES (?, ?, ?, ?, ?, 480, ?)",
[$siteId, $userId, $voucher['code'], $fullVoucherName, $maxUses, ($voucher['unifi_id'] ?? null)]
);
// Voucher-Daten für Druck speichern
$expiryTimestamp = time() + (480 * 60);
$voucherData = [
'code' => $voucherCode,
'site_name' => $site['name'],
'max_uses' => $maxUses,
'expiry_date' => date('d.m.Y', $expiryTimestamp),
'expiry_time' => date('H:i', $expiryTimestamp)
];
// E-Mail versenden falls gewünscht
if ($sendEmail && !empty($recipientEmail)) {
if ($mailer->sendVoucherEmail($recipientEmail, $voucherCode, $site['name'], $maxUses)) {
$success .= ' E-Mail wurde erfolgreich versendet!';
} else {
$success .= ' (E-Mail konnte nicht versendet werden)';
}
}
$voucherCreated = true;
$success = 'Voucher erfolgreich erstellt!' . ($sendEmail ? ' E-Mail wurde versendet.' : '');
} catch (Exception $e) {
$error = 'Fehler: ' . $e->getMessage();
}
}
}
$currentUser = $auth->isLoggedIn() ? $auth->getCurrentUser() : null;
// Auto-select wenn nur eine Site
$autoSelectSite = (count($sites) === 1) ? $sites[0]['id'] : 0;
?>
= htmlspecialchars($appTitle) ?>
= htmlspecialchars($appTitle) ?>
= htmlspecialchars($error) ?>
✓ Ihr Zugangs-Code
= htmlspecialchars($voucherCode) ?>
Der Code ist 8 Stunden ab Erstellung gültig
= htmlspecialchars($instructionHeader) ?>
= $instructionText ?>
= htmlspecialchars($instructionHeader) ?>
= $instructionText ?>