- stricheintragen.php und einzahlung.php erhielten bisher gar keine Zugriffskontrolle (nur CSRF), jetzt Rollen-/Legacy-Fallback wie in kaffeeliste.php; Sammeleintraege spiegeln transaktional ins Ledger (ledger_mirror_legacy_payment neu ergaenzt). - letzteneintraege.php war rein ueber Legacy-Admin gesperrt und haette neue SaaS-Mandanten ausgeschlossen; Loeschen markiert den gespiegelten Ledger-Eintrag jetzt per voided_at statt ihn zu entfernen (ledger_void_entry_by_legacy_id). - check-m4-ledger-migration.php an das Storno-Modell angepasst: verwaiste Ledger-Zeilen sind nur noch ein Fehler, wenn sie nicht voided sind. - Nebenbei: PHP-Warning bei Sammelerfassung behoben, toten Code entfernt, veraltete README (verwies auf nicht existierende saas-app/-Struktur) korrigiert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
6.0 KiB
M5 App-Kern
Stand: 2026-07-14 (fortgeführt)
M5 stellt die operativen App-Seiten schrittweise auf das neue tenant-sichere Modell um. Der Start erfolgt bewusst read-only, damit Summen, Links und Darstellung gegen die bestehende Legacy-Oberfläche vergleichbar bleiben.
Ziel
- Kernseiten aus
app/ledger.phplesen lassen. - Bestehendes Tabellenlayout und Bediengefühl erhalten.
- Schreibende Legacy-Flows erst nach stabiler Leseparität umstellen.
- Tenant-Kontext serverseitig bestimmen, nicht aus Formularfeldern.
Umgesetzte Schritte
Umgesetzte Dateien:
kaffeeliste.php
teilnehmerauswertung.php
index.php
Umgesetzter Umfang kaffeeliste.php:
- Die Gesamtübersicht liest aktive Teilnehmer aus
ledger_fetch_participant_summaries(). - Angezeigte Werte bleiben fachlich gleich: aktueller Stand, Gesamtausgabe, Gesamtstriche und Gesamteinzahlungen.
- Links zur bestehenden
teilnehmerauswertung.phpbleiben überparticipants.legacy_mitarbeiter_iderhalten. - Owner, Admin und Treasurer dürfen die SaaS-Ansicht lesen.
- Der lokale Legacy-/Dev-Admin-Fallback nutzt nur ohne SaaS-Session den Default-Tenant.
- Die Sidebar zeigt Legacy-Schreibseiten weiterhin nur für Legacy-Admins; Ledger-Leseansichten sind für passende SaaS-Rollen sichtbar.
- Export, letzte Einträge, CSV-Upload und Info-Mail bleiben noch Legacy-Flows.
Umgesetzter Umfang teilnehmerauswertung.php:
- Die Detailauswertung liest Teilnehmerdaten über
ledger_fetch_participant_summary_by_legacy_id(). - Die Route bleibt kompatibel zu bestehenden Links:
teilnehmerauswertung.php?user_id=<legacy_mitarbeiter_id>. - Gesamtwerte, Jahresübersicht und letzte Buchungen werden aus
ledger_entriesgeladen. - PayPal-Anzeige nutzt die neuen Tenant-Settings statt
kl_config. - Owner, Admin und Treasurer dürfen die SaaS-Ansicht lesen; der lokale Legacy-/Dev-Admin-Fallback nutzt weiterhin den Default-Tenant.
Ergänzte Ledger-Helfer:
ledger_fetch_default_tenant()ledger_fetch_participant_summary_by_legacy_id()ledger_mirror_legacy_consumption()- Filter
legacy_mitarbeiter_idsinledger_fetch_participant_summaries()
Umgesetzter Umfang index.php:
- Das persönliche Dashboard liest den aktuellen Stand, Jahreswerte und letzte
Buchungen aus
ledger_entries. - Die Teilnehmerzuordnung erfolgt über den aktuellen SaaS-User oder im lokalen Legacy-/Dev-Fallback über die E-Mail-Adresse des Legacy-Mitarbeiters.
- PayPal-Anzeige und Preis pro Strich nutzen die Tenant-Settings.
- Eigene Web-Striche bleiben mit dem bestehenden Legacy-Datensatz kompatibel und werden direkt ins Ledger gespiegelt.
Fortsetzung: Schreibseiten und Storno
Umgesetzte Dateien:
stricheintragen.php
einzahlung.php
letzteneintraege.php
app/ledger.php
scripts/check-m4-ledger-migration.php
Umgesetzter Umfang stricheintragen.php und einzahlung.php:
- Beide Sammelerfassungsseiten waren zuvor ohne jede Zugriffsprüfung
erreichbar (nur CSRF-Schutz, kein
checkKaffeelisteAdmin- oder Rollen-Check). Das ist jetzt behoben: Zugriff erfordert SaaS-Rolleowner,adminodertreasurer, oder im Legacy-/Dev-FallbackcheckKaffeelisteAdminmit dem Default-Tenant. - Jede eingetragene Legacy-Zeile (
kl_Kaffeeverbrauchbeziehungsweisekl_Einzahlungen) wird innerhalb derselben Transaktion sofort überledger_mirror_legacy_consumption()beziehungsweise die neueledger_mirror_legacy_payment()ins Ledger gespiegelt. Schlägt die Spiegelung fehl, wird die gesamte Sammelerfassung zurückgerollt statt teilweise gespeichert zu werden. - Ein vorbestehender Bug wurde nebenbei behoben: Bei einer POST-Anfrage blieb
$sqlMitarbeiterunbelegt, was einen PHP-Warning erzeugte und die Mitarbeiterliste nach dem Speichern leer ließ.
Umgesetzter Umfang letzteneintraege.php:
- Der Seitenzugriff nutzte bisher ausschließlich den Legacy-Check
checkKaffeelisteAdmin, wodurch neu registrierte SaaS-Mandanten (ohne Legacy-kl_Mitarbeiter-Zeile) die Seite nie hätten nutzen können. Jetzt gilt dieselbe Rollen-/Fallback-Logik wie inkaffeeliste.php. - Löschen erzeugt keinen harten Delete im Ledger mehr. Neue Funktion
ledger_void_entry_by_legacy_id()setztvoided_atauf dem gespiegelten Ledger-Eintrag, bevor die Legacy-Zeile auskl_Einzahlungenoderkl_Kaffeeverbrauchentfernt wird (in einer Transaktion). Der Ledger-Eintrag bleibt damit für die Revision erhalten; alle Lesepfade filtern bereits konsistent aufvoided_at IS NULL. - Zwei nie aufgerufene Funktionen (
berechneGesamtausgabe,berechneGesamtstriche,berechneGesamteinzahlungen) wurden als toten Code entfernt.
Angepasstes Check-Skript:
scripts/check-m4-ledger-migration.phpging bisher davon aus, dass jeder gespiegelte Ledger-Eintrag eine noch existierende Legacy-Zeile hat. Das ist durch das Storno-Modell nicht mehr korrekt: Ein stornierter Eintrag hat absichtlich keine Legacy-Zeile mehr, bleibt aber im Ledger stehen. Die Prüfungen filtern jetzt zusätzlich aufvoided_at IS NULL, sodass echte Dateninkonsistenzen weiterhin erkannt werden, stornierte Einträge aber nicht mehr als Fehler zählen.
Alle drei Flows wurden gegen die Remote-Dev-Datenbank live per HTTP getestet
(Sammeleintrag Striche, Sammeleinzahlung, Storno beider Buchungsarten über
letzteneintraege.php) und anschließend wieder auf den Ausgangsstand
zurückgesetzt.
Noch offen
- Eigene PayPal-/Zahlungsbereich als eigenständiger App-Screen (aktuell nur im Dashboard integriert).
- Mitgliederverwaltung tenant- und rollenbasiert umsetzen
(
mitarbeiterverwalten.phpist noch nicht angefasst). - Hinweise als tenant-spezifische Notices umsetzen.
- Export, Mail und Jahresprozesse bleiben M6-Themen.
Aktueller Prüfstatus
- M4 Ledger-Migration: grün mit 73 Assertions (Storno-fähig).
- M4 Ledger-Service: grün mit 115 Assertions.
- Golden Master: grün mit 104 Assertions.
- HTTP-Smoke: grün mit 23 geprüften Seiten.
- Live-Test der Schreibflows gegen die Dev-DB: Sammelstriche, Sammeleinzahlung und Storno beider Buchungsarten erfolgreich geprüft.