'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); ?>

Verwaltung

Anträge und Nutzerverwaltung.

Anträge Nutzer Dienstpläne Downloads Fortbildung Stundennachweise Bewertungen News Einsatzanweisungen Login-Versuche
← Zurück zur Liste

Von ·

Status aktualisiert.
Von
Bis
Vertretung
–' ?>
Nachricht
–' ?>
'Arztbesuch', 'behoerdengang' => 'Behördengang', 'sonderurlaub' => 'Sonderurlaub', 'elternzeit_pflegezeit' => 'Elternzeit / Pflegezeit', 'sonstiges' => 'Sonstiges', ]; ?>
Von
Bis
Grund
Vertretung
–' ?>
Nachricht
–' ?>
'Massage', 'fitnessstudio' => 'Fitnessstudio', 'tankgutschein' => 'Tankgutschein', 'fortbildung' => 'Fortbildung', ]; ?>
Benefit
Nachricht
–' ?>
'Praktikum', 'aushilfe' => 'Aushilfe', 'festanstellung' => 'Festanstellung', ]; ?>
Name des Kandidaten
E-Mail
Qualifikation
Nachricht
–' ?>
'Anfrage WBL/PDL Weiterbildung', 'fortbildung' => 'Fortbildung anfragen', 'pflichtschulung' => 'Pflichtschulung', ]; ?>
Anliegen
Thema
Nachricht
–' ?>
Anhang
Monat
Nachweis
Status
Admin-Notiz

Entscheidung

Antrag wurde gelöscht.
'Alle', 'pending' => 'Ausstehend', 'accepted' => 'Akzeptiert', 'rejected' => 'Abgelehnt'] as $k => $l): ?>

Keine Anträge gefunden.

Mitarbeiter Typ Datum Status
Details →

Nutzer

Name Benutzername Rolle E-Mail Aktiv Erstellt
'Früh', 'spaet' => 'Spät', 'nacht' => 'Nacht']; $dp_weekdays = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']; $dp_months_de = ['','Januar','Februar','März','April','Mai','Juni', 'Juli','August','September','Oktober','November','Dezember']; $dp_today_str = (new DateTimeImmutable('today'))->format('Y-m-d'); ?>

format('N') - 1; for ($i = 0; $i < $dp_lead; $i++): ?>

Keine aktiven Mitarbeiter vorhanden.

'Bitte einen Titel eingeben.', 'nofile' => 'Bitte eine Datei auswählen.', 'badext' => 'Dateityp nicht erlaubt.', 'badmime' => 'Dateityp nicht erlaubt.', 'toobig' => 'Datei ist zu groß (max. 20 MB).', 'upload' => 'Fehler beim Hochladen.', 'invalid' => 'Ungültige Anfrage.', ]; echo e($errs[$_GET['err']] ?? 'Ein Fehler ist aufgetreten.'); ?>

Vorhandene Downloads

Reihenfolge per Drag & Drop ändern — wird automatisch gespeichert.

Noch keine Downloads vorhanden.

Neuer Download

'Bitte einen Titel eingeben.', 'nofile' => 'Bitte eine Datei auswählen.', 'badext' => 'Dateityp nicht erlaubt.', 'badmime' => 'Dateityp nicht erlaubt.', 'toobig' => 'Datei ist zu groß (max. 20 MB).', 'upload' => 'Fehler beim Hochladen.', 'invalid' => 'Ungültige Anfrage.', ]; echo e($errs[$_GET['err']] ?? 'Ein Fehler ist aufgetreten.'); ?>

Vorhandene Unterlagen

Reihenfolge per Drag & Drop ändern — wird automatisch gespeichert.

Noch keine Unterlagen vorhanden.

Neue Unterlage

Alle Stundennachweise

Noch keine Stundennachweise eingereicht.

Mitarbeiter Monat Datei Eingereicht Status
Details →

Alle Einsatzbewertungen

Noch keine Bewertungen vorhanden.

Mitarbeiter Einsatzort Zeitraum Bewertung Wieder? Feedback Datum

$b['bewertung'] ? ' class="empty"' : '' ?>>★ Ja' : 'Nein' ?>
Bitte Titel und Text ausfüllen.

Veröffentlichte News

Noch keine News vorhanden.

News anlegen

Einsatzanweisungen

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 PDF hochladen


Login-Versuche wurden gelöscht.

Fehlgeschlagene Login-Versuche

protokollierte Versuche 200 ? ' (jüngste 200 angezeigt)' : '' ?>. Eine IP wird nach 5 Fehlversuchen für 10 Minuten gesperrt.

0): ?>
Aktuell gesperrt (letzte 10 Min.): $l): ?> (×)

Keine Login-Versuche protokolliert.

Zeitpunkt Benutzername IP-Adresse Status
–' ?> Gesperrt