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'; +?> + + + + 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',