Report · Code-Match · Rest-GAP · 2026-06-18

Projektportal Code-Match: was nach genauer Nachpruefung wirklich noch fehlt

Korrigierte Fassung nach Code-, Config-, DDEV-, Mailpit- und Live-Browser-Abgleich. Dieser Report ergaenzt den Journey-Report vom 18.06.2026 und korrigiert zu grobe GAP-Aussagen aus frueheren Audit-Staenden.

Branch: feature/fix-rsm-profile-application Commit: a162733 Drupal: 11.3.12 DDEV: Bootstrap successful, DB connected, Theme byte_theme Browser: agent-browser Pruefdatum: 18.06.2026
Harte Rest-GAPs Availability-Hash-Link-Journey, PPP-ID-Vergabe fuer neue Registrierungen, Bewerber-E-Mail-Bestaetigung und externe Mailingwork-/Marketing-DOI-Anbindung fehlen oder sind nicht verdrahtet.
Nicht mehr als GAP zaehlen Projekt-Alert existiert. Merkliste hat CSRF. Bewerbung submitet live. E-Mail-Wechsel-DOI und Account-Loeschung sind implementiert und getestet.
Kleine Drifts Aktives Suchagent-Mailtemplate verlinkt noch auf /mein-profil/suchagent. Profil-Sync ist Mail-Queue, keine Salesforce-API. Mehrere Canvas-Seiten sind Content und nicht vollstaendig aus Config-Sync rekonstruierbar.
Autonom abarbeitbar Reihenfolge: Suchagent-Link-Drift, Bewerber-ACK, PPP-ID-Entscheidung/Implementierung, Availability-Slice, Mailingwork nur nach Scope-/Credential-Klaerung.

1. TL;DR

GAP ist deutlich kleiner als der alte Parity-Audit nahelegte. Projekt-Alert, Suchagent, Merkliste, Registrierung, Login, Profil, E-Mail-Wechsel, Account-Loeschung und Projektbewerbung sind im aktuellen Code groesstenteils vorhanden. Wirklich offen bleiben wenige, aber fachlich relevante Punkte: Availability aus Neos, PPP-ID-Vergabe fuer neue Accounts, Bewerber-ACK per E-Mail, externe Magazin-/Newsletter-Anbindung und ein Suchagent-Mailtemplate-Drift.

Rest-GAPGroesseWarum relevantEmpfehlung
Verfuegbarkeit melden gross Neos-Hash-Link-Journey ist nicht als Drupal-Route/Form/Tokenprozess vorhanden. Nur Profilfeld und importierte Mailtemplates existieren. Eigenes Availability-Slice bauen oder explizit aus MVP nehmen.
PPP-ID-Vergabe fuer neue Accounts mittel field_ppp_id existiert, neue Selbstregistrierer bleiben aber NULL. Bewerbungen fallen dann auf UUID zurueck. Vergaberegel festlegen: RMS/Salesforce, Sequenz, oder bewusst UUID.
Bewerber-E-Mail-Bestaetigung mittel Inline-Danke-Seite funktioniert; Mailpit zeigt interne Mail an bewerbung@solcom.de, aber keine Mail an Bewerber-Adresse. neos_application_confirm verdrahten oder als out-of-scope dokumentieren.
Mailingwork / Magazin DOI mittel Drupal speichert Opt-in lokal, externe DOI-/Marketingwork-Anbindung ist nicht sichtbar. Scope, Anbieter und Credentials klaeren; dann Integration bauen.
Suchagent-Mail-Link klein Aktive Config easy_email.easy_email_type.ppp_alert nutzt noch /mein-profil/suchagent; neuer Alias ist /projektportal/suchagent. Config-Sync auf neuen Pfad bringen.

2. Journey-Matrix gegen aktuellen Code

JourneyStatusAktueller BefundRestpunkt
Registrierung implementiert Route /projektportal/registrieren, Webform-Wizard, Honeypot, Upload, gesperrter User, Profilanlage, Verify-Mail vorhanden. Keine harte Code-Luecke.
E-Mail-Verifikation implementiert Route /projektportal/verifizieren/{user}/{timestamp}/{hash}, Hash/Timeout, Aktivierung und Welcome-Mail vorhanden. Keine harte Code-Luecke.
Login / Passwort-Reset implementiert E-Mail-Login-Modul aktiv, Post-Login-Redirect vorhanden, Password-Reset live getestet. Branded Login ist Canvas-Content. Canvas-Page nicht vollstaendig per Config-Sync nachvollziehbar, aber DB-Alias vorhanden.
Profil anzeigen / bearbeiten implementiert Profil-Entity projektpartner, Profil-View/Edit-Blocks, Profile-Felder und Live-Save vorhanden. Salesforce-API-Sync fehlt; aktuell Mail-Queue an Vertrieb.
Konto-Einstellungen implementiert Core-User-Form im Portalblock, technische Felder ausgeblendet, Newsletter-Feld sichtbar, Delete-Link vorhanden. Canvas-Page als Content; destructive Live-Test Account-Loeschung nicht erneut ausgefuehrt.
E-Mail-Wechsel Double-Opt-In implementiert Neue Mail wird geparkt, Confirm-Route /projektportal/email-bestaetigen/... bestaetigt via HMAC/KeyValue. Keine harte Code-Luecke.
Account-Loeschung implementiert Hard-delete-Methode, Profil-/File-/Directory-Purge und Tests vorhanden. Keine eigene Portal-Loeschroute; Core-Cancel-Form wird genutzt.
Projektliste / Detail implementiert View, Detailtemplate, Project-Offer-Routen und Live-Projektangebot vorhanden. Keine harte Code-Luecke im geprueften Scope.
Merkliste implementiert List/Add/Remove/Merge-Routen vorhanden; Add/Remove/Merge sind POST, Rolle projektpartner, CSRF Header Token. Alter CSRF-GAP ist stale.
Projektbewerbung implementiert Gast- und Konto-Bewerbung ueber Webform; Live-Submit erzeugte SID 15 und Mail an bewerbung@solcom.de mit CC Projektkontakt. Bewerber-E-Mail-Bestaetigung fehlt oder ist nicht verdrahtet.
Apply-all Merkliste implementiert Route /projektportal/merkliste/bewerben, Hidden JSON-Kontext, Mail pro Projekt, Clear nach Apply. Keine harte Code-Luecke.
Oeffentlicher Projekt-Alert implementiert Subscribe-, Confirm- und Unsubscribe-Routen unter /projektportal/projekt-alert/*; Double-Opt-In und Tokens vorhanden. Digest-/Matcher-Mailpfad braucht direkte E2E-Testabdeckung.
Eingeloggter Suchagent implementiert ppp_alert-Entity, Canvas-Block, CRUD-Form, Permission, Unique pro User, Cron/Mail-Services vorhanden; live gespeichert. Aktives Mailtemplate verlinkt noch auf alten Pfad; kein Token-Unsubscribe, Verwaltung laeuft im Konto.
Verfuegbarkeit melden fehlt Profilfeld field_availability und Neos-Mailtemplates existieren, aber keine Drupal-Route/Form/Token-Journey. Harter funktionaler GAP gegen Neos, falls im Scope.

3. Echte Rest-GAPs

3.1 Verfuegbarkeit / Availability

Es gibt importierte Easy-Email-Templates wie neos_avail_partner, neos_avail_agent, neos_avail_confirm und ein Profilfeld field_availability. Es gibt aber keine Route /projektportal/verfuegbarkeit, keine Tokenvalidierung, keine Formular- oder Controllerklasse und keinen speichernden Availability-Prozess. Live-Aufruf von /projektportal/verfuegbarkeit?id=test landet auf 404.

3.2 PPP-ID-Vergabe fuer neue Selbstregistrierer

field_ppp_id existiert aktiv als User-Basefield in users_field_data. Bestandsmigration mapped Neos rmsnumber darauf. Neue Selbstregistrierer erhalten aktuell keine PPP-ID: Testuser UID 17 hat field_ppp_id = NULL. Die Projektbewerbung nutzt dann die Fallback-UUID im Mailbody.

3.3 Bewerber-Eingangsbestaetigung per E-Mail

Webform-Submit zeigt eine Danke-Meldung. Mailpit belegt interne RSM-Mail an bewerbung@solcom.de mit CC an Projektkontakt. Eine E-Mail an codex.bewerbung.20260618@example.com wurde nicht erzeugt. Das importierte Template neos_application_confirm ist vorhanden, aber nicht als Handler im RSM-Bewerbungswebform verdrahtet.

3.4 Mailingwork / Magazin / Newsletter

Drupal speichert Newsletter-/Magazin-Opt-ins lokal: field_newsletter_opt_in am User und newsletter am oeffentlichen Projekt-Alert. Eine externe Mailingwork- oder Marketing-DOI-Anbindung ist im Custom-Code und in config/sync nicht sichtbar.

3.5 Suchagent-Mailtemplate-Pfad

Aktive Config easy_email.easy_email_type.ppp_alert verweist in HTML und Plaintext noch auf [site:url]mein-profil/suchagent. Der aktuelle Portal-Alias ist /projektportal/suchagent. Das install-default im Modul ist bereits korrekt; config/sync und aktive Config sind noch alt.

4. Korrigierte Alt-Befunde

Alter BefundKorrekturEvidenz
Projekt-Alert fehlt falsch Oeffentlicher Projekt-Alert und eingeloggter Suchagent existieren. Routen /projektportal/projekt-alert/abonnieren, /bestaetigen/{token}, /abbestellen/{token}; ppp_alert-Entity und Canvas-Block.
Merkliste ohne CSRF stale Add/Remove/Merge verlangen _csrf_request_header_token. solcom_project_offer.routing.yml, Zeilen 18-49.
Bewerbungsabschluss fehlt stale Live-Submit erzeugte Webform-Submission und interne Mail. SID 15 in webform_submission; Mailpit-Mail an bewerbung@solcom.de.
E-Mail-Wechsel-DOI fehlt falsch Confirm-Route, Pending-KeyValue, HMAC und Tests existieren. ProjektpartnerMailManager, ProjektpartnerEmailChangeController, ProjektpartnerMailFlowTest.
Account-Loeschung fehlt falsch Hard-delete plus Purge-Service und Tests existieren. ProjektpartnerAccountPurger, ProjektpartnerAccountDeletionTest.
Profil-Sync fehlt komplett zu grob Profil-Sync per Queue/Mail existiert; echte Salesforce-API nicht. ProfileChangeSfSync, ppp_sf_sync, vertrieb@solcom.de.

5. Evidence

6. Teststatus

CheckStatusErgebnis
DDEV Bootstrap pass ddev drush status erfolgreich.
Browser-Smoke Projektbewerbung pass Gast-Submit erzeugt SID 15 und Danke-Meldung.
Mailpit Bewerbungs-Mail pass Interne Bewerbungsmail angekommen.
Targeted PHPUnit pass 41 Tests, 1063 Assertions, Exit 0. PHPUnit meldete 152 Deprecations aus Drupal/Webform/Contrib-Pfaden; keine Testfehler.

7. Autonom abarbeitbare Reihenfolge

  1. Suchagent-Mailtemplate-Link fixen: aktive Config und config/sync/easy_email.easy_email_type.ppp_alert.yml von /mein-profil/suchagent auf /projektportal/suchagent umstellen. Kleiner, risikoarmer Fix.
  2. Bewerber-ACK klaeren und bauen: entweder neos_application_confirm als zweite Mail nach Submit verdrahten oder bewusst aus Scope nehmen. Mittlerer Aufwand, klare Testbarkeit ueber Mailpit.
  3. PPP-ID-Vergabe entscheiden: fachliche Regel fuer neue Accounts festlegen. Danach Implementierung in Registrierung und Bewerbungstest.
  4. Availability-Slice planen: Route, Token, Formular, Upload, Status, Mails, Cron/Reminder. Grosser eigener Scope.
  5. Mailingwork/Marketing-Integration: erst nach Scope, Anbieter-API und Credentials. Ohne diese Daten nicht sauber autonom abschliessbar.
  6. Direkte Tests ergaenzen: oeffentlicher Projekt-Alert-Digest, Suchagent-Mail-Link, Bewerber-ACK, PPP-ID-Neuregistrierung.
Fazit. Fuer Abnahme ist Hauptfrage nicht mehr "haben wir Projektalert?", sondern welche Neos-Paritaet noch zwingend in den MVP muss. Technisch fehlen vor allem Availability und externe Integrationen; mehrere alte GAPs sind durch aktuellen Code und Live-Evidence widerlegt.