Wasserzeichen fuer den kostenlosen Tarif

Mandanten im Tarif "free" (bis 10 Teilnehmer) zeigen unten rechts eine
kleine Marke mit Logo und Adresse der Kaffeeliste; zahlende Mandanten
behalten ihre Oberflaeche ohne fremdes Logo.

Die Sichtbarkeit haengt allein an tenant_billing.plan_code und wird als
reine Leseabfrage geprueft - billing_fetch_or_init() waere ein Schreibzugriff
im Seitenaufbau. Laesst sich der Tarif nicht lesen, bleibt die Marke aus.
Das Logo ist ein Inline-SVG, das Linkziel kommt aus APP_MARKETING_URL bzw.
aus APP_HOST ohne App-Subdomain.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 00:14:17 +02:00
co-authored by Claude Opus 5
parent 6cd7fcc079
commit 1d53b66e3f
7 changed files with 225 additions and 1 deletions
+34
View File
@@ -327,3 +327,37 @@ mandant-einstellungen.php (vollständige Tarif-Vergleichstabelle mit Bestell-But
Zugriff wurden hier durchgeführt. Vor Go-Live einmal im Stripe-Testmodus
gegen einen echten Test-Mandanten durchspielen (Upgrade, Downgrade
zwischen zwei bezahlten Stufen, Downgrade auf `free`).
## Wasserzeichen im kostenlosen Tarif (umgesetzt)
Stand: 2026-08-21. Mandanten im Tarif `free` (bis 10 Teilnehmer) zeigen
unten rechts eine kleine Marke mit Logo und Adresse der Kaffeeliste.
Zahlende Mandanten sehen die Oberfläche ohne fremdes Logo.
Umgesetzte Dateien:
```text
app/plan-watermark.php (Sichtbarkeit + Markup)
app/bootstrap.php (app_marketing_url())
footer.php (Einbindung vor den Skripten)
assets/css/app.css (.plan-watermark)
scripts/http-smoke.php (Dashboard-Check)
```
- **Nur der Tarif entscheidet.** `plan_watermark_visible()` blendet die
Marke ein, wenn `tenant_billing.plan_code` `free` ist fehlt der
Datensatz, gilt wie beim Anlegen `free`. Lässt sich der Tarif nicht
lesen, bleibt die Oberfläche sauber: ein Wasserzeichen bei einem
zahlenden Kunden wäre der schlimmere Fehler.
- **Keine Schreibzugriffe im Seitenaufbau.** Bewusst nicht
`billing_fetch_or_init()`, das eine fehlende Zeile anlegen würde; die
Prüfung ist eine reine Leseabfrage und wird pro Request zwischengespeichert.
- **Logo als Inline-SVG.** Spart einen Request, bleibt auf jedem Bildschirm
scharf und übernimmt die Farbe der Umgebung. Ein eigenes Bild lässt sich
in `plan_watermark_logo_svg()` durch ein `<img>` ersetzen.
- **Ziel der Verlinkung** ist die Marketing-Domain: `APP_MARKETING_URL`,
ersatzweise `APP_HOST` ohne die App-Subdomain
(`app.kaffeeliste.de``kaffeeliste.de`).
- Getrennt von `app/branding.php`: dort geht es um das Logo *des Mandanten*
(Kopfzeile), hier um das *des Anbieters*. Beides kann gleichzeitig
sichtbar sein.