P2503 · Projektpartnerportal · RSM-Fallback

RSM XML Import — Projektangebote aus Altsystem

REFINED P2503-197 Erstellt & Refined: 2026-05-30 (via solcom-grill)

User Story

Als Projektpartner möchte ich auf der SOLCOM-Website aktuelle Projektangebote sehen, auch wenn Salesforce noch nicht live ist, damit ich mich bereits ab Go-Live auf passende Projekte bewerben kann.

Outcome

Das neue Sub-Modul solcom_rsm_import importiert täglich die RSM-XML-Datei aus private://rsm/ und legt project_offer-Nodes an bzw. aktualisiert bestehende. Import und SF-API-Pull schließen sich via State Flag aus. Die Projektliste unter /fuer-freiberufler/projektliste ist ab Tag 1 des Go-Live befüllt.

Scope

In Scope

  • Neues Sub-Modul solcom_rsm_import unter web/modules/custom/solcom_project_offer/modules/
  • Drupal Migrate SourcePlugin RsmXmlSource: liest neueste Datei in private://rsm/ (nach filemtime), dekodiert UTF-16, parst <OpenPos><Datensatz>-Struktur
  • Feldmapping RSM → project_offer-Node:
RSM-FeldDrupal-FeldTyp
lfdNrfield_rsm_lfd_nr (Migration Key)Integer
TiteltitleString
BeschreibungbodyText (HTML)
Ortfield_locationString
Startfield_start_dateDate
Dauerfield_durationString
Stellentypfield_job_typeString
Bearbeiterfield_contact_emailEmail
Aktivstatus (published/unpublished)Boolean
FreelancerLink (Minggo-URL, Suffix = SF-ID)field_minggo_url + field_sf_id (extrahiert)String
Regionfield_regionString
Branchefield_industryString
skillsfield_skillsText
  • State Flag solcom_project_offer.rsm_fallback_enabled: bei 1 läuft RSM-Import-Cron, SF-Import schläft; bei 0 umgekehrt
  • Cron-Job: täglich, prüft ob Flag aktiv, wählt neueste Datei, führt Migrate aus
  • Automatisches Unpublish von Nodes deren lfdNr nicht mehr in der neuesten XML erscheint oder Aktiv=0
  • Alte Dateien in private://rsm/ nach 30 Tagen löschen

Out of Scope

  • SF-Migration und lfdNr→SF-ID-Mapping (separater Task nach SF-Go-Live)
  • SFTP-Konfiguration auf dem Server (operativer Schritt, nicht Modul-Code)
  • Bewerbungsformular (eigene Story: RSM Bewerbungs-Webform)

Akzeptanzkriterien

  1. Wenn drush state:get solcom_project_offer.rsm_fallback_enabled = 1 und eine XML-Datei in private://rsm/ liegt, werden nach Cron-Run alle Aktiv=1-Datensätze als project_offer-Nodes angelegt/aktualisiert.
  2. Datensätze mit Aktiv=0 oder nicht mehr in der XML vorhanden werden unpublished.
  3. Bei mehreren Dateien in private://rsm/ wird die neueste (nach filemtime) verwendet.
  4. Wenn Flag = 0, wird kein RSM-Import durchgeführt (SF-Import läuft stattdessen).
  5. Nodes mit FreelancerLink haben field_minggo_url befüllt und field_sf_id mit dem extrahierten SF-Record-ID-Suffix.
  6. Folgerun mit gleicher Datei erzeugt keine Duplikate (idempotent via field_rsm_lfd_nr).

QA-Plan (Click-Pfade)

AKURL / KommandoAktionErwartet
1drush state:set … 1 && drush cronFlag setzen, Cron laufen lassenNodes angelegt, Titel/Ort aus XML korrekt
2/fuer-freiberufler/projektlisteNode mit Aktiv=0 suchenNode unpublished, nicht in Listing sichtbar
3private://rsm/ (2 Dateien)Cron laufen lassenNur neuere Datei importiert (Datumsstempel prüfen)
4drush state:set … 0 && drush cronFlag auf 0, CronKein RSM-Import, kein Fehler-Log
5/fuer-freiberufler/projektliste/{node}Node mit FreelancerLink aufrufenfield_minggo_url befüllt, field_sf_id korrekt extrahiert
6drush cron (gleiche Datei, 2× laufen)Zweiter Cron-RunNode-Anzahl unverändert (kein Duplikat)

Technische Details

XML-Struktur

<?xml version="1.0" encoding="UTF-16"?>
<OpenPos>
  <Datensatz>
    <lfdNr>42773</lfdNr>
    <Titel>Senior PHP Developer</Titel>
    <Beschreibung>...</Beschreibung>
    <Ort>München</Ort>
    <Start>01.07.2026</Start>
    <Dauer>6 Monate</Dauer>
    <Bearbeiter>max.mustermann@solcom.de</Bearbeiter>
    <Aktiv>1</Aktiv>
    <FreelancerLink>https://solcom.minggo.io/UUID/apply/a1WSZ001</FreelancerLink>
    ...
  </Datensatz>
</OpenPos>

SF-ID Extraktion aus FreelancerLink

Pattern: https://solcom.minggo.io/{UUID}/apply/{SF_ID} → letztes URL-Segment ist die SF-ID.

Abhängigkeiten