88 lines
2.9 KiB
PHP
Executable File
88 lines
2.9 KiB
PHP
Executable File
<?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
|
||
];
|
||
}
|