Serviceartikel (Geräte)
Zuletzt geändert: 18.07.2026 15:54

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 #

MethodePfadScopeZweck
GET/api/v1/service-articlesservice-articles:readListe (Paging, Filter, q, changedSince, categoryAnd/Or/Not)
GET/api/v1/service-articles/idsservice-articles:readSchlüsselliste für den Lösch-Abgleich
GET/api/v1/service-articles/{id}service-articles:readEinzelnes Gerät über die Id
GET/api/v1/service-articles/by-number/{number}service-articles:readEinzelnes Gerät über die SarNummer
POST/api/v1/service-articlesservice-articles:writeAnlegen (cn_SrNew bzw. cn_SrNewFromAr bei articleId)
PATCH/api/v1/service-articles/{id}service-articles:writeFelder ändern (partiell)
DELETE/api/v1/service-articles/{id}service-articles:writeLöschen, nur wenn unbenutzt (cn_SrDel)
GET/api/v1/service-articles/{id}/historyservice-articles:readGerätehistorie über alle Belegarten
POST/api/v1/service-articles/{id}/actions/create-orderdocuments:writeServiceauftrag aus dem Gerät (cn_AfNewFromSr)
POST/api/v1/service-articles/{id}/actions/create-quotedocuments:writeAngebot aus dem Gerät (cn_AnNewFromSr)
GET/api/v1/addresses/{id}/service-articlesservice-articles:readGeräte eines Kunden
GET/api/v1/articles/{id}/service-articlesservice-articles:readGeräte zu einem Stamm-Artikel
GET/PUT/DELETE/api/v1/service-articles/{id}/image (+/preview)service-articles:read/writeGerätebild, siehe Bilder
GET/POST/DELETE/api/v1/service-articles/{id}/filesdms:*DMS-Dateien des Geräts, siehe DMS
div./api/v1/service-articles/categories u.a.s. MerkmaleMerkmalbaum, 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-FeldDB-SpalteTypSchreibbar
idIDintnein
serviceArticleNumberSarNummerstringja (eindeutig via cnf_SrUniqueSarNummer; leer = Nummernkreis konOptionen.SarPrefix)
serviceArticleTypeSarTypstringja
articleId / articleNumberArtikelId / ArtNummerint/stringja (validiert) / nein
customerAddressId / customerMatchAdresseId / Matchint/stringja (validiert) / nein
locationAddressIdLAdresseIdintja (validiert; Standort-/Lieferadresse, nicht der Lieferant)
name / manufacturer / manufacturerNumber / brand / typeBezeichnung / Hersteller / ArtNummerHersteller / Marke / Typstringja
serialNumber / condition / location / mileageSeriennummer / Zustand / Standort / Laufleistungstring/intja
acquiredAt / warranty1Until / warranty2UntilErwerbsDatum / Garantie1Bis / Garantie2Bisdatetimeja
inspectionDue1/2 / lastInspection1/2 / lastMaintenance1/2PruefungsTermin1/2 / LetztePruefung1/2 / LetzteWartung1/2datetimeja
datasheetUrl / productUrl / longText / infoDatasheetUrl / ProductUrl / Langtext / infostringja
masterId / masterNumberMasterServiceArtikelId / MasterSarNummerint/stringja (kein Selbstbezug) / nein
templateIdTemplateServiceArtikelIdintja (kein Selbstbezug)
userText1-3 / userNumber1-3 / userInt1-3 / userDate1-2UserVC* / UserN* / UserI* / UserD*div.ja
createdAt / changedAtCreateDate / ChangeDatedatetimenein

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 #

StatusCodeBedeutung
501SERVICE_ARTICLES_UNAVAILABLETabelle fehlt (EULANDA-Schema älter als 6.7)
404NOT_FOUNDGerät existiert nicht
409SERVICE_ARTICLE_IN_USEBelege referenzieren das Gerät, Löschen nicht möglich
422VALIDATION_LOOKUP_INVALIDarticleId/customerAddressId/… existiert nicht
422VALIDATION_FIELD_INVALIDz.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.