Eviworx
Docs

Asset Lifecycle & Tracking Modes

The asset model distinguishes two things: the tracking mode of the asset type (PERSON / LOCATION / CONSUMABLE) and the lifecycle status of the individual asset. The mode determines the anchor (person or location) and which actions are possible; the status describes the current lifecycle state. On every write the server checks that mode, status and anchor are consistent. This page is the conceptual foundation; the concrete endpoints live in the Assets API.

🧭
Core Principle

The status permits or forbids an anchor — but the ACTION sets or clears it, never the status as a side effect. Anchor fields (assignedToId, locationId) change only through actions (checkout, return, install, deinstall, report lost, retire). Stock is the status AVAILABLE (available/ready). The physical location (locationId) is independent of the status and allowed in every status.

Tracking Modes (AssetType.trackingMode)

The mode is set on the asset type and applies to all assets of that type. It determines whether the type is a consumable and whether assets are bound to people or to locations. While the type has no assets the mode can be changed freely; after that the API answers HTTP 409.

Mode Anchor User allowed? Assignment path Notes
PERSONUserCheckout / handoverUnique item; locationId possible in addition (storage/office location)
LOCATIONLocation❌ neverInstall / deinstallno handover (a location cannot confirm)
CONSUMABLEQuantity❌ neverQuantity assignment (ConsumableAssignment)reduced status set; no CMDB relations/handover; always standalone
Location ≠ "installed": An AVAILABLE asset may have a location (storage). "Installed" is the status IN_USE, not "has a locationId".

Status Taxonomy (11 statuses)

Every asset has exactly one of the following 11 statuses.

Status Meaning User allowed? Typical anchor
ORDEREDordered, not delivered
RECEIVEDreceived, not yet ready
AVAILABLEavailable/ready (stock), freely assignableoptional locationId
RESERVEDreserved — not yet handed out ("reserved for X" is really PENDING_ACCEPTANCE)
PENDING_ACCEPTANCEperson handover running, confirmation pending✅ (recipient)User
IN_USEin use — PERSON: with the user / LOCATION: installed at the locationmode-dependentUser or location
MAINTENANCEin maintenance/repair — anchor may remainyes (keeps user)possibly user
RETURN_PENDINGreturn running, user still holds it, awaiting IT✅ (User)User
RETIREDretired (reactivatable)
LOSTlost/stolen (mandatory reason)locationId remains (last location)
DISPOSEDdisposed (final)

Status Groups and Their Rules

GroupMembersPurpose
No userORDERED, RECEIVED, AVAILABLE, RESERVED, RETIRED, LOST, DISPOSEDno user allowed
Anchor requiredIN_USE, PENDING_ACCEPTANCE, RETURN_PENDINGat least one anchor (user/location)
Checkout fromAVAILABLE, RESERVED, MAINTENANCEstarting status for checkout/install
Return targetAVAILABLE, MAINTENANCE, RETIREDtarget status on return (checkin/confirmReturn)
Out of serviceDISPOSED, RETIRED, LOSTno new license/contract links; the assignment must be removed
Reason requiredLOSTmandatory comment (statusNote)
ConsumableORDERED, RECEIVED, AVAILABLE, RETIRED, DISPOSEDallowed statuses for CONSUMABLE types
Manually settable9 (all except PENDING_ACCEPTANCE, RETURN_PENDING)settable via form/update/bulk
Bulk settableORDERED, RECEIVED, AVAILABLE, RESERVED, MAINTENANCE, RETIRED, DISPOSEDsettable via bulk; excluded are IN_USE (requires a handover record) and LOST (requires a reason)
TerminalDISPOSEDno further transitions
MAINTENANCE intentionally belongs neither to "No user" nor to "Anchor required": a PERSON device in maintenance keeps its user, a LOCATION device its location. PENDING_ACCEPTANCE and RETURN_PENDING result only from actions — they are not in the manual status dropdown and are reached only via handover and return. IN_USE can be set manually (e.g. "end maintenance" for a device that kept its user); a new assignment, however, runs only via checkout, install or handover (see the rule below).

Anchor Rules

On every write (create, update, bulk plus checkout, checkin, install, deinstall, handover) the server validates the resulting state. The first rule violated is reported with HTTP 400 and the following error code:

RuleConditionError code
Consumable without userCONSUMABLE ⟹ assignedToId == nullCONSUMABLE_NO_DIRECT_ASSIGNEE
Consumable statusCONSUMABLE ⟹ status ∈ {ORDERED, RECEIVED, AVAILABLE, RETIRED, DISPOSED}CONSUMABLE_INVALID_STATUS
LOCATION without userLOCATION ⟹ assignedToId == nullLOCATION_ASSET_CANNOT_HAVE_USER
Status without userstatus in group "No user" ⟹ no userASSET_STATUS_ASSIGNED_CONFLICT
Anchor requiredstatus ∈ {IN_USE, PENDING_ACCEPTANCE, RETURN_PENDING} ⟹ user and/or locationASSET_STATUS_NEEDS_ANCHOR
PERSON strictPERSON ∧ status ∈ {IN_USE, PENDING_ACCEPTANCE, RETURN_PENDING} ⟹ user (location is not enough)PERSON_ASSET_NEEDS_USER
Note requiredstatus = LOST ⟹ commentASSET_LOST_REQUIRES_NOTE
Flow-only rule: A PATCH /api/assets/:id must not change assignedToId in the same call as a transition to IN_USE → ASSET_ASSIGN_VIA_FLOW_ONLY. Assignment runs exclusively via checkout/handover/install. (An IN_USE→IN_USE owner change and status-only changes remain allowed.)

Transition Matrix

Unique items (PERSON/LOCATION):

FromTo
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)

Consumables (CONSUMABLE) — reduced matrix:

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

The Three Lifecycles

PERSON — anchor = user

  • Direct checkout: → IN_USE + user, immediate, CHECKOUT_DIRECT record. External recipients: create user + email. No confirmation step.
  • Handover with confirmation: → PENDING_ACCEPTANCE + recipient + email; accept → IN_USE; reject/cancel → revert to previous state.
  • Return: Checkin / confirmReturn → AVAILABLE | MAINTENANCE | RETIRED, user cleared.

LOCATION — anchor = location (no handover)

  • Install: → IN_USE + locationId (no user), deployedAt set. Direct IT action + activity log.
  • Deinstall: → AVAILABLE | MAINTENANCE, locationId cleared (history in log), deployedAt cleared. Option keepLocation keeps the location.

CONSUMABLE — quantity

The status is not tied to an anchor: usually AVAILABLE, plus quantity and quantity assignments (ConsumableAssignment, to a user OR a location). Reduced status set, no handover, no CMDB relations.

Field Truth Table (what each action sets/clears)

ActionstatusassignedToIdlocationIddeployedAtRecord
Direct checkout (PERSON)IN_USE→ User→ nowCHECKOUT_DIRECT; email if external
Create handoverPENDING_ACCEPTANCE→ recipientemail to recipient
Handover acceptIN_USE(stays)→ nowemail to initiator
Install (LOCATION)IN_USEnull→ location→ nowActivity
Checkin / confirmReturnAVAILABLE|MAINTENANCE|RETIRED→ null(stays)→ nullRETURN; email
Deinstall (LOCATION)AVAILABLE|MAINTENANCEnull→ null→ nullActivity
Set maintenanceMAINTENANCEunchangedunchangedunchangedActivity (statusNote optional)
Report lostLOST→ nullstays (last location)→ nullActivity (statusNote mandatory)
Retire / DisposeRETIRED / DISPOSED→ nullstays(retiredAt/disposedAt)activity; blocked while active contract/license links exist

Fields (API)

AssetType

FieldTypDescription
trackingModeenum (default PERSON)PERSON | LOCATION | CONSUMABLE. Immutable once the type has assets (otherwise 409).
standaloneboolean (default true)false = built-in component (e.g. RAM/SSD): no standalone checkout/handover, follows its container via co-move. CONSUMABLE is always standalone.
requiresConfirmationboolean (default false)Handover with recipient confirmation as the default for this type.
hasTypePermissionsBooleanType lock: for assets of this type only the type-specific permissions apply (see permissions).

Asset

FieldTypDescription
statusNoteString? (Text)Reason/comment for the current status. Mandatory on LOST, optional on RESERVED/MAINTENANCE; replaced/cleared on status change. Shown in the overview tab and coexists with the handover damageReport (separate facts).
quantityInt (Default 1)Quantity — relevant only for CONSUMABLE types.
deployedAtDateTime?Timestamp of deployment; cleared outside active states.

Related Documentation

Endpoints & examples
Assets API — checkout/install/handover, relations, impact
Inventory
Inventory API — action model, missing/lost, auto-account
Permissions
Permissions & RBAC — type-specific permissions