1.3.0 Geburtstagslogik verbessert
This commit is contained in:
86
zahler.php
86
zahler.php
@@ -1,59 +1,73 @@
|
||||
<?php
|
||||
function get_next_payer_username($conn, $meeting_id)
|
||||
{
|
||||
$current_year = (int)date('Y');
|
||||
|
||||
// Alle zugesagten Nutzer mit paid_count
|
||||
/**
|
||||
* 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'];
|
||||
$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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user