Commit graph

183 commits

Author SHA1 Message Date
b18598584c Web-Frontend: /api-Doku mit KI-Deklarationsfeldern (curl-Beispiele + Hinweis)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:44:20 +00:00
92af015532 API: KI-Deklaration als v1-Pflichtfeld, Legacy-Default fuer /service (Entscheidung 10.07.)
Befund: v1 hatte keine KI-Deklarationsfelder — Submit lief seit der
KI-Kennzeichnungspflicht (09.07.) immer auf 422 und haette alle
Legacy-API-Kunden blockiert (Suite uebersah es: Factory deklariert).

- v1-Submit verlangt ai_text_declaration; der Call gilt dokumentiert
  als verbindliche Bestaetigung (Art. 50 KI-VO) und schliesst die
  Archiv-Kenntnisnahme (AGB par. 13) ein
- Bild-Upload verlangt ai_declaration (original/ai_generated/ai_edited)
- Legacy-/service-Aliasse defaulten auf none/original — das
  API-Kunden-Mailing (R6.4) weist auf die Erklaerungswirkung hin
- OpenAPI v1.yml + lang-Hinweis aktualisiert; Tests erweitert
  (Submit/Image/LegacyCompatibility)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:41:24 +00:00
01e175e138 R4.3: Karten-Metadaten-Logik als PressRelease-Praesentations-Helper
localizedCategoryName/cardImageUrl/teaserText/wordCount/readTimeMinutes/
compactPublishedLabel ersetzen die 5x kopierte @php-Logik der
Kartenkomponenten; Lesezeit-Formel vereinheitlicht (ceil -> round in
HomePageData-Spotlight). Tests: Web/PressReleaseCardHelpersTest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:57:26 +00:00
460e092c02 QA-Checkliste B-G vertieft (Nachpruefung 10.07.)
- Alle referenzierten Beleg-Tests verifiziert, Suite 1156 gruen
- B-G um Features 07.-10.07. ergaenzt: Kontakt-Queue/-Widget,
  Ablehnungsbegruendung, KI-Kennzeichnung (Submit/API/Label),
  Tarifwechsel, Add-ons, USt/eVatR, Rechnungsseite, Depublikation
  komplett, PM-Tracking, Boersenticker, Monitoring-Alerts
- Frontend-Umbau-Vorbehalt in F aufgehoben (Umbau committet 09.07.)
- Befund dokumentiert: Page-Data-Cache ohne Publish-Invalidierung
  (max. 5 Min. Verzug, bewusster Tradeoff, kein Blocker)
- Release-Plan: naechste-Schritte-Block nachgezogen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 10:54:56 +00:00
0603fe5368 R2.5: legal-request-Hinweistexte final (Wortlaut aus Meldeverfahren v0.1)
- Meldung/DSGVO/Persoenlichkeitsrecht auf die am 06.07. freigegebenen
  /melden-Texte gezogen: kostenlose manuelle Pruefung, unverzuegliche
  Eingangsbestaetigung mit Vorgangsnummer (sofern E-Mail), Entscheidung
  mit Begruendung; DSGVO ohne pauschale 30-Tage-Zusage, stattdessen
  Bestaetigungslink/Nachweis wie im Meldeverfahren
- ENTWURF-TODO entfernt, Querverweis auf /melden ergaenzt
- Render-Test erweitert (Vorgangsnummer, kostenlos, melden-Link)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 10:11:28 +00:00
8f5970436b PM-Tracking: Ereignis-Log fuer Aufrufe + Shares (press_release_events)
- press_release_events (type view/share, channel, ohne Personenbezug):
  Model/Enums/Factory, Cascade-Delete an der PM
- Detailaufruf loggt View-Event zusaetzlich zum Legacy-hits-Zaehler
  (bleibt bewusst einfacher Page-Request-Zaehler, User-Vorgabe 10.07.)
- POST press-release/{slug}/share (throttle 30/min, nur archiv-sichtbare
  PMs des Portals) loggt Teilen-Klicks je Kanal (LinkedIn/X/E-Mail/Copy)
- Kundenpanel-PM-Seite: neue Kachel Geteilt mit Kanal-Aufschluesselung
- lang: web.detail.views (de/en)
- Tests: Web/PressReleaseTrackingTest (7)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:56:42 +00:00
60d0d9b103 Release-Doku: Commit-Session vermerkt + Wiedereinstieg fuer morgen
7-Commit-WIP-Aufraeumung + R5.3/Buchungsdaten im Stand-Block, R6.5-WIP-Punkt
abgehakt, neuer Block 'Wo es morgen weitergeht'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 15:54:16 +00:00
c6b5ec8479 Release-Doku: Stand 09.07. nachgezogen; Runbook FULLTEXT-Fenster + Monitoring
Stand-Block 07.-09.07. (Billing/USt, Tarifwechsel, Agentur-Attribution,
KI-Kennzeichnung, Tages-Fixes), R5.3 abgehakt, Commit-Zahlen aktualisiert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 15:34:40 +00:00
d57f6b5c66 Agentur-Attribution: Plan abgehakt, Abnahme-Status 08.07. dokumentiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 09:51:56 +00:00
59ac67a4c8 companies:retire-agency-type: Firmen-Typ „Agentur" abschaffen
A4 des Umbaus Agentur-Attribution → User-Profil: Agentur-Firmen mit
PMs oder Pressekontakten werden zu type=company umtypisiert (sie sind
faktisch Newsrooms), leere Agentur-Firmen soft-gelöscht. Geschützt vor
Löschung (nur Umtypisierung): Mitgliedschaften Dritter in company_user
oder Verknüpfungen in user_payment_option_company. --dry-run +
JSON-Report; im Deploy-Runbook nach legacy:migrate-agency-names
eingereiht.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 09:33:39 +00:00
402fa4a38b legacy:migrate-agency-names: Agentur-Namen → users.agency_name
Übernimmt je Owner den Namen seiner Legacy-Agentur-Firma(en) ins neue
Profilfeld (A2 des Umbaus Agentur-Attribution → User-Profil). Regeln:
zuletzt aktualisierter Datensatz gewinnt bei Mehrfach-Namen (alle
Varianten im Report), bereits gesetzte Werte werden nie überschrieben,
Owner-lose Agentur-Firmen werden nur reportet. --dry-run + JSON-Report
nach storage/app/private/migration/; im Deploy-Runbook (Erst-Einrichtung)
nach dem Firmen-/User-Import eingereiht.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 09:25:04 +00:00
d1c976372e Buchungs-Modal: Dark-Mode-lesbare Preistabelle + aufgeraeumtes Layout
Preistabelle und Trenner nutzen Alpha-Farben (black/white) statt
Theme-Tokens, die im Dark Mode gegen den Modal-Hintergrund untergingen;
--color-bg-subtle war zudem nirgends definiert (Gesamt-Zeile ohne Bg).
Unternehmer-Bestaetigung als abgesetzter Consent-Block, Fusszeile mit
Trennlinie, Subtitle in den Kopf integriert. QA: A5 abgehakt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 11:13:55 +00:00
4fe0882dea QA-Checkliste: A1-A4 manuell abgenommen (07.07., inkl. 2FA-Fixes)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 11:01:46 +00:00
339ae5de70 Plan: Adress-Import, Key-Import-Verifikation und Git-Hygiene 06.07. dokumentiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:37:42 +00:00
3320aaaa85 Rechnungsadressen der Bestandskunden aus dem Legacy-Archiv uebernehmen
Befund 06.07.: Der MAN-Rechnungslauf ueberspringt Vereinbarungen ohne
Rechnungsadresse — der Bestandsschutz laeuft dann am Periodenende faktisch
aus. Der Grandfather-Import nahm die Adressen bisher nicht mit, weil die
Altportale sie nur als Freitext-Blob fuehren.

- legacy:import-billing-addresses: uebernimmt Adressen der grandfathered
  Kunden aus der Quell-Rechnung im Archiv (pdf_payload.billing_address),
  nie ueberschreibend, mit Dry-Run und Report der manuell nachzupflegenden
  Faelle (leere/unparsebare Blobs, unbekannte Laender)
- LegacyAddressParser: Best-Effort-Strukturierung der Blobs (mehrzeilig,
  kommasepariert, CH-PLZ-Praefix, Firmen-/Zusatzzeilen); raet nie
- Laenderaufloesung ueber die country-Tabellen der Legacy-Verbindungen
- config/countries.php: CY ergaenzt (reale Bestandskunden aus Zypern)
- WS-7- und QA-Checkliste: Import-Schritt nach dem Grandfathering

Lokal: 11 von 21 Bestandskunden importiert, 9 im Report (7 leere Blobs);
MAN-Lauf rechnet zuvor blockierte Vereinbarungen jetzt ab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 12:19:50 +00:00
387d41a782 Plan + QA-Checkliste: Legacy-Fixes vom 06.07. dokumentiert
Buchungs-Gate-Bug (grandfatheredNow) und Legacy-API-Uebernahme im
Stand-Block festgehalten; QA-Punkt zur API von "api_key wird abgewiesen"
auf die neue Kompatibilitaets-Semantik umgestellt (inkl. Import-Pruefung
beim Staging-Rehearsal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 11:59:04 +00:00
73f414e22a R6.1: QA-Checkliste erstellt, Vorpruefung abgeschlossen
dev/release/qa-checkliste.md loest Par. 15 der Scope-Doku ab: jeder
Punkt mit Beleg-Tests aus der gruenen Suite bzw. konkreten manuellen
Browser-/Staging-Schritten, inkl. Testzugaenge und Reihenfolge.
Befunde der Vorpruefung: /thumbnails-Redirect fehlte (separat gefixt,
d0ffe66); Newsletter-Double-Opt-In bewusst vertagt und als
Nicht-Blocker dokumentiert. Offen bleiben die manuellen Durchgaenge
(User) und die Staging-Punkte (R6.3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 10:16:21 +00:00
90fd171e37 Depublikations-Preis festgelegt: 35 Euro netto (O6, User 06.07.)
Default 3500 Cent in config/billing.php (per Env ueberschreibbar,
0 deaktiviert) — Checkout und /melden-Preisanzeige (Doppelausweis
35,00 netto / 41,65 brutto) sind damit ohne weiteren Env-Handgriff
aktiv. O6 aus der Entscheidungsliste geschlossen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 09:57:11 +00:00
fac15f7f8e Plan: R3.1 komplett — Rechtstexte-System fertig (Suite: 956 gruen)
Restbacklog 06.07. dokumentiert: E3-Versionierung, rejection_categories,
T10/T12/T13. Offen nur noch [EXTERN] (anwaltliche Freigabe,
Depublikations-Preis, Postfach) und bewusste Phase-2-Punkte.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 09:47:49 +00:00
dc2b2b0d7d Plan: Klaerungsliste Rechtstexte komplett beantwortet (06.07.)
Alle inhaltlichen Freigaben erteilt (AGB-Portalliste via Hub-#familie,
Kuendigungsseiten-Ergaenzung, neutraler Depublikations-Preis, vorsichtige
Medienprivileg-Zitierung, Aenderungsweg ueber Magic-Links). Rechtstexte
damit inhaltlich final; offen nur noch anwaltliche Freigabe und das
Postfach info@pressekonto.com [EXTERN].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 09:02:32 +00:00
3940d462d9 Umami-Webanalyse eingebaut, bis zum Go-Live deaktiviert
Selbst gehostetes Umami (sys.adametz.media) je Brand: Website-IDs aus
dev/release/umami.md in config/domains.php, Snippet via x-web.umami im
web-master-Layout auf allen oeffentlichen Seiten der drei Domains.
UMAMI_ENABLED=false haelt es aus, bis die Webseiten live gehen
(User-Vorgabe 06.07.; Go-Live-Checkliste WS-7 ergaenzt). Damit stimmt
Datenschutz Abschnitt 5 mit dem Code ueberein. User bestaetigt ausserdem:
Log-/Backup-Fristen und Stripe-Entitaet passen wie eingetragen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 08:56:14 +00:00
43397adb6a Zentrale Rechts-E-Mail info@pressekonto.com fuer alle Rechtstexte
User-Entscheidung 06.07.: info@pressekonto.com ist die Haupt-E-Mail fuer
alle rechtlichen Anliegen. Zentral in config/legal.php (LEGAL_CONTACT_EMAIL),
verwendet von Impressum, AGB, Datenschutz, /melden und /richtlinien auf
allen drei Domains. Support-Kontakt bleibt je Brand (CONTACT_EMAIL_*),
REPORT_EMAIL_* ist nur noch optionales separates DSA-Postfach. Nebenbei
den verunglueckten Enterprise-Hinweis auf der Buchungsseite repariert
(E-Mail war ohne Trennung angeklebt).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 08:32:59 +00:00
9d3eef60f8 Plan: Tagesabschluss 03.07. dokumentiert (Rechtstexte komplett, T1neu, Mail-CI)
Stand & Wiedereinstieg mit Klaerungsliste Rechtstexte, [EXTERN]-Punkten
und R3.1-Restbacklog aktualisiert. Nebenbei: Pint-Formatierung sidebar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 16:30:08 +00:00
f0cd11aa57 Plan: Datenschutz v0.3 + Cookie-Rueckbau + T1neu in R3.1 dokumentiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 16:18:56 +00:00
efe7f86b4e Plan: Hub-Inhalts-Audit + Rechtstexte-Einbau dokumentiert (E2 B2B-only)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 15:55:07 +00:00
f46795ba77 Plan: R6.2 Security-Review + R6.6 Doku-Sync erledigt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:44:36 +00:00
acb2a19aff Doku (R6.6): veraltete migration-2026-Dokus mit Verweis-Banner versehen
12-NAECHSTE-SCHRITTE und 08-PROGRESS zeigen klar auf den aktiven
Release-Plan; Phase 8/Stripe als erledigt markiert, damit die
eingefrorenen Staende nicht weiter in die Irre fuehren.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:34:56 +00:00
5537041014 Plan: R4.1/R4.2 Aufraeumen + R3.2 Rueckbau erledigt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:23:40 +00:00
f5bf282027 Deploy: .env.example vervollstaendigt + Deploy-Runbook (R5.1/R5.2)
Alle projektspezifischen Env-Keys dokumentiert (Multi-Domain, Legacy-DBs,
Stripe/Billing, KI, Sanctum, Newsletter, Vite); Runbook fuers neue
Laravel-System mit Prod-.env-Solltabelle, Release-Schritten,
Queue-Worker (classification), Cron-Tasks inkl. Ausfall-Folgen,
Stripe-Webhook, Erst-Einrichtung, Smoke-Test und Rollback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 12:38:24 +00:00
7494f19b4a Plan: R2.4 SEO-Basics erledigt (Sitemap, robots, Meta)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 12:34:43 +00:00
b855cbf7c0 Plan: Kuendigungsbutton (R3.0b) + Erloeschens-Checkbox (R3.0c) erledigt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 11:42:17 +00:00
239ec571bc Plan: Rechtstexte-Architektur referenziert + Hub-Geruest-Vorarbeit notiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:48:07 +00:00
8001280185 Plan: Online-Widerruf (R3.0) erledigt + Follow-ups notiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:04:05 +00:00
38d7cca086 Plan: R2.2/R2.3 erledigt (Hub-Ueberarbeitung + Plan-Katalog-Pipeline verifiziert)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:24:39 +00:00
5226f5de2b Plan: R2.1 erledigt + naechste Schritte notiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 08:15:25 +00:00
1e9c2f96ed Plan: R0 komplett + R1.1/R1.3 erledigt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 08:08:45 +00:00
cb2fe97609 Plan: Release-Entwicklungsplan (R0-R6) aus Vier-Achsen-Analyse konsolidiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:50:37 +00:00
90f3245e41 Plan: Phase 5 vollstaendig abgeschlossen (5.2/5.3/5.5 auf erledigt)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 10:44:15 +00:00
0e08d8acc4 5.5: Auth-Components abgeschlossen (funktional gegengetestet) + Plan-Stand
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 10:11:23 +00:00
6b1d84fc01 Doku: 5.4 abgeschlossen + 5.5 Teil-Stand im Entwicklungsplan
5.4 als erledigt markiert (page-header/empty-state/table-pagination; table-
panel + searchable-select bewusst nicht gebaut). 5.5 Teil-erledigt (alert +
session-status); password-input + rate-limit-trait mit Begruendung zurueck-
gestellt. Wiedereinstieg-Abschnitt + Datum aktualisiert, Perf-Fix vermerkt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 08:44:44 +00:00
c16b0b77e2 Doku: portalBadgeColor()-Klaerung im Plan vermerkt (toter Code entfernt)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 10:57:19 +00:00
63071a0a3e Doku: Stand & Wiedereinstieg-Abschnitt im Entwicklungsplan
Klarer Status (Phasen 0-4 + 5.1 fertig, 5.2/5.3 teilweise) und konkrete
Reihenfolge fuer den Wiedereinstieg in die verbleibende Blade-Component-Arbeit
(visuelle QA noetig, eine Component pro Commit). Hinweise zu ausgeschlossenen
User-Dateien (sidebar, web/**) festgehalten.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:25:22 +00:00
dc68404891 Doku: Phase-5.3-Fortschritt (displayName/localizedName erledigt, Rest UI-lastig)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:20:33 +00:00
89842ac37f Optimierung 5.2 (Teil 1): ProvidesUserFormRules-Concern
Die zwischen Benutzer-Anlegen und -Bearbeiten identischen Validierungsbloecke
liegen jetzt in ProvidesUserFormRules: userIdentityRules(?int $ignore) (E-Mail-
Unique ignoriert beim Bearbeiten den eigenen Datensatz), userRolesAndCompaniesRules()
und userBillingRules(). Beide Formulare nutzen die Array-Spreads; die nur im
Bearbeiten genutzten Profil-/Kontakt-Regeln bleiben dort inline. Ungenutzten
Rule-Import aus dem Anlegen-Formular entfernt.

Offen (mit User abzustimmen, UI-/Divergenz-lastig): gemeinsamer Save-Service und
die Blade-Feld-Components.

31 User-Tests gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 12:41:57 +00:00
a8958c176e Optimierung 5.1: Tabellen-Concerns (Sortierung, Volltext-Heuristik, Stats)
- HasSortableTable::sort() ersetzt 5 byte-identische sort()-Kopien in den
  Admin-Listen (Benutzer, Firmen, Kategorien, Kontakte, Pressemitteilungen).
  $sortBy/$sortDir-Defaults bleiben je Komponente, da sie divergieren.
- HasFullTextSearch::supportsFullTextSearch() ersetzt 9 byte-identische Kopien
  (4 Index-Listen + 5 Firmen-Comboboxen); ungenutzte DB-Imports entfernt.
- AdminPerformanceCache::activeInactiveStats(Builder) buendelt den identischen
  SUM(CASE WHEN is_active)-Block der Benutzer- und Firmenliste.

Zurueckgestellt (real divergent): HasResettableFilters (updatedXxxFilter
normalisieren teils zusaetzlich) und eine gemeinsame hydrateRelationCounts().

Tests: erweiterte AdminPerformanceCacheTest; 99 Admin-Tests bleiben gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 12:36:48 +00:00
8e0aedaf95 Doku: Phase 4 im Entwicklungsplan abgeschlossen markiert (4.1-4.4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 12:16:13 +00:00
e5a63bcedd Optimierung 4.1: Web-Portal-/Domain-Kontext extrahiert
- WebPortalContext::fromRequest() buendelt die zuvor ~6x je Route-Closure
  wiederholte Host->Portal-Ableitung (portal, language, portalValues,
  domainConfig).
- DomainAssetContext::applyWebDomainConfig() ist die Single Source of Truth fuer
  die Domain-/Theme-Anwendung (config + View::share + Vite); die fruehere
  $applyWebDomainConfig-Closure in routes/web.php ist nur noch ein duenner
  Delegations-Wrapper, damit Bare-Root- und Edition-Home-Route unveraendert
  per Closure aufrufen koennen.
- Die 6 Portal-Seiten-Closures (Kategorie, Detail, Veroeffentlichen, Suche,
  Newsrooms, Newsroom-Detail) sowie Preise nutzen jetzt den zentralen Kontext.

Abgesichert durch die 92 Web/-Tests (jede Seite laeuft ueber den neuen Kontext).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:42:00 +00:00
987a5a2c42 Optimierung 4.2: Published-Release-Query ueber PressRelease-Scopes zentralisiert
Vier komponierbare Scopes auf PressRelease:
- published()         Status freigegeben + published_at gesetzt (ohne Zeitschranke,
                      damit Statistik-Fenster frei einschraenken koennen)
- visibleInArchive()  published() + published_at <= jetzt (oeffentlich sichtbar)
- forPortalValues()   whereIn portal
- forLanguage()       where language

~19 duplizierte Query-Bloecke in routes/web.php (Home, Kategorie, Detail,
Veroeffentlichen, Suche, Newsrooms, Newsroom-Detail, Legacy-Redirect) nutzen
jetzt diese Scopes. Jedes withoutGlobalScope(PortalScope) bleibt an seiner
Stelle erhalten; die Klausel-Reihenfolge ist fuers Ergebnis irrelevant (reine
AND-Verknuepfung), daher verhaltensgleich.

Test: Web/PublishedReleaseScopeTest; die 89 bestehenden Web/-Tests bleiben gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:35:55 +00:00
4c80b934ab Doku: Phase 3 im Entwicklungsplan abgeschlossen markiert (3.1-3.3 nachgezogen)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:21:22 +00:00
31e01e46b6 Optimierung 3.6: Zugriffs-Gates und getrennte Impersonation-Sperre
- Gate::define('access-admin'|'access-customer') als Single Source of Truth im
  AppServiceProvider (auch via @can/Policies nutzbar). EnsureUserIsAdmin und
  EnsureUserIsCustomer pruefen jetzt ueber diese Gates.
- Impersonation-Redirect aus EnsureUserIsAdmin in die eigene Middleware
  BlockAdminDuringImpersonation ausgelagert (Sitzungs-Bedingung statt
  Rollenfrage); laeuft vor der Zugriffspruefung und ist zusaetzlich als
  persistente Livewire-Middleware registriert.
- Routen-Alias 'can:' bewusst NICHT verwendet: die Admin-Middleware ist
  persistente Livewire-Middleware und braucht eine konkrete Klasse; der
  parametrisierte Alias kann dort nicht stehen. EnsureApiUserIsActive bleibt
  eigenstaendig (is_active-Pruefung mit getesteter JSON-Antwort, kein Gate).
- Tests: Auth/AccessGatesTest; UserImpersonationTest bleibt gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:20:28 +00:00