diff --git a/docs/m2-technical-foundation.md b/docs/m2-technical-foundation.md
index 4529656..041fe00 100644
--- a/docs/m2-technical-foundation.md
+++ b/docs/m2-technical-foundation.md
@@ -140,9 +140,9 @@ Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`,
eine PayPal-Alias-Dublette und hinterlaesst keine Datei in `var/uploads`.
- CSV-Upload negative Tests: Nicht-CSV-Dateien werden abgewiesen.
- Golden Master weiterhin gruen mit 104 Assertions.
-- HTTP-Smoke weiterhin gruen mit 22 sicheren Seiten inklusive Landingpage, Login,
+- HTTP-Smoke weiterhin gruen mit 23 sicheren Seiten inklusive Landingpage, Login,
Registrierung, Passwort-Reset, E-Mail-Verifikation und geschuetzter
- Mandant-Einstellungen sowie geschuetzter Mandantenauswahl.
+ Mandant-Einstellungen, geschuetzter Mandantenauswahl sowie Ledger-Preview.
## Bewusste Grenzen
diff --git a/docs/m4-data-migration.md b/docs/m4-data-migration.md
index 854db40..0001b3a 100644
--- a/docs/m4-data-migration.md
+++ b/docs/m4-data-migration.md
@@ -1,6 +1,6 @@
# M4 Datenmigration Fachlicher Kern
-Stand: 2026-07-13
+Stand: 2026-07-14
M4 uebernimmt die finanznahen Legacy-Buchungen additiv in das neue
tenant-sichere Ledger-Modell. Die bestehenden Legacy-Seiten lesen und schreiben
@@ -48,6 +48,7 @@ Ergaenzende App-Dateien:
```text
app/ledger.php
+ledger-preview.php
```
Ausgefuehrter Dev-Stand:
@@ -58,6 +59,8 @@ Ausgefuehrter Dev-Stand:
- Ein zweiter Backfill-Lauf blieb idempotent und erzeugte keine Dubletten.
- `app/ledger.php` stellt zentrale Abfragen fuer Tenant-Summen,
Teilnehmer-Summen, einzelne Teilnehmer und letzte Buchungen bereit.
+- `ledger-preview.php` zeigt eine read-only App-Vorschau auf Tenant-Summen,
+ aktive Teilnehmer und die letzten Ledger-Buchungen.
## Abbildungsregeln
@@ -143,6 +146,7 @@ Installation aus `.local/` verwendet werden.
Master: erfuellt.
- Tenant-Summen, aktive Teilnehmer, Einzelteilnehmer und letzte Buchungen sind
ueber `app/ledger.php` abrufbar: erfuellt.
+- Read-only Ledger-Preview ist im Browser erreichbar: erfuellt.
## Aktueller Pruefstatus
@@ -155,11 +159,11 @@ Installation aus `.local/` verwendet werden.
- M3 Settings-Flow: weiterhin gruen.
- M3 Mail-Flow: weiterhin gruen.
- Golden Master: weiterhin gruen mit 104 Assertions.
-- HTTP-Smoke: weiterhin gruen mit 22 geprueften Seiten.
+- HTTP-Smoke: weiterhin gruen mit 23 geprueften Seiten inklusive
+ `ledger-preview.php`.
## Noch offen in M4
-- Erste read-only App-Seite oder Preview auf Basis von `app/ledger.php`.
- Tenant-sichere Dashboard-, Strich-, Einzahlungs- und Listenqueries schrittweise
von Legacy-Tabellen auf das Ledger umstellen.
- Storno-/Reversal-Modell in der UI statt harter Deletes.
diff --git a/docs/saas-umstrukturierungsplan.md b/docs/saas-umstrukturierungsplan.md
index b5d1644..ce63b4b 100644
--- a/docs/saas-umstrukturierungsplan.md
+++ b/docs/saas-umstrukturierungsplan.md
@@ -304,7 +304,7 @@ Uebersicht:
| M1 | Golden Master | Legacy-Ergebnisse sind als Vergleichsbasis eingefroren; HTTP-Smoke prueft sichere Seiten |
| M2 | Technisches Fundament | Abgeschlossen: Migrationen, Bootstrap, Session, CSRF-Helper und Legacy-Schreibseitenschutz stehen |
| M3 | SaaS-Basis | Abgeschlossen: Tenants, User, Registrierung, Login, Rollen, Mail-Links und zentrale Mandantenauswahl funktionieren |
-| M4 | Datenmigration | Gestartet: Ledger-Tabelle, Legacy-Backfill, Paritaetscheck und Ledger-Service sind umgesetzt |
+| M4 | Datenmigration | Gestartet: Ledger-Tabelle, Legacy-Backfill, Paritaetscheck, Ledger-Service und Preview sind umgesetzt |
| M5 | App-Kern | Dashboard, Striche, Einzahlungen, Mitglieder und Liste laufen |
| M6 | Betriebsflows | Import, Export, Mail und Jahresprozesse sind auditierbar |
| M7 | Landingpage | Public-Seite und Auth-Seiten sind im gemeinsamen Stil nutzbar; spaetere Ausbaustufen folgen |
@@ -482,6 +482,7 @@ Schritte:
- Salden gegen Golden-Master vergleichen: Kontrollskript erledigt.
- Ledger-Service fuer Tenant-Summen, Teilnehmer-Summen und letzte Buchungen:
erledigt.
+- Read-only Ledger-Preview fuer Browservergleich: erledigt.
Ergebnis:
@@ -490,6 +491,7 @@ Ergebnis:
nachweisbar.
- Erste App-Abfragen koennen ueber `app/ledger.php` tenant-sicher aus dem neuen
Modell lesen.
+- `ledger-preview.php` zeigt die neue Ledger-Auswertung ohne Schreibzugriffe.
- Dokumentation: `docs/m4-data-migration.md`.
Abhaengigkeiten:
diff --git a/footer.php b/footer.php
index 2e8b833..853dcf9 100644
--- a/footer.php
+++ b/footer.php
@@ -21,6 +21,7 @@ if(checkKaffeelisteAdmin($conn, $mailadress)){
Einzahlung eintragen
Striche eintragen
Kaffeeliste anzeigen
+ Ledger Preview
Mitglieder verwalten
Hinweise verwalten
diff --git a/ledger-preview.php b/ledger-preview.php
new file mode 100644
index 0000000..6e95abb
--- /dev/null
+++ b/ledger-preview.php
@@ -0,0 +1,160 @@
+prepare('SELECT id, name, slug FROM tenants WHERE slug = ? LIMIT 1');
+ $stmt->execute([$defaultTenantSlug]);
+ $tenant = $stmt->fetch();
+
+ if ($tenant !== false) {
+ $hasAccess = true;
+ $tenantId = (int)$tenant['id'];
+ $tenantName = (string)$tenant['name'];
+ $tenantSlug = (string)$tenant['slug'];
+ }
+}
+
+$year = ledger_current_year();
+$tenantTotals = $hasAccess ? ledger_fetch_tenant_totals($pdo, $tenantId, $year) : ledger_empty_totals();
+$participantSummaries = $hasAccess ? ledger_fetch_participant_summaries($pdo, $tenantId, [
+ 'active_only' => true,
+ 'year' => $year,
+]) : [];
+$recentEntries = $hasAccess ? ledger_fetch_recent_entries($pdo, $tenantId, ['limit' => 25]) : [];
+
+function ledger_preview_money(int $cents): string
+{
+ return saas_format_money_cents($cents) . ' EUR';
+}
+
+function ledger_preview_entry_type(string $type): string
+{
+ if ($type === 'payment') {
+ return 'Einzahlung';
+ }
+
+ if ($type === 'consumption') {
+ return 'Kaffeeverbrauch';
+ }
+
+ return $type;
+}
+
+include 'header.php';
+include 'headerline.php';
+include 'nav.php';
+?>
+
+
+
+
Ledger Preview
+
+
+
+
+
+ Read-only Vorschau aus ledger_entries fuer
+
+ ().
+ Die bestehenden App-Seiten schreiben weiterhin in die Legacy-Tabellen.
+
+
+
Tenant-Summen
+
+
+ | Gesamteinzahlungen |
+ Gesamtausgaben |
+ Gesamtstriche |
+ Aktueller Saldo |
+ Einzahlungen |
+ Ausgaben |
+ Striche |
+
+
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+
+
+
+
Aktive Teilnehmer
+
+
+ | Name |
+ E-Mail |
+ Aktueller Stand |
+ Gesamtausgaben |
+ Gesamtstriche |
+ Gesamteinzahlungen |
+ Striche |
+
+
+
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
Letzte Ledger-Buchungen
+
+
+ | Datum |
+ Teilnehmer |
+ Typ |
+ Betrag |
+ Striche |
+ Quelle |
+ Legacy |
+
+
+
+ |
+ |
+ |
+ |
+ |
+ |
+
+
+ |
+
+
+
+
+
+
+
+
diff --git a/scripts/http-smoke.php b/scripts/http-smoke.php
index b9a6255..8dbbb1e 100644
--- a/scripts/http-smoke.php
+++ b/scripts/http-smoke.php
@@ -31,6 +31,11 @@ $checks = [
'path' => 'kaffeeliste.php',
'contains' => ['Aktive Mitarbeiter'],
],
+ [
+ 'label' => 'Ledger Preview',
+ 'path' => 'ledger-preview.php',
+ 'contains' => ['Ledger Preview', 'Tenant-Summen', 'Letzte Ledger-Buchungen'],
+ ],
[
'label' => 'Mitgliederverwaltung',
'path' => 'mitarbeiterverwalten.php',