Zum Inhalt

Inventar (Inventories)

Die Inventar-API verwaltet alle Prüfmittel und Messinstrumente im System.

Endpunkte

Methode Pfad Beschreibung Berechtigung
GET /api/v2/inventories Alle Inventare auflisten inventory_view
GET /api/v2/inventories/{id} Einzelnes Inventar abrufen inventory_view
POST /api/v2/inventories Inventar anlegen inventory_edit
PUT /api/v2/inventories/{id} Inventar aktualisieren inventory_edit
DELETE /api/v2/inventories/{id} Inventar löschen inventory_delete

Feldmapping

Jedes Feld besitzt drei Bezeichner: den V1-Code (Metrologie-/MetTrack-Code wie I4206), die DB-Spalte (physischer Spaltenname wie serial_number) und den API-Namen — den Bezeichner, den die API nach außen verwendet (in Response-Feldern, im filter[...], im sort und als Grid-Spalte).

V1-Code DB-Spalte Beschreibung
I4201 asset_number Prüfmittel-Nummer
I4202 manufacturer Hersteller
I4203 model Modell
I4204 description Messmittelbeschreibung
I4206 serial_number Seriennummer

API-Namen wählen: V1-Code oder DB-Spalte

Welcher Bezeichner als API-Name dient, ist konfigurierbar. Bestandskunden integrieren gegen die V1-Codes — deshalb ist der V1-Code die Standard- Vorgabe: Die API liefert und akzeptiert Felder dann unter ihrem Code (z.B. I4206 statt serial_number). Der gespeicherte Wert bleibt unverändert in seiner physischen DB-Spalte; nur der nach außen sichtbare Feldname ändert sich.

In der Feldverwaltung (Admin → Felddefinitionen) stehen pro Tabelle zwei Massenaktionen bereit (Berechtigung field_management_admin):

  • „API-Name = V1-Code" — setzt den API-Namen aller Felder auf ihren V1-Code (serial_number → I4206). Das ist die Werksvorgabe.
  • „API-Name = DB-Spalte" — setzt den API-Namen auf den lesbaren DB-Spaltennamen (I4206 → serial_number).

Programmatisch entspricht das dem Endpunkt:

curl -X POST "https://example.com/api/v2/field-definitions/inventory/copy-api-name" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{ "source": "v1_name" }'   # oder "column_name"

Beispiele auf dieser Seite

Die folgenden Beispiele nutzen die lesbaren Namen (serial_number, manufacturer). Ist der V1-Code als API-Name aktiv, treten überall die Codes an ihre Stelle (I4206, I4202) — in Request- und Response-Feldern sowie in filter[...] und sort.

Alle Inventare auflisten

curl -X GET "https://example.com/api/v2/inventories?page=1&per_page=25" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Query-Parameter

Parameter Typ Beschreibung
page integer Seitennummer (Standard: 1)
per_page integer Einträge pro Seite (Standard: 25)
sort string Sortierfeld, z.B. inventory_number oder -manufacturer (absteigend)
filter[manufacturer] string Nach Hersteller filtern
filter[serial_number] string Nach Seriennummer filtern
filter[customer_id] integer Nach Kunde filtern
fields string Kommaliste der Felder, die die Antwort tragen soll

Nur die Felder holen, die gebraucht werden

Ohne fields traegt jede Zeile den vollstaendigen Attributsatz der Installation — auf einer gewachsenen Registry ueber hundert Felder je Zeile. ?fields=asset_number,manufacturer,status schneidet das zu, und zwar nicht nur die Antwort: Der Server laedt dann auch nur die Relationen und liest nur die Spalten, die dafuer noetig sind.

Ein Feld ist unter seinem api_name, seinem physischen Spaltennamen oder seinem V1-Code adressierbar. Abgeleitete Werte kommen mit ihrem Feld: customer_id bringt customer_id_label mit, status bringt status_label. Filter und Sortierung duerfen weiterhin Felder nennen, die nicht angefordert sind.

Antwort

{
  "data": [
    {
      "id": 1,
      "inventory_number": "PM-2024-001",
      "manufacturer": "Fluke",
      "model": "8845A",
      "serial_number": "SN-123456",
      "customer_id": 5,
      "relationships": {
        "customer": {
          "id": 5,
          "name": "Mustermann GmbH"
        },
        "calibrations": [
          { "id": 12, "calibration_date": "2024-06-15" }
        ],
        "categories": [
          { "id": 3, "name": "Multimeter" }
        ]
      }
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 25,
    "total": 142,
    "last_page": 6
  },
  "links": {
    "first": "/api/v2/inventories?page=1",
    "last": "/api/v2/inventories?page=6",
    "next": "/api/v2/inventories?page=2",
    "prev": null
  }
}

Einzelnes Inventar abrufen

curl -X GET "https://example.com/api/v2/inventories/1" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Die Antwort enthält das vollständige Inventar-Objekt im data-Feld inklusive aller Beziehungen (Customer, Calibrations, Categories).

Inventar anlegen

curl -X POST "https://example.com/api/v2/inventories" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "inventory_number": "PM-2024-002",
    "manufacturer": "Keysight",
    "model": "34461A",
    "serial_number": "MY-987654",
    "customer_id": 5
  }'

Pflichtfelder

Mindestens inventory_number muss angegeben werden. Alle weiteren Felder sind optional, aber empfohlen.

Erfolgreiche Antwort (201)

{
  "data": {
    "id": 2,
    "inventory_number": "PM-2024-002",
    "manufacturer": "Keysight",
    "model": "34461A",
    "serial_number": "MY-987654",
    "customer_id": 5
  }
}

Inventar aktualisieren

curl -X PUT "https://example.com/api/v2/inventories/2" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "manufacturer": "Keysight Technologies",
    "serial_number": "MY-987654-A"
  }'

Partielle Updates

Es müssen nur die zu ändernden Felder gesendet werden. Nicht enthaltene Felder bleiben unverändert.

Inventar löschen

curl -X DELETE "https://example.com/api/v2/inventories/2" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Achtung

Das Löschen eines Inventars entfernt auch alle verknüpften Kalibrierungen und Dokumente. Diese Aktion kann nicht rückgängig gemacht werden.

Erfolgreiche Antwort (200)

{
  "message": "Inventar erfolgreich gelöscht."
}

Sortierung und Filterung

Sortierbeispiele

# Aufsteigend nach Inventarnummer
curl "https://example.com/api/v2/inventories?sort=inventory_number" \
  -H "Authorization: Bearer {token}"

# Absteigend nach Hersteller
curl "https://example.com/api/v2/inventories?sort=-manufacturer" \
  -H "Authorization: Bearer {token}"

Filterbeispiele

# Nur Fluke-Geräte
curl "https://example.com/api/v2/inventories?filter[manufacturer]=Fluke" \
  -H "Authorization: Bearer {token}"

# Geräte eines bestimmten Kunden
curl "https://example.com/api/v2/inventories?filter[customer_id]=5&sort=-inventory_number" \
  -H "Authorization: Bearer {token}"

Fehlercodes

HTTP-Status Bedeutung
401 Nicht authentifiziert — ungültiger oder fehlender Token
403 Keine Berechtigung (inventory_view, inventory_edit oder inventory_delete fehlt)
404 Inventar nicht gefunden
422 Validierungsfehler — ungültige oder fehlende Felder
429 Rate-Limit überschritten