query('SELECT * FROM organizations ORDER BY name')->fetchAll(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { verify_csrf(); $action = $_POST['action'] ?? ''; if ($action === 'assign_org' && $staff['role'] === 'admin') { $userId = (int) $_POST['user_id']; $orgId = $_POST['organization_id'] !== '' ? (int) $_POST['organization_id'] : null; $pdo->prepare('UPDATE users SET organization_id = ? WHERE id = ?')->execute([$orgId, $userId]); audit_log($staff['id'], "Organisation zugeordnet für Kunde #{$userId}"); flash('success', 'Organisation zugeordnet.'); redirect('/staff/customers.php' . ($_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '')); } if ($action === 'ban_email') { $email = trim($_POST['email'] ?? ''); $matchType = ($_POST['match_type'] ?? 'email') === 'domain' ? 'domain' : 'email'; $value = $matchType === 'domain' ? (substr(strrchr($email, '@'), 1) ?: $email) : $email; if ($value !== '') { // Nur einfügen wenn noch nicht vorhanden $exists = $pdo->prepare('SELECT COUNT(*) FROM banlist WHERE match_type=? AND LOWER(value)=?'); $exists->execute([$matchType, strtolower($value)]); if (!(int)$exists->fetchColumn()) { $pdo->prepare('INSERT INTO banlist (match_type, value, reason, created_by, created_at) VALUES (?,?,?,?,?)') ->execute([$matchType, strtolower($value), 'Gesperrt aus Kundenverwaltung', $staff['id'], db_now()]); audit_log($staff['id'], "Kunde gesperrt: {$value} ({$matchType})"); flash('success', '"' . $value . '" wurde zur Sperrliste hinzugefuegt.'); } else { flash('info', '"' . $value . '" ist bereits auf der Sperrliste.'); } } redirect('/staff/customers.php' . ($_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '')); } if ($action === 'unban_email') { $email = strtolower(trim($_POST['email'] ?? '')); $domain = substr(strrchr($email, '@'), 1) ?: ''; $pdo->prepare('DELETE FROM banlist WHERE (match_type=\'email\' AND LOWER(value)=?) OR (match_type=\'domain\' AND LOWER(value)=?)') ->execute([$email, $domain]); audit_log($staff['id'], "Kundensperrung aufgehoben: {$email}"); flash('success', "Sperrung aufgehoben fuer: {$email}"); } } $search = trim($_GET['q'] ?? ''); $like = '%' . $search . '%'; // Registrierte Kunden $regSql = "SELECT u.*, o.name AS organization_name, (SELECT COUNT(*) FROM tickets t WHERE t.user_id = u.id) AS ticket_count, (SELECT MAX(t2.requester_ip) FROM tickets t2 WHERE t2.user_id = u.id AND t2.requester_ip IS NOT NULL) AS last_ip FROM users u LEFT JOIN organizations o ON o.id = u.organization_id"; $regParams = []; if ($search !== '') { $regSql .= ' WHERE u.name LIKE ? OR u.email LIKE ?'; $regParams = [$like, $like]; } $regSql .= ' ORDER BY u.name LIMIT 200'; $regStmt = $pdo->prepare($regSql); $regStmt->execute($regParams); $registered = array_map(fn($c) => array_merge($c, ['is_guest' => false]), $regStmt->fetchAll()); // Gast-Kunden $guestSql = "SELECT requester_email AS email, MAX(requester_name) AS name, COUNT(*) AS ticket_count, MIN(created_at) AS created_at, MAX(requester_ip) AS last_ip FROM tickets WHERE user_id IS NULL"; $guestParams = []; if ($search !== '') { $guestSql .= ' AND (requester_name LIKE ? OR requester_email LIKE ?)'; $guestParams = [$like, $like]; } $guestSql .= ' GROUP BY requester_email ORDER BY requester_email LIMIT 200'; $guestStmt = $pdo->prepare($guestSql); $guestStmt->execute($guestParams); $guests = array_map(fn($g) => array_merge($g, [ 'id' => null, 'organization_id' => null, 'organization_name' => null, 'is_guest' => true, ]), $guestStmt->fetchAll()); $customers = array_slice( usort_return(array_merge($registered, $guests), fn($a, $b) => strcasecmp($a['name'] ?? '', $b['name'] ?? '')), 0, 200 ); // Alle aktuell gesperrten E-Mails/Domains aus der Sperrliste vorausberechnen $bannedEmails = $pdo->query("SELECT LOWER(value) FROM banlist WHERE match_type='email'")->fetchAll(PDO::FETCH_COLUMN); $bannedDomains = $pdo->query("SELECT LOWER(value) FROM banlist WHERE match_type='domain'")->fetchAll(PDO::FETCH_COLUMN); $bannedEmailSet = array_flip($bannedEmails); $bannedDomainSet = array_flip($bannedDomains); function is_customer_banned(string $email, array $bannedEmailSet, array $bannedDomainSet): bool { $email = strtolower($email); $domain = substr(strrchr($email, '@'), 1) ?: ''; return isset($bannedEmailSet[$email]) || isset($bannedDomainSet[$domain]); } function usort_return(array $arr, callable $fn): array { usort($arr, $fn); return $arr; } $pageTitle = 'Kunden'; $activePage = 'customers'; require __DIR__ . '/_header.php'; ?>

Kunden

Registrierte Kundenkonten und Gast-Anfrager (ohne Konto) aus allen Tickets.

Zurücksetzen
Name E-Mail IP-Adresse Typ Organisation Tickets Seit Status
–' ?> Gast' : 'Konto' ?> – (kein Konto)
0): ?> 0 Gesperrt Aktiv
werden abgewiesen.');">
Keine Kunden gefunden.