Assets Reference Public

Checkout & Check-in

Daily Operations Checkout & Check-in The endorsement lifecycle is the heart of Safekeep: an asset is checked out (endorsed) to a staff member, the assignee confirms receipt —…

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 12 min 1 views
Daily Operations

Checkout & Check-in

The endorsement lifecycle is the heart of Safekeep: an asset is checked out (endorsed) to a staff member, the assignee confirms receipt — signing an acceptance agreement when the category requires one — can later request its return, and IT finally checks it back in. Every step stamps the asset record and appends one immutable event to the asset's chain-of-custody Activity log.

ℹ️
Where these actions live. All four lifecycle actions are launched from the "Actions" dropdown on the asset detail page (ams/assets/view/…) — there is no bulk checkout from the registry table. In Safekeep's vocabulary an asset is endorsed to a user; "checkout" and "endorsement" mean the same thing, and the checkout modal labels the assignee field "Endorsed to".

The endorsement pipeline

The lifecycle state is stored per asset as its endorsement status and shown as a chip next to "Endorsed to" in the detail page's lifecycle summary panel. It moves strictly through four states:

Assigned
checked out to a staff user
Acknowledged
assignee confirmed receipt
Return requested
assignee asked to give it back
Returned
checked in; assignment cleared

Two stages are optional shortcuts: an asset can be checked in straight from Assigned (the assignee never acknowledged), and Return requested can be skipped entirely when IT initiates the check-in. Once Returned, the asset is free to be checked out again — a fresh checkout restarts the pipeline at Assigned.

Assigned
Checked outEndorsed to a user; receipt not yet confirmed.
Acknowledged
Receipt confirmedThe assignee accepted custody (and the terms, if required).
Return requested
Hand-back pendingThe assignee still holds the asset until it is checked in.
Returned
Back in stockAssignment cleared; ready for the next endorsement.
4
Lifecycle states
4
Lifecycle actions
1
Permission (asset_checkout)
1
Event logged per action

1 · Check out (endorse) an asset

????
Purpose: hand an asset to a staff member and start the chain of custody.
Who: anyone with the asset_checkout permission ("Assets: Checkout / Endorse").
Preconditions: the asset is not currently checked out, and its status label is Deployable type (or the asset has no status label at all — see the guard below).
  1. Open the asset

    From the registry (ams/assets, Browse tab), click the asset's title to open its detail page.

  2. Actions → "Check out asset"

    Open the "Actions" dropdown and choose "Check out asset". The item only appears while the asset is not checked out.

  3. Fill the checkout modal

    Pick the assignee in "Endorsed to" (required), optionally set a "Due / return by" date and a note.

  4. Click "Check out"

    On success you get the toast "Asset checked out." and the page reloads showing the Assigned chip and the new "Endorsed" Activity entry.

Checkout modal fields

Field labelRequiredNotes
"Asset"Read-only: the asset title, plus #ASSET_TAG when a tag is set.
"Endorsed to"YesSelect2 dropdown of active staff users only. You cannot check out to a location, a department, or another asset — user targets are the only kind implemented.
"Due / return by"NoDatepicker. Drives the "Return due" reason in the "Assets needing attention" widget and the return-due reminder.
"Note (optional)"NoTextarea; stored as the body of the logged event and visible in the Activity timeline.
ℹ️
No status field in this modal. Checkout never changes the asset's status label — an asset checked out while "Ready to Deploy" stays "Ready to Deploy" unless someone edits it. If your process uses the seeded Deployed label, set it manually via Edit, or set the status back at check-in with "Set status to".

Guards — when checkout is refused

⚠️
Already out: if the asset is currently checked out (endorsed to someone and not yet returned), the server rejects the request with "This asset is already checked out."
⚠️
Status not deployable: if the asset's status label is not a Deployable-type label, checkout is blocked with "This asset's status is not deployable, so it cannot be checked out." With the seeded labels that means Pending, In Repair, Broken, Lost / Stolen and Archived block checkout, while Ready to Deploy and Deployed allow it — see Status Labels. An asset with no status label at all is checked out without any status check.

What checkout records

On the asset
Assignee set ("Issued to"), assignment type user, "Issued at" stamped with today's date (UTC), "Due / return by" saved, endorsement status set to Assigned, the acting user recorded as the endorser, and any previous return date / acknowledgement flags cleared.
In the Activity log
One "Endorsed" event titled "Checked out to [assignee]", with your note as its body and the assignee as the event's target user.
Toast
"Asset checked out." — then the page reloads.
⚠️
Don't reassign through the Edit form. The Add/Edit modal also has an "Issued to" dropdown. Changing it there bypasses the lifecycle: no deployability check, no endorsement status, no acknowledgement request, and no event in the Activity chain of custody (only a comment-style change note). The same applies to checkout-on-import (see Import, Export & Labels): imported assignments set the assignee and the Assigned chip but log no "Endorsed" event. Use the Check out asset action whenever custody matters.

2 · Confirm receipt (acknowledge)

????
Purpose: the assignee formally accepts custody of the asset — and, when the category requires it, accepts the acceptance agreement with a typed signature.
Who: the current assignee, or an admin. There is no permission key for this action — it is gated purely by identity.
Preconditions: the asset is checked out and not yet acknowledged.

When the assignee opens their endorsed asset, the "Actions" dropdown offers "Confirm receipt" (it appears while the asset is checked out and receipt is not yet confirmed). The server also accepts the confirmation from an admin on the assignee's behalf — but the dropdown item itself is shown only to the assignee, so there is no button for admins. If the asset is not assigned at all, the server refuses with "This asset is not currently assigned."

The acceptance agreement (EULA) panel

What the modal shows depends on the asset's category:

  • Category does not require acceptance (the default for every category, including all six seeded ones): the modal simply shows "Asset: [title]" and the muted prompt "Confirm receipt". One click on the "Confirm receipt" button completes it.
  • Category requires acceptance: the modal adds a required signature field labeled "Type your full name to sign". If the category also has agreement text, a scrollable "Acceptance agreement" box shows the full terms above a required checkbox "I have read and accept the terms above."
⚠️
No admin UI for the acceptance flags — database only. The category form has no fields for "require acceptance" or the agreement text. Today the flags behind this panel (require_acceptance and eula_text on the asset-categories table) can only be set directly in the database by a technical administrator. Until that UI ships, most installs will only ever see the plain one-click "Confirm receipt" modal. See Categories and FAQ & Troubleshooting.

Validation messages

⚠️
When acceptance is required, both requirements are enforced server-side too: leaving the checkbox unticked returns "Please tick the box to accept the terms.", and an empty signature returns "Please type your full name to accept the agreement."

What confirming receipt records

On the asset
Acknowledged flag set, acknowledgement timestamp stamped (UTC), endorsement status moves to Acknowledged. The assignee and due date are untouched.
In the Activity log
One "Acknowledged" event titled "Receipt confirmed." — with body "Signed: [typed name]" when a signature was captured. The event row additionally stores accepted_at (the acceptance timestamp) and, when acceptance was required, a frozen snapshot of the agreement text as accepted (stored_eula) plus the typed signature (signature_file). Because the snapshot is stored on the event, later edits to the category's agreement never rewrite what this user actually accepted.
Toast
"Receipt confirmed." — then the page reloads.

3 · Request return

????
Purpose: the assignee signals they want to hand the asset back — a flag for IT, not a check-in.
Who: the current assignee, or an admin. No permission key.
Preconditions: the asset is checked out and a return has not already been requested.

The "Actions" dropdown offers "Request return" to the assignee while the asset is checked out and no request is pending. The modal shows "Asset: [title]" and an optional "Note (optional)" textarea; the footer button is "Request return".

  • If the asset is not checked out, the server answers "This asset is not currently assigned."
  • If a return was already requested, the request is rejected with the message "Return requested".
On the asset
Only the endorsement status changes — to Return requested. The assignee keeps the asset: the assignment, issued date, and due date all stay in place until someone checks it in.
In the Activity log
One "Return requested" event titled "Return requested", with your note as its body and the assignee as the target.
Toast
"Return requested" — then the page reloads.
ℹ️
No notification is sent by this action itself. IT teams should watch the Return requested chip on the asset (or agree on an out-of-band ping) — the request only flips the state and logs the event.

4 · Check in an asset

????
Purpose: take the asset back into stock — record its condition, optionally reset its status, and clear the assignment.
Who: anyone with asset_checkout (the same permission as checkout). It does not matter who requested the return — any permitted user can check in.
Preconditions: the asset is currently assigned.
  1. Actions → "Check in asset"

    On the asset detail page, open "Actions" and choose "Check in asset" — the item appears while the asset is checked out. If the asset has no assignee the server refuses with "This asset is not currently assigned."

  2. Record the hand-back

    Note the physical "Condition", choose a status in "Set status to" if the asset should move (e.g. back to "Ready to Deploy", or to "In Repair" if it came back damaged), and add a note.

  3. Click "Check in"

    Toast "Asset checked in."; the page reloads with the assignment cleared and a "Returned" Activity entry.

Check-in modal fields

Field labelRequiredNotes
"Endorsed to"Read-only: the current assignee being checked in from.
"Condition"NoFree text (no fixed vocabulary). If filled, it overwrites the asset's stored condition.
"Set status to"NoStatus-label dropdown. Optional manual status move recorded together with the check-in — the only place besides the Edit form where you can change status during the lifecycle.
"Note (optional)"NoStored as the body of the logged event.

What check-in records and clears

Stamped
Return date set to today, endorsement status set to Returned; the asset's condition and status label are updated if you filled those fields.
Cleared
The assignee ("Issued to"), issued date, due date, assignment type, the endorser, and both acknowledgement markers (flag + timestamp) are all wiped — the asset is fully back in stock and ready for the next checkout.
In the Activity log
One "Returned" event titled "Checked in from [previous assignee]", with your note as its body and the previous assignee as the target.
Toast
"Asset checked in." — then the page reloads.

Who can do what, in each state

"Checked out" means the asset has an assignee and its endorsement status is anything other than Returned. The "Actions" dropdown on the detail page shows exactly the actions valid for the current state and viewer:

Endorsement stateAvailable lifecycle actionsWho can act
— / Returned (not checked out) "Check out asset" Holder of asset_checkout (status must be Deployable or empty)
Assigned "Confirm receipt" · "Request return" · "Check in asset" Confirm receipt / Request return: assignee (or admin) · Check in: asset_checkout
Acknowledged "Request return" · "Check in asset" Request return: assignee (or admin) · Check in: asset_checkout
Return requested "Check in asset" (and "Confirm receipt" if receipt was never confirmed) Check in: asset_checkout · Confirm receipt: assignee (or admin)

"Audit asset" (asset_audit) and "Edit" (asset_update) are available in every state — see Auditing Assets. For "Confirm receipt" and "Request return", the dropdown item is shown only to the assignee; an admin is authorized server-side but gets no menu entry. The full permission matrix is in Permissions & Roles.

There is no status-driven automation. Changing an asset's status label — even to Archived, Broken or Lost / Stolennever auto-checks the asset in, never clears the assignee, and never triggers any lifecycle transition. Likewise, checking out never sets a "Deployed" status. The only status-based rule in the whole module is the checkout gate: an asset whose status is not Deployable-type cannot be checked out. If you archive or write off an asset that is still endorsed to someone, check it in first, then set the status.

Events written per action

Every lifecycle action appends exactly one event to the asset's Activity timeline (the chain of custody, newest first — see Asset Detail & Activity). Each event carries the acting user and the UTC time it occurred; all kinds render with the same blue chip in the timeline.

ActionEvent kindEvent titleBody / extras
Check out Endorsed "Checked out to [assignee]" Your note; target = the assignee.
Confirm receipt Acknowledged "Receipt confirmed." "Signed: [name]" when a signature was typed; plus the acceptance timestamp and — when the category required acceptance — the frozen agreement snapshot and the typed signature.
Request return Return requested "Return requested" Your note; target = the assignee.
Check in Returned "Checked in from [previous assignee]" Your note; target = the previous assignee.
ℹ️
Naming quirk. Checkout and check-in log events labeled "Endorsed" and "Returned" — not "Checkout"/"Check-in". Chips named "Checkout", "Check-in", "Note" and "Issue" exist in the vocabulary but are never written by these actions (reserved for future use). The other two live kinds, "Audit" and "Maintenance", come from audits and maintenance records. The whole timeline is also queryable across assets in the Activity log report — see Asset Reports.

Quick reference

Was this guide helpful?

Report a content problem