ERP-Integration: Firmenablauf
Überblick
Dieser Leitfaden beschreibt, wie ein ERP-System eine Firma samt Betriebsstätten, Einsatzorten und Ansprechpartnern aus talent.Flow übernimmt und weiterpflegt. Er folgt demselben Muster wie der Bewerberablauf: Ereignis → Referenz → Abruf → Pflege.
Der wesentliche Unterschied zum Bewerberablauf: Firmen tragen eine externe Id. Damit lässt sich die Zuordnung zum ERP-Datensatz direkt im Datensatz führen, statt in einer eigenen Tabelle.
Kurzfassung: Webhook auf das Firmen-Ereignis registrieren, danach GET /v3/customers/{id} aufrufen — dieser eine Aufruf liefert die Firma mit Betriebsstätten, deren Einsatzorten und den Ansprechpartnern vollständig verschachtelt.
Der Ablauf im Bild
sequenceDiagram
participant U as Anwender in talent.Flow
participant TF as talent.Flow
participant ERP as Ihr ERP-System
U->>TF: Firma anlegen bzw. übertragen
TF->>ERP: POST auf Ihre Webhook-URL
ERP-->>TF: 200 OK
ERP->>TF: GET /v3/customers/{entityId}
TF-->>ERP: Firma inkl. offices[] und contacts[]
Note over ERP: Übernahme mit importExternalId als Schlüssel
ERP->>TF: PUT / POST / DELETE zur Pflege
TF-->>ERP: 200 OKSchritt 1: Webhook registrieren
curl -X POST https://api.talent360.io/v3/webhooks/subscribe \
-H "Authorization: Bearer IHR_ACCESS_TOKEN" \
-H "User-Agent: Mozilla/5.0 (Kundenname)" \
-H "Content-Type: application/json" \
-d '{"event": 1379, "url": "https://erp.example.com/hooks/talent360"}'
| Zweck | Endpunkt |
|---|---|
| Webhook registrieren | POST /v3/webhooks/subscribe |
| Registrierungen prüfen | GET /v3/webhooks/subscriptions |
| Verfügbare Ereignistypen | GET /v3/webhooks/event/types |
| Protokoll lesen | POST /v3/webhooks/protocol |
Ereignisse rund um die Firma
| Id | Ereignis | Cloud-Event | Bedeutung |
|---|---|---|---|
1379 |
Company created (customer) | io.talent360.customercreatedcustomer |
Firma als Kunde angelegt |
1380 |
Company created (interested party) | io.talent360.customercreatedinterestedparty |
Firma als Interessent angelegt |
1381 |
Company office added | io.talent360.customerofficeadded |
Betriebsstätte hinzugefügt |
1382 |
Company location added | io.talent360.customerlocationadded |
Einsatzort hinzugefügt |
1383 |
Company contact added | io.talent360.customercontactadded |
Ansprechpartner hinzugefügt |
Ein ERP, das nur echte Kunden führt, abonniert 1379. Soll auch der Vertriebsvorlauf mitlaufen, kommt 1380 dazu. Die Ereignisse 1381 bis 1383 melden Nachträge an einer bereits übernommenen Firma — sie sind für den laufenden Abgleich relevant, nicht für die Erstübernahme.
Registrierungsregeln, Fehlerschwelle und Wiederherstellung sind identisch zum Bewerberablauf — insbesondere gilt auch hier: sofort mit 200 antworten, sonst wird die Registrierung nach 10 Fehlern pausiert.
Schritt 2: Die Firma abrufen
curl -X GET https://api.talent360.io/v3/customers/815 \
-H "Authorization: Bearer IHR_ACCESS_TOKEN" \
-H "User-Agent: Mozilla/5.0 (Kundenname)" \
-H "Accept: application/json"
Ein Aufruf genügt. Die Antwort enthält die Firma, darin offices[] mit den Betriebsstätten, in jeder Betriebsstätte locations[] mit den zugeordneten Einsatzorten, sowie contacts[] mit den Ansprechpartnern. Sie müssen die Unterobjekte nicht einzeln nachladen.
Struktur der Antwort:
CustomerReadDto
├─ id, name, description, notes, ranking
├─ corporationId, corporation Unternehmensgruppe
├─ companyTypeId, companyType
├─ customerStatus, customerStatusChangedAtUtc
├─ importExternalId, importedAtUtc ← Zuordnung zum Quellsystem
├─ createdAtUtc, modifiedAtUtc
├─ address, responsibility
├─ offices[] Betriebsstätten
│ ├─ id, companyType, description
│ ├─ email, telephone, telefax
│ ├─ costCenter, vatId Kostenstelle, USt-IdNr.
│ ├─ importExternalId, importedAtUtc ← auch je Betriebsstätte
│ ├─ locations[] Einsatzorte, je mit importExternalId, importedAtUtc
│ └─ address, responsibility
└─ contacts[] Ansprechpartner, je mit importExternalId, assignedOfficeIds
Nutzen Sie importExternalId. Das Feld ist beim Anlegen schreibbar und wird beim Lesen zurückgeliefert — an der Firma, an jeder Betriebsstätte, an jedem Einsatzort und an jedem Ansprechpartner. Legen Sie dort Ihre ERP-Id ab, dann brauchen Sie keine separate Zuordnungstabelle und kein Matching über den Firmennamen. importedAtUtc hält fest, wann der Datensatz übernommen wurde. Neu in V 3.4.0: Auch Einsatzorte liefern beide Felder beim Lesen.
| Zweck | Endpunkt |
|---|---|
| Firma inkl. Betriebsstätten und Kontakten | GET /v3/customers/{id} |
| Betriebsstätte einzeln lesen | GET /v3/customers/offices/{officeId} |
| Einsatzort einzeln lesen | GET /v3/customers/locations/{locationId} |
| Ansprechpartner einzeln lesen | GET /v3/customers/contacts/{contactId} |
Die Einzelabrufe brauchen Sie vor allem für gezielte Nachladungen nach den Ereignissen 1381–1383. Neu in V 3.4.0: Eine unbekannte oder gelöschte Id liefert an allen drei Einzelabrufen 404 mit Fehlerkörper; bisher kam 204 ohne Inhalt.
Schritt 3: Daten ändern
| Zweck | Endpunkt |
|---|---|
| Firmenstammdaten ändern | PUT /v3/customers/{customerId} |
| Firmenstatus ändern | PUT /v3/customers/{customerId}/customerstatus |
| Vertragsstatus ändern | PUT /v3/customers/{customerId}/contractstatus |
| Betriebsstätte ändern | PUT /v3/customers/{customerId}/offices/{officeId} |
| Einsatzort ändern (Neu in V 3.4.0) | PUT /v3/customers/{customerId}/offices/{officeId}/locations/{locationId} |
| Ansprechpartner ändern | PUT /v3/customers/{customerId}/contacts/{contactId} |
| Anfrage umhängen (Neu in V 3.4.0) | PUT /v3/customers/{customerId}/requests/{requestId} |
Alle Änderungsendpunkte sind Teil-Updates: Nur die übermittelten Felder werden geändert. Die Zuständigkeit (responsibility) und createdAtUtc werden dabei ebenfalls übernommen.
Neu in V 3.4.0: Einsatzorte sind änderbar — Bezeichnung, Anfahrtshinweise, Ansprechpartner, externe Id und Adresse. Das Umhängen auf eine andere Betriebsstätte ist weiterhin nicht möglich; in diesem Fall legen Sie einen neuen Einsatzort an und löschen den alten.
Rechtsform im Firmennamen. Endet name an POST/PUT Firma auf eine Rechtsform (z. B. „Musterfirma GmbH"), trennt die API sie ab und setzt companyTypeId daraus. Liefern Sie companyTypeId getrennt und den Namen ohne Rechtsform, wenn der gespeicherte Name dem gesendeten entsprechen soll.
Schritt 4: Daten ergänzen
| Zweck | Endpunkt |
|---|---|
| Firma anlegen | POST /v3/customers |
| Betriebsstätte anlegen | POST /v3/customers/{customerId}/offices |
| Einsatzort anlegen | POST /v3/customers/{customerId}/offices/{officeId}/locations |
| Ansprechpartner anlegen | POST /v3/customers/{customerId}/contacts |
| Beruf anlegen | POST /v3/customers/{customerId}/professions |
| Konzerne lesen (Neu in V 3.4.0) | GET /v3/customers/corporations |
Ein Einsatzort hängt immer an einer Betriebsstätte — die Reihenfolge ist damit vorgegeben: erst Firma, dann Betriebsstätte, dann Einsatzort. Gehört die Firma zu einem Konzern, liefert der Konzernkatalog die zulässigen Werte für corporationId.
Schritt 5: Daten löschen
Neu in V 3.4.0: Für Betriebsstätten, Einsatzorte, Ansprechpartner und Anfragen gibt es Löschendpunkte. Damit lassen sich Löschungen aus dem ERP spiegeln und Testdaten entfernen.
| Objekt | Endpunkt |
|---|---|
| Betriebsstätte | DELETE /v3/customers/{customerId}/offices/{officeId} |
| Einsatzort | DELETE /v3/customers/{customerId}/offices/{officeId}/locations/{locationId} |
| Ansprechpartner | DELETE /v3/customers/{customerId}/contacts/{contactId} |
| Anfrage | DELETE /v3/customers/{customerId}/requests/{requestId} |
Soft-Delete, genau wie in talent.Flow. Der Datensatz wird deaktiviert und liefert im Einzelabruf anschließend 404. Beim Löschen einer Betriebsstätte bleiben ihre Einsatzorte, Kontaktzuordnungen und Anfragen bestehen — wer sie ebenfalls entfernen will, löscht sie vorher einzeln. Ein Datensatz, der nicht zur angegebenen Firma gehört oder bereits gelöscht ist, ergibt 404.
Die Firma selbst lässt sich nicht löschen. Soll eine Firma aus dem operativen Blick verschwinden, führt der Weg über den Status: PUT /v3/customers/{customerId}/customerstatus.
Abgleich ohne Webhook
Falls Sie zusätzlich einen periodischen Abgleich brauchen — etwa zur Kontrolle oder nach einem längeren Ausfall:
| Zweck | Endpunkt |
|---|---|
| Firmenänderungen im Zeitraum | GET /v3/customers/changes |
| Firmenänderungen pro Tag | GET /v3/customers/changes/{date} |
| Firmenänderungen pro Stunde | GET /v3/customers/changes/{date}/{hour} |
Der bevorzugte Weg zur Wiederherstellung bleibt aber das Webhook-Protokoll, weil es exakt die Ereignisse liefert, die Ihr System verpasst hat — siehe Bewerberablauf.
Empfehlungen im Überblick
- Firma über
GET /v3/customers/{id}in einem Aufruf übernehmen, statt Unterobjekte einzeln zu laden. importExternalIdbeim Anlegen setzen — an der Firma, an jeder Betriebsstätte, an jedem Einsatzort und Ansprechpartner.- Im Webhook-Handler sofort
200antworten, Verarbeitung asynchron anstoßen. - Ereignis-
idals Idempotenzschlüssel speichern. - Reihenfolge einhalten: Firma → Betriebsstätte → Einsatzort.
- Unterobjekte per
DELETEentfernen; für die Firma selbst den Statuswechsel vorsehen. - Auf 404 statt 204 prüfen, wenn ein Einzelabruf ins Leere geht.
- Access Token zwischenspeichern (siehe Authentifizierung).
Checkliste vor dem Go-Live
- Registrierung für das passende Firmen-Ereignis ist angelegt und über
GET /v3/webhooks/subscriptionsgeprüft. - Entschieden ist, ob auch Interessenten (
1380) übernommen werden. - Nachtrags-Ereignisse (
1381–1383) werden verarbeitet oder bewusst ignoriert. importExternalIdwird gesetzt und beim Rücklesen ausgewertet.- Einsatzorte werden über
PUTgeändert; ein Wechsel der Betriebsstätte ist als Neuanlage plus Löschung umgesetzt. - Löschungen im ERP werden über die
DELETE-Endpunkte gespiegelt, die Firma selbst über den Statuswechsel. - Ein Wiederherstellungslauf über
/webhooks/protocolist implementiert und getestet.
