getMessage(); } include 'header.php'; // Jahr für Auswertung $year = date('Y'); $yearStart = $year . '-01-01'; $nextYearStart = (string)((int)$year + 1) . '-01-01'; $reasonOptions = vacationAbsenceReasonOptions(); $reasonKeys = array_keys($reasonOptions); function vacationOverviewStatusLabel(?string $status): string { $status = trim((string)$status); if ($status === '' || $status === 'beantragt') { return 'Beantragt'; } if ($status === 'genehmigt') { return 'Genehmigt'; } if ($status === 'abgelehnt') { return 'Abgelehnt'; } return ucfirst($status); } // Lade alle Mitarbeiter $stmt = $pdo->prepare("SELECT id, vorname, nachname, email, urlaubstage FROM users ORDER BY nachname, vorname"); $stmt->execute(); $users = $stmt->fetchAll(); $statsStmt = $pdo->prepare(" SELECT user_id, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'urlaub' AND LOWER(TRIM(COALESCE(status, ''))) = 'genehmigt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS urlaub_used_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS total_absence_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(status, ''))) = 'beantragt' OR TRIM(COALESCE(status, '')) = '' THEN 1 ELSE 0 END), 0) AS pending_count, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'urlaub' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS urlaub_total_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'krankheit_mit_atest' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS krankheit_mit_atest_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'krankheit_ohne_atest' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS krankheit_ohne_atest_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'berufsschule' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS berufsschule_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'weiterbildung' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS weiterbildung_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'persoenliche_gruende' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS persoenliche_gruende_days, COALESCE(SUM(CASE WHEN LOWER(TRIM(COALESCE(absence_reason, 'urlaub'))) = 'sonstiges' AND LOWER(TRIM(COALESCE(status, ''))) != 'abgelehnt' THEN COALESCE(days, 0) ELSE 0 END), 0) AS sonstiges_days FROM vacations WHERE start_date >= :year_start AND start_date < :next_year_start GROUP BY user_id "); $statsStmt->execute([ 'year_start' => $yearStart, 'next_year_start' => $nextYearStart, ]); $statsRows = $statsStmt->fetchAll(PDO::FETCH_ASSOC); $statsByUser = []; foreach ($statsRows as $row) { $statsByUser[(int)$row['user_id']] = $row; } $upcomingStmt = $pdo->prepare(" SELECT v.user_id, v.start_date, v.end_date, v.days, v.status, v.absence_reason, u.vorname, u.nachname FROM vacations v JOIN users u ON u.id = v.user_id WHERE v.end_date >= CURDATE() AND LOWER(TRIM(COALESCE(v.status, ''))) != 'abgelehnt' ORDER BY v.start_date ASC, v.end_date ASC "); $upcomingStmt->execute(); $upcomingRows = $upcomingStmt->fetchAll(PDO::FETCH_ASSOC); $upcomingByUser = []; foreach ($upcomingRows as $row) { $uid = (int)$row['user_id']; if (!isset($upcomingByUser[$uid])) { $upcomingByUser[$uid] = []; } if (count($upcomingByUser[$uid]) < 5) { $upcomingByUser[$uid][] = $row; } } function vacationOverviewReasonValue(array $statsByUser, int $userId, string $key): int { $map = [ 'urlaub' => 'urlaub_total_days', 'krankheit_mit_atest' => 'krankheit_mit_atest_days', 'krankheit_ohne_atest' => 'krankheit_ohne_atest_days', 'berufsschule' => 'berufsschule_days', 'weiterbildung' => 'weiterbildung_days', 'persoenliche_gruende' => 'persoenliche_gruende_days', 'sonstiges' => 'sonstiges_days', ]; $field = $map[$key] ?? null; if ($field === null || !isset($statsByUser[$userId])) { return 0; } return (int)($statsByUser[$userId][$field] ?? 0); } ?>
| Mitarbeiter | Anspruch | Urlaub genutzt () | Verbleibend | Alle Abwesenheiten | Offene Anträge | Bevorstehende Einträge | ||
|---|---|---|---|---|---|---|---|---|
| '; } } ?> |
Hinweis: Der Urlaubsanspruch wird weiterhin aus users.urlaubstage gelesen. Die zusätzlichen Spalten zeigen die Abwesenheiten je Grund pro Jahr.