Ressource: service-articles #
Serviceartikel sind die EULANDA-Geräteverwaltung: ein konkretes Gerät
beim Kunden (z.B. eine Drehbank), verknüpft mit dem Stamm-Artikel, dem
Kunden, der Standort-Adresse, Seriennummer, Prüf-/Wartungs-/
Garantie-Terminen, eigenem Merkmalbaum, Bild und DMS-Ordner. Über die
ServiceArtikelId-Verweise in allen Belegtabellen liefert die API die
komplette Gerätehistorie - die Basis für Field-Service-Szenarien
(Geräteübersicht je Kunde, Reparaturhistorie, Serviceauftrag direkt am
Gerät).
Das Modul existiert ab EULANDA-Schema 6.7. Fehlt die Tabelle in einer
älteren Datenbank, liefern alle Endpunkte 501
SERVICE_ARTICLES_UNAVAILABLE.
Endpunkte #
| Methode | Pfad | Scope | Zweck |
|---|---|---|---|
| GET | /api/v1/service-articles | service-articles:read | Liste (Paging, Filter, q, changedSince, categoryAnd/Or/Not) |
| GET | /api/v1/service-articles/ids | service-articles:read | Schlüsselliste für den Lösch-Abgleich |
| GET | /api/v1/service-articles/{id} | service-articles:read | Einzelnes Gerät über die Id |
| GET | /api/v1/service-articles/by-number/{number} | service-articles:read | Einzelnes Gerät über die SarNummer |
| POST | /api/v1/service-articles | service-articles:write | Anlegen (cn_SrNew bzw. cn_SrNewFromAr bei articleId) |
| PATCH | /api/v1/service-articles/{id} | service-articles:write | Felder ändern (partiell) |
| DELETE | /api/v1/service-articles/{id} | service-articles:write | Löschen, nur wenn unbenutzt (cn_SrDel) |
| GET | /api/v1/service-articles/{id}/history | service-articles:read | Gerätehistorie über alle Belegarten |
| POST | /api/v1/service-articles/{id}/actions/create-order | documents:write | Serviceauftrag aus dem Gerät (cn_AfNewFromSr) |
| POST | /api/v1/service-articles/{id}/actions/create-quote | documents:write | Angebot aus dem Gerät (cn_AnNewFromSr) |
| GET | /api/v1/addresses/{id}/service-articles | service-articles:read | Geräte eines Kunden |
| GET | /api/v1/articles/{id}/service-articles | service-articles:read | Geräte zu einem Stamm-Artikel |
| GET/PUT/DELETE | /api/v1/service-articles/{id}/image (+/preview) | service-articles:read/write | Gerätebild, siehe Bilder |
| GET/POST/DELETE | /api/v1/service-articles/{id}/files | dms:* | DMS-Dateien des Geräts, siehe DMS |
| div. | /api/v1/service-articles/categories u.a. | s. Merkmale | Merkmalbaum, Filter, Zuordnung |
Zusätzlich tragen die Beleg-Ressourcen das Feld serviceArticleId
(bei Angeboten und Aufträgen schreibbar): GET
/api/v1/sales-orders?serviceArticleId=4711 liefert alle Aufträge eines
Geräts über den normalen Gleichheitsfilter.
Felder (Glossar Entwurf) #
| API-Feld | DB-Spalte | Typ | Schreibbar |
|---|---|---|---|
id | ID | int | nein |
serviceArticleNumber | SarNummer | string | ja (eindeutig via cnf_SrUniqueSarNummer; leer = Nummernkreis konOptionen.SarPrefix) |
serviceArticleType | SarTyp | string | ja |
articleId / articleNumber | ArtikelId / ArtNummer | int/string | ja (validiert) / nein |
customerAddressId / customerMatch | AdresseId / Match | int/string | ja (validiert) / nein |
locationAddressId | LAdresseId | int | ja (validiert; Standort-/Lieferadresse, nicht der Lieferant) |
name / manufacturer / manufacturerNumber / brand / type | Bezeichnung / Hersteller / ArtNummerHersteller / Marke / Typ | string | ja |
serialNumber / condition / location / mileage | Seriennummer / Zustand / Standort / Laufleistung | string/int | ja |
acquiredAt / warranty1Until / warranty2Until | ErwerbsDatum / Garantie1Bis / Garantie2Bis | datetime | ja |
inspectionDue1/2 / lastInspection1/2 / lastMaintenance1/2 | PruefungsTermin1/2 / LetztePruefung1/2 / LetzteWartung1/2 | datetime | ja |
datasheetUrl / productUrl / longText / info | DatasheetUrl / ProductUrl / Langtext / info | string | ja |
masterId / masterNumber | MasterServiceArtikelId / MasterSarNummer | int/string | ja (kein Selbstbezug) / nein |
templateId | TemplateServiceArtikelId | int | ja (kein Selbstbezug) |
userText1-3 / userNumber1-3 / userInt1-3 / userDate1-2 | UserVC* / UserN* / UserI* / UserD* | div. | ja |
createdAt / changedAt | CreateDate / ChangeDate | datetime | nein |
Der Einkaufspreis (EkNetto) ist bewusst nicht im Feldkatalog - er
folgt mit einem eigenen, restriktiveren Scope (wie bei den Artikeln).
changedAt wird bei API-Updates explizit fortgeschrieben, damit der
changedSince-Delta-Sync zuverlässig ist.
Historie #
GET /api/v1/service-articles/4711/history
{
"quotes": [ { "id": 12, "number": 20211869, "date": "2026-05-02T00:00:00" } ],
"salesOrders": [ { "id": 1893, "number": 20213037, "date": "2026-07-18T00:00:00" } ],
"deliveryNotes": [],
"invoices": [],
"purchaseOrders": []
}
Die Historie kommt aus den EULANDA-Funktionen cnf_SrGoto* (Verweise
in Kopf und Positionen) in einem Roundtrip und liefert bewusst nur
Id, Nummer und Datum - Belegdetails über die Beleg-Endpunkte
(Scope documents:read).
Beispiele #
$h = @{ Authorization = "Bearer $key" }
# Geräte eines Kunden mit fälliger Prüfung zuerst
Invoke-RestMethod 'http://localhost:8100/api/v1/addresses/17/service-articles?sort=inspectionDue1' -Headers $h
# Gerät anlegen: aus dem Stamm-Artikel, mit Seriennummer
$body = @{ articleId = 2; name = 'Drehbank DB-200'; serialNumber = 'SN-4711'; customerAddressId = 17 } | ConvertTo-Json
Invoke-RestMethod 'http://localhost:8100/api/v1/service-articles' -Method Post -Body $body -ContentType 'application/json' -Headers $h
# Wartung vom Tablet zurückschreiben
Invoke-RestMethod 'http://localhost:8100/api/v1/service-articles/4711' -Method Patch `
-Body '{"lastMaintenance1":"2026-07-18T10:00:00","condition":"gewartet"}' -ContentType 'application/json' -Headers $h
# Serviceauftrag direkt am Gerät
Invoke-RestMethod 'http://localhost:8100/api/v1/service-articles/4711/actions/create-order' -Method Post -Headers $h
curl.exe -H "Authorization: Bearer %KEY%" "http://localhost:8100/api/v1/service-articles?changedSince=2026-07-18T00:00:00&fields=id,serviceArticleNumber,changedAt"
curl.exe -H "Authorization: Bearer %KEY%" "http://localhost:8100/api/v1/service-articles/by-number/SAR000001"
curl.exe -H "Authorization: Bearer %KEY%" "http://localhost:8100/api/v1/service-articles/4711/history"
curl.exe -X POST -H "Authorization: Bearer %KEY%" "http://localhost:8100/api/v1/service-articles/4711/actions/create-order"
Fehler #
| Status | Code | Bedeutung |
|---|---|---|
| 501 | SERVICE_ARTICLES_UNAVAILABLE | Tabelle fehlt (EULANDA-Schema älter als 6.7) |
| 404 | NOT_FOUND | Gerät existiert nicht |
| 409 | SERVICE_ARTICLE_IN_USE | Belege referenzieren das Gerät, Löschen nicht möglich |
| 422 | VALIDATION_LOOKUP_INVALID | articleId/customerAddressId/… existiert nicht |
| 422 | VALIDATION_FIELD_INVALID | z.B. masterId/templateId zeigt auf das Gerät selbst |
Migration von der XML-Schnittstelle #
Für Integrationen, die bisher EULANDA-servicearticle.xml per Datei
austauschen: SERVICEARTIKELNR entspricht serviceArticleNumber
(by-number/{number}), ADRESSEMATCH wird zu customerAddressId +
customerMatch. Neu gegenüber dem XML: articleId (Stamm-Artikel),
Delta-Sync über changedSince + /ids statt Voll-Snapshots, die
Gerätehistorie und das Rückschreiben von Wartungsdaten per PATCH.