diff --git a/admin/zeiterfassung_hilfe.php b/admin/zeiterfassung_hilfe.php index a10d929..1686dcf 100644 --- a/admin/zeiterfassung_hilfe.php +++ b/admin/zeiterfassung_hilfe.php @@ -22,7 +22,7 @@ if (!$user) {
Im Bereich Einstellungen werden zentrale Konfigurationen gepflegt, zum Beispiel Benachrichtigungsadressen und technische Grundeinstellungen. Änderungen dort sollten bewusst vorgenommen werden.
Die Zeiterfassung ist aus dem Admin-Menü direkt erreichbar. Dort wechseln Administratoren in den operativen Bereich für Zeiten, Fehlbuchungen, Urlaub und Mitarbeiterverwaltung.
+Die Zeiterfassung ist aus dem Admin-Menü direkt erreichbar. Dort wechseln Administratoren in den operativen Bereich für Zeiten, Fehlbuchungen, Abwesenheiten und Mitarbeiterverwaltung.
Der Bereich Fehlbuchungen zeigt unvollständige oder fehlerhafte KOMMEN/GEHEN-Folgen an. Mitarbeiter sehen dort ihre eigenen problematischen Tage und können diese korrigieren.
-Über Urlaubsantrag wird Urlaub eingereicht. Der Antrag wird anschließend über die Genehmigungsfunktionen der Admins geprüft.
+Über Abwesenheitsantrag werden Urlaube und weitere Abwesenheitsgründe eingereicht. Der Antrag wird anschließend über die Genehmigungsfunktionen der Admins geprüft.
-Im eigenen Urlaubskalender sind persönliche Urlaubszeiten sichtbar. So kann jeder Mitarbeiter seine eigenen Anträge und genehmigten Zeiten prüfen.
+Im eigenen Kalender sind die persönlichen Abwesenheiten sichtbar. So kann jeder Mitarbeiter seine eigenen Anträge und genehmigten Zeiten prüfen.
Der Team-Kalender zeigt genehmigte Urlaubseinträge des Teams sowie Betriebsurlaub. Damit lassen sich Überschneidungen und Abwesenheiten leichter erkennen.
@@ -89,11 +89,14 @@ if (!$user) {In der Mitarbeiterverwaltung werden Mitarbeiter angelegt und gepflegt. Dort werden unter anderem E-Mail, Rollen, Zeiterfassungsberechtigung, Admin-Status und Kartenzuordnungen verwaltet.
-Die Urlaubsübersicht dient zur Kontrolle aller Urlaubseinträge. Sie ist besonders für Planung und Rückfragen hilfreich.
+Die Abwesenheitsübersicht dient zur Kontrolle aller Abwesenheitseinträge. Dort werden pro Mitarbeiter die Urlaubstage für den Anspruch sowie die übrigen Abwesenheitsgründe je Jahr zusammengefasst.
-Im Bereich Urlaubsanträge genehmigen prüfen Admins eingereichte Urlaube und können diese annehmen oder ablehnen.
+Im Bereich Abwesenheiten genehmigen prüfen Admins eingereichte Abwesenheiten und können diese annehmen oder ablehnen.
+ +Der Leitungskalender zeigt alle Abwesenheitstermine über alle Personen hinweg. Damit lassen sich Urlaub, Krankheit, Weiterbildung und weitere Gründe zentral koordinieren.
Unter Betriebsurlaub werden zentrale Schließzeiten der Praxis gepflegt. Diese Einträge erscheinen im Urlaubskontext und können mit Vertreterinformationen hinterlegt werden.
@@ -118,13 +121,13 @@ if (!$user) {Eigene fehlerhafte Tage können in der Zeiterfassung angepasst werden. Größere Korrekturen oder Sammelkorrekturen werden durch Admins vorgenommen.
Im Bereich Mein Urlaubskalender. Dort sind die eigenen Urlaubszeiträume sichtbar.
+Im Bereich Mein Abwesenheitskalender. Dort sind die eigenen Abwesenheitszeiträume sichtbar.
Im Team-Urlaubskalender. Dort werden freigegebene Urlaube und Betriebsurlaub angezeigt.
Betriebsurlaub sind zentrale Schließzeiten der Praxis. Diese werden administrativ gepflegt und im Urlaubskalender sichtbar gemacht.
+Betriebsurlaub sind zentrale Schließzeiten der Praxis. Diese werden administrativ gepflegt und im Abwesenheitskalender sichtbar gemacht.
Dann sollte ein Admin oder Vorgesetzter informiert werden. Admins können einzelne Tage bearbeiten oder automatisch fehlende Ausstempelungen ergänzen.
@@ -151,6 +154,9 @@ if (!$user) {Im Bereich Betriebsurlaub. Dort werden Beschreibung, Vertretung, Telefonnummer, Adresse und URL gepflegt.
+Nur Urlaub zählt auf den Urlaubsanspruch. Krankheit, Berufsschule, Weiterbildung, persönliche Gründe und Sonstiges werden separat ausgewertet.
+Es gibt direkte Menüeinträge zwischen beiden Bereichen. In der Zeiterfassung führt Zur Admin-Oberfläche zurück in die Verwaltung.
diff --git a/zeiterfassung/admin_absence_calendar.php b/zeiterfassung/admin_absence_calendar.php new file mode 100644 index 0000000..3c30d7a --- /dev/null +++ b/zeiterfassung/admin_absence_calendar.php @@ -0,0 +1,233 @@ +getMessage(); +} + +function adminAbsenceStatusLabel(?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); +} + +function adminAbsenceColor(string $reason, string $status): string +{ + $reason = vacationAbsenceNormalizeReason($reason); + $status = trim(strtolower($status)); + + $palette = [ + 'urlaub' => '#2f855a', + 'krankheit_mit_atest' => '#c53030', + 'krankheit_ohne_atest' => '#9b2c2c', + 'berufsschule' => '#dd6b20', + 'weiterbildung' => '#6b46c1', + 'persoenliche_gruende' => '#4a5568', + 'sonstiges' => '#718096', + ]; + + $color = $palette[$reason] ?? '#2d3748'; + if ($status === 'beantragt') { + return $color; + } + + return $color; +} + +function adminAbsenceEventTitle(array $row): string +{ + $employee = trim(($row['vorname'] ?? '') . ' ' . ($row['nachname'] ?? '')); + $reasonLabel = vacationAbsenceReasonLabel($row['absence_reason'] ?? 'urlaub'); + $statusLabel = adminAbsenceStatusLabel($row['status'] ?? ''); + if ($employee === '') { + return $reasonLabel . ' (' . $statusLabel . ')'; + } + + if ($statusLabel !== 'Genehmigt') { + return $employee . ' · ' . $reasonLabel . ' (' . $statusLabel . ')'; + } + + return $employee . ' · ' . $reasonLabel; +} + +$events = []; + +$vacStmt = $pdo->prepare(" + SELECT + v.id, + v.user_id, + v.start_date, + v.end_date, + v.days, + v.status, + v.comment_user, + v.absence_reason, + u.vorname, + u.nachname, + u.email + FROM vacations v + JOIN users u ON u.id = v.user_id + WHERE LOWER(TRIM(COALESCE(v.status, ''))) != 'abgelehnt' + ORDER BY v.start_date ASC, v.end_date ASC, u.nachname ASC, u.vorname ASC +"); +$vacStmt->execute(); +$vacations = $vacStmt->fetchAll(PDO::FETCH_ASSOC); + +foreach ($vacations as $row) { + $endInclusive = (new DateTime($row['end_date']))->modify('+1 day')->format('Y-m-d'); + $reason = vacationAbsenceNormalizeReason($row['absence_reason'] ?? 'urlaub'); + $status = trim((string)($row['status'] ?? '')); + $statusLabel = adminAbsenceStatusLabel($status); + + $events[] = [ + 'id' => 'vac_' . $row['id'], + 'title' => adminAbsenceEventTitle($row), + 'start' => $row['start_date'], + 'end' => $endInclusive, + 'allDay' => true, + 'backgroundColor' => adminAbsenceColor($reason, $status), + 'borderColor' => adminAbsenceColor($reason, $status), + 'extendedProps' => [ + 'type' => 'absence', + 'user_id' => $row['user_id'], + 'employee_name' => trim(($row['vorname'] ?? '') . ' ' . ($row['nachname'] ?? '')), + 'email' => $row['email'] ?? '', + 'status' => $status, + 'status_label' => $statusLabel, + 'reason' => $reason, + 'reason_label' => vacationAbsenceReasonLabel($reason), + 'days' => (int)($row['days'] ?? 0), + 'comment' => $row['comment_user'] ?? '', + ], + ]; +} + +$companyStmt = $pdo->prepare(" + SELECT id, start_date, end_date, description + FROM company_holidays + ORDER BY start_date ASC, end_date ASC +"); +$companyStmt->execute(); +$companyHolidays = $companyStmt->fetchAll(PDO::FETCH_ASSOC); + +foreach ($companyHolidays as $row) { + $endInclusive = (new DateTime($row['end_date']))->modify('+1 day')->format('Y-m-d'); + $events[] = [ + 'id' => 'com_' . $row['id'], + 'title' => $row['description'] ?: 'Betriebsurlaub', + 'start' => $row['start_date'], + 'end' => $endInclusive, + 'allDay' => true, + 'backgroundColor' => '#005f73', + 'borderColor' => '#005f73', + 'extendedProps' => [ + 'type' => 'company', + 'description' => $row['description'] ?: 'Betriebsurlaub', + ], + ]; +} + +include 'header.php'; +?> + +| Mitarbeiter | -Von | -Bis | -Tage | -Kommentar | -Status | -Aktion | -
|---|---|---|---|---|---|---|
| - | - | - | - | - | - Beantragt'; - } elseif ($r['status'] === 'genehmigt') { - echo 'Genehmigt'; - } else { - echo 'Abgelehnt'; - } - ?> - | -- - - - - - - - - | -
| Mitarbeiter | +Grund | +Von | +Bis | +Tage | +Kommentar | +Status | +Aktion | +
|---|---|---|---|---|---|---|---|
| + | + | + | + | + | + | + Beantragt'; + } elseif ($r['status'] === 'genehmigt') { + echo 'Genehmigt'; + } else { + echo 'Abgelehnt'; + } + ?> + | ++ + + + + + + + + | +
Hier werden alle persönlichen Abwesenheiten angezeigt, inklusive Urlaub, Krankheit, Schule und Weiterbildung. Betriebsurlaub wird ebenfalls mit eingeblendet.
+ + +| Mitarbeiter | -Von | -Bis | -Tage | -Kommentar | -Aktion | -
|---|---|---|---|---|---|
| - | - | - | - | - | - - - - - - | -
| Mitarbeiter | +Grund | +Von | +Bis | +Tage | +Kommentar | +Aktion | +
|---|---|---|---|---|---|---|
| + | + | + | + | + | + | + + + + + + | +
Dieser Kalender zeigt nur Urlaub von Personen sowie Betriebsurlaub. Andere Abwesenheitsarten werden hier bewusst ausgeblendet.
+