'Ausstehend', 'accepted' => 'Akzeptiert', 'rejected' => 'Abgelehnt', ]; $type_labels = [ 'urlaubsantrag' => 'Urlaubsantrag', 'abwesenheitsantrag' => 'Abwesenheitsantrag', 'benefitsantrag' => 'Benefitsantrag', 'werben' => 'Mitarbeiter werben', 'fortbildungsantrag' => 'Fortbildungsantrag', 'stundennachweis' => 'Stundennachweis', ]; /* ── Anträge ─────────────────────────────────────────────────────────── */ $detail_id = isset($_GET['id']) ? (int)$_GET['id'] : 0; $detail_type = $_GET['type'] ?? ''; $allowed_types = ['urlaubsantrag', 'abwesenheitsantrag', 'benefitsantrag', 'werben', 'fortbildungsantrag', 'stundennachweis']; $req = null; if ($detail_id > 0 && in_array($detail_type, $allowed_types, true) && $tab === 'antraege') { $table = 'requests_' . $detail_type; $stmt = db()->prepare( "SELECT r.*, u.name AS user_name FROM $table r JOIN users u ON u.id = r.user_id WHERE r.id = ?" ); $stmt->execute([$detail_id]); $req = $stmt->fetch(); if (!$req) { header('Location: admin.php'); exit; } $req['type'] = $detail_type; } $filter = $_GET['status'] ?? 'all'; $filter = in_array($filter, ['all', 'pending', 'accepted', 'rejected'], true) ? $filter : 'all'; $requests = []; if ($tab === 'antraege' && !$req) { $union_sql = " SELECT id, user_id, status, admin_note, created_at, 'urlaubsantrag' AS type FROM requests_urlaubsantrag UNION ALL SELECT id, user_id, status, admin_note, created_at, 'abwesenheitsantrag' AS type FROM requests_abwesenheitsantrag UNION ALL SELECT id, user_id, status, admin_note, created_at, 'benefitsantrag' AS type FROM requests_benefitsantrag UNION ALL SELECT id, user_id, status, admin_note, created_at, 'werben' AS type FROM requests_werben UNION ALL SELECT id, user_id, status, admin_note, created_at, 'fortbildungsantrag' AS type FROM requests_fortbildungsantrag UNION ALL SELECT id, user_id, status, admin_note, created_at, 'stundennachweis' AS type FROM requests_stundennachweis "; if ($filter === 'all') { $sql = "SELECT r.*, u.name AS user_name FROM ($union_sql) r JOIN users u ON u.id = r.user_id ORDER BY r.created_at DESC"; $requests = db()->query($sql)->fetchAll(); } else { $sql = "SELECT r.*, u.name AS user_name FROM ($union_sql) r JOIN users u ON u.id = r.user_id WHERE r.status = ? ORDER BY r.created_at DESC"; $stmt = db()->prepare($sql); $stmt->execute([$filter]); $requests = $stmt->fetchAll(); } } /* ── Nutzer ──────────────────────────────────────────────────────────── */ $users = []; if ($tab === 'nutzer') { $users = db()->query('SELECT * FROM users ORDER BY created_at DESC')->fetchAll(); } /* ── Downloads ───────────────────────────────────────────────────────── */ $downloads = []; if ($tab === 'downloads') { $downloads = db()->query('SELECT * FROM downloads ORDER BY sort_order ASC, id ASC')->fetchAll(); } /* ── Fortbildung-Materialien ─────────────────────────────────────────── */ $fb_materials = []; if ($tab === 'fortbildung') { $fb_materials = db()->query('SELECT * FROM fortbildung_materials ORDER BY sort_order ASC, id ASC')->fetchAll(); } /* ── News ────────────────────────────────────────────────────────────── */ $news_items = []; if ($tab === 'news') { $news_items = db()->query('SELECT * FROM news ORDER BY date DESC, id DESC')->fetchAll(); } /* ── Einsatzanweisungen ──────────────────────────────────────────────── */ $ea_users = []; if ($tab === 'einsatzanweisung') { $ea_users = db()->query( 'SELECT u.id, u.name, u.username, COALESCE(e.filename, \'\') AS filename, COALESCE(e.original_name, \'\') AS original_name, COALESCE(e.ort, \'\') AS ort, COALESCE(e.uploaded_at, \'\') AS uploaded_at FROM users u LEFT JOIN einsatzanweisung e ON e.user_id = u.id WHERE u.active = 1 ORDER BY u.name ASC' )->fetchAll(); } /* ── Stundennachweise ────────────────────────────────────────────────── */ $alle_stundennachweise = []; if ($tab === 'stundennachweis') { $alle_stundennachweise = db()->query( 'SELECT s.*, u.name AS user_name FROM requests_stundennachweis s JOIN users u ON u.id = s.user_id ORDER BY s.monat DESC, s.created_at DESC' )->fetchAll(); } /* ── Einsatzbewertungen ──────────────────────────────────────────────── */ $alle_bewertungen = []; if ($tab === 'bewertungen') { $alle_bewertungen = db()->query( 'SELECT e.*, u.name AS user_name FROM einsatzbewertungen e JOIN users u ON u.id = e.user_id ORDER BY e.created_at DESC' )->fetchAll(); } /* ── Dienstplan ──────────────────────────────────────────────────────── */ $dp_users = []; $dp_selected = null; $dp_selected_id = 0; $dp_schichten = []; $dp_overlays = []; $dp_year = 0; $dp_month = 0; $dp_first = null; $dp_days = 0; $dp_prev_url = ''; $dp_next_url = ''; if ($tab === 'dienstplan') { $dp_now = new DateTimeImmutable('today'); $dp_year = isset($_GET['year']) ? (int)$_GET['year'] : (int)$dp_now->format('Y'); $dp_month = isset($_GET['month']) ? (int)$_GET['month'] : (int)$dp_now->format('n'); $dp_year = max(2020, min(2099, $dp_year)); $dp_month = max(1, min(12, $dp_month)); $dp_users = db()->query( 'SELECT id, name FROM users WHERE active = 1 ORDER BY name ASC' )->fetchAll(); $dp_selected_id = isset($_GET['user_id']) ? (int)$_GET['user_id'] : 0; foreach ($dp_users as $u) { if ((int)$u['id'] === $dp_selected_id) { $dp_selected = $u; break; } } if (!$dp_selected && !empty($dp_users)) { $dp_selected = $dp_users[0]; $dp_selected_id = (int)$dp_selected['id']; } $dp_first = new DateTimeImmutable(sprintf('%04d-%02d-01', $dp_year, $dp_month)); $dp_month_start = $dp_first->format('Y-m-d'); $dp_month_end = $dp_first->modify('last day of this month')->format('Y-m-d'); $dp_days = (int)$dp_first->format('t'); $dp_prev = $dp_first->modify('-1 month'); $dp_next = $dp_first->modify('+1 month'); $dp_prev_url = 'admin.php?tab=dienstplan&user_id=' . $dp_selected_id . '&year=' . $dp_prev->format('Y') . '&month=' . $dp_prev->format('n'); $dp_next_url = 'admin.php?tab=dienstplan&user_id=' . $dp_selected_id . '&year=' . $dp_next->format('Y') . '&month=' . $dp_next->format('n'); if ($dp_selected_id) { $stmt = db()->prepare( 'SELECT date, schicht FROM dienstplan WHERE user_id = ? AND date >= ? AND date <= ?' ); $stmt->execute([$dp_selected_id, $dp_month_start, $dp_month_end]); foreach ($stmt->fetchAll() as $row) { $dp_schichten[$row['date']] = $row['schicht']; } $stmt = db()->prepare(" SELECT von, bis, 'urlaub' AS typ FROM requests_urlaubsantrag WHERE user_id = ? AND status = 'accepted' AND bis >= ? AND von <= ? UNION ALL SELECT von, bis, 'abwesenheit' AS typ FROM requests_abwesenheitsantrag WHERE user_id = ? AND status = 'accepted' AND bis >= ? AND von <= ? "); $stmt->execute([$dp_selected_id, $dp_month_start, $dp_month_end, $dp_selected_id, $dp_month_start, $dp_month_end]); foreach ($stmt->fetchAll() as $row) { $cursor = new DateTimeImmutable($row['von']); $end = new DateTimeImmutable($row['bis']); while ($cursor <= $end) { $key = $cursor->format('Y-m-d'); if ($key >= $dp_month_start && $key <= $dp_month_end) { $dp_overlays[$key] = $row['typ']; } $cursor = $cursor->modify('+1 day'); } } } } /* ── Login-Versuche ──────────────────────────────────────────────────── */ $login_attempts = []; $login_total = 0; $login_locked = []; if ($tab === 'login') { $login_total = (int)db()->query('SELECT COUNT(*) FROM login_attempts')->fetchColumn(); $login_attempts = db()->query( 'SELECT ip, username, attempted_at FROM login_attempts ORDER BY attempted_at DESC LIMIT 200' )->fetchAll(); $cutoff = date('c', time() - 600); $stmt = db()->prepare( 'SELECT ip, COUNT(*) AS cnt, MAX(attempted_at) AS last_at FROM login_attempts WHERE attempted_at >= ? GROUP BY ip HAVING COUNT(*) >= 5 ORDER BY cnt DESC' ); $stmt->execute([$cutoff]); $login_locked = $stmt->fetchAll(); } $extra_head = <<<'CSS' CSS; layout_start('OMSORG – Verwaltung', 'admin', $extra_head); ?>
Anträge und Nutzerverwaltung.
Von = e($req['user_name']) ?> · = e(date('d.m.Y H:i', strtotime($req['created_at']))) ?>
Keine Anträge gefunden.
| Mitarbeiter | Typ | Datum | Status | |
|---|---|---|---|---|
| = e($row['user_name']) ?> | = e($type_labels[$row['type']] ?? $row['type']) ?> | = e(date('d.m.Y', strtotime($row['created_at']))) ?> | = e($status_labels[$row['status']] ?? $row['status']) ?> | Details → |
= count($users) ?> Nutzer
| Name | Benutzername | Rolle | Aktiv | Erstellt | ||
|---|---|---|---|---|---|---|
| = e($u['name']) ?> | = e($u['username']) ?> | = $u['role'] === 'admin' ? 'Admin' : 'Nutzer' ?> | = e($u['email'] ?: '–') ?> | = (int)$u['active'] ? 'Aktiv' : 'Inaktiv' ?> | = e(date('d.m.Y', strtotime($u['created_at']))) ?> |
Keine aktiven Mitarbeiter vorhanden.
Reihenfolge per Drag & Drop ändern — wird automatisch gespeichert.
Noch keine Downloads vorhanden.
Reihenfolge per Drag & Drop ändern — wird automatisch gespeichert.
Noch keine Unterlagen vorhanden.
Noch keine Stundennachweise eingereicht.
| Mitarbeiter | Monat | Datei | Eingereicht | Status | |
|---|---|---|---|---|---|
| = e($s['user_name']) ?> | = e(date('F Y', strtotime($s['monat'] . '-01'))) ?> | = e($s['original_name']) ?> | = e(date('d.m.Y', strtotime($s['created_at']))) ?> | = e($status_labels[$s['status']] ?? $s['status']) ?> | Details → |
Noch keine Bewertungen vorhanden.
| Mitarbeiter | Einsatzort | Zeitraum | Bewertung | Wieder? | Feedback | Datum |
|---|---|---|---|---|---|---|
| = e($b['user_name']) ?> | = e($b['einsatzort']) ?> |
= e(date('d.m.Y', strtotime($b['von']))) ?> – = e(date('d.m.Y', strtotime($b['bis']))) ?> |
$b['bewertung'] ? ' class="empty"' : '' ?>>★ | = (int)$b['wieder'] ? 'Ja' : 'Nein' ?> | = $b['feedback'] !== '' ? nl2br(e($b['feedback'])) : '–' ?> | = e(date('d.m.Y', strtotime($b['created_at']))) ?> |
Noch keine News vorhanden.
= nl2br(e($n['text'])) ?>
Pro Mitarbeiter kann eine PDF hinterlegt und ein Einsatzort gesetzt werden. Der Einsatzort wird im Dienstplan des Mitarbeiters angezeigt.
Keine aktiven Mitarbeiter vorhanden.
| Mitarbeiter | Einsatzort | PDF hochladen | |
|---|---|---|---|
|
= e($u['name']) ?>
= e($u['username']) ?> |
↓ = e($u['original_name']) ?>
= e(date('d.m.Y', strtotime($u['uploaded_at']))) ?> – |
= (int)$login_total ?> protokollierte Versuche= $login_total > 200 ? ' (jüngste 200 angezeigt)' : '' ?>. Eine IP wird nach 5 Fehlversuchen für 10 Minuten gesperrt.
= e($l['ip'] ?: '–') ?> (= (int)$l['cnt'] ?>×)
Keine Login-Versuche protokolliert.
| Zeitpunkt | Benutzername | IP-Adresse | Status |
|---|---|---|---|
| = e(date('d.m.Y H:i:s', strtotime($a['attempted_at']))) ?> | = $a['username'] !== '' ? e($a['username']) : '–' ?> | = e($a['ip'] ?: '–') ?> |
Gesperrt – |