Doku: Status-Sync 11./12.06., Decision-Update Preisstruktur und Phase-9-Plan

- Decision-Update Preisstruktur & Veroeffentlichungs-Flow aufgenommen
  (Launch-Tarife, Slot-Verbrauch bei Veroeffentlichung, Submit-Gate,
  Launch-Credits) inkl. Klarstellung 12.06.: Gelb geht direkt live,
  keine manuelle Pruef-Queue, nur Rot wird abgelehnt
- Alle Status-Dokumente auf den Code-Stand gezogen: README-Index,
  STATUS-ABGLEICH (KI-Pipeline, Bilder/Lizenzen, Pricing), Checkliste
  (KI- und Titelbild-Bloecke, Launch-To-dos), Admin-User,
  user-zusammenhaenge (Datenmodell-Delta), Entwicklungsplan KI-Pruefung
  (Phase 0 abgehakt, Decision-Abgleich)
- Ueberschriebene Tarif-Abschnitte in Konzept-Update 1/2 und
  Relaunch-Konzept mit Superseded-/IST-Hinweisen markiert
- Neues Plan-Dokument PHASE-9-FLOW-UND-TARIFE-PLAN.md (9A-9J)
- Phase-8-Roadmap-Doku (20-PHASE-8-USER-PANEL.md) + PROGRESS-Eintraege

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-12 09:20:22 +00:00
parent a000238ca8
commit 8d8d957884
17 changed files with 2231 additions and 172 deletions

View file

@ -0,0 +1,103 @@
# Phase 8 · User-Panel-Konsolidierung & PM-Lifecycle
Stand: 2026-05-29 · **abgeschlossen**
Plan-Doc: [`docs/PHASE-8-USER-PANEL-PLAN.md`](../../../docs/PHASE-8-USER-PANEL-PLAN.md)
Abgleich: [`docs/STATUS-ABGLEICH-USER-PANEL.md`](../../../docs/STATUS-ABGLEICH-USER-PANEL.md)
Folge-Initiative nach Phase 7 (PM-Form-Refactor). Ziel: das User-Panel
produktionsreif abrunden — Show-Page-Lücken, Firmen-Liste auf
Mockup-Niveau, durchgängige PM-Titelbilder, rechtssichere Bild-Lizenzen
und ein bewusster Veröffentlichungs-Flow mit Kontingent-Vorbereitung.
## Päckchen-Übersicht
| ID | Thema | Status |
|---|---|---|
| 8A | Show-Page-Lücken (subtitle, scheduling, embargo, boilerplate_override) — Customer + Admin | ✅ |
| 8B | Listen-Indikatoren für Scheduling/Embargo | ✅ |
| 8C | Pressekontakt-Warn-Box in der Form-Sidebar | ✅ |
| 8D | Doku-Sync (`docs/user-admin/*`, `STATUS-ABGLEICH`) | ✅ |
| 8E | Firmen-Liste auf Mockup-Niveau (Counter-Strip, Saved-Views, Filter-Chips, Toggle, Rollen-Legende) | ✅ |
| 8F | SVG-Titelbild-Platzhalter-Set + Anzeige-Komponente + Picker-Modal | ✅ |
| 8G | Titelbild-Schema (`placeholder_variant`) + Cover-Resolver | ✅ |
| 8H | Bild-Upload mit Lizenz-Pflichtfeldern | ✅ |
| 8I | Veröffentlichungs-Modal (Rechtshinweis + Kontingent) | ✅ |
| 8J | Quota-Stub im Datenmodell + monatlicher Reset-Command | ✅ |
| 8K | Tests, Pint, Build, Doku-Abschluss | ✅ |
## Wichtigste Code-Artefakte (8F8J, neu in dieser Phase)
**Enums**
- `app/Enums/PressReleasePlaceholder.php` — 9 SVG-Varianten (Default,
Seed-deterministisch, Labels, Asset-Pfad).
- `app/Enums/ImageLicenseType.php` — 5 Lizenztypen, `requiresLicenseUrl()`.
**Assets / Komponenten**
- `public/images/press-release-placeholders/01..09-*.svg` (1600×900,
3 Muster × 3 Hub-Farben).
- `resources/views/components/portal/press-release-placeholder.blade.php`
rendert Bild/Platzhalter mit optionalem Titel-Overlay.
- `resources/views/livewire/components/press-release-placeholder-picker.blade.php`
FluxUI-Modal mit 3×3-Grid, dispatcht `placeholder-selected`.
**Services**
- `app/Services/PressRelease/PressReleaseCoverImage.php``coverUrl()`,
`coverIsPlaceholder()`, `placeholder()`. Bevorzugt `is_preview`-Bild,
fällt sonst auf den SVG-Platzhalter zurück.
**Schema (additive, nullable/Default-Migrationen)**
- `press_releases.placeholder_variant` (string 32, nullable).
- `press_release_images`: `author`, `license_type`, `license_url`,
`persons_consent` (default false), `rights_confirmed_at`.
- `users`: `press_release_quota` (default 3),
`press_release_quota_used_this_month` (default 0).
**Models**
- `PressRelease`: Cast + `creating`-Hook setzt deterministisch eine
Platzhalter-Variante, wenn keine gesetzt ist.
- `PressReleaseImage`: Lizenz-Felder + `license_type`-Enum-Cast.
- `User`: `pressReleaseQuotaRemaining()`.
**Service-Hook & Command**
- `PressReleaseService::submitForReview()` zählt
`press_release_quota_used_this_month` des Autors hoch (Stub).
- `app/Console/Commands/ResetMonthlyPressReleaseQuota.php` +
Scheduler-Eintrag (`monthlyOn(1, '00:05')`) in `routes/console.php`.
**Views**
- Customer-Show + Admin-Show: Hero-Titelbild via Cover-Resolver.
- Customer Create/Edit: Platzhalter-Vorschau + Picker-Einbindung
(`#[On('placeholder-selected')]`).
- Customer-Show: Veröffentlichungs-Modal (`confirm-submit-review`) mit
Rechts-Platzhalter, Kontingent-Badge und 3 Bestätigungs-Checkboxen
(Submit-Button via Alpine disabled bis alle gesetzt).
- Image-Manager: Lizenz-Felder + Anzeige in der Bild-Kachel.
## Tests (neu)
- `tests/Feature/PressReleasePlaceholderTest.php` (8) — Enum, Assets,
Picker, Cover-Resolver (Platzhalter + echtes Bild).
- `tests/Feature/PressReleaseImageLicenseTest.php` (3) — Pflichtfelder,
CC-ohne-URL, vollständiger Upload + `rights_confirmed_at`.
- `tests/Feature/PressReleaseQuotaTest.php` (3) — Remaining-Berechnung,
Increment bei Submit, monatlicher Reset.
- `tests/Feature/PressReleasePublishModalPhase8iTest.php` (2) — Modal-Inhalt
(Rechtshinweis + Kontingent), Submit-Flow.
Gesamt-Suite nach Phase 8: **375 passed, 4 skipped**. Pint clean,
`npm run build:portal` clean.
## Bewusste Abweichungen / offene Folge-Themen
- **8H — Upload-Control**: `flux:input type=file` statt `flux:file-upload`
(Pro-Dropzone mit aufwändigem Slot-Aufbau). Funktion identisch, kein
Risiko für den Upload-Flow. Dropzone-Optik ggf. separat nachziehen.
- **8I — Rechtstext** ist ein **Platzhalter** und vor Go-Live anwaltlich
zu prüfen.
- **8J — Quota** ist ein Stub. Die Schnittstelle
`User::pressReleaseQuotaRemaining()` bleibt stabil; das echte
Tarif-/Credit-Modul löst Spalten + Decrement-Logik später ab.
- Offen (Phase 2/3): Stock-/KI-Bildquellen, Wasserzeichen-Check,
Magic-Link-Flow für Pressekontakte, Statistik-/Abrechnungs-Tabs,
Anhänge-Reaktivierung (Security-Audit).

View file

@ -5,6 +5,67 @@
---
## 2026-05-29 · Phase 8 · User-Panel-Konsolidierung abgeschlossen (8F8K) ✅
Abschluss von Phase 8. Die erste Hälfte (8A8E: Show-Page-Lücken,
Listen-Indikatoren, Pressekontakt-Warnung, Firmen-Liste auf Mockup-Niveau)
war bereits im Commit „Optimierung der User und Admin Panels" enthalten,
aber undokumentiert. Heute der zweite Block plus Doku-Sync.
Roadmap-Doc: `20-PHASE-8-USER-PANEL.md`. Plan: `docs/PHASE-8-USER-PANEL-PLAN.md`.
**8D — Doku-Sync**: `docs/user-admin/checkliste-user-backend.md`,
`docs/STATUS-ABGLEICH-USER-PANEL.md` und `Admin-User.md` auf den
echten IST-Stand gezogen (8A8E waren als „offen" markiert, sind
aber umgesetzt).
**8F — SVG-Titelbild-Platzhalter**
- 9 Varianten (3 Muster × 3 Hub-Farben) in
`public/images/press-release-placeholders/`.
- `App\Enums\PressReleasePlaceholder` (Default, Seed-deterministisch).
- `<x-portal.press-release-placeholder>` + Picker-Modal
(`components.press-release-placeholder-picker`, dispatcht
`placeholder-selected`).
**8G — Titelbild-Schema + Cover-Resolver**
- Migration `placeholder_variant` auf `press_releases` (nullable).
- Model-`creating`-Hook setzt deterministisch eine Variante.
- `App\Services\PressRelease\PressReleaseCoverImage`
(`coverUrl`/`coverIsPlaceholder`).
- Hero-Bild in Customer-/Admin-Show; Vorschau + Picker in Create/Edit.
**8H — Bild-Upload mit Lizenz-Pflichtfeldern**
- Migration: `author`, `license_type`, `license_url`,
`persons_consent`, `rights_confirmed_at` auf `press_release_images`.
- `App\Enums\ImageLicenseType` (CC/kommerziell erzwingen Lizenz-URL).
- Image-Manager: Urheber (Pflicht), Lizenztyp (Pflicht), Lizenz-URL
(bedingt), Personen-Einwilligung, Rechte-Bestätigung (Pflicht).
- Abweichung: Upload-Control bleibt `flux:input type=file` statt
`flux:file-upload` (Stabilität). Lizenzerfassung vollständig.
**8J — Quota-Stub (vor 8I, damit Modal darauf aufsetzt)**
- Migration: `users.press_release_quota` (3),
`..._used_this_month` (0).
- `User::pressReleaseQuotaRemaining()`,
Decrement in `PressReleaseService::submitForReview()`.
- Command `press-releases:reset-monthly-quota` + Scheduler
(`monthlyOn(1, '00:05')`).
**8I — Veröffentlichungs-Modal (Customer-Show)**
- „Zur Prüfung einreichen" öffnet jetzt ein FluxUI-Modal statt
`wire:confirm`: Rechtshinweis (Platzhalter, anwaltlich zu prüfen),
Kontingent-Badge, 3 Bestätigungs-Checkboxen (Submit via Alpine
disabled bis alle gesetzt) → ruft das bestehende `submitForReview()`.
**8K — Abschluss**
- Neue Tests: `PressReleasePlaceholderTest` (8),
`PressReleaseImageLicenseTest` (3), `PressReleaseQuotaTest` (3),
`PressReleasePublishModalPhase8iTest` (2).
- Suite: **375 passed, 4 skipped**. Pint clean.
`npm run build:portal` clean.
---
## 2026-05-29 · Wartung · Test-Regression-Fix + Phase-7-Doku nachgezogen
Review der Gesamt-Umsetzung. Zwei Befunde behoben: