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
-
-
-
-
-
-
-
-
-
Es sind noch keine Termine vorhanden.
-
-
-
-
-
-
-
= date('d.m.y H:i', strtotime($meeting['meeting_date'])); ?>
-
-
-
= htmlspecialchars($meeting['color_name']); ?>
-
-
-
-
-
Grund: = htmlspecialchars($meeting['reason']); ?>
-
-
-
-
-
-
-
-
-
\ 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';
+?>
+
+
+
+
+ = htmlspecialchars($message) ?>
+
+
+
+
+
+
Terminübersicht
+
+
+
+
+
+
+
+
+
+
+
Keine anstehenden Termine.
+
+
+
+
+
+
+
= date('d.m.Y H:i', strtotime($m['meeting_date'])) ?>
+
+
+
= htmlspecialchars($m['color_name']); ?>
+
+
Grund: = htmlspecialchars($m['reason']); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file