..., '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']; $meeting_ts = strtotime($meeting_date); $meeting_year = (int)date('Y', $meeting_ts); $meeting_month = (int)date('n', $meeting_ts); $meeting_day = (int)date('j', $meeting_ts); // Alle ZUSAGENDEN Teilnehmer – mit last_birthday_year $sql = " SELECT u.id, u.username, u.birthday, u.last_birthday_year, 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; } // 🔹 Geburtstagskandidaten: Geburtstag war + noch nicht in diesem Jahr gezahlt $birthday_candidates = array_filter($candidates, function ($c) use ($meeting_year, $meeting_month, $meeting_day) { if (!$c['birthday'] || $c['birthday'] === '0000-00-00') { return false; } $last_bday_year = (int)($c['last_birthday_year'] ?? 0); if ($last_bday_year >= $meeting_year) { return false; // Bereits in diesem Jahr gezahlt } $bday_month = (int)date('n', strtotime($c['birthday'])); $bday_day = (int)date('j', strtotime($c['birthday'])); // War der Geburtstag in diesem Jahr bereits? return ($bday_month < $meeting_month || ($bday_month == $meeting_month && $bday_day <= $meeting_day)); }); 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 ]; } // 🔹 Normale Rotation $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 ]; }