From 0f34cf93a4a7c6fd1b1eae5d2b662c4bd04e8148 Mon Sep 17 00:00:00 2001 From: Borgal Date: Thu, 30 Oct 2025 03:13:35 +0100 Subject: [PATCH] =?UTF-8?q?men=C3=BC=20angepasst=20und=20Terminplaunung=20?= =?UTF-8?q?=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/planning.php | 276 ---------------------------------------- planning.php | 307 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+), 276 deletions(-) delete mode 100755 admin/planning.php create mode 100755 planning.php diff --git a/admin/planning.php b/admin/planning.php deleted file mode 100755 index 661b507..0000000 --- a/admin/planning.php +++ /dev/null @@ -1,276 +0,0 @@ -format('Y-m-d'); - $edit_meeting['meeting_time_only'] = $edit_date_time->format('H:i'); -} - -// --- Logik zum Hinzufügen oder Speichern von Terminen (POST) --- - -if ($_SERVER["REQUEST_METHOD"] == "POST") { - $meeting_date_only = $_POST['meeting_date']; - $meeting_time_only = $_POST['meeting_time'] ?? '12:00'; - $meeting_date = $meeting_date_only . ' ' . $meeting_time_only; - $color_id = $_POST['color_id']; - $reason = $_POST['reason'] ?? 'Zufallsfarbe'; - $id = $_POST['id'] ?? null; - - if ($id) { // Update-Logik - $stmt = mysqli_prepare($conn, "UPDATE meetings SET meeting_date = ?, color_id = ?, reason = ? WHERE id = ?"); - mysqli_stmt_bind_param($stmt, "sisi", $meeting_date, $color_id, $reason, $id); - if (mysqli_stmt_execute($stmt)) { - $message = "Termin erfolgreich aktualisiert!"; - $message_type = 'success'; - } else { - $message = "Fehler beim Aktualisieren des Termins."; - $message_type = 'danger'; - } - mysqli_stmt_close($stmt); - } else { // Insert-Logik - $stmt = mysqli_prepare($conn, "INSERT INTO meetings (meeting_date, color_id, reason) VALUES (?, ?, ?)"); - mysqli_stmt_bind_param($stmt, "sis", $meeting_date, $color_id, $reason); - if (mysqli_stmt_execute($stmt)) { - $message = "Neuer Termin erfolgreich hinzugefügt!"; - $message_type = 'success'; - } else { - $message = "Fehler beim Hinzufügen des Termins."; - $message_type = 'danger'; - } - mysqli_stmt_close($stmt); - } -} - -// --- Nächste 2 Donnerstage automatisch hinzufügen (mit 12:00 Uhr) --- -$date = new DateTime('now'); -$date->modify('next thursday'); - -for ($i = 0; $i < 2; $i++) { - $next_thursday = $date->format('Y-m-d') . ' 12:00:00'; - - $stmt = mysqli_prepare($conn, "SELECT id FROM meetings WHERE meeting_date = ?"); - mysqli_stmt_bind_param($stmt, "s", $next_thursday); - mysqli_stmt_execute($stmt); - mysqli_stmt_store_result($stmt); - - if (mysqli_stmt_num_rows($stmt) == 0) { - $color_id = get_weighted_random_color($conn); - if ($color_id) { - $stmt_insert = mysqli_prepare($conn, "INSERT INTO meetings (meeting_date, color_id, reason) VALUES (?, ?, ?)"); - $default_reason = "Zufallsfarbe"; - mysqli_stmt_bind_param($stmt_insert, "sis", $next_thursday, $color_id, $default_reason); - mysqli_stmt_execute($stmt_insert); - mysqli_stmt_close($stmt_insert); - } - } - mysqli_stmt_close($stmt); - - $date->modify('+1 week'); -} - -// --- Termine und alle Farben abrufen (für Übersicht und Formular) --- -$all_colors = []; -$result = mysqli_query($conn, "SELECT id, name, hex_code FROM colors ORDER BY name"); -while ($row = mysqli_fetch_assoc($result)) { - $all_colors[] = $row; -} - -$meetings = []; -// Aktualisierte Abfrage: Zeigt nur Meetings an, die nicht abgeschlossen sind (is_completed = 0) -$result = mysqli_query($conn, "SELECT m.id, m.meeting_date, m.created_at, m.reason, c.name AS color_name, c.hex_code FROM meetings m JOIN colors c ON m.color_id = c.id WHERE m.is_completed = 0 ORDER BY m.meeting_date"); -while ($row = mysqli_fetch_assoc($result)) { - $meetings[] = $row; -} - -require_once '../inc/header.php'; -?> - -
- - - - - -
-

Terminverwaltung

-
- -
-
-
-

-
-
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
wenn leer, wird automatisch "Zufallsfarbe" eingetragen
-
-
-
- - Abbrechen -
-
-
-
-
-
-
-
- -
-
-

Übersicht der nächsten Termine

- -
-
- -

Es sind noch keine Termine vorhanden.

- -
- -
- -

Grund:

-
- -
- -
-
-
- - \ No newline at end of file diff --git a/planning.php b/planning.php new file mode 100755 index 0000000..7af3c4b --- /dev/null +++ b/planning.php @@ -0,0 +1,307 @@ + (int)$row['id'], + 'usage' => (int)$row['usage_count'] + ]; + } + + $max_usage = max(array_column($colors, 'usage')); + $color_pool = []; + + foreach ($colors as $color) { + $weight = $max_usage - $color['usage'] + 1; // Mindestgewicht = 1 + for ($i = 0; $i < $weight; $i++) { + $color_pool[] = $color['id']; + } + } + + if (empty($color_pool)) { + return null; + } + + return $color_pool[array_rand($color_pool)]; +} + +// --- Nur Admins: Löschen --- +if ($is_admin && isset($_GET['action']) && $_GET['action'] == 'delete' && isset($_GET['id'])) { + $id = (int)$_GET['id']; + $stmt = mysqli_prepare($conn, "DELETE FROM meetings WHERE id = ?"); + mysqli_stmt_bind_param($stmt, "i", $id); + if (mysqli_stmt_execute($stmt)) { + $message = "Termin erfolgreich gelöscht!"; + $message_type = 'success'; + } else { + $message = "Fehler beim Löschen des Termins."; + $message_type = 'danger'; + } + mysqli_stmt_close($stmt); + header("Location: planning.php"); + exit(); +} + +// --- Nur Admins: Bearbeiten --- +if ($is_admin && isset($_GET['action']) && $_GET['action'] == 'edit' && isset($_GET['id'])) { + $id = (int)$_GET['id']; + $stmt = mysqli_prepare($conn, "SELECT id, meeting_date, color_id, reason FROM meetings WHERE id = ?"); + mysqli_stmt_bind_param($stmt, "i", $id); + mysqli_stmt_execute($stmt); + $result = mysqli_stmt_get_result($stmt); + $edit_meeting = mysqli_fetch_assoc($result); + mysqli_stmt_close($stmt); + $edit_mode = true; + + if ($edit_meeting) { + $edit_dt = new DateTime($edit_meeting['meeting_date']); + $edit_meeting['meeting_date_only'] = $edit_dt->format('Y-m-d'); + $edit_meeting['meeting_time_only'] = $edit_dt->format('H:i'); + } else { + $message = "Termin nicht gefunden."; + $message_type = 'warning'; + } +} + +// --- Nur Admins: Speichern (POST) --- +if ($is_admin && $_SERVER["REQUEST_METHOD"] == "POST") { + $meeting_date_only = $_POST['meeting_date'] ?? ''; + $meeting_time_only = $_POST['meeting_time'] ?? '12:00'; + $color_id = (int)($_POST['color_id'] ?? 0); + $reason = trim($_POST['reason'] ?? 'Zufallsfarbe'); + $id = !empty($_POST['id']) ? (int)$_POST['id'] : null; + + if (empty($meeting_date_only) || !$color_id) { + $message = "Datum und Farbe sind erforderlich."; + $message_type = 'danger'; + } else { + $meeting_date = $meeting_date_only . ' ' . $meeting_time_only; + if ($id) { + $stmt = mysqli_prepare($conn, "UPDATE meetings SET meeting_date = ?, color_id = ?, reason = ? WHERE id = ?"); + mysqli_stmt_bind_param($stmt, "sisi", $meeting_date, $color_id, $reason, $id); + } else { + $stmt = mysqli_prepare($conn, "INSERT INTO meetings (meeting_date, color_id, reason) VALUES (?, ?, ?)"); + mysqli_stmt_bind_param($stmt, "sis", $meeting_date, $color_id, $reason); + } + + if (mysqli_stmt_execute($stmt)) { + $message = $id ? "Termin aktualisiert!" : "Neuer Termin hinzugefügt!"; + $message_type = 'success'; + } else { + $message = "Fehler beim Speichern."; + $message_type = 'danger'; + } + mysqli_stmt_close($stmt); + header("Location: planning.php"); + exit(); + } +} + +// --- 🔁 Automatische Planung: 4 Donnerstage, max. 1 pro Woche --- +if ($is_admin) { + $today = new DateTime('today'); + $existing_weeks = []; + $result_existing = mysqli_query($conn, "SELECT meeting_date FROM meetings"); + while ($row = mysqli_fetch_assoc($result_existing)) { + $dt = new DateTime($row['meeting_date']); + $year = $dt->format('o'); + $week = $dt->format('W'); + $existing_weeks["$year-$week"] = true; + } + + $date = clone $today; + for ($i = 0; $i < 4; $i++) { + $date->modify($i === 0 ? 'next thursday' : 'next thursday'); + $year = $date->format('o'); + $week = $date->format('W'); + $week_key = "$year-$week"; + + if (!isset($existing_weeks[$week_key])) { + $new_date = $date->format('Y-m-d') . ' 12:00:00'; + $color_id = get_weighted_random_color($conn); + if ($color_id) { + $check = mysqli_prepare($conn, "SELECT id FROM meetings WHERE meeting_date = ?"); + mysqli_stmt_bind_param($check, "s", $new_date); + mysqli_stmt_execute($check); + $exists = mysqli_fetch_assoc(mysqli_stmt_get_result($check)); + mysqli_stmt_close($check); + + if (!$exists) { + $default_reason = "Zufallsfarbe"; + $ins = mysqli_prepare($conn, "INSERT INTO meetings (meeting_date, color_id, reason) VALUES (?, ?, ?)"); + mysqli_stmt_bind_param($ins, "sis", $new_date, $color_id, $default_reason); + mysqli_stmt_execute($ins); + mysqli_stmt_close($ins); + $existing_weeks[$week_key] = true; + } + } + } + } +} + +// --- Daten für Anzeige laden --- +$all_colors = []; +if ($is_admin) { + $result_colors = mysqli_query($conn, "SELECT id, name, hex_code FROM colors ORDER BY name"); + while ($row = mysqli_fetch_assoc($result_colors)) { + $all_colors[] = $row; + } +} + +$meetings = []; +$result_meetings = mysqli_query($conn, " + SELECT m.id, m.meeting_date, m.reason, c.name AS color_name, c.hex_code + FROM meetings m + JOIN colors c ON m.color_id = c.id + WHERE m.is_completed = 0 + ORDER BY m.meeting_date +"); +while ($row = mysqli_fetch_assoc($result_meetings)) { + $meetings[] = $row; +} + +require_once 'inc/header.php'; +?> + +
+ + + + +
+

Terminübersicht

+
+ + +
+
+
+

+
+
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
Wenn leer, wird „Zufallsfarbe“ eingetragen.
+
+
+ + Abbrechen +
+
+
+
+
+
+ + +
+
+

Anstehende Termine

+ + + +
+
+ +

Keine anstehenden Termine.

+ +
+ +
+ +
+ +
+ +
+
+
+ + \ No newline at end of file