diff --git a/dev/release/boost-platzierung-offen.md b/dev/release/boost-platzierung-offen.md index bdb6dc21..7e243596 100644 --- a/dev/release/boost-platzierung-offen.md +++ b/dev/release/boost-platzierung-offen.md @@ -1,58 +1,49 @@ -# Boost-Platzierung — offene Punkte (Thema für Montag, 13.07.2026) +# Boost-Platzierung — ENTSCHIEDEN + UMGESETZT (13.07.2026) -Stand: 10.07.2026 abends. Kontext: Boost-Add-on ist seit heute Ende-zu-Ende live -(Kauf-Modal mit Pflicht-Schalter + Verlängerungs-Hinweis, Ausspielung auf Start- -und Branchenseite mit Badge „Top-Platzierung", sofortige Cache-Invalidierung, -Hinweis in der Kunden-PM-Liste). Zwei Dinge sind bewusst noch ungelöst. +Stand: 13.07.2026. Kontext: Boost-Add-on ist seit 10.07. Ende-zu-Ende live. +Die zwei offenen Punkte von Montag sind entschieden und umgesetzt. -## 1. Hero „Im Fokus" als Slider +## Entscheidung (User, 13.07.2026) -**Angedacht (User, 10.07.):** Das große Hero-Fenster der Startseite soll die -Top-Meldungen als Slider durchlaufen — insbesondere, wenn mehrere geboostete -PMs gleichzeitig aktiv sind. +1. **Harte Slot-Grenzen:** max. **5** gleichzeitige Boosts auf der Startseite, + max. **3** je Branchenseite (Kategorieseite) — die Grenzen entsprechen genau + den sichtbaren Plätzen (Startseite: Lead + 4 Seitenleiste; Branchenseite: + Lead + 2 Top-Slots). Verkauft wird nur, was sichtbar ist. +2. **Zwei Boost-Stufen mit Preisunterscheidung:** + - **Startseiten-Boost** (voller Preis, 12/20/35 Credits für 7/14/30 Tage): + erscheint wie bisher auf Startseite **und** Branchenseite. + - **Kategorie-Boost** (50 % vom Boost-Preis, aufgerundet: **6/10/18 + Credits**): erscheint **nur** auf der Branchenseite der Rubrik. +3. **Hero-Slider:** vorerst **nicht** umgesetzt — durch die Slot-Grenze + (5 = sichtbare Plätze) entsteht kein Sichtbarkeits-Überhang. Bleibt als + spätere Ausbaustufe notiert (dann könnte die Grenze steigen), ebenso die + Zeitraum-Buchung wie im Anzeigengeschäft. -**Ist-Zustand:** Statisch. Die jüngste geboostete PM ist der Lead, weitere -geboostete rutschen in die Seitenleiste „Was sonst zählt" -(`HomePageData` → `focus-hero.blade.php`). Branchenseite analog (Lead + 2 Top-Slots). +## Umsetzung (13.07.2026, Suite: 1222 grün) -**Ideen:** +- `boosts.placement` (`home`/`category`, Enum `BoostPlacement`; Bestandsboosts + = `home`), Preise/Slots in `config/credits.php` (`boost_category`, + `boost_slots`). +- `BoostService::slotAvailability()` prüft je Ausgabe (Portal × Sprache, beim + Kategorie-Boost zusätzlich je Rubrik); Kauf am vollen Inventar wirft + `BoostNotAllowedException::soldOut()` mit dem frühesten freien Termin. + **Verlängerungen** brauchen keinen freien Slot (die PM hält ihren); + die Stufen verlängern unabhängig voneinander. +- Startseite (`HomePageData`) zeigt nur `home`-Boosts; Branchenseite + (`CategoryPageData`) zeigt Kategorie-Boosts **mit Vorrang** vor + Startseiten-Boosts (die 3 Kategorie-Slots sind die verkaufte Garantie, + Startseiten-Boosts füllen nur übrige Plätze). +- Kategorie-Boost invalidiert nur die Branchenseiten-Caches, nicht die + Startseite. +- Kunden-UI (PM-Seite): zwei Boost-Angebote im Add-on-Panel; bei vollem + Inventar „Derzeit ausgebucht — der nächste Platz wird am TT.MM.JJJJ frei." + statt der Kauf-Buttons (serverseitig gegated). +- Preisseite (`/preise`, beide Staffeln + Leistungsbeschreibungs-Note zu + Slot-Begrenzung, de/en), Buchungsseiten-Preisliste ergänzt. +- Tests: `BoostServiceTest` (Slots/Preise/Verlängerung), + `Web/BoostPlacementTest` (Platzierung/Vorrang/Cache), + `PressReleaseShowAddonsTest` (UI/Ausgebucht), `CreditPricingServiceTest`. -- **Alpine-Rotation im bestehenden Hero (empfohlen, kleinster Eingriff):** - `HomePageData` liefert statt einem `leadRelease` eine kleine Lead-Liste - (alle aktiven Boosts + jüngste Meldung als Abschluss-Slide). `focus-hero` - rendert alle Slides serverseitig (SEO: Inhalte im Markup, erste Slide - sichtbar) und rotiert per Alpine alle ~6–8 s mit Punkten/Pfeilen, Pause bei - Hover. Kein neues Paket nötig, Cache-Verhalten bleibt unverändert. -- **Fairness durch Rotation statt „Neueste gewinnt":** Reihenfolge der Slides - nicht nach `published_at`, sondern rotierend (z. B. nach Boost-Beginn oder - round-robin je Cache-Build), damit bei mehreren Käufern jeder regelmäßig die - erste Slide bekommt. -- **Abgrenzung:** Slider nur im Hero der Startseite; Branchenseite erst einmal - statisch lassen (weniger Traffic-Druck, weniger Aufwand). - -## 2. Was passiert, wenn viele gleichzeitig boosten? (Begrenzung?) - -**Problem heute:** Es gibt keine Obergrenze. Sichtbare Plätze sind aber endlich -(Startseite: Lead + 4 Seitenleiste; Branchenseite: Lead + 2). Ab dem 6. aktiven -Boost je Ausgabe zahlt jemand, ohne auf der Startseite aufzutauchen — -Beschwerde-/Erstattungsrisiko. Aktuell unkritisch (wenige Kunden), vor -Skalierung aber zu entscheiden. - -**Ideen:** - -- **Harte Slot-Grenze mit „Ausverkauft" (empfohlen):** z. B. max. 5 aktive - Boosts je Ausgabe (Portal). `BoostService` prüft die Verfügbarkeit im Gate, - das Kauf-Modal zeigt statt der Laufzeit-Buttons „Derzeit ausgebucht — frei ab - TT.MM." (frühestes `ends_at`). Ehrlich, einfach zu erklären, kein - Preis-Mechanik-Umbau. -- **Slider löst die Grenze auf:** Mit Hero-Slider (Punkt 1) skaliert die - Sichtbarkeit — alle aktiven Boosts rotieren durch die erste Position, die - Slot-Grenze kann dann höher liegen (oder als weiches Limit nur die - Slider-Länge deckeln, z. B. max. 8 Slides). -- **Zeitraum-Buchung wie im Anzeigengeschäft (später):** Boost bucht einen - konkreten Kalender-Zeitraum je Slot (Verfügbarkeitskalender im Modal). - Sauberste Lösung bei echter Nachfrage-Konkurrenz, aber deutlich mehr UI/Logik - — nichts für den Launch. - -**Empfehlung für Montag:** Slot-Grenze (klein, z. B. 5/Ausgabe) + Hero-Slider -mit Rotation beschließen; Zeitraum-Buchung als spätere Ausbaustufe notieren. +**Hinweis [EXTERN]:** Die aktualisierte Boost-Note der Preise-Seite +(Leistungsbeschreibung, „was Sie bekommen und was nicht") sollte mit in die +anwaltliche Freigabe des Rechtstexte-Pakets. diff --git a/dev/release/entwicklungsplan-release.md b/dev/release/entwicklungsplan-release.md index 598018e4..4b51ef3a 100644 --- a/dev/release/entwicklungsplan-release.md +++ b/dev/release/entwicklungsplan-release.md @@ -32,6 +32,8 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G **10.07. abends — API-Legacy-Paritaet (neues Arbeitsdokument `dev/release/api-legacy-paritaet.md`):** User-Vorgabe: /service-API muss beim Cutover verhaltensgleich zum Altsystem laufen. Alt-Vertrag vollstaendig aus dem Symfony-Code (`_businessportal24.com/`) extrahiert; Prod-Aktivitaets-Logs (User, `dev/api/` — enttrackt via .gitignore, Kundendaten!) ausgewertet: **ein echter Client (connektar), 5 Endpoints, Sofort-Publish beim POST belegt; 2 der 5 Endpoints (Company-/Kontakt-Create) laufen heute auf 410.** Entscheidungen: Sofort-Publish nachbilden + Admin-Schalter fuer KI-Pruefung der Legacy-Einlieferungen; Legacy-API und v1 bleiben getrennt; Ablehnungs-Rueckkanal spaeter in v1. S1+S2 noch am 10.07. umgesetzt: Legacy-Compat-Controller fuer die 5 connektar-Endpoints (inkl. Company-/Kontakt-Create, die vorher 410 liefen), Anlegen = Einreichen mit Sofort-Publish via Permission `api:immediate-publication` (WS-7: connektar zuweisen!), Admin-Schalter "KI-Pruefung Legacy-API" (neue app_settings-Tabelle, Toggle auf /admin/press-releases) + KI-Spalte/Pruef-Button in der Admin-PM-Liste; API-Einlieferer-Mails gehen an Pressekontakt/Firmen-Mail statt an den Einlieferer (User-Entscheidung). Tests: LegacyServiceParityTest. **Offen: S4 Testdaten (User-Vorgaben ausstehend), S5 Staging-Smoke, S7 Mailing.** +**13.07. — Boost-Platzierung entschieden + umgesetzt (Suite: 1222 gruen):** User-Entscheidung: harte Slot-Grenzen (5 Startseite, 3 je Branchenseite = exakt die sichtbaren Plaetze; Hero-Slider damit vorerst unnoetig, bleibt Ausbaustufe) + zweite Boost-Stufe **Kategorie-Boost** (nur Branchenseite, 50 % aufgerundet: 6/10/18 Credits; Startseiten-Boost unveraendert 12/20/35 inkl. Branchenseite). Umsetzung: `boosts.placement` + `BoostPlacement`-Enum, `credits.boost_category`/`boost_slots`, `BoostService::slotAvailability()` (je Portal x Sprache, Kategorie zusaetzlich je Rubrik; Verlaengerung haelt ihren Slot; ausgebucht -> Exception mit fruehestem freien Termin), Startseite zeigt nur Home-Boosts, Branchenseite Kategorie-Boosts mit Vorrang, Kategorie-Boost invalidiert nur Kategorie-Caches, Add-on-Panel mit zwei Angeboten + „Derzeit ausgebucht — frei ab"-Anzeige, Preise-/Buchungsseite + Lang-Keys (de/en) inkl. Slot-Hinweis in der Leistungsbeschreibungs-Note (**[EXTERN]: in anwaltliche Freigabe aufnehmen**). Details in `dev/release/boost-platzierung-offen.md`. + **Wiedereinstieg / naechste Schritte:** 1. ~~Klaerungsliste Rechtstexte~~ **erledigt 06.07.**; ~~R3.1-Restbacklog~~ **erledigt 06.07.** (siehe oben). 2. **[EXTERN]:** Postfach `info@pressekonto.com` anlegen (Haupt-Rechts-Mail, 06.07.); CONTACT_EMAIL_*-Support-Postfaecher je Brand; REPORT_EMAIL_* optional · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3. (~~Depublikations-Preis~~ entschieden: 35 EUR netto.) @@ -51,7 +53,7 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G **Wartet auf Dich / extern (nicht durch mich abschliessbar):** R6.5 Branch merge + Release-Tag (Dein Go; Push ist erfolgt) · R1.2 Stripe-Live · R1.4 Preisfreigabe · R1.5 Refund-Entscheidung · (~~R2.5 legal-request-Texte~~ erledigt 10.07., Wortlaut aus freigegebenem Meldeverfahren) · R5.4 Favicons · R6.3 Staging-Rehearsal · R6.4 Go-Live-Kette · Postfach `info@pressekonto.com` · anwaltliche Freigabe. -**Thema für Montag (13.07., Entscheidung User):** Boost-Platzierung — Hero „Im Fokus" als Slider + Begrenzung gleichzeitiger Boosts. Ist-Stand, Risiko (mehr zahlende Boosts als sichtbare Plätze) und 3 Lösungsideen inkl. Empfehlung in `dev/release/boost-platzierung-offen.md`. +~~**Thema für Montag (13.07., Entscheidung User):** Boost-Platzierung~~ **entschieden + umgesetzt 13.07.** (Slot-Grenzen 5/3, Kategorie-Boost zu 50 %, Slider vertagt — s. Stand-Block + `dev/release/boost-platzierung-offen.md`). **Bewusst nachgelagert (nicht Teil dieses Release):** Sentry/APM · User-Panel-Vollflow · Newsletter-DOI · EN-Rechtstexte · T11-DSA-Queue-Ausbau. diff --git a/dev/release/qa-checkliste.md b/dev/release/qa-checkliste.md index bfbfeee9..630ef837 100644 --- a/dev/release/qa-checkliste.md +++ b/dev/release/qa-checkliste.md @@ -40,7 +40,7 @@ Staging-Rehearsal (R6.3) mit echtem Datenbestand wiederholen. - [ ] **Blacklist blockiert Publish** — Automatisiert: `PressReleaseBlacklistTest`. Manuell: PM mit Blacklist-Wort einreichen → automatische Ablehnung mit Begründung. - [ ] **Buchungsseite komplett**: Abo, Einzel-PM, Credits, Unternehmer-Checkbox (T1neu) — Automatisiert: `Billing/BookingsPageTest`, `Billing/CheckoutFlowTest`, `CreditTopupTest`. Manuell: Modal-Optik, USt-Aufschlüsselung, Checkbox-Zwang; Buchungs-/Verlängerungsdatum des Abos wird angezeigt (`SubscriptionPeriodResolver`, 09.07. — braucht Stripe-Daten, also Staging). - [ ] **Tarifwechsel im Buchungs-Modal** (neu 07.07.) — Abo-Swap mit anteiliger Verrechnung, Downgrade ohne Gutschrift erst zum Periodenende, Kontingent-Sperre beim Wechsel. Automatisiert: `Billing/CheckoutFlowTest`. Manuell auf Staging: Upgrade + Downgrade je einmal durchspielen. -- [ ] **Add-ons Boost/Veröffentlichungsnachweis** — Buchung über Credits an der PM-Seite; Add-ons-Modal statt Toast bei fehlendem Guthaben (07.07.). Automatisiert: `BoostServiceTest`, `ProofPdfAndExtraPmTest`, `PressReleaseShowAddonsTest`. Manuell: Boost buchen, Nachweis-PDF herunterladen. +- [ ] **Add-ons Boost/Veröffentlichungsnachweis** — Buchung über Credits an der PM-Seite; Add-ons-Modal statt Toast bei fehlendem Guthaben (07.07.). **Neu 13.07.:** zwei Boost-Stufen (Startseiten-Boost 12/20/35, Kategorie-Boost nur Branchenseite 6/10/18) mit Slot-Grenzen (5 Startseite, 3 je Branchenseite) — bei vollem Inventar zeigt das Panel „Derzeit ausgebucht — frei ab TT.MM." statt der Kauf-Buttons. Automatisiert: `BoostServiceTest`, `ProofPdfAndExtraPmTest`, `PressReleaseShowAddonsTest`, `Web/BoostPlacementTest`. Manuell: beide Boost-Stufen buchen (Startseiten-Boost erscheint auf Start- + Branchenseite, Kategorie-Boost nur auf der Branchenseite), Nachweis-PDF herunterladen. - [ ] **PM-Statistiken sichtbar** (neu 10.07.) — Kachel „Aufrufe" + „Geteilt" (mit Kanal-Aufschlüsselung) auf der Kunden-PM-Seite. Automatisiert: `Web/PressReleaseTrackingTest`. Manuell: PM im Frontend aufrufen/teilen → Zahlen steigen. ## D. Billing & Stripe (Staging mit Stripe-Testmode)