0) { return mysqli_fetch_assoc($result); } return null; } // Den aktuellen Termin holen $row = get_current_meeting($conn); // Logik: Wenn ein Termin existiert und dessen Datum/Uhrzeit in der Vergangenheit liegt, // wird er als "abgeschlossen" markiert und der nächste Termin wird geladen. if ($row && strtotime($row['meeting_date']) < time()) { $id_to_complete = $row['id']; $sql_update = "UPDATE meetings SET is_completed = 1 WHERE id = ?"; $stmt_update = mysqli_prepare($conn, $sql_update); if ($stmt_update) { mysqli_stmt_bind_param($stmt_update, "i", $id_to_complete); mysqli_stmt_execute($stmt_update); mysqli_stmt_close($stmt_update); } // Den nächsten (jetzt aktuellen) Termin neu laden $row = get_current_meeting($conn); } // --- NEUE LOGIK FÜR TEILNAHMEBESTÄTIGUNG --- if ($row) { $meeting_id = $row['id']; $user_attendance_status = null; // Aktionen aus der URL verarbeiten if (isset($_GET['action']) && isset($_GET['meeting_id']) && $_GET['meeting_id'] == $meeting_id) { $action = $_GET['action']; $rsvp_status_value = null; $attended_value = 0; if ($action == 'accept') { $rsvp_status_value = 'accepted'; $attended_value = 1; } elseif ($action == 'decline') { $rsvp_status_value = 'declined'; $attended_value = 0; } elseif ($action == 'maybe') { $rsvp_status_value = 'maybe'; $attended_value = 0; } if ($rsvp_status_value !== null) { // Vorhandenen Eintrag prüfen $check_sql = "SELECT rsvp_status FROM meeting_teilnehmer WHERE meeting_id = ? AND user_id = ?"; $check_stmt = mysqli_prepare($conn, $check_sql); if ($check_stmt) { mysqli_stmt_bind_param($check_stmt, "ii", $meeting_id, $logged_in_user_id); mysqli_stmt_execute($check_stmt); $check_result = mysqli_stmt_get_result($check_stmt); $existing_attendance = mysqli_fetch_assoc($check_result); mysqli_stmt_close($check_stmt); if ($existing_attendance) { // Eintrag aktualisieren $update_sql = "UPDATE meeting_teilnehmer SET rsvp_status = ?, attended = ? WHERE meeting_id = ? AND user_id = ?"; $update_stmt = mysqli_prepare($conn, $update_sql); if ($update_stmt) { mysqli_stmt_bind_param($update_stmt, "siii", $rsvp_status_value, $attended_value, $meeting_id, $logged_in_user_id); mysqli_stmt_execute($update_stmt); mysqli_stmt_close($update_stmt); } } else { // Neuen Eintrag hinzufügen $insert_sql = "INSERT INTO meeting_teilnehmer (meeting_id, user_id, attended, rsvp_status) VALUES (?, ?, ?, ?)"; $insert_stmt = mysqli_prepare($conn, $insert_sql); if ($insert_stmt) { mysqli_stmt_bind_param($insert_stmt, "iiis", $meeting_id, $logged_in_user_id, $attended_value, $rsvp_status_value); mysqli_stmt_execute($insert_stmt); mysqli_stmt_close($insert_stmt); } } } header("Location: index.php"); exit; } } // Status des eingeloggten Nutzers abrufen $user_status_sql = "SELECT rsvp_status FROM meeting_teilnehmer WHERE meeting_id = ? AND user_id = ?"; $user_status_stmt = mysqli_prepare($conn, $user_status_sql); if ($user_status_stmt) { mysqli_stmt_bind_param($user_status_stmt, "ii", $meeting_id, $logged_in_user_id); mysqli_stmt_execute($user_status_stmt); $user_status_result = mysqli_stmt_get_result($user_status_stmt); $user_status_row = mysqli_fetch_assoc($user_status_result); if ($user_status_row) { $user_attendance_status = $user_status_row['rsvp_status']; } mysqli_stmt_close($user_status_stmt); } // Daten für die Benutzerübersicht abrufen $attendees_sql = "SELECT t.rsvp_status, u.username FROM meeting_teilnehmer AS t LEFT JOIN users AS u ON t.user_id = u.id WHERE t.meeting_id = ?"; $attendees_stmt = mysqli_prepare($conn, $attendees_sql); $accepted_users = []; $declined_users = []; $maybe_users = []; $total_accepted = 0; $total_declined = 0; $total_maybe = 0; if ($attendees_stmt) { mysqli_stmt_bind_param($attendees_stmt, "i", $meeting_id); mysqli_stmt_execute($attendees_stmt); $attendees_result = mysqli_stmt_get_result($attendees_stmt); while ($row_user = mysqli_fetch_assoc($attendees_result)) { switch ($row_user['rsvp_status']) { case 'accepted': $accepted_users[] = htmlspecialchars($row_user['username']); $total_accepted++; break; case 'declined': $declined_users[] = htmlspecialchars($row_user['username']); $total_declined++; break; case 'maybe': $maybe_users[] = htmlspecialchars($row_user['username']); $total_maybe++; break; } } mysqli_stmt_close($attendees_stmt); } // --- NEUE LOGIK FÜR DIE BESTIMMUNG DES NÄCHSTEN ZAHLERS --- $next_payer_username = null; if ($total_accepted > 0) { $sql_next_payer = " SELECT u.username, (SELECT COUNT(*) FROM meeting_teilnehmer WHERE user_id = u.id AND paid = 1) AS paid_count FROM meeting_teilnehmer mt JOIN users u ON mt.user_id = u.id WHERE mt.meeting_id = ? AND mt.rsvp_status = 'accepted' ORDER BY paid_count ASC "; $stmt_next_payer = mysqli_prepare($conn, $sql_next_payer); mysqli_stmt_bind_param($stmt_next_payer, "i", $meeting_id); mysqli_stmt_execute($stmt_next_payer); $result_next_payer = mysqli_stmt_get_result($stmt_next_payer); $payer_candidates = []; $min_paid_count = -1; while ($row_payer = mysqli_fetch_assoc($result_next_payer)) { if ($min_paid_count == -1 || $row_payer['paid_count'] < $min_paid_count) { $min_paid_count = $row_payer['paid_count']; $payer_candidates = [$row_payer['username']]; } elseif ($row_payer['paid_count'] == $min_paid_count) { $payer_candidates[] = $row_payer['username']; } } mysqli_stmt_close($stmt_next_payer); if (!empty($payer_candidates)) { sort($payer_candidates); $next_payer_username = $payer_candidates[0]; } } // --- NEUE LOGIK FÜR TERMINVERSCHIEBUNG --- if ($row) { // Aktive Verschiebungsvorschläge abrufen $proposals_sql = "SELECT p.*, u.username as proposer_name, COUNT(CASE WHEN v.vote = 'yes' THEN 1 END) as yes_votes, COUNT(CASE WHEN v.vote = 'no' THEN 1 END) as no_votes, COUNT(CASE WHEN v.vote = 'maybe' THEN 1 END) as maybe_votes FROM meeting_reschedule_proposals p LEFT JOIN users u ON p.proposed_by_user_id = u.id LEFT JOIN meeting_reschedule_votes v ON p.id = v.proposal_id WHERE p.meeting_id = ? AND p.status = 'pending' GROUP BY p.id ORDER BY p.created_at DESC"; $proposals_stmt = mysqli_prepare($conn, $proposals_sql); $active_proposals = []; if ($proposals_stmt) { mysqli_stmt_bind_param($proposals_stmt, "i", $meeting_id); mysqli_stmt_execute($proposals_stmt); $proposals_result = mysqli_stmt_get_result($proposals_stmt); while ($proposal = mysqli_fetch_assoc($proposals_result)) { $active_proposals[] = $proposal; } mysqli_stmt_close($proposals_stmt); } // User-Stimme für aktive Vorschläge abrufen $user_votes = []; if (!empty($active_proposals)) { $vote_sql = "SELECT proposal_id, vote FROM meeting_reschedule_votes WHERE user_id = ? AND proposal_id IN (" . implode(',', array_column($active_proposals, 'id')) . ")"; $vote_stmt = mysqli_prepare($conn, $vote_sql); if ($vote_stmt) { mysqli_stmt_bind_param($vote_stmt, "i", $logged_in_user_id); mysqli_stmt_execute($vote_stmt); $vote_result = mysqli_stmt_get_result($vote_stmt); while ($vote = mysqli_fetch_assoc($vote_result)) { $user_votes[$vote['proposal_id']] = $vote['vote']; } mysqli_stmt_close($vote_stmt); } } // Neue Verschiebung vorschlagen - MIT EINSCHRÄNKUNG (nur eine pro User) if (isset($_POST['propose_reschedule']) && isset($_POST['new_date']) && isset($_POST['reason'])) { $new_date = $_POST['new_date']; $reason = $_POST['reason']; // Prüfen, ob User bereits einen Vorschlag eingereicht hat $check_existing_sql = "SELECT id FROM meeting_reschedule_proposals WHERE meeting_id = ? AND proposed_by_user_id = ? AND status = 'pending'"; $check_existing_stmt = mysqli_prepare($conn, $check_existing_sql); $existing_proposal = null; if ($check_existing_stmt) { mysqli_stmt_bind_param($check_existing_stmt, "ii", $meeting_id, $logged_in_user_id); mysqli_stmt_execute($check_existing_stmt); $check_result = mysqli_stmt_get_result($check_existing_stmt); $existing_proposal = mysqli_fetch_assoc($check_result); mysqli_stmt_close($check_existing_stmt); } // Nur einreichen, wenn noch kein aktiver Vorschlag existiert if (!$existing_proposal) { $insert_proposal_sql = "INSERT INTO meeting_reschedule_proposals (meeting_id, proposed_by_user_id, proposed_date, reason) VALUES (?, ?, ?, ?)"; $insert_stmt = mysqli_prepare($conn, $insert_proposal_sql); if ($insert_stmt) { mysqli_stmt_bind_param($insert_stmt, "iiss", $meeting_id, $logged_in_user_id, $new_date, $reason); mysqli_stmt_execute($insert_stmt); mysqli_stmt_close($insert_stmt); // >>> E-MAIL-BENACHRICHTIGUNG SENDEN <<< require_once __DIR__ . '/vendor/autoload.php'; $mail = new \PHPMailer\PHPMailer\PHPMailer(true); try { // SMTP-Konfiguration aus secure.php $mail->isSMTP(); $mail->Host = SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = SMTP_USERNAME; $mail->Password = SMTP_PASSWORD; $mail->SMTPSecure = SMTP_ENCRYPTION; $mail->Port = SMTP_PORT; $mail->setFrom(MAIL_FROM_ADDRESS, MAIL_FROM_NAME); $proposer_name = $_SESSION['username'] ?? 'Ein Benutzer'; $new_date_formatted = date('d.m.Y H:i', strtotime($new_date)); $subject = "DoMiLi: Neuer Terminvorschlag für " . date('d.m.Y H:i', strtotime($row['meeting_date'])); $message_template = "Hallo %s,\n\n%s hat einen neuen Vorschlag zur Verschiebung des Termins eingereicht.\n\nNeuer vorgeschlagener Termin: %s\nGrund: %s\n\nBitte logge dich ein, um abzustimmen oder den Vorschlag einzusehen.\n\nDein DoMiLi-Team"; $participant_sql = "SELECT DISTINCT u.email, u.username FROM meeting_teilnehmer mt JOIN users u ON mt.user_id = u.id WHERE mt.meeting_id = ? AND mt.user_id != ? AND u.email IS NOT NULL AND u.email != ''"; $participant_stmt = mysqli_prepare($conn, $participant_sql); mysqli_stmt_bind_param($participant_stmt, "ii", $meeting_id, $logged_in_user_id); mysqli_stmt_execute($participant_stmt); $participants = mysqli_stmt_get_result($participant_stmt); while ($participant = mysqli_fetch_assoc($participants)) { $mail->addAddress($participant['email']); $mail->Subject = $subject; $mail->Body = sprintf($message_template, $participant['username'], $proposer_name, $new_date_formatted, $reason); $mail->send(); $mail->clearAddresses(); } $_SESSION['success_message'] = "Vorschlag eingereicht! Alle Teilnehmer wurden per E-Mail benachrichtigt."; } catch (Exception $e) { $_SESSION['error_message'] = "Fehler beim Senden der E-Mails."; error_log("PHPMailer Error: " . $mail->ErrorInfo); } } } else { $_SESSION['error_message'] = "Du hast bereits einen Verschiebungsvorschlag eingereicht. Bitte lösche zuerst deinen bestehenden Vorschlag."; } header("Location: index.php"); exit; } // Für Vorschlag abstimmen if (isset($_POST['vote_proposal']) && isset($_POST['proposal_id'])) { $proposal_id = intval($_POST['proposal_id']); $vote = $_POST['vote_proposal']; if (!in_array($vote, ['yes', 'no', 'maybe'])) { error_log("Ungültige Abstimmung: " . $vote); header("Location: index.php"); exit; } error_log("Abstimmung empfangen: proposal_id=$proposal_id, vote=$vote, user_id=$logged_in_user_id"); // Vorhandene Stimme prüfen $check_vote_sql = "SELECT id FROM meeting_reschedule_votes WHERE proposal_id = ? AND user_id = ?"; $check_stmt = mysqli_prepare($conn, $check_vote_sql); $existing_vote = null; if ($check_stmt) { mysqli_stmt_bind_param($check_stmt, "ii", $proposal_id, $logged_in_user_id); mysqli_stmt_execute($check_stmt); $check_result = mysqli_stmt_get_result($check_stmt); $existing_vote = mysqli_fetch_assoc($check_result); mysqli_stmt_close($check_stmt); error_log("Vorhandene Stimme gefunden: " . ($existing_vote ? "Ja (ID: " . $existing_vote['id'] . ")" : "Nein")); if ($existing_vote) { // Stimme aktualisieren $update_vote_sql = "UPDATE meeting_reschedule_votes SET vote = ? WHERE id = ?"; $update_stmt = mysqli_prepare($conn, $update_vote_sql); if ($update_stmt) { mysqli_stmt_bind_param($update_stmt, "si", $vote, $existing_vote['id']); $result = mysqli_stmt_execute($update_stmt); error_log("Stimme aktualisiert: " . ($result ? "Erfolg" : "Fehler")); mysqli_stmt_close($update_stmt); } } else { // Neue Stimme abgeben $insert_vote_sql = "INSERT INTO meeting_reschedule_votes (proposal_id, user_id, vote) VALUES (?, ?, ?)"; $insert_stmt = mysqli_prepare($conn, $insert_vote_sql); if ($insert_stmt) { mysqli_stmt_bind_param($insert_stmt, "iis", $proposal_id, $logged_in_user_id, $vote); $result = mysqli_stmt_execute($insert_stmt); error_log("Neue Stimme eingefügt: " . ($result ? "Erfolg" : "Fehler")); error_log("Affected rows: " . mysqli_stmt_affected_rows($insert_stmt)); mysqli_stmt_close($insert_stmt); } } } header("Location: index.php"); exit; } // Vorschlag löschen (nur vom Ersteller) if (isset($_POST['delete_proposal']) && isset($_POST['proposal_id'])) { $proposal_id = $_POST['proposal_id']; $check_owner_sql = "SELECT proposed_by_user_id FROM meeting_reschedule_proposals WHERE id = ? AND meeting_id = ?"; $check_owner_stmt = mysqli_prepare($conn, $check_owner_sql); if ($check_owner_stmt) { mysqli_stmt_bind_param($check_owner_stmt, "ii", $proposal_id, $meeting_id); mysqli_stmt_execute($check_owner_stmt); $check_owner_result = mysqli_stmt_get_result($check_owner_stmt); $proposal_owner = mysqli_fetch_assoc($check_owner_result); mysqli_stmt_close($check_owner_stmt); if ($proposal_owner && $proposal_owner['proposed_by_user_id'] == $logged_in_user_id) { $delete_votes_sql = "DELETE FROM meeting_reschedule_votes WHERE proposal_id = ?"; $delete_votes_stmt = mysqli_prepare($conn, $delete_votes_sql); if ($delete_votes_stmt) { mysqli_stmt_bind_param($delete_votes_stmt, "i", $proposal_id); mysqli_stmt_execute($delete_votes_stmt); mysqli_stmt_close($delete_votes_stmt); } $delete_proposal_sql = "DELETE FROM meeting_reschedule_proposals WHERE id = ?"; $delete_proposal_stmt = mysqli_prepare($conn, $delete_proposal_sql); if ($delete_proposal_stmt) { mysqli_stmt_bind_param($delete_proposal_stmt, "i", $proposal_id); mysqli_stmt_execute($delete_proposal_stmt); mysqli_stmt_close($delete_proposal_stmt); } } } header("Location: index.php"); exit; } // Vorschlag bearbeiten (nur vom Ersteller) if (isset($_POST['edit_proposal']) && isset($_POST['proposal_id']) && isset($_POST['new_date']) && isset($_POST['reason'])) { $proposal_id = $_POST['proposal_id']; $new_date = $_POST['new_date']; $reason = $_POST['reason']; $check_owner_sql = "SELECT proposed_by_user_id FROM meeting_reschedule_proposals WHERE id = ? AND meeting_id = ?"; $check_owner_stmt = mysqli_prepare($conn, $check_owner_sql); if ($check_owner_stmt) { mysqli_stmt_bind_param($check_owner_stmt, "ii", $proposal_id, $meeting_id); mysqli_stmt_execute($check_owner_stmt); $check_owner_result = mysqli_stmt_get_result($check_owner_stmt); $proposal_owner = mysqli_fetch_assoc($check_owner_result); mysqli_stmt_close($check_owner_stmt); if ($proposal_owner && $proposal_owner['proposed_by_user_id'] == $logged_in_user_id) { $delete_votes_sql = "DELETE FROM meeting_reschedule_votes WHERE proposal_id = ?"; $delete_votes_stmt = mysqli_prepare($conn, $delete_votes_sql); if ($delete_votes_stmt) { mysqli_stmt_bind_param($delete_votes_stmt, "i", $proposal_id); mysqli_stmt_execute($delete_votes_stmt); mysqli_stmt_close($delete_votes_stmt); } $update_proposal_sql = "UPDATE meeting_reschedule_proposals SET proposed_date = ?, reason = ? WHERE id = ?"; $update_proposal_stmt = mysqli_prepare($conn, $update_proposal_sql); if ($update_proposal_stmt) { mysqli_stmt_bind_param($update_proposal_stmt, "ssi", $new_date, $reason, $proposal_id); mysqli_stmt_execute($update_proposal_stmt); mysqli_stmt_close($update_proposal_stmt); } } } header("Location: index.php"); exit; } // Vorschlag annehmen (nur Admin) if (isset($_POST['accept_proposal']) && isset($_POST['proposal_id'])) { if (isset($_SESSION['role']) && $_SESSION['role'] == 'admin') { $proposal_id = $_POST['proposal_id']; $accept_sql = "UPDATE meeting_reschedule_proposals SET status = 'accepted' WHERE id = ?"; $accept_stmt = mysqli_prepare($conn, $accept_sql); if ($accept_stmt) { mysqli_stmt_bind_param($accept_stmt, "i", $proposal_id); mysqli_stmt_execute($accept_stmt); mysqli_stmt_close($accept_stmt); } header("Location: index.php"); exit; } } // Vorschlag ablehnen (nur Admin) if (isset($_POST['reject_proposal']) && isset($_POST['proposal_id'])) { if (isset($_SESSION['role']) && $_SESSION['role'] == 'admin') { $proposal_id = $_POST['proposal_id']; $reject_sql = "UPDATE meeting_reschedule_proposals SET status = 'rejected' WHERE id = ?"; $reject_stmt = mysqli_prepare($conn, $reject_sql); if ($reject_stmt) { mysqli_stmt_bind_param($reject_stmt, "i", $proposal_id); mysqli_stmt_execute($reject_stmt); mysqli_stmt_close($reject_stmt); } header("Location: index.php"); exit; } } } } include('inc/header.php'); $german_weekdays = [ 'Mon' => 'Mo.', 'Tue' => 'Di.', 'Wed' => 'Mi.', 'Thu' => 'Do.', 'Fri' => 'Fr.', 'Sat' => 'Sa.', 'Sun' => 'So.', ]; ?>
= htmlspecialchars($color_row['name']) ?>
= htmlspecialchars($row['reason']) ?>
nächster Termin:
= $german_weekday . ' ' . date('d.m.Y H:i', strtotime($row['meeting_date'])) ?>
Du hast zugesagt!
Du hast abgesagt!
Vielleicht dabei!
Bist du dabei?
Rechnung wird bezahlt von:
Neuer Termin: = date('d.m.Y H:i', strtotime($proposal['proposed_date'])) ?>
Grund: = htmlspecialchars($proposal['reason']) ?>
Erstellt: = date('d.m.Y H:i', strtotime($proposal['created_at'])) ?>