diff --git a/kasse.php b/kasse.php index dc4776c..ab07a2e 100755 --- a/kasse.php +++ b/kasse.php @@ -25,18 +25,20 @@ if ($is_admin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'] mysqli_stmt_close($check); if (!$exists) { + // 1. Abschluss in penalty_closings protokollieren $insert = mysqli_prepare($conn, "INSERT INTO penalty_closings (closing_date, closed_by) VALUES (?, ?)"); mysqli_stmt_bind_param($insert, "si", $today, $user_id); mysqli_stmt_execute($insert); mysqli_stmt_close($insert); + // 2. E-Mail-Daten: Strafen seit letztem Abschluss (für Benachrichtigung) $penalty_summary = []; $stmt_email = mysqli_prepare($conn, " SELECT u.username, COUNT(*) AS penalty_count FROM meeting_teilnehmer mt JOIN meetings m ON mt.meeting_id = m.id JOIN users u ON mt.user_id = u.id - WHERE m.meeting_date >= ? AND m.meeting_date <= ? + WHERE m.meeting_date > ? AND m.meeting_date <= ? AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 GROUP BY u.username "); @@ -48,6 +50,24 @@ if ($is_admin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'] } mysqli_stmt_close($stmt_email); + // 3. NEU: Kumulierte Strafen JEDES Benutzers bis heute in penalty_history speichern + $stmt_save = mysqli_prepare($conn, " + INSERT INTO penalty_history (closing_date, user_id, username_at_close, penalty_count) + SELECT ?, u.id, u.username, COUNT(mt.id) + FROM users u + LEFT JOIN meeting_teilnehmer mt ON u.id = mt.user_id + LEFT JOIN meetings m ON mt.meeting_id = m.id + AND m.meeting_date <= ? + AND mt.attended = 1 + AND mt.wore_color = 0 + AND m.is_completed = 1 + GROUP BY u.id, u.username + "); + mysqli_stmt_bind_param($stmt_save, "ss", $today, $today); + mysqli_stmt_execute($stmt_save); + mysqli_stmt_close($stmt_save); + + // 4. E-Mail-Versand (unverändert) $all_users = []; $stmt_users = mysqli_prepare($conn, "SELECT id, username, email FROM users WHERE email IS NOT NULL AND email != ''"); mysqli_stmt_execute($stmt_users); @@ -146,6 +166,8 @@ if ($is_admin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'] } // --- DATEN FÜR ANZEIGE --- + +// Letztes Abschlussdatum ermitteln $last_closing_date = '2020-01-01'; $result_last = mysqli_query($conn, "SELECT MAX(closing_date) AS last_date FROM penalty_closings"); if ($result_last) { @@ -155,107 +177,139 @@ if ($result_last) { } } -$cumulative_penalties = []; -$stmt_cum = mysqli_prepare($conn, " - SELECT u.username, COUNT(*) AS total_penalty_count - FROM meeting_teilnehmer mt - JOIN meetings m ON mt.meeting_id = m.id - JOIN users u ON mt.user_id = u.id - WHERE mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 - GROUP BY u.username -"); -mysqli_stmt_execute($stmt_cum); -$result_cum = mysqli_stmt_get_result($stmt_cum); -while ($row = mysqli_fetch_assoc($result_cum)) { - $cumulative_penalties[$row['username']] = (int)$row['total_penalty_count']; -} -mysqli_stmt_close($stmt_cum); - -$open_penalties = []; -$total_open = 0; $penalty_amount = 1; +// 🔹 Alle Mitglieder initialisieren +$penalties_data = []; +$stmt_members = mysqli_prepare($conn, "SELECT username FROM users ORDER BY username"); +mysqli_stmt_execute($stmt_members); +$result_members = mysqli_stmt_get_result($stmt_members); +while ($row = mysqli_fetch_assoc($result_members)) { + $penalties_data[$row['username']] = [ + 'username' => $row['username'], + 'total_penalty_count' => 0, + 'open_penalty_count' => 0 + ]; +} +mysqli_stmt_close($stmt_members); + +// 🔹 "Strafen gesamt" = KUMULIERT seit Beginn (nur echte Strafen) +$stmt_total = mysqli_prepare($conn, " + SELECT u.username, COUNT(penalty.meeting_id) AS total_penalty_count + FROM users u + LEFT JOIN ( + SELECT mt.user_id, mt.meeting_id + FROM meeting_teilnehmer mt + INNER JOIN meetings m ON mt.meeting_id = m.id + WHERE mt.attended = 1 + AND mt.wore_color = 0 + AND m.is_completed = 1 + ) AS penalty ON u.id = penalty.user_id + GROUP BY u.id, u.username +"); +mysqli_stmt_execute($stmt_total); +$result_total = mysqli_stmt_get_result($stmt_total); +while ($row = mysqli_fetch_assoc($result_total)) { + if (isset($penalties_data[$row['username']])) { + $penalties_data[$row['username']]['total_penalty_count'] = (int)$row['total_penalty_count']; + } +} +mysqli_stmt_close($stmt_total); + +// 🔹 "offener Betrag" = Strafen SEIT letztem Abschluss (>) $stmt_open = mysqli_prepare($conn, " SELECT u.username, COUNT(*) AS open_penalty_count FROM meeting_teilnehmer mt JOIN meetings m ON mt.meeting_id = m.id JOIN users u ON mt.user_id = u.id - WHERE m.meeting_date >= ? AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 + WHERE m.meeting_date > ? AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 GROUP BY u.username "); mysqli_stmt_bind_param($stmt_open, "s", $last_closing_date); mysqli_stmt_execute($stmt_open); $result_open = mysqli_stmt_get_result($stmt_open); while ($row = mysqli_fetch_assoc($result_open)) { - $open_penalties[$row['username']] = (int)$row['open_penalty_count']; - $total_open += $row['open_penalty_count']; + if (isset($penalties_data[$row['username']])) { + $penalties_data[$row['username']]['open_penalty_count'] = (int)$row['open_penalty_count']; + } } mysqli_stmt_close($stmt_open); -$penalties_data = []; -$all_usernames = array_unique(array_merge(array_keys($cumulative_penalties), array_keys($open_penalties))); -foreach ($all_usernames as $username) { - $total = $cumulative_penalties[$username] ?? 0; - $open = $open_penalties[$username] ?? 0; - $penalties_data[] = [ - 'username' => $username, - 'total_penalty_count' => $total, - 'open_penalty_count' => $open - ]; -} -usort($penalties_data, fn($a, $b) => $b['open_penalty_count'] <=> $a['open_penalty_count']); +// 🔹 Sortieren +$penalties_data = array_values($penalties_data); +usort($penalties_data, function ($a, $b) { + if ($b['open_penalty_count'] !== $a['open_penalty_count']) { + return $b['open_penalty_count'] <=> $a['open_penalty_count']; + } + return strcmp($a['username'], $b['username']); +}); -$total_penalties = array_sum(array_column($penalties_data, 'total_penalty_count')); +$total_open = array_sum(array_column($penalties_data, 'open_penalty_count')); $total_due = $total_open * $penalty_amount; -$historical_table = []; -$closing_years = []; +// 🔹 Historische Strafen: pro Abschluss-Zeitraum +$historical_periods = []; +$closing_dates = []; + $result_closings = mysqli_query($conn, "SELECT closing_date FROM penalty_closings ORDER BY closing_date"); while ($row = mysqli_fetch_assoc($result_closings)) { - $closing_date = new DateTime($row['closing_date']); - $year = (int)$closing_date->format('Y'); - $month = (int)$closing_date->format('n'); - $closed_year = ($month >= 7) ? $year : ($year - 1); - $closing_years[] = $closed_year; + $closing_dates[] = $row['closing_date']; } -$closing_years = array_unique($closing_years); -sort($closing_years); -if (!empty($closing_years)) { - foreach ($closing_years as $year) { - $year_start = "$year-01-01"; - $year_end = "$year-12-31"; +if (count($closing_dates) >= 2) { + for ($i = 1; $i < count($closing_dates); $i++) { + $start_date = $closing_dates[$i - 1]; + $end_date = $closing_dates[$i]; + $period_label = date('d.m.Y', strtotime($start_date)) . ' – ' . date('d.m.Y', strtotime($end_date)); $stmt_hist = mysqli_prepare($conn, " SELECT u.username, COUNT(*) AS penalty_count FROM meeting_teilnehmer mt JOIN meetings m ON mt.meeting_id = m.id JOIN users u ON mt.user_id = u.id - WHERE m.meeting_date BETWEEN ? AND ? + WHERE m.meeting_date > ? AND m.meeting_date <= ? AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 GROUP BY u.username "); - mysqli_stmt_bind_param($stmt_hist, "ss", $year_start, $year_end); + mysqli_stmt_bind_param($stmt_hist, "ss", $start_date, $end_date); mysqli_stmt_execute($stmt_hist); $result_hist = mysqli_stmt_get_result($stmt_hist); while ($row = mysqli_fetch_assoc($result_hist)) { - $username = $row['username']; - $count = (int)$row['penalty_count']; - - if (!isset($historical_table[$username])) { - $historical_table[$username] = ['years' => [], 'total' => 0]; - } - $historical_table[$username]['years'][] = $year; - $historical_table[$username]['total'] += $count; + $historical_periods[] = [ + 'username' => $row['username'], + 'period' => $period_label, + 'count' => (int)$row['penalty_count'] + ]; } mysqli_stmt_close($stmt_hist); } +} elseif (count($closing_dates) === 1) { + $end_date = $closing_dates[0]; + $period_label = '17.07.2025 – ' . date('d.m.Y', strtotime($end_date)); - foreach ($historical_table as $username => $data) { - $historical_table[$username]['year_label'] = implode('/', $data['years']); + $stmt_hist = mysqli_prepare($conn, " + SELECT u.username, COUNT(*) AS penalty_count + FROM meeting_teilnehmer mt + JOIN meetings m ON mt.meeting_id = m.id + JOIN users u ON mt.user_id = u.id + WHERE m.meeting_date <= ? + AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 + GROUP BY u.username + "); + mysqli_stmt_bind_param($stmt_hist, "s", $end_date); + mysqli_stmt_execute($stmt_hist); + $result_hist = mysqli_stmt_get_result($stmt_hist); + while ($row = mysqli_fetch_assoc($result_hist)) { + $historical_periods[] = [ + 'username' => $row['username'], + 'period' => $period_label, + 'count' => (int)$row['penalty_count'] + ]; } + mysqli_stmt_close($stmt_hist); } +// --- Rechnungs-Statistik (unverändert) --- $paid_stats = []; $sql_paid = " SELECT u.username, COUNT(mt.user_id) AS paid_count @@ -308,12 +362,11 @@ require_once 'inc/header.php';

- Strafen gesamt:
- offener Betrag: + Strafkasse:

-
Keine Strafen erfasst.
+
Keine Mitglieder gefunden.
@@ -349,17 +402,17 @@ require_once 'inc/header.php'; - + - - $data): ?> + + - - - + + + @@ -390,8 +443,8 @@ require_once 'inc/header.php';
BenutzerJahr(e)Zeitraum Strafen