P2503 · Projektpartnerportal · F-340

project_offer-XML-Feeds (Freelancermap, freelance.de)

REFINED P2503-112 Erstellt: 2026-05-11 · Refined: 2026-05-17

User Story

Als Vertriebsmitarbeiter möchte ich meine offenen Projektanfragen automatisch über XML-Feeds an Freelancermap und freelance.de übergeben, um die Reichweite meiner Ausschreibungen zu erhöhen und den manuellen Pflegeaufwand auf den Plattformen zu eliminieren.

Technische Beschreibung

Custom-Drupal-Routes /feeds/freelancermap.xml und /feeds/freelance.xml publizieren XML im Format <openPositions> (Spec gespiegelt aus den Live-Samples in docs/context/freelance.xml + docs/context/freelancermap.xml). Quelle ist node.type.project_offer (gespiegelt aus Salesforce via solcom_project_offer-Migrate). Filterung pro Vendor über field_sf_channel_freelance / field_sf_channel_freelancermap + Status + Veröffentlichungs-Fenster. Code lebt im neuen Sub-Modul solcom_project_offer/modules/solcom_project_offer_feeds/. Legacy-Pfade /asp/robots/*.xml liefern 301-Redirect auf die kanonischen Drupal-URLs.

Doku-Korrektur 2026-05-17

Die initiale Version dieses Story-Hubs (2026-05-11) hatte zwei fundamentale Drifts, die im grill-with-docs am 2026-05-17 aufgelöst wurden:

  • Quelle: node.type.vacancynode.type.project_offer — Vacancies sind eigene Festanstellungen (Karriere/Personio); F-340 betrifft Freelance-Aufträge (Projektpartnerportal/SF).
  • Modul-Heimat: solcom_vacancy oder neues solcom_job_feeds → Sub-Modul unter solcom_project_offer.
  • URL-Strategie: kanonisch /feeds/*, Legacy /asp/robots/* → 301.

PRD-Hub

Vollständiges PRD inkl. Architektur-Map, XML-Schema, Vendor-Config und Test-Scope: docs/prds/2026-05-17-project-offer-xml-feeds-prd.html.

Akzeptanzkriterien

Stakeholder-Sprache, testbar — wie im Jira-Ticket gepflegt:

  1. Ein Aufruf von https://www.solcom.de/feeds/freelancermap.xml liefert eine wohlgeformte XML mit Root <openPositions> und einem <position>-Element pro publizierter Projektanfrage, deren Freelancermap-Channel-Flag in Salesforce gesetzt ist.
  2. Ein Aufruf von https://www.solcom.de/feeds/freelance.xml liefert dasselbe Format mit der Teilmenge der für freelance.de freigeschalteten Projektanfragen.
  3. Eine Projektanfrage, deren Veröffentlichungs-Endedatum (field_sf_publish_end) in der Vergangenheit liegt, erscheint nicht im Feed — spätestens beim ersten Vendor-Poll nach Ablauf.
  4. Eine Projektanfrage, deren field_sf_pub_status in Salesforce von „Online" auf einen anderen Wert geändert wurde, erscheint nicht im Feed — spätestens beim ersten Vendor-Poll nach dem Migrate-Sync.
  5. Ein Aufruf der Legacy-URL https://www.solcom.de/asp/robots/freelance.xml beantwortet mit HTTP 301 und einem Location-Header, der auf https://www.solcom.de/feeds/freelance.xml zeigt. Dasselbe für freelancermap.xml.
  6. Pro Projektanfrage enthält das XML eine <jobApplicationURL> mit einem Minggo-Deep-Link der Form https://solcom.minggo.io/{minggo_workspace_id}/apply/{sf_id}.
  7. Pro Projektanfrage enthält das XML eine <jobDescriptionURL> mit der absoluten Drupal-Detail-URL der Projektanfrage. Für den freelance.de-Feed wird zusätzlich eine zweite CDATA-URL mit UTM-Parametern ausgespielt.
  8. Beide Feed-Responses tragen den HTTP-Header X-Robots-Tag: noindex, nofollow.
  9. Beide Feed-Responses werden über Drupal-Page-Cache mit Cache-Tag node_list:project_offer ausgeliefert; nach einer Pflege-Änderung in Salesforce wird der nächste Vendor-Poll spätestens innerhalb von Migrate-Intervall + 1 Stunde die Änderung enthalten.
  10. Beide Feed-Endpoints sind öffentlich anonym aufrufbar, ohne Authentifizierung.
  11. Der Code lebt im Sub-Modul solcom_project_offer/modules/solcom_project_offer_feeds/ und kann ohne Auswirkung auf die Migrate-Schicht des Haupt-Moduls deaktiviert werden.
  12. Es existieren Pflicht-Tests für (a) die Filter-Logik (Kernel, gegen Fixture-Nodes), (b) die Routen + Headers (Functional), (c) die Legacy-301-Redirects (Functional).

Abhängigkeiten

  • F-290 / P2503-108 (project_offer-Sync) produktiv — ohne Migrate-Sync gibt es keine Project-Offer-Nodes.
  • Pathauto-Pattern auf den neuen IA-Pfad /fuer-freiberufler/projektliste/[node:title] umgestellt (gehört zu F-290 oder eigener URL-Kanon-Story).
  • Drupal-Cutover-Plan aktiv: www.solcom.de zeigt am Go-Live auf Drupal.
  • Legacy-Detail-URL-Redirect-Strategie geklärt (Vendor-Backlinks auf alte ASP-Detail-Seiten — separater Klärungsbedarf, im PRD als offene Frage hinterlegt).
  • Salesforce-Pflege der Channel-Flags SC_Publishing_Channel_Freelancermap__c und SC_Publishing_Channel_Freelance__c ist im Vertriebs-Workflow verankert.

Offene Fragen

  • Korrekte UTM-Parameter-Werte für freelance.de (Default-Vorschlag im PRD; finale Abstimmung mit Vendor bei Implementierung).
  • Sollen bestehende Vendor-Anzeigen mit Backlinks auf /asp/robots/detail.aspx?id=<id> nach Cutover via Catch-all-Redirect weiterhin funktionieren — oder ist es akzeptiert, dass alte Backlinks ablaufen?
  • Wie wird field_sf_estimated_start (DateTime, ISO-8601) in das Vendor-Format dd.mm.yyyy übersetzt? Field-Spec im Implementations-Plan.

Artefakte

Worklog

DatumPhaseEintrag
2026-05-20 Review Persisted — standards: 1 hard / 2 judgement, spec: alle AKs ✓ mit 2 partials (worst: tests/src/Functional/-Klassen erweitern KernelTestBase — PSR-4-Namespace-Drift). PR #164388 mit drei Sub-Tasks (P2503-165/166/167) alle in „Fertig".