prepare(" SELECT id, vorname, nachname, email FROM users WHERE zeiterfassung = 1 ORDER BY nachname, vorname "); $stmtUsers->execute(); $selectableUsers = $stmtUsers->fetchAll(PDO::FETCH_ASSOC); } function calculateWorkingDays($start, $end) { $start = new DateTime($start); $end = new DateTime($end); $end->modify('+1 day'); $interval = new DateInterval('P1D'); $period = new DatePeriod($start, $interval, $end); $workingDays = 0; foreach ($period as $day) { if ($day->format('N') < 6) { $workingDays++; } } return $workingDays; } if ($_SERVER["REQUEST_METHOD"] === "POST") { $start_date = trim((string)($_POST['start_date'] ?? '')); $end_date = trim((string)($_POST['end_date'] ?? '')); $comment = trim((string)($_POST['comment'] ?? '')); $selected_absence_reason = vacationAbsenceNormalizeReason($_POST['absence_reason'] ?? vacationAbsenceDefaultReason()); $selected_user_id = $canManageTeamVacations ? (int)($_POST['user_id'] ?? $user_id) : $user_id; $selectedUser = null; if ($selected_user_id <= 0) { $error = "Bitte einen Mitarbeiter auswaehlen."; } else { $stmtSelectedUser = $pdo->prepare(" SELECT id, vorname, nachname FROM users WHERE id = ? AND zeiterfassung = 1 LIMIT 1 "); $stmtSelectedUser->execute([$selected_user_id]); $selectedUser = $stmtSelectedUser->fetch(PDO::FETCH_ASSOC); if (!$selectedUser) { $error = "Der ausgewaehlte Mitarbeiter wurde nicht gefunden."; } } if ($error === "" && ($start_date === '' || $end_date === '')) { $error = "Bitte beide Datumsfelder ausfuellen."; } elseif ($error === "" && $start_date > $end_date) { $error = "Enddatum liegt vor dem Startdatum."; } elseif ($error === "" && vacationAbsenceCountsAgainstEntitlement($selected_absence_reason) && $start_date < date("Y-m-d")) { $error = "Urlaub kann nicht in der Vergangenheit beantragt werden."; } elseif ($error === "") { $stmt = $pdo->prepare(" SELECT COUNT(*) FROM vacations WHERE user_id = ? AND status != 'abgelehnt' AND ( (start_date BETWEEN ? AND ?) OR (end_date BETWEEN ? AND ?) OR (? BETWEEN start_date AND end_date) ) "); $stmt->execute([$selected_user_id, $start_date, $end_date, $start_date, $end_date, $start_date]); $exists = (int)$stmt->fetchColumn(); if ($exists > 0) { $error = "Der Zeitraum ueberschneidet sich mit einem bestehenden Antrag."; } else { $days = calculateWorkingDays($start_date, $end_date); $insert = $pdo->prepare(" INSERT INTO vacations (user_id, start_date, end_date, days, comment_user, absence_reason) VALUES (?, ?, ?, ?, ?, ?) "); $insert->execute([$selected_user_id, $start_date, $end_date, $days, $comment, $selected_absence_reason]); $reasonLabel = vacationAbsenceReasonLabel($selected_absence_reason); if ($selected_user_id !== $user_id && $selectedUser) { $message = "Abwesenheit fuer " . $selectedUser['vorname'] . " " . $selectedUser['nachname'] . " erfolgreich eingetragen ($days Werktage, Grund: " . $reasonLabel . ")."; } else { if ($selected_absence_reason === 'urlaub') { $message = "Urlaubsantrag erfolgreich eingereicht ($days Werktage)."; } else { $message = "Abwesenheitsantrag erfolgreich eingereicht ($days Werktage, Grund: " . $reasonLabel . ")."; } } } } } ?>

Abwesenheitsantrag

Nur Urlaub wird auf das Urlaubskontingent angerechnet.


prepare($listSql); $stmt->execute(); } else { $listSql .= " WHERE v.user_id = ? ORDER BY v.created_at DESC"; $stmt = $pdo->prepare($listSql); $stmt->execute([$user_id]); } $antraege = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>
Mitarbeiter Grund Von Bis Tage Status Aktion
Beantragt'; } elseif ($a['status'] === 'genehmigt') { echo 'Genehmigt'; } else { echo 'Abgelehnt'; } ?>