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.
/mein-profil/suchagent. Profil-Sync ist Mail-Queue,
keine Salesforce-API. Mehrere Canvas-Seiten sind Content und nicht vollstaendig aus Config-Sync rekonstruierbar.
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-GAP | Groesse | Warum relevant | Empfehlung |
|---|---|---|---|
| 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
| Journey | Status | Aktueller Befund | Restpunkt |
|---|---|---|---|
| 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 Befund | Korrektur | Evidenz |
|---|---|---|
| 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
ddev drush status: Drupal 11.3.12, Bootstrap successful, DB connected, Themebyte_theme.ddev drush route: Projektportal-Routen fuer Registrierung, Verifikation, Profil, E-Mail-Bestaetigung, Bewerbung, Merkliste und oeffentlichen Projekt-Alert vorhanden; keineverfuegbarkeit-Route.- SQL
path_alias: Aliase/projektportal,/projektportal/profil/bearbeiten,/projektportal/suchagent,/projektportal/merkliste,/projektportal/konto/einstellungenvorhanden. - SQL
users_field_data: Spaltefield_ppp_idexistiert; UID 17 hatNULL. - Live-Bewerbung via
agent-browser: Danke-Text sichtbar, Webform-Submission SID 15 erzeugt. - Mailpit: Bewerbungs-Mail an
bewerbung@solcom.de, CCa.wiechert@solcom.de, SubjectBewerbung ueber Projektportal / Projekt-Nummer: 1000436 / .Net Entwickler (m/w). - Subagent-Review Account/Profil: Registrierung, E-Mail-Verifikation, E-Mail-Wechsel-DOI, Newsletter-Feld, Account-Loeschung bestaetigt.
- Subagent-Review Projekt/Alert: Projektliste, Merkliste, Bewerbung, Apply-all, oeffentlicher Projekt-Alert, eingeloggter Suchagent bestaetigt.
- Subagent-Review Neos-Paritaet: Availability, PPP-ID-Vergabe, Bewerber-ACK, Mailingwork als echte Restluecken bestaetigt.
6. Teststatus
| Check | Status | Ergebnis |
|---|---|---|
| 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
- Suchagent-Mailtemplate-Link fixen: aktive Config und
config/sync/easy_email.easy_email_type.ppp_alert.ymlvon/mein-profil/suchagentauf/projektportal/suchagentumstellen. Kleiner, risikoarmer Fix. - Bewerber-ACK klaeren und bauen: entweder
neos_application_confirmals zweite Mail nach Submit verdrahten oder bewusst aus Scope nehmen. Mittlerer Aufwand, klare Testbarkeit ueber Mailpit. - PPP-ID-Vergabe entscheiden: fachliche Regel fuer neue Accounts festlegen. Danach Implementierung in Registrierung und Bewerbungstest.
- Availability-Slice planen: Route, Token, Formular, Upload, Status, Mails, Cron/Reminder. Grosser eigener Scope.
- Mailingwork/Marketing-Integration: erst nach Scope, Anbieter-API und Credentials. Ohne diese Daten nicht sauber autonom abschliessbar.
- Direkte Tests ergaenzen: oeffentlicher Projekt-Alert-Digest, Suchagent-Mail-Link, Bewerber-ACK, PPP-ID-Neuregistrierung.