Report · Neos-Paritaet · Ausgangsvertraege · Tests · 2026-06-19

Projektportal Neos-Paritaet: Zielbild, Ausgangsvertraege und Tests

Zielbild fuer volle Paritaet zwischen Legacy-Neos und Drupal-Projektportal. Die Seite dokumentiert, welche Daten Neos wirklich nach aussen gesendet hat, was Drupal aktuell sendet, wo bewusste Ersatzvertraege entschieden werden muessen und welche automatisierten Tests bzw. manuellen Pruefschritte bis zur Paritaet fehlen.

Branch: feature/fix-rsm-profile-application Commit: a162733 Stand: 19.06.2026 Quellen: Neos Legacy-Code, Drupal-Code, config/sync, Read-only Subagent-Slices Scope: Projektportal, Suchagent/Projekt Alert, Projektbewerbung, Personio, Availability, Feeds
Zielbild Spaetere Paritaet heisst: jeder Neos-Ausgangsvertrag hat in Drupal entweder denselben Vertrag, einen dokumentierten Ersatzvertrag mit Tests oder eine explizite Out-of-scope-Entscheidung.
P0-GAPs Availability-Journey, PPP-ID-Neuvergabe, Bewerber-ACK, Suchagent-Link-Drift und fehlende Vertragstests fuer mehrere ausgehende Datenformate.
Paritaetsentscheidungen Power-App-Mail statt Neos-HTML, zwei Alert-Modelle statt einem Neos-Alert, Profil-Sync per Mail statt API, Newsletter lokal statt Mailingwork.
Nahe am Ziel Registrierung, Verify/Welcome, E-Mail-Wechsel-DOI, Konto-Loeschung, Merkliste, RSM-Bewerbung, Personio-Basis-Payload und Feeds sind bereits gut testbar.

1. Definition: Was Paritaet spaeter bedeuten muss

Volle Paritaet ist kein reiner Seitenvergleich. Entscheidend sind die ausgehenden Datenvertraege: Mails, API-Calls, Feed-Dateien, Dateiablagen, Token-Links, Cron-Jobs, Importformate und Empfaenger. Ein Flow gilt erst als paritaetisch, wenn er fachlich erreichbar ist, sein ausgehender Vertrag dokumentiert ist und mindestens ein automatisierter Test den Vertrag absichert.

ParitaetsbausteinDefinition of DoneBeispiel
Journey Route/Form/Token/Redirect existiert, ist fuer Zielpersona erreichbar und hat Browser- oder Functional-Test. /projektportal/verfuegbarkeit?hash=... darf nicht 404 sein.
Ausgangsvertrag Empfaenger, Subject/Header, Body/Payload, Attachments, Dateiformat und Fallbacks sind dokumentiert und getestet. Bewerbungsmail an bewerbung@solcom.de plus CC, PPP-ID, Session, Datei.
Ersatzvertrag Wenn Drupal bewusst anders sendet als Neos, ist die Abweichung entschieden und als neuer Vertrag getestet. Power-App-Plaintext statt Neos-HTML fuer RSM-Bewerbung.
Externe Integration Mock-Vertragstest plus separater Smoke-/Sandbox-Check, sofern Credentials/Endpoint existieren. Personio Application JSON, Mailingwork DOI, Salesforce URL-Writeback.
Manuelle Abnahme Konkrete Pruefschritte mit Beleg: Mailpit, DB-Zeile, HTTP-Response, Datei, Screenshot oder Video. Suchagent-Cron erzeugt Mail mit Projektlink und korrektem Verwaltungslink.

2. Ausgangsvertraege: Neos vs. Drupal-Ist

FlowNeos-VertragDrupal-IstParitaets-GAPZieltest
Projektbewerbung HTML-Mail Application.html; To bewerbung@solcom.de, CC Projektkontakt, From no-reply@solcom.de als SOLCOM Projektportal. Betreff ist standardmaessig Bewerbung ueber Projektportal / Projekt-Nummer: ...; UTM-Quelle oder Kampagne kann den Kanal im Betreff ersetzen. Uploads laufen ueber /api/uploadtempfile, MIME pdf/doc/docx, 1 KB bis 5 MB, maximal 4 Dokumente. Archiv unter Data/Bewerbungen/YYYY-MM-DD/YYYY-MM-DD_H-i-s_bewerbung/ mit bewerbung.html und Unterlagen/. Bewerber-ACK ApplicationConfirmation.html geht an Bewerberadresse, BCC bewerbung@solcom.de, Subject Eingangsbestaetigung / Projekt-Nummer: .... RSM-Webform sendet text/plain Power-App-Zeilenformat an bewerbung@solcom.de, CC Kontakt, From SOLCOM Projektportal <no-reply@solcom.de>; CV oder Profil-Dokument als Attachment; Apply-all sendet Mail pro Projekt. mittel Bewerber-ACK fehlt; Archiv-Datei fehlt; UTM-Betreffprioritaet ist nicht belegt; Plaintext ist Ersatzvertrag, nicht Neos-HTML. Kernel-Golden-Master fuer Zeilenformat, UTM-Betreff und Attachments + Browser-Full-Submit + Mailpit-ACK-Test oder Out-of-scope-Entscheidung.
Projekt Alert / Suchagent Ein Neos-Modell fuer User/Gast. Neue Alerts starten inaktiv und senden DOI-Mail Anmeldebestaetigung - SOLCOM Projekt Alert mit Hash-Aktivierung. Cron sendet nur neue Projektbenachrichtigungen; ProjectAlertNotification verhindert erneuten Versand desselben Projekts je Alert. Import legt Notifications fuer vorhandene Projekte an, damit Altdaten nicht sofort verschickt werden. Mail SOLCOM Projekt Alert kommt von no-reply@solcom.de, Signatur projektalert@solcom.de, Hash-Link fuer Abmeldung. Include-Tags bilden AND-Gruppen, Gruppen werden OR-verknuepft; NoTags schliessen Treffer aus; Gebiete enthalten D0 bis D9. Zwei Modelle: eingeloggter ppp_alert mit Easy Email ppp_alert; oeffentlicher project_offer_alert mit DOI/Digest via MailManager, Token-Unsubscribe und Cleanup unbestaetigter Alerts nach 7 Tagen. Aktive ppp_alert-Config verlinkt noch auf /mein-profil/suchagent. mittel Modell-Split ist moeglich, aber muss entschieden werden; Link-Drift ist echter Bug. Config-Test gegen /projektportal/suchagent; Cron-E2E mit Matching-Projekt und Dedupe; Public Subscribe → Confirm → Digest → Unsubscribe.
Availability / Verfuegbarkeit XML/CSV-Import erzeugt Availability-Datensaetze mit PersonalNr, Projektpartner, Mailtyp, E-Mail, Anredezeile, Mitarbeiter, Bearbeiter, Status und Hash. Command sendet vier Einladungstypen mit eigenen Subjects: Ihr Profil fuer unsere Projekte, Ihr Mitarbeiterprofil fuer unsere Projekte, Sind Sie bald verfuegbar?, Ist Ihr Mitarbeiter bald verfuegbar?. Formular per Hash sendet bei Status 1 HTML-Mail an projektpartner@solcom.de, From no-reply@solcom.de, Subject Aktualisierung RMS Nr. ... / Verfuegbar ab: .... Body enthaelt RMS-Nummer, Name, Datum, Nachricht, Datenschutz, Versandzeit, Session-ID, Mailtyp und PPP-ID. Archiv unter Data/Verfuegbarkeit/YYYY-MM-DD/YYYY-MM-DD_H-i-s_verfuegbarkeit/ mit verfuegbarkeit.html und Uploads. ACK Eingangsbestaetigung geht an Partneradresse. Profilfeld field_availability und importierte neos_avail_*-Templates existieren. Keine Route, kein Token, kein Formular, kein Import-/Sendprozess fuer Availability-Journey. gross Kompletter Neos-Journey fehlt, falls Zielbild volle Paritaet ist. Neues Modul/Slice mit Token-Route, Import-Fixture, vier Einladungstypen, Submit-Mail, ACK-Mail, Upload-Archiv, Cleanup und Access-Tests.
Mailingwork / Magazin Form-encoded HTTP POST an https://login.mailingwork.de/webservice/webservice/json/*. Funktionen isemailinlist, optinrecipient; Felder 1 Titel, 3 Nachname, 4 Vorname, 11 E-Mail; listId und optinSetupId aus Neos-Settings; Credentials duerfen nicht in Doku- oder Testdaten kopiert werden. Lokale Felder field_newsletter_opt_in am User und newsletter am oeffentlichen Alert. Keine aktive Mailingwork- oder Marketing-DOI-Anbindung im geprueften Custom-Code. mittel Externe DOI fehlt; Provider/Scope/Credentials muessen entschieden werden. API-Client-Mocktest fuer Mailingwork oder bewusster Ersatz durch neues Marketing-System.
Registrierung / Verify / Welcome Registrierung aus Bewerbung oder Portal erzeugt Account, sendet Aktivierung/Confirm-Mail; Neos nutzte RMS-/PPP-Kontext und optionale Magazin-Anmeldung. Webform erzeugt gesperrten User, projektpartner-Profil und private Dokumente; Easy Email ppp_verify und ppp_welcome; DOI und One-Time-Login vorhanden. mittel Neue Selbstregistrierer erhalten keine belegte PPP-ID; externe Magazin-Anbindung fehlt. Registration-Test muss field_ppp_id-Regel pruefen, sobald Quelle/Sequenz entschieden ist.
Profil-Sync Legacy-Profil-/RMS-Kontext war externer Integrationsvertrag; genaue aktuelle Ziel-API ist fachlich zu klaeren. Drupal vergleicht editierbare Profilfelder und queued Easy Email ppp_sf_sync an vertrieb@solcom.de. mittel Mail-Fallback ist kein API-Sync. Als Ersatzvertrag akzeptieren oder Salesforce/RMS-API bauen. Entweder Mail-Golden-Master behalten oder Salesforce-Client-Vertragstest ergaenzen.
Account-E-Mail-Wechsel Double-Opt-In fuer neue E-Mail-Adresse. Neue Adresse wird geparkt; Confirm-Link per HMAC/KeyValue; Easy Email ppp_email_change. klein Aktueller Code matcht Ziel. Bestehende Kernel-/Functional-Tests behalten; Link-Expiry pruefen.
Account-Loeschung Neos-Templates neos_acc_delete* existieren fuer Loeschkontext. Drupal loescht User, Profil, Dateien und Directory; keine aktive Ausgangsmail gefunden. entscheidung Falls Neos-Mail fachlich relevant war, fehlt Ausgangsvertrag. Sonst als bewusst entfernt dokumentieren. Deletion-Test um Mail-Erwartung erweitern oder explizit kein Mailversand als Vertrag testen.
Vendor-Feeds Externe Plattformen erhalten Projektangebote mit Detail-/Apply-Links. Public GET fuer Freelancermap/freelance.de als XML openPositions, Gulp als HTML-Legacy; Eligibility via published, Channel-Flag, Publish-Window. minggo_workspace_id ist leer, dadurch fehlt jobApplicationURL. klein/unklar Viele Tests vorhanden; voller Neos-Sample-Diff und Minggo-URL-Entscheidung fehlen. Golden-Sample pro Vendor + Live-HTTP-Headers + Legacy-Redirects + Minggo-Apply-URL, wenn Workspace gesetzt.

3. Personio-Kompatibilitaet

Personio ist am naechsten an echter Vertragstreue: Endpoints, Header, Top-Level-Body und Kernattribute matchen. Die Rest-GAPs sitzen nicht im Grund-POST, sondern in Randformaten: Legacy-Cookie-Format, App-Referer-Kanal, Upload-Typen.

AspektNeosDrupalGAP/Test
Endpoints /v1/recruiting/applications/documents multipart, danach /v1/recruiting/applications JSON. Gleiche Endpoints; Application-POST mit zusaetzlichem X-Idempotency-Key. match Header-/Endpoint-Test behalten.
Application JSON job_position_id, first_name, last_name, email, application_date, attributes, files. Gleicher Body; application_date aus Submission-Zeit, retry-stabil. match Golden-Master-Payloadtest.
Gender m/w/d zu male/female/diverse, sonst undefined. Aktueller Drupal-Code sendet die rohen Webform-Werte m/w/d/u. gap Mapping-Fix plus Kernel-Test fuer alle vier Werte.
Referer info-Cookie als JSON mit url_full = base64(referer); >252 Zeichen wird gekuerzt und lowercased. info-Cookie raw base64(referer), Klaro-gated; keine belegte Neos-Langwert-Normalisierung im aktuellen Code. teilweise Legacy-JSON-Cookie-Test, Langwert-Normalisierung oder bewusste Abweichung dokumentieren.
Channel Grosse Domain-Tabelle, last-match-wins, android-app/ios-app-Spezialfall. Domain-Tabelle vorhanden; App-Spezialfall nicht belegt. klein Unit-Test fuer App-Referer und gesamte Domain-Tabelle.
Upload-Kategorien cv, cover-letter, certificate, sonst other. cv, cover-letter, weitere Anhaenge other; kein eigenes Arbeitszeugnis-Feld. mittel Feld-/Kategorie-Entscheidung fuer certificate.
Applicant Confirmation Im Career-Personio-Flow kein lokaler Mailversand gefunden; Redirect nach Personio-Erfolg. Thank-you sagt, Personio sendet Bestaetigung; kein lokaler Applicant-Mailversand. match Test soll explizit keine lokale Mail erwarten.

4. Testzielbild: P0/P1/P2

PrioritaetTestWarumAutomatisierung
P0 Availability Journey Token-Route, Import-Fixture, Formular-Submit, Mail an projektpartner@solcom.de, ACK an Partner, Upload-Archiv. Groesster kompletter Neos-GAP. Functional + Kernel + Mailpit/Browser-Pruefschritt.
P0 PPP-ID-Neuvergabe Registrierung erzeugt fachlich korrekte field_ppp_id oder dokumentierten Ersatzwert. Neue Bewerbungen ohne PPP-ID brechen externe Zuordnung. Kernel/Functional, sobald Regel entschieden ist.
P0 Bewerber-ACK Projektbewerbung Projektbewerbung erzeugt interne Mail und Bewerber-ACK oder dokumentiert explizit keinen ACK. Neos sendete ApplicationConfirmation.html; Drupal aktuell nicht. Kernel-Mailtest + Browser-Full-Submit.
P0 Projektbewerbung Ausgangsvertrag Eine SOLCOM-Mail pro Projekt, Projektkontakt-CC, UTM-Betreffprioritaet, Body-Felder, Dateiliste, Attachments und optionales Archiv. Neos-Vertrag ist breiter als aktueller Teilstring-Test und umfasst UTM, Uploadlimits und Archivpfad. Kernel-Golden-Master + Browser-Submit + Mailpit.
P0 Suchagent-Link-Drift Config-Sync und aktive Config duerfen nicht mehr /mein-profil/suchagent enthalten. User landet sonst auf altem Pfad. Kernel/Config-Test + Mailbody-Test.
P1 Personio Golden Master Kompletter Application-JSON, Header, Dokument-Upload-Reihenfolge, Referer, Channel, Upload-Kategorien. Externer API-Vertrag muss regressionssicher sein. Kernel mit Guzzle MockHandler + optional Sandbox-Smoke.
P1 Suchagent Cron E2E Alert speichern, passendes Projekt erzeugen, Cron ausloesen, Mail mit Projektlink und Verwaltungslink pruefen; danach gleicher Projekt-Treffer darf nicht erneut gesendet werden. Neos hatte Notification-Dedupe und Import-Baseline gegen Massenversand. Kernel/Functional, optional Browser fuer UI.
P1 Oeffentlicher Projekt Alert Subscribe → Confirm → Digest → Unsubscribe mit Token und Cleanup nach 7 Tagen. Neos konnte Gast-Alerts; Drupal hat eigenes anonymes Modell. Functional + Kernel.
P1 Mailingwork/Newsletter Provider-Client oder Ersatzentscheidung; Duplicate-Check, optinrecipient-Feldmapping und Fehlerfaelle der JSON-API pruefen. Lokale Opt-ins sind keine Neos-Paritaet. Mock-Vertragstest nach Providerentscheidung.
P1 Neos-Template-Matrix Alle importierten neos_*-Easy-Email-Templates als verwendet, ersetzt oder tot markieren. Aktuell liegen viele Templates in Config, ohne aktiven Trigger. Config-/Service-Inventar + Report-Gate.
P2 Feed-Sample-Diff Freelancermap, freelance.de, Gulp plus Legacy-Redirects gegen Golden Samples. Feeds sind nah dran, aber Vendor-Format muss stabil bleiben. Kernel + HTTP route tests.
P2 Visuelle Portal-Regressions Profil, Konto, Merkliste, Suchagent, Bewerbung, Registrierung via Browser und a11y Smoke. Paritaet muss auch bedienbar bleiben. agent-browser fuer Browser-Evidence.

5. Konkrete Pruefschritte fuer spaetere Abnahme

FlowSchritteErwarteter BelegAutomatisierbar
Registrierung /projektportal/registrieren ausfuellen, Datei hochladen, Verify-Link aus Mailpit klicken. User aktiv, Rolle projektpartner, Profil + Datei, Verify und Welcome-Mail. Ja.
PPP-ID Neuen Selbstregistrierer anlegen, danach Bewerbung absenden. field_ppp_id gesetzt oder bewusst dokumentierter Ersatz; Mailbody enthaelt erwarteten Wert. Ja nach Regelentscheidung.
Login / Profil Mit E-Mail einloggen, Profil bearbeiten, Datei pruefen. Profilwerte gespeichert, private Datei nur fuer Owner erreichbar, kein Admin-Chrome fuer Endnutzer. Ja.
E-Mail-Wechsel Neue Adresse setzen, Confirm-Link klicken, erneut anmelden. Alte Adresse bleibt bis Confirm aktiv; neue Adresse danach aktiv; Pending-Key entfernt. Ja.
Merkliste Anonym Projekt merken, einloggen, Merkliste oeffnen, Eintrag entfernen. Persistente Merkliste, CSRF-geschuetzte JSON-Aktionen, Server-Storage pro User. Ja.
Projektbewerbung Projekt-Detail → Bewerben → Upload → Submit; zusaetzlich UTM-Kontext und mehrere Projekte pruefen. Danke-Seite, Webform-Submission, interne Mail an bewerbung@solcom.de, CC Kontakt, korrekter UTM-/Standard-Betreff, Dateiliste, Bewerber-ACK oder dokumentierter Nichtversand. Ja.
Apply-all Zwei Projekte merken, /projektportal/merkliste/bewerben absenden. Eine Mail pro Projekt, korrektes Subject/CC, Merkliste danach leer. Ja.
Suchagent Skill/Region speichern, passendes Projekt nach Baseline erzeugen, Cron zweimal ausloesen. Erster Lauf sendet Mailpit-Mail mit Projektlink und Link auf /projektportal/suchagent; zweiter Lauf sendet denselben Treffer nicht erneut. Ja.
Oeffentlicher Projekt Alert Gast-Subscribe, Confirm-Link, Digest-Cron, Unsubscribe-Link. Unconfirmed Cleanup nach 7 Tagen, Digest nur confirmed, Token-Unsubscribe loescht Entity. Ja.
Availability Import-Fixture laden, Hash-Link oeffnen, Datum/Message/Upload senden; Upload-MIME und Dateigroesse negativ testen. Aktuell 404. Ziel: Einladung je Mailtyp, Mail an projektpartner@solcom.de, ACK an Partner, Archiv-Dateien, Uploadvalidierung. Ja nach Implementierung.
Personio Vacancy-Bewerbung mit Referer, Gender, Talentpool, Dokumenten absenden; Queue verarbeiten. Mock/Sandbox zeigt JSON und Dokument-Refs im Neos-kompatiblen Format; kein lokaler Applicant-Mailversand. Ja, Sandbox optional.
Feeds /feeds/freelancermap.xml, /feeds/freelance.xml, Gulp-Legacy-URL abrufen. HTTP 200/301, erwartete XML/HTML-Struktur, Items, Canonical/Apply-Links, Cache-Tags. Ja.

6. Entscheidungen, bevor Full-Parity gebaut wird

  1. Power-App statt Neos-HTML: Soll RSM-Bewerbung dauerhaft das Plaintext-Power-App-Format sein? Dann Neos-HTML-Archiv nicht bauen, sondern Ersatzvertrag offiziell machen.
  2. Bewerber-ACK: Muss Drupal wie Neos eine Bestaetigungsmail fuer Projektbewerbungen senden, oder reicht Danke-Seite/Minggo?
  3. Archivpflicht: Muessen Data/Bewerbungen und Data/Verfuegbarkeit als Dateiarchive in Drupal nachgebaut werden, oder reicht Webform-/Entity-Speicherung?
  4. PPP-ID-Quelle: Kommt neue PPP-ID aus RMS/Salesforce, lokaler Sequenz oder bewusstem UUID-Ersatz?
  5. Availability-Scope: Vollstaendiger Neos-Hash-Link-Flow in MVP oder Phase 2? Ohne Entscheidung bleibt groesster GAP offen.
  6. Legacy-Import-Samples: Fuer Project-Alert-CSV und Availability-XML/CSV fehlen belastbare Export-Samples. Ohne Samples bleiben Feldindizes und Sonderfaelle unsicher.
  7. Alert-Modell: Zwei Drupal-Modelle akzeptieren oder oeffentlichen und eingeloggten Alert naeher an Neos zusammenfuehren?
  8. Newsletter/Mailingwork: Mailingwork reaktivieren, durch neues Marketing-System ersetzen oder lokale Opt-ins als Zielzustand definieren?
  9. Profil-Sync: Mail an Vertrieb als finaler Ersatzvertrag oder echter Salesforce/RMS-API-Sync?
  10. Personio Upload-Typen: Eigenes Arbeitszeugnis-Feld fuer certificate oder alle Zusatzdokumente bewusst other?

7. Screenshot-Vergleich: Formularinventar

Screenshots sollen pro Formularpaar einzeln entstehen, damit spaeter klar ist, welcher ProPal-Stand gegen welchen Neos-Stand geprueft wurde. Produktion https://www.solcom.de/de/projektportal/registrieren blockierte die Agent-Browser-Session und den integrierten Browser am 19.06.2026 mit Cloudflare-Human-Check. Auto-Connect lieferte keine eingeloggte User-Chrome-Session fuer solcom.de. Echte Neos-Produktionsscreenshots brauchen daher eine geloeste Challenge in der sichtbaren Browser-Session, eine verbundene Chrome-Session mit Remote-Debugging oder eine lokale Cookie-State-Datei. Bis dahin koennen ProPal-Screenshots und statische Legacy-Template-Referenzen vorbereitet werden.

FormularProPal ScreenshotNeos ScreenshotStatus / naechster Schritt
Registrierung Fullpage, annotiert Agent-Browser-Blocker, In-App-Browser-Blocker teilweise Neos-Produktion erst nach Auth-/Cloudflare-Zugriff erfassbar.
Login offen offen Als naechster einzelner Screenshot-Block abarbeiten.
Passwort-Reset offen offen Nach Login-Block erfassen.
Profil bearbeiten offen offen ProPal braucht authentifizierten Projektpartner-Testuser; Neos braucht Produktionssession.
Konto / Zugangsdaten offen offen Nur mit Testuser; keine produktiven Aenderungen absenden.
Suchagent / Projekt Alert eingeloggter Partner offen offen Mit Testprojekt und Testuser aufnehmen; Cron-Mail separat testen.
Oeffentlicher Projekt Alert offen offen Public-Formular zuerst lokal aufnehmen, danach Neos bei Zugriff.
Projektbewerbung offen offen ProPal-Projektangebot mit Bewerbungsroute waehlen; Submit erst in Test-/DDEV-Kontext.
Availability fehlt offen ProPal ist 404 bis Implementation; Neos braucht gueltigen Hash oder statische Template-Referenz.

8. Quellen und Evidenz

Arbeitsstand. Diese Seite ist Dokumentation und Zielbild. Der fruehere PHPUnit-Prozess wurde wegen Prioritaetswechsel abgebrochen; Code- und Testpatches aus dem Zwischenanlauf wurden wieder entfernt. Die naechste technische Runde sollte zuerst entscheiden, welche Ersatzvertraege wirklich gelten, dann P0-Vertragstests einzeln umsetzen.