Files
domili/zahler.php
2025-11-18 18:40:27 +01:00

88 lines
2.9 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Gibt den Vorschlag für den nächsten Rechnungszahler zurück.
* Liefert ein Array: ['username' => ..., '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
];
}