num_rows > 0; mysqli_stmt_close($check); if (!$exists) { $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); $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 <= ? AND mt.attended = 1 AND mt.wore_color = 0 AND m.is_completed = 1 GROUP BY u.username "); mysqli_stmt_bind_param($stmt_email, "ss", $last_closing_date, $today); mysqli_stmt_execute($stmt_email); $result_email = mysqli_stmt_get_result($stmt_email); while ($row = mysqli_fetch_assoc($result_email)) { $penalty_summary[] = $row; } mysqli_stmt_close($stmt_email); $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); $result_users = mysqli_stmt_get_result($stmt_users); while ($row = mysqli_fetch_assoc($result_users)) { $all_users[] = $row; } mysqli_stmt_close($stmt_users); if (!empty($all_users) && file_exists(__DIR__ . '/vendor/autoload.php')) { require_once __DIR__ . '/vendor/autoload.php'; $today_formatted = date('d.m.Y', strtotime($today)); $last_closing_formatted = date('d.m.Y', strtotime($last_closing_date)); foreach ($all_users as $recipient) { $recipient_email = $recipient['email']; $recipient_name = $recipient['username'] ?? 'Benutzer'; try { $mail = new \PHPMailer\PHPMailer\PHPMailer(true); $mail->CharSet = 'UTF-8'; $mail->isSMTP(); $mail->Host = SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = SMTP_USERNAME; $mail->Password = SMTP_PASSWORD; $mail->SMTPSecure = SMTP_ENCRYPTION; $mail->Port = SMTP_PORT; $mail->setFrom(MAIL_FROM_ADDRESS, MAIL_FROM_NAME); $text_body = "Hallo $recipient_name,\n\n"; $text_body .= "Der Jahresabschluss wurde am $today_formatted durchgeführt.\n"; $text_body .= "Strafen der abgeschlossenen Periode (vom $last_closing_formatted bis $today_formatted):\n\n"; if (empty($penalty_summary)) { $text_body .= "Keine Strafen in diesem Zeitraum.\n"; } else { foreach ($penalty_summary as $row) { $text_body .= "- " . $row['username'] . ": " . (int)$row['penalty_count'] . " Strafen (1 € pro Strafe)\n"; } } $text_body .= "\nDein DoMiLi-Admin."; $html_table_rows = ''; if (empty($penalty_summary)) { $html_table_rows = '
Hallo $recipient_name,
der Jahresabschluss wurde am $today_formatted durchgeführt.
Strafen der abgeschlossenen Periode (vom $last_closing_formatted bis $today_formatted):
| Mitglied | Anzahl Strafen | Betrag |
|---|
Dein DoMiLi-Admin.
"; $mail->isHTML(true); $mail->Subject = "DoMiLi – Jahresabschluss abgeschlossen am $today_formatted"; $mail->Body = $html_body; $mail->AltBody = $text_body; $mail->addAddress($recipient_email); $mail->send(); } catch (Exception $e) { error_log("PHPMailer Fehler: " . $mail->ErrorInfo); } } } $close_success = "Jahresabschluss erfolgreich durchgeführt!"; } else { $close_error = "Heute wurde bereits ein Abschluss durchgeführt."; } } // --- DATEN FÜR ANZEIGE --- $last_closing_date = '2020-01-01'; $result_last = mysqli_query($conn, "SELECT MAX(closing_date) AS last_date FROM penalty_closings"); if ($result_last) { $row = mysqli_fetch_assoc($result_last); if ($row && !is_null($row['last_date'])) { $last_closing_date = $row['last_date']; } } $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; $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 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']; } 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']); $total_penalties = array_sum(array_column($penalties_data, 'total_penalty_count')); $total_due = $total_open * $penalty_amount; $historical_table = []; $closing_years = []; $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_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"; $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 ? 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_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; } mysqli_stmt_close($stmt_hist); } foreach ($historical_table as $username => $data) { $historical_table[$username]['year_label'] = implode('/', $data['years']); } } $paid_stats = []; $sql_paid = " SELECT u.username, COUNT(mt.user_id) AS paid_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.paid = 1 AND m.is_completed = 1 GROUP BY u.username ORDER BY paid_count DESC "; $result_paid = mysqli_query($conn, $sql_paid); while ($row = mysqli_fetch_assoc($result_paid)) { $paid_stats[] = $row; } require_once 'inc/header.php'; ?>
Strafen gesamt: = $total_penalties ?>
offener Betrag: = number_format($total_due, 2, ',', '.') ?> €
| Benutzer | Strafen gesamt | offener Betrag |
|---|---|---|
| = htmlspecialchars($p['username']) ?> | = htmlspecialchars($p['total_penalty_count']) ?> | = number_format($p['open_penalty_count'] * $penalty_amount, 2, ',', '.') ?> € |
| Benutzer | Jahr(e) | Strafen |
|---|---|---|
| = htmlspecialchars($username) ?> | = htmlspecialchars($data['year_label']) ?> | = htmlspecialchars($data['total']) ?> |
| — | ||