Doku: Launch-Vorbereitung 18.06. (Status-Widget, WS-8, i18n, Paket-Vorteile)

- Decision-Update: neuer Abschnitt 7 "Launch-Vorbereitung (Stand 18.06.2026)"
  dokumentiert Status-Widget, WS-8-Optimierungen, Paket-Vorteile in der DB,
  i18n-Readiness (Default-Locale de, Views __()-gewrappt, EN-Inhalt bewusst
  spaeter) sowie den Editor-Umbruch-Fix. End-to-End-QA als naechster Schritt.
- WS-7-Checkliste: add_benefits_to_plans_table in die Migrations-Liste
  aufgenommen (APP_LOCALE=de stand bereits drin).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-18 17:03:19 +00:00
parent 052b214bd9
commit 6cb7b79dae
2 changed files with 29 additions and 1 deletions

View file

@ -224,4 +224,31 @@ Die credit-nahe Mechanik ist technisch umgesetzt. Single Source of Truth für al
**Noch offen / nächste Schritte**
- Featured-Platzierung geboosteter PMs im öffentlichen Web-Feed.
- Vorab-Prüfung/Redigieren (§4.1) als Voraussetzung für Prüfzähler-UI und Pfade C/D/G.
- Vorab-Prüfung/Redigieren (§4.1) als Voraussetzung für Prüfzähler-UI und Pfade C/D/G.
## 7. Launch-Vorbereitung (Stand 18.06.2026)
Aufsetzend auf dem Credit-Stand aus §6 wurden weitere Launch-Punkte umgesetzt:
**Status-Widget (immer verfügbarer Buchungsüberblick)**
- Header-Dropdown oben rechts (Desktop) bzw. im Mobile-Header, für alle Kunden-Panel-User: aktuelle Buchung/Tarif (+ Intervall), verbleibendes PM-Kontingent (oder ∞), Credit-Guthaben. Ohne aktive Buchung Hinweis + Link zur Buchungsseite.
- `CustomerStatusSummary` bündelt die Anzeige-Werte über die öffentliche `User`-API (Gating bleibt Single Source of Truth im Modell); Anzeige via `x-customer.status-menu`. Kompakte Topbar (`min-h-0`), kein Leerraum.
**WS-8 Code-Optimierung**
- `User::currentPlan()` und `hasUnlimitedPressReleaseQuota()` pro Request memoisiert (Status-Widget fragt sie auf jeder Seite ab); `fresh()` setzt den Cache zurück.
- Detailseite: `getMyPR()` war nicht memoisiert und lief bis zu 7× pro Request mit voller Eager-Load-Query → memoisiert; Firmen-Kennzahlen per `withCount()` statt nachträglichem `loadCount()`.
- Dedup: `PressRelease::scopeAccessibleBy(User)` (Kunden-PM-Zugriff), `Contact::scopeForCompany()`, `BillingAddress::REQUIRED_FIELDS`/`completenessPercent()`, Trait `InteractsWithPressReleaseTags` (create/edit).
**Paket-Vorteile (dynamisch, admin-pflegbar)**
- `plans.benefits` (JSON-Spalte, Cast, `Plan::benefitsList()`). Im Admin „Tarife & Pakete" zeilenweise pflegbar; angezeigt auf der In-App-Buchungsseite UND der öffentlichen Preise-Seite (eine Datenquelle). DB-Vorteile sind admin-redaktioneller Klartext (unter `/en` nicht auto-übersetzt — bewusst).
**i18n (Internationalisierungs-Readiness)**
- Default-Locale auf `de` (`APP_LOCALE`/`APP_FALLBACK_LOCALE`): Backend rendert Deutsch nativ als Schlüssel; `en` ist der spätere Umschalter. Frontend nutzt bereits URL-Prefix `/de`–`/en` (`SetEdition`) + strukturierte `lang/de|en/*.php`.
- Alle Backend-Views sind `__()`-gewrappt (Auth-Strecke als letzter Rest nachgezogen). Leeres `lang/en.json` als Gerüst.
- **Bewusst offen:** Backend-Sprachumschalter (Middleware liest `user->language`) und die EN-Übersetzungen (~2743 Strings) — erst beim tatsächlichen EN-Launch.
**Bekannter Bugfix**
- Legacy-/importierte PMs (Plaintext mit `\n`) verloren beim Laden in den HTML-Editor die Umbrüche → `PressReleaseHtmlSanitizer::toEditorHtml()` wandelt sie beim Bearbeiten in `<p>`/`<br>`.
**Noch offen / nächster Schritt**
- End-to-End-Flow-Durchlauf mit Test­buchungen (Detail-/Optikkorrekturen, Stripe-Testmodus) — QA als letzter Launch-Schritt.

View file

@ -106,6 +106,7 @@ Diese Phase-Migrationen MÜSSEN durchlaufen (Details im Sicherheits-Doc §7):
3. `add_oauth_provider_columns_to_users` — Google-Verknüpfung.
4. `create_legal_requests_table` — Compliance-Queue (WS-3).
5. **Credit-Ökonomie** (Decision-Update Rev. 4): `create_credit_wallets_table`, `create_credit_transactions_table` (Wallet + Ledger), `create_review_checks_table` (Prüfzähler), `create_boosts_table` (Platzierung), `create_credit_topups_table` (Stripe-Aufladung). Ohne sie schlagen Wallet-, Boost-, Nachweis- und Topup-Flows fehl.
6. `add_benefits_to_plans_table` — Tarif-Vorteile (admin-pflegbare Liste, In-App- und Preise-Seite). Nullable; ohne sie greift der Plan-Vorteils-Fallback. Vorteilstexte kommen aus dem Seeder bzw. dem Admin („Tarife & Pakete").
Einmalige Setups (idempotent, in dieser Reihenfolge):