FAQ pro Mandant statt fest codiertem AOK-Inhalt

faq.php zeigte bislang fuer jeden Mandanten denselben, komplett
AOK-spezifischen Inhalt (Kaffeemaschinen-Bedienung, interner
Ansprechpartner) - fuer andere Kunden unbrauchbar und inhaltlich falsch.

- Neue Tabelle faq_entries (tenant-scoped, Soft-Delete, sort_order).
- Migration uebernimmt die bisherigen AOK-Inhalte einmalig als FAQ des
  migrierten Default-Mandanten; andere Mandanten sehen sie nicht.
- Neue Mandanten bekommen bei der Registrierung automatisch eine kurze
  generische Starter-FAQ (faq_seed_default_entries), frei editierbar.
- faq.php: lesbar fuer alle angemeldeten Mitglieder eines Mandanten,
  Anlegen/Bearbeiten/Entfernen auf owner/admin beschraenkt.
- Landingpage verweist nicht mehr auf faq.php (jetzt interner,
  mandantengebundener Inhalt statt oeffentlicher Marketing-Seite).

Live getestet: AOK-Carry-over fuer Default-Mandant, frisch registrierter
Test-Mandant bekam isolierte generische Starter-FAQ, Anlegen mit
HTML-Payload (korrekt escaped), Bearbeiten und Soft-Delete geprueft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 23:18:09 +02:00
co-authored by Claude Sonnet 5
parent d176619e1d
commit 8b0dcd2c70
7 changed files with 311 additions and 72 deletions
+39
View File
@@ -303,6 +303,45 @@ Fehlermeldung fehl.
Dashboard integriert).
- Export, Mail und Jahresprozesse bleiben M6-Themen.
## Nachtrag: FAQ pro Mandant
Umgesetzte Dateien:
```text
database/migrations/0012_saas_faq_entries.sql
app/faq.php
faq.php
app/saas-auth.php (Starter-FAQ bei Registrierung)
landing.php (Link auf die jetzt mandantengebundene faq.php entfernt)
```
Hintergrund: `faq.php` war komplett AOK-spezifischer Inhalt
(Kaffeemaschinen-Bedienung, Milch-/Zucker-Standort, interner
Ansprechpartner) und für jeden Mandanten identisch sichtbar nicht
brauchbar für andere Kunden.
- Neue Tabelle `faq_entries` (tenant-scoped, Soft-Delete via `deleted_at`,
`sort_order` für die Reihenfolge).
- Die Migration übernimmt die bisherigen AOK-Inhalte einmalig als erste
FAQ-Einträge des migrierten Default-Mandanten (`kl_hinweise`-Migration
als Vorbild). Andere Mandanten sehen diese Inhalte nicht.
- Neue Mandanten bekommen bei der Registrierung automatisch eine kurze,
generische Starter-FAQ (`faq_seed_default_entries()`, vier Fragen zu
Einrichtung, Rollen, PayPal, eigenem Stand) editierbar, nicht bindend.
- `faq.php` ist jetzt für alle angemeldeten Mitglieder eines Mandanten
lesbar (auch Legacy-Fallback über `checkKaffeelisteAccess`); Anlegen,
Bearbeiten und Entfernen einzelner Fragen ist auf `owner`/`admin`
beschränkt (beziehungsweise `checkKaffeelisteAdmin` im Legacy-Fallback).
- Die Landingpage verweist nicht mehr auf `faq.php` (das ist jetzt
interner, mandantengebundener App-Inhalt), sondern zeigt den
vollständigen generischen FAQ-Auszug direkt auf der Seite selbst.
Live getestet: Carry-over der AOK-Inhalte für den Default-Mandanten
geprüft, ein frisch registrierter Test-Mandant bekam korrekt die
generische Starter-FAQ (isoliert von den AOK-Inhalten), Anlegen mit
HTML/Skript-Payload im Text (korrekt escaped), Bearbeiten und
Soft-Delete-Löschen erfolgreich geprüft. Testdaten anschließend entfernt.
## Aktueller Prüfstatus
- M4 Ledger-Migration: grün mit 73 Assertions (Storno-fähig).
+5 -4
View File
@@ -629,10 +629,11 @@ Schritte:
- App-Sidebar von Public-Links trennen. Erledigt.
- FAQ-Auszug strukturieren: erledigt. Fünf produktbezogene Fragen
(Einrichtung, Mandantentrennung, Rollen, Export/Löschung, PayPal) direkt
auf der Landingpage, mit Verweis auf die vollständige FAQ. Die
bestehende `faq.php` bleibt bewusst unverändert AOK-spezifisch
(Kaffeemaschine, Ansprechpartner) und wurde nicht 1:1 auf die
Landingpage übernommen.
auf der Landingpage. Die bestehende App-FAQ (`faq.php`) war komplett
AOK-spezifisch (Kaffeemaschine, interner Ansprechpartner) und ist jetzt
selbst pro Mandant editierbar; die alten Inhalte wurden dem migrierten
Default-Mandanten zugeordnet, neue Mandanten starten mit einer
generischen Kurz-FAQ. Details siehe unten bei „FAQ pro Mandant".
- Keine App-Sidebar im Public-Bereich.
Ergebnis: