(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) ** 2; 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'; ?>