format('Y-m-d'); $stmt = mysqli_prepare($conn, " SELECT m.id AS meeting_id, m.meeting_date, mt.user_id, mt.wore_color, mt.paid, mt.birthday_pay FROM meetings m LEFT JOIN meeting_teilnehmer mt ON m.id = mt.meeting_id AND mt.attended = 1 WHERE m.meeting_date <= ? AND m.is_completed = 1 ORDER BY m.meeting_date "); mysqli_stmt_bind_param($stmt, 's', $bisDatum); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $alleMeetingsMitTeilnehmern = []; while ($row = mysqli_fetch_assoc($result)) { $alleMeetingsMitTeilnehmern[] = $row; } mysqli_stmt_close($stmt); // === 5. Meetings des Berichtsmonats mit Farben === $stmtMeta = mysqli_prepare($conn, " SELECT id, meeting_date, reason, color_id FROM meetings WHERE meeting_date >= ? AND meeting_date <= ? AND is_completed = 1 ORDER BY meeting_date "); $startDate = $berichtsMonatBeginn->format('Y-m-d'); $endDate = $berichtsMonatEnde->format('Y-m-d'); mysqli_stmt_bind_param($stmtMeta, 'ss', $startDate, $endDate); mysqli_stmt_execute($stmtMeta); $resultMeta = mysqli_stmt_get_result($stmtMeta); $berichtsMeetingsMeta = []; while ($row = mysqli_fetch_assoc($resultMeta)) { $color_id = (int)$row['color_id']; $colorStmt = mysqli_prepare($conn, "SELECT name FROM colors WHERE id = ?"); mysqli_stmt_bind_param($colorStmt, 'i', $color_id); mysqli_stmt_execute($colorStmt); $colorRes = mysqli_stmt_get_result($colorStmt); $colorName = '–'; if ($cRow = mysqli_fetch_assoc($colorRes)) { $colorName = $cRow['name']; } mysqli_stmt_close($colorStmt); $berichtsMeetingsMeta[] = [ 'id' => $row['id'], 'meeting_date' => $row['meeting_date'], 'reason' => $row['reason'], 'color_name' => $colorName ]; } mysqli_stmt_close($stmtMeta); // === 6. Für jedes Meeting: alle Benutzer mit allen Werten === $gruppiert = []; foreach ($berichtsMeetingsMeta as $meta) { $mid = $meta['id']; $meetingDatum = new DateTime($meta['meeting_date']); $gruppiert[$mid] = [ 'datum' => $meta['meeting_date'], 'reason' => $meta['reason'], 'color_name' => $meta['color_name'], 'teilnehmer' => [] ]; foreach ($userIds as $uid) { $username = $alleBenutzer[$uid]; $teilgenommen = false; $wore_color = null; $paid_this = false; $paid_this_birthday = false; // NEU // Finde Teilnahme-Daten für dieses Meeting foreach ($alleMeetingsMitTeilnehmern as $mt) { if ($mt['meeting_id'] == $mid && $mt['user_id'] == $uid) { $teilgenommen = true; $wore_color = !empty($mt['wore_color']); $paid_this = ($mt['paid'] == 1); $paid_this_birthday = ($mt['birthday_pay'] == 1); // Explizit prüfen break; } } // Kumulierte Werte bis zu diesem Meeting $strafenGesamt = 0; $offeneStrafen = 0; $teilnahmenGesamt = 0; $rechnungenGesamt = 0; foreach ($alleMeetingsMitTeilnehmern as $mt) { if ($mt['user_id'] != $uid || is_null($mt['user_id'])) continue; $mDatum = new DateTime($mt['meeting_date']); if ($mDatum > $meetingDatum) continue; $teilnahmenGesamt++; if (!$mt['wore_color']) { $strafenGesamt++; if ($mt['meeting_date'] >= $last_closing) { $offeneStrafen++; } } // 🔹 NUR normale Zahlungen zählen (birthday_pay = 0) $is_paid = ($mt['paid'] == 1); $is_birthday = ($mt['birthday_pay'] == 1); if ($is_paid && !$is_birthday) { $rechnungenGesamt++; } } // Name mit Symbolen $userNameAnzeige = htmlspecialchars($username); if ($paid_this) { $userNameAnzeige .= ' €'; if ($paid_this_birthday) { $userNameAnzeige .= ' (G)'; } } if (!$teilgenommen) { $farbeSymbol = '–'; } else { $farbeSymbol = $wore_color ? '✓' : '✗'; } $gruppiert[$mid]['teilnehmer'][] = [ 'username' => $userNameAnzeige, 'farbe_symbol' => $farbeSymbol, 'teilgenommen' => $teilgenommen, 'offene_strafen' => $offeneStrafen, 'strafen_gesamt' => $strafenGesamt, 'teilnahmen_gesamt' => $teilnahmenGesamt, 'rechnungen_gesamt' => $rechnungenGesamt ]; } } // === 7. Gesamt offene Strafen === $gesamtOffen = 0; foreach ($alleMeetingsMitTeilnehmern as $mt) { if (!is_null($mt['user_id']) && !$mt['wore_color'] && $mt['meeting_date'] >= $last_closing) { $gesamtOffen++; } } // === 8. PDF-Pfad === @mkdir(__DIR__ . '/backups', 0755, true); $baseName = 'DoMiLi_Backup_' . $berichtsMonatBeginn->format('Y-m'); $counter = 0; $outputPath = __DIR__ . '/backups/' . $baseName . '.pdf'; while (file_exists($outputPath)) { $counter++; $outputPath = __DIR__ . '/backups/' . $baseName . '_' . $counter . '.pdf'; } // === 9. HTML mit allen Anforderungen === $html = '
Keine abgeschlossenen Meetings im Berichtsmonat.
'; } else { $meetingCount = 0; foreach ($gruppiert as $meeting) { if ($meetingCount > 0 && $meetingCount % 3 === 0) { $html .= ''; } $meetingCount++; $meetingDatum = new DateTime($meeting['datum']); $html .= '| Benutzer* | Farbe getragen | offene Strafen (in €) | Strafen gesamt | Teilnahmen gesamt | Rechnung gesamt |
|---|---|---|---|---|---|
| ' . $t['username'] . ' | ' . $farbeHtml . ' | ' . $t['offene_strafen'] . ' | ' . $t['strafen_gesamt'] . ' | ' . $t['teilnahmen_gesamt'] . ' | ' . $t['rechnungen_gesamt'] . ' |