From 0cb4ca932c17bf8d7c9b153cbf7548d25acff177 Mon Sep 17 00:00:00 2001 From: Borgal Date: Sun, 16 Nov 2025 21:26:21 +0100 Subject: [PATCH] 1.3.0 Geburtstagslogik verbessert --- index.php | 13 +++++--- participant.php | 36 ++++++++++++--------- zahler.php | 86 ++++++++++++++++++++++++++++--------------------- 3 files changed, 80 insertions(+), 55 deletions(-) diff --git a/index.php b/index.php index 10ddee4..83afe68 100755 --- a/index.php +++ b/index.php @@ -180,10 +180,10 @@ if ($row) { } // --- ZAHLENDE PERSON BESTIMMEN --- - $next_payer_username = null; + $next_payer_info = null; if ($total_accepted > 0) { include_once('zahler.php'); - $next_payer_username = get_next_payer_username($conn, $meeting_id); + $next_payer_info = get_next_payer_info($conn, $meeting_id); } @@ -369,10 +369,15 @@ $german_weekdays = [
- +

Rechnung wird bezahlt von:

-

+

+ + + cake + +

diff --git a/participant.php b/participant.php index 07c2728..472eae8 100755 --- a/participant.php +++ b/participant.php @@ -85,17 +85,15 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") { } mysqli_stmt_close($stmt_insert); - // 🔹 GEBURTSTAGS-REGEL: last_birthday_year NUR setzen, wenn Geburtstag bereits war - $current_year = (int)date('Y'); - $meeting_date_for_bday = $meeting['meeting_date']; - + // 🔹 GEBURTSTAGS-ZAHLUNG BEHANDELN foreach ($_POST['user_id'] as $user_id) { $user_id = (int)$user_id; $paid = isset($_POST['paid'][$user_id]) && $_POST['paid'][$user_id] == 1; if (!$paid) continue; - $user_stmt = mysqli_prepare($conn, "SELECT birthday FROM users WHERE id = ? AND birthday IS NOT NULL"); + // Hole aktuellen Status + $user_stmt = mysqli_prepare($conn, "SELECT birthday_payer_pending FROM users WHERE id = ?"); mysqli_stmt_bind_param($user_stmt, "i", $user_id); mysqli_stmt_execute($user_stmt); $user_row = mysqli_fetch_assoc(mysqli_stmt_get_result($user_stmt)); @@ -103,20 +101,28 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") { if (!$user_row) continue; - $birthday = $user_row['birthday']; - $birth_month = (int)date('m', strtotime($birthday)); - $birth_day = (int)date('d', strtotime($birthday)); - $birthday_this_year = "$current_year-$birth_month-$birth_day"; + $was_birthday_payer = (bool)$user_row['birthday_payer_pending']; - if (strtotime($birthday_this_year) <= strtotime($meeting_date_for_bday)) { - $update_stmt = mysqli_prepare($conn, " + if ($was_birthday_payer) { + // 🎂 Geburtstags-Zahlung: NICHT zählen, aber Flag zurücksetzen + $update = mysqli_prepare($conn, " UPDATE users - SET last_birthday_year = ? + SET birthday_payer_pending = 0 WHERE id = ? "); - mysqli_stmt_bind_param($update_stmt, "ii", $current_year, $user_id); - mysqli_stmt_execute($update_stmt); - mysqli_stmt_close($update_stmt); + mysqli_stmt_bind_param($update, "i", $user_id); + mysqli_stmt_execute($update); + mysqli_stmt_close($update); + } else { + // 🔢 Normale Zahlung: reguläre Anzahl erhöhen + $update = mysqli_prepare($conn, " + UPDATE users + SET regular_paid_count = regular_paid_count + 1 + WHERE id = ? + "); + mysqli_stmt_bind_param($update, "i", $user_id); + mysqli_stmt_execute($update); + mysqli_stmt_close($update); } } diff --git a/zahler.php b/zahler.php index 9b8b41d..5ce57f2 100755 --- a/zahler.php +++ b/zahler.php @@ -1,59 +1,73 @@ ..., 'is_birthday_payer' => true/false] + */ +function get_next_payer_info($conn, $meeting_id) +{ + // Meeting-Datum holen + $stmt = mysqli_prepare($conn, "SELECT meeting_date FROM meetings WHERE id = ?"); + mysqli_stmt_bind_param($stmt, "i", $meeting_id); + mysqli_stmt_execute($stmt); + $meeting = mysqli_fetch_assoc(mysqli_stmt_get_result($stmt)); + mysqli_stmt_close($stmt); + + if (!$meeting) { + return null; + } + + $meeting_date = $meeting['meeting_date']; + $current_year = (int)date('Y', strtotime($meeting_date)); + + // Alle ZUSAGENDEN Teilnehmer dieses Meetings $sql = " SELECT u.id, u.username, u.birthday, - u.last_birthday_year, - (SELECT COUNT(*) FROM meeting_teilnehmer WHERE user_id = u.id AND paid = 1) AS paid_count + u.birthday_payer_pending, + u.regular_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 u.username "; + $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "i", $meeting_id); mysqli_stmt_execute($stmt); $candidates = mysqli_fetch_all(mysqli_stmt_get_result($stmt), MYSQLI_ASSOC); mysqli_stmt_close($stmt); - if (empty($candidates)) return null; - - // Finde minimale paid_count - $min_paid = min(array_column($candidates, 'paid_count')); - $eligible = array_filter($candidates, fn($c) => $c['paid_count'] == $min_paid); - - $birthday_eligible = []; - $others = []; - - foreach ($eligible as $c) { - $is_birthday_payer_eligible = ( - !empty($c['birthday']) - && $c['birthday'] !== '0000-00-00' - && $c['last_birthday_year'] != $current_year - ); - - if ($is_birthday_payer_eligible) { - $birthday_eligible[] = $c; - } else { - $others[] = $c; - } + if (empty($candidates)) { + return null; } - // Sortiere alphabetisch - $sort = fn($a, $b) => strcmp($a['username'], $b['username']); - - if (!empty($birthday_eligible)) { - usort($birthday_eligible, $sort); - return $birthday_eligible[0]['username']; + // 🔹 PRIORITÄT 1: Geburtstags-Zahler (birthday_payer_pending = 1) + $birthday_candidates = array_filter($candidates, fn($c) => $c['birthday_payer_pending'] == 1); + if (!empty($birthday_candidates)) { + usort($birthday_candidates, fn($a, $b) => strcmp($a['username'], $b['username'])); + $first = $birthday_candidates[0]; + return [ + 'username' => $first['username'], + 'is_birthday_payer' => true + ]; } - $all = array_merge($birthday_eligible, $others); - usort($all, $sort); - return $all[0]['username']; + // 🔹 PRIORITÄT 2: Normale Rotation (nach regular_paid_count) + $min_paid = min(array_column($candidates, 'regular_paid_count')); + $regular_candidates = array_filter($candidates, fn($c) => $c['regular_paid_count'] == $min_paid); + usort($regular_candidates, fn($a, $b) => strcmp($a['username'], $b['username'])); + $first = $regular_candidates[0]; + return [ + 'username' => $first['username'], + 'is_birthday_payer' => false + ]; +} + +function get_next_payer_username($conn, $meeting_id) +{ + $info = get_next_payer_info($conn, $meeting_id); + return $info ? $info['username'] : null; }