Eviworx
Docs

Asset-Lebenszyklus & Tracking-Modi

Das Asset-Modell unterscheidet zwei Dinge: den Tracking-Modus des Asset-Typs (PERSON / LOCATION / CONSUMABLE) und den Lebenszyklus-Status des einzelnen Assets. Der Modus bestimmt den Anker (Person oder Standort) und welche Aktionen möglich sind; der Status beschreibt den aktuellen Lebenszyklus-Zustand. Bei jedem Schreibvorgang prüft der Server, dass Modus, Status und Anker zueinander passen. Diese Seite ist die konzeptionelle Grundlage; die konkreten Endpunkte stehen in der Assets API.

🧭
Leitprinzip

Der Status erlaubt oder verbietet einen Anker — aber die AKTION setzt oder leert ihn, nie der Status als Nebenwirkung. Anker-Felder (assignedToId, locationId) werden nur durch Handlungen verändert (Ausgabe, Rücknahme, Install, Deinstall, Verloren-melden, Ausmustern). Lagerbestand ist der Status AVAILABLE (verfügbar/einsatzbereit). Der physische Ort (locationId) ist unabhängig vom Status und bei jedem Status erlaubt.

Tracking-Modi (AssetType.trackingMode)

Der Modus wird am Asset-Typ festgelegt und gilt für alle Assets dieses Typs. Er bestimmt, ob es sich um Verbrauchsmaterial handelt und ob Assets an Personen oder an Standorte gebunden werden. Solange der Typ keine Assets hat, ist der Modus frei änderbar; danach antwortet die API mit HTTP 409.

Modus Anker User erlaubt? Ausgabe-Weg Besonderheit
PERSONUserCheckout / HandoverUnikat; locationId zusätzlich möglich (Lager-/Büroort)
LOCATIONStandort❌ nieInstall / Deinstallkein Handover (Standort kann nicht bestätigen)
CONSUMABLEMenge❌ nieMengen-Zuweisung (ConsumableAssignment)reduzierte Statusmenge; keine CMDB-Relations/Handover; immer standalone
Standort ≠ „installiert": Ein AVAILABLE-Asset darf einen Standort (Lagerort) haben. „Installiert" ist der Status IN_USE, nicht „hat eine locationId".

Status-Taxonomie (11 Status)

Jedes Asset hat genau einen der folgenden 11 Status.

Status Bedeutung User erlaubt? typischer Anker
ORDEREDbestellt, nicht geliefert
RECEIVEDgeliefert, noch nicht einsatzbereit
AVAILABLEverfügbar/einsatzbereit (Lager), frei zuweisbaroptional locationId
RESERVEDvorgemerkt — noch keine Ausgabe („reserviert für X" ist fachlich PENDING_ACCEPTANCE)
PENDING_ACCEPTANCEPersonen-Handover läuft, Bestätigung offen✅ (recipient)User
IN_USEin Betrieb — PERSON: beim User / LOCATION: am Standort installiertmodus-abhängigUser oder Standort
MAINTENANCEin Wartung/Reparatur — Anker kann bleibenja (behält User)evtl. User
RETURN_PENDINGRückgabe läuft, User hat es noch, wartet auf IT✅ (User)User
RETIREDaußer Betrieb (reaktivierbar)
LOSTverloren/gestohlen (Pflicht-Grund)locationId bleibt (letzter Ort)
DISPOSEDentsorgt (final)

Status-Gruppen und ihre Regeln

GruppeMitgliederZweck
Ohne BenutzerORDERED, RECEIVED, AVAILABLE, RESERVED, RETIRED, LOST, DISPOSEDkein User erlaubt
Anker erforderlichIN_USE, PENDING_ACCEPTANCE, RETURN_PENDINGmind. ein Anker (User/Standort)
Ausgabe möglich ausAVAILABLE, RESERVED, MAINTENANCEAusgangsstatus für Ausgabe/Installation
Rückgabe-ZielAVAILABLE, MAINTENANCE, RETIREDZielstatus bei Rücknahme (Checkin/confirmReturn)
Außer BetriebDISPOSED, RETIRED, LOSTkeine neuen Lizenz-/Vertrags-Verknüpfungen; die Zuweisung muss aufgehoben sein
Begründung erforderlichLOSTPflicht-Kommentar (statusNote)
VerbrauchsmaterialORDERED, RECEIVED, AVAILABLE, RETIRED, DISPOSEDerlaubte Status für CONSUMABLE-Typen
Manuell setzbar9 (alle außer PENDING_ACCEPTANCE, RETURN_PENDING)per Formular/Update/Bulk wählbar
Per Bulk setzbarORDERED, RECEIVED, AVAILABLE, RESERVED, MAINTENANCE, RETIRED, DISPOSEDper Bulk setzbar; nicht enthalten sind IN_USE (braucht ein Übergabeprotokoll) und LOST (braucht eine Begründung)
EndstatusDISPOSEDkeine weiteren Übergänge
MAINTENANCE gehört bewusst weder zu „Ohne Benutzer" noch zu „Anker erforderlich": ein PERSON-Gerät in Wartung behält seinen User, ein LOCATION-Gerät seinen Standort. PENDING_ACCEPTANCE und RETURN_PENDING entstehen nur durch Aktionen — sie stehen nicht im manuellen Status-Dropdown, sondern werden ausschließlich über Übergabe und Rückgabe erreicht. IN_USE lässt sich manuell setzen (z. B. „Wartung beenden" für ein Gerät, das seinen User behalten hat); eine neue Zuweisung läuft dabei aber nur über Ausgabe, Installation oder Übergabe (siehe Regel unten).

Anker-Regeln

Der Server prüft bei jedem Schreibvorgang (Anlegen, Ändern, Bulk sowie Ausgabe, Rücknahme, Installation, Deinstallation, Übergabe) den resultierenden Zustand. Die erste verletzte Regel wird mit HTTP 400 und dem folgenden Fehlercode gemeldet:

RegelBedingungFehlercode
Consumable ohne UserCONSUMABLE ⟹ assignedToId == nullCONSUMABLE_NO_DIRECT_ASSIGNEE
Consumable-StatusCONSUMABLE ⟹ status ∈ {ORDERED, RECEIVED, AVAILABLE, RETIRED, DISPOSED}CONSUMABLE_INVALID_STATUS
LOCATION ohne UserLOCATION ⟹ assignedToId == nullLOCATION_ASSET_CANNOT_HAVE_USER
Status ohne BenutzerStatus der Gruppe „Ohne Benutzer" ⟹ kein UserASSET_STATUS_ASSIGNED_CONFLICT
Anker-Pflichtstatus ∈ {IN_USE, PENDING_ACCEPTANCE, RETURN_PENDING} ⟹ User und/oder StandortASSET_STATUS_NEEDS_ANCHOR
PERSON striktPERSON ∧ status ∈ {IN_USE, PENDING_ACCEPTANCE, RETURN_PENDING} ⟹ User (Standort reicht nicht)PERSON_ASSET_NEEDS_USER
Notiz-Pflichtstatus = LOST ⟹ KommentarASSET_LOST_REQUIRES_NOTE
Flow-Only-Regel: Ein PATCH /api/assets/:id darf assignedToId nicht im selben Aufruf mit dem Übergang nach IN_USE ändern → ASSET_ASSIGN_VIA_FLOW_ONLY. Zuweisung läuft ausschließlich über Checkout/Handover/Install. (Ein IN_USE→IN_USE-Besitzerwechsel und status-only-Änderungen bleiben erlaubt.)

Übergangsmatrix

Unikate (PERSON/LOCATION):

VonNach
ORDEREDRECEIVED, DISPOSED
RECEIVEDAVAILABLE, MAINTENANCE, DISPOSED
AVAILABLERESERVED, PENDING_ACCEPTANCE, IN_USE, MAINTENANCE, RETIRED, LOST, DISPOSED
RESERVEDAVAILABLE, PENDING_ACCEPTANCE, IN_USE, LOST
PENDING_ACCEPTANCEIN_USE, AVAILABLE
IN_USEAVAILABLE, RETURN_PENDING, MAINTENANCE, RETIRED, LOST, DISPOSED
MAINTENANCEAVAILABLE, IN_USE, PENDING_ACCEPTANCE, RETURN_PENDING, RETIRED, LOST, DISPOSED
RETURN_PENDINGAVAILABLE, MAINTENANCE, RETIRED, IN_USE
RETIREDAVAILABLE, DISPOSED
LOSTAVAILABLE, DISPOSED
DISPOSED— (terminal)

Verbrauchsmaterial (CONSUMABLE) — reduzierte Matrix:

VonNach
ORDEREDRECEIVED, DISPOSED
RECEIVEDAVAILABLE, DISPOSED
AVAILABLERETIRED, DISPOSED
RETIREDAVAILABLE, DISPOSED
DISPOSED— (terminal)

Die drei Lebenszyklen

PERSON — Anker = User

  • Direkt-Checkout: → IN_USE + User, sofort, CHECKOUT_DIRECT-Protokoll. Externe Empfänger: User anlegen + Mail. Kein Bestätigungsschritt.
  • Handover mit Bestätigung: → PENDING_ACCEPTANCE + Recipient + Mail; Accept → IN_USE; Reject/Cancel → Revert auf Vorzustand.
  • Rücknahme: Checkin / confirmReturn → AVAILABLE | MAINTENANCE | RETIRED, User geleert.

LOCATION — Anker = Standort (kein Handover)

  • Installieren: → IN_USE + locationId (kein User), deployedAt gesetzt. Direkte IT-Aktion + Activity-Log.
  • Deinstallieren: → AVAILABLE | MAINTENANCE, locationId geleert (Historie im Log), deployedAt geleert. Option keepLocation lässt den Standort stehen.

CONSUMABLE — Menge

Der Status hängt nicht an einem Anker: i. d. R. AVAILABLE, dazu quantity und Mengen-Zuweisungen (ConsumableAssignment, an einen User ODER einen Standort). Reduzierte Statusmenge, kein Handover, keine CMDB-Relations.

Feld-Wahrheitstabelle (was jede Aktion setzt/leert)

AktionstatusassignedToIdlocationIddeployedAtProtokoll
Direkt-Checkout (PERSON)IN_USE→ User→ nowCHECKOUT_DIRECT; Mail extern
Handover erstellenPENDING_ACCEPTANCE→ recipientMail an Empfänger
Handover AcceptIN_USE(bleibt)→ nowMail an Initiator
Install (LOCATION)IN_USEnull→ Standort→ nowActivity
Checkin / confirmReturnAVAILABLE|MAINTENANCE|RETIRED→ null(bleibt)→ nullRETURN; Mail
Deinstall (LOCATION)AVAILABLE|MAINTENANCEnull→ null→ nullActivity
Wartung setzenMAINTENANCEunverändertunverändertunverändertActivity (statusNote optional)
Verloren meldenLOST→ nullbleibt (letzter Ort)→ nullActivity (statusNote Pflicht)
Retire / DisposeRETIRED / DISPOSED→ nullbleibt(retiredAt/disposedAt)Activity; blockt bei aktiven Vertrags-/Lizenz-Links

Felder (API)

AssetType

FeldTypBeschreibung
trackingModeEnum (Default PERSON)PERSON | LOCATION | CONSUMABLE. Unveränderlich, sobald der Typ Assets hat (sonst 409).
standaloneBoolean (Default true)false = Einbau-Komponente (z.B. RAM/SSD): keine eigenständige Ausgabe/Handover, folgt dem Container via Co-Move. CONSUMABLE ist immer standalone.
requiresConfirmationBoolean (Default false)Handover mit Empfänger-Bestätigung als Default für diesen Typ.
hasTypePermissionsBooleanTyp-Sperre: für Assets dieses Typs gelten nur die typbezogenen Berechtigungen (siehe Permissions).

Asset

FeldTypBeschreibung
statusNoteString? (Text)Grund/Kommentar des aktuellen Status. Pflicht bei LOST, optional bei RESERVED/MAINTENANCE; beim Status-Wechsel ersetzt/geleert. Wird im Overview-Tab angezeigt und koexistiert mit dem Handover-damageReport (getrennte Fakten).
quantityInt (Default 1)Menge — nur bei CONSUMABLE-Typ relevant.
deployedAtDateTime?Zeitpunkt der Inbetriebnahme; außerhalb aktiver Zustände geleert.

Verwandte Dokumentation

Endpunkte & Beispiele
Assets API — Checkout/Install/Handover, Relations, Impact
Inventory
Inventory API — Aktionsmodell, Missing/LOST, Auto-Account
Permissions
Permissions & RBAC — Typbezogene Berechtigungen