Deadline
08.07.2026
solcom_project_offer_alert (Modul B) als Basis, solcom_projektpartner_alert
(Modul A) wird stillgelegt. Architektur-Begründung: ADR-0055.
Im Grilling mit dem Site Owner konvergiert; Details und verworfene Alternativen im ADR-0055.
| Frage | Entscheidung |
|---|---|
| Scope | Vollüberarbeitung aller 5 Stakeholder-Findings vor Go-Live (keine Deaktivierung). |
| Basis-System | Modul B solcom_project_offer_alert — kann anonym (Double-Opt-in) und eingeloggt (Upsert) bereits; Matcher arbeitet Freitext-basiert. |
| Schlagwort-Eingabe | Freitext + kuratierte Vorschläge (Neos-Parität: Select2-tags:true-Verhalten). Neues Vocabulary alert_suggestion, Seed aus den 28 Neos-Technology-Nodes. Keine Term-Erzeugung durch User-Eingaben. |
| ODER-Gruppen | Explizit gestrichen (User-Entscheidung). Formular bleibt flach; Neos-Bool-Gruppen werden bei Migration zu OR-Listen abgeflacht. |
| Anonym-Verwaltung | Token-Edit-Link in jeder Mail (Bestätigung + Digest) — Formular vorbefüllt, mit Löschen-Button. Enumeration-safe. |
| Migration | Alle 12.912 aktiven Neos-Alerts (User- und Gast-Alerts), ohne erneutes Double-Opt-in — Consent bestand im Altsystem. |
| Frequenz | Erklär-Copy statt Einstellung („E-Mail sobald neue passende Projekte erscheinen — jedes Projekt nur einmal"). frequency-Feld bleibt im Datenmodell ungenutzt. |
| Treffer-Preview | Nur Trefferzähler (AJAX auf vorhandenen Matcher), keine Ergebnisliste. Nice-to-have — darf nachrutschen. |
| URL-Kanon | /projektportal/projektalert überlebt (pfadgleich mit dem Neos-Altsystem — Alt-Bookmarks bleiben gültig); /projektportal/suchagent wird Redirect. |
Sechs Pakete, sequenziert auf die verbleibenden Tage bis zum 08.07. Go-Live-kritisch: WP1, WP3, WP5, WP6. WP4 idealerweise davor, notfalls unmittelbar danach.
alert_suggestion, enforceWhitelist aus, min. 2 Zeichen, max. 4. Speicherung bleibt String-basiert.alert_suggestion (Config) + Seed via Update-Hook aus den Neos-Technology-Nodes (normalisiert, dedupliziert).validateForm(): identischer Begriff in Include und Exclude → Validierungsfehler.last_digest_sent./projektportal/projekt-alert/bearbeiten/{token} nach Muster der bestehenden confirm/unsubscribe-Routen.neos) auf contenance_solcom_domain_model_projectalert, nur active=1; JOIN projectalertguest, User-Alerts via migration_lookup auf Drupal-uid.solcom_projektpartner_alert_neos-Migration + NeosAlertSource entsorgen (erwartete Tabelle neos_search_agent existiert im realen Dump nicht)./projektportal/suchagent → /projektportal/projektalert, Tagify-Chip-Styling im byte_theme, optional „Kein Gebiet ausschließen"-Default-Checkbox. Browser-Verify + WCAG-Check Pflicht.ppp_alert-Daten prüfen (mw app exec + drush); ggf. Mini-Überführung. Dann Canvas-Page/Block raus, Permission entziehen, Modul deinstallieren, Config-Cleanup, CONTEXT.md nachziehen.SkillTextSplit + RSM-_split_skills: Werte mit ^/=/! als Alt-Suchsyntax erkennen und skippen (nicht splitten — Fragmente wären Müll).skill-Terms löschen, ihre 1–2 Node-Referenzen bereinigen.Quelle: contenance_solcom_domain_model_projectalert (20.369 Zeilen, davon 12.912 aktiv; 13.053 user-, 7.314 gast-gebunden). Ziel: project_offer_alert-Entities.
| Neos-Quelle | Drupal-Ziel | Transformation |
|---|---|---|
tags (serialisierte Bool-Gruppen, Wildcards wie projektleit*) | filter_skills | Unserialisieren, alle Gruppen zu einer OR-Liste abflachen, * strippen, trimmen, deduplizieren. Substring-Matching des Matchers macht Präfix-Wildcards implizit. |
notags | filter_exclude_skills | Wie tags, Ziel ist JSON-Array von Labels. |
states / locations (Exclude-Semantik) | filter_excluded_locations | 1:1-Mapping: A→AT, D0–D9→DE_0–DE_9, Remote→remote, International→international, CH→CH. |
user (Neos-Account-UUID) | uid | Join auf Neos-User → ppp_id → migration_lookup gegen solcom_projektpartner_neos_user. |
guest → projectalertguest (gender, firstname, lastname, email) | Kontaktfelder der Alert-Entity | Direktübernahme; kein Drupal-User entsteht. |
hash | Token | Wird NICHT übernommen — frisches UUID-Token pro migriertem Alert (Alt-Hashes waren in Alt-Mails, die auf Alt-Routen zeigen). |
active | confirmed | Nur active=1 wird migriert, ankommt als confirmed=TRUE — kein erneutes Double-Opt-in. |
| Ebene | Abdeckung |
|---|---|
| Kernel | Matcher (Include-OR, Exclude-Vorrang, Location-Buckets inkl. PLZ-Regex); Form-Validierung (Include/Exclude-Duplikat, anonymer Dedup-Pfad); Migration mit Fixtures aus echten Neos-Samples (Bool-Gruppen, Gast-Join, states-Mapping). |
| Functional | Token-Routen: bearbeiten/{token} lädt vorbefüllt, falsches Token 404/leer (enumeration-safe), Löschpfad entfernt Entity. |
| Browser (Pflicht vor UI-Done) | Formular auf solcom.ddev.site + Staging: Chip-Eingabe frei, Vorschläge sauber (keine ^-Terms), Zähler, Mail-Links via Mailpit. |
| Statisch | PHPCS + PHPStan lokal in DDEV vor PR-Open (CI prüft nur auf PR/develop/main). |
^/=/!), Leerstrings in tags/notags.ppp_alert-Daten haben (lokal nur 2 Testeinträge).mw app exec vor Uninstall; bei Bestand Mini-Überführung nach B (gleiches Feld-Mapping wie Neos-User-Alerts).