Assets Reference Public

Adding & Editing Assets

Daily Operations Adding & Editing Assets Every asset record in Safekeep is created and maintained through one modal form — opened as Add entry, Edit, or Clone. This page walks the…

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

Adding & Editing Assets

Every asset record in Safekeep is created and maintained through one modal form — opened as Add entry, Edit, or Clone. This page walks the form top to bottom: every field in on-screen order, how picking an Asset Model auto-fills defaults, how the Category swaps the Additional fields section in and out, what the Duplicate count does in Clone mode, and exactly what gets logged when you save an edit.

ℹ️
Where it lives. The form posts to ams/assets/save and opens from the Asset Registry (Browse tab) via the "Add entry" toolbar button or the row-action menu ("Edit" / "Clone"), and from the asset detail page via Actions → "Edit". The footer has a single "Save" button; the × to close is in the modal header.

One modal, three modes

Add entry

Creates a new asset. Opened by the "Add entry" button on the Browse tab. Needs the asset_create permission.

Edit

Opens the same form pre-filled. Changes to key fields are written into the asset's change log on save. Needs asset_update.

Clone

Admin only. Opens the form pre-filled from an existing asset and adds a "Duplicate" count field — save creates that many brand-new copies.

IT Admin Asset custodian Anyone with asset_create / asset_update

Field reference (on-screen order)

Only two fields are hard-required: Title and Category (both enforced client-side and server-side; a missing required field shows "This field is required."). Everything else is optional — but the more you fill in, the more the reports, exports, and reminder widgets can do for you. All dropdowns are searchable Select2 controls with a "-" blank first option unless noted.

#Field labelRequiredWhat it is & notes
0Duplicate Clone mode only. A number input (minimum 1, default 1): how many copies to create. See Clone mode below.
1TitleRequired The asset's display name — the link text everywhere in the registry. Text input, autofocused.
2DescriptionOptional Rich-text editor. On every save the description is also stored as a pinned, non-deletable first comment on the asset's detail page — that comment is the only place the detail page shows it. It also appears as the hover popover on the registry's Title column (first 280 characters) and in the XLSX export's "Notes" column.
3Asset TagOptional Your inventory tag (e.g. AST-000123). Free text — the form does not auto-generate tags and does not check uniqueness (see the warning below). The tag is the dedupe key for imports and is what the QR/barcode on printed labels encodes.
4Asset ModelOptional Dropdown of the Asset Model catalog, shown as "Name (ModelNumber)". Picking one auto-fills defaults — see Model defaults. The model also records the depreciation profile and EOL months — neither has a field on this form (see the caveat under Model defaults).
5StatusOptional Dropdown of Status Labels (e.g. Ready to Deploy, In Repair). Statuses never change on their own — you set them here or during check-in. The only lifecycle gate: a non-Deployable status blocks checkout.
6Issued toOptional Dropdown of active staff users (first option "- Select Users -"). Setting it here assigns the asset without going through the endorsement lifecycle — see the warning below. Prefer Check out asset.
7CategoryRequired Dropdown of categories with full breadcrumbed names (Hardware > Computers > Laptops). Changing it instantly re-renders the Additional fields section below it with that category's custom fields.
8Additional fields (section)Per field The selected category's custom fields, rendered dynamically — see Additional fields below. Required fields carry a trailing * on their label.
9VendorOptional Dropdown of suppliers from the shared Vendors catalog (managed at ams/vendors, outside this module). Shown as a contact link in the registry.
10TypeOptional Ownership type — fixed list: "Own", "Lease", "Rental", "Contract", "Service".
11BrandOptional Manufacturer, from the shared Brands catalog (only brands flagged for assets appear). Auto-filled from the Asset Model if left blank.
12ModelOptional Legacy free-text model name — distinct from the Asset Model catalog pick in row 4. This is the text shown in the registry's "Model" column.
13Serial no.Optional Free text. Not checked for uniqueness (see warning below).
14CostOptional Purchase cost. Enter a plain number (e.g. 74999.00 for a ₱74,999 laptop) — the registry formats it as a decimal, and the depreciation schedule uses it as the starting book value.
15Purchase dateOptional Pop-up date picker. Also the anchor date the monthly depreciation computation and date-based warranty imports work from.
16Warranty expiry dateOptional Date picker. Drives the "Warranty expiring" reminder in the "Assets needing attention" widget and the daily warranty-expiry reminder.
17Order NumberOptional Free text — the PO / order reference. Visible only in this form and the XLSX export.
18Warranty (months)Optional Number input, minimum 0. The warranty length; kept alongside the expiry date (the form does not compute one from the other — imports can).
19ConditionOptional Free text (e.g. Good — minor scratches). Also updatable during check-in and audits, which overwrite whatever is here.
20Issued atOptional Date picker. Manually editable, but a real checkout overwrites it with the checkout date.
21Due / return byOptional Date picker. When set and the asset is still out, it drives the "Return due" reminder.
22Last AuditOptional Date picker. Normally maintained for you by the Record audit action.
23Next AuditOptional Date picker. Feeds the Audit due report and the audit-due reminder; also auto-set by the audit action (today + cadence days).
24LocationOptional Dropdown of locations with breadcrumbed names (HQ > 3F > Server Room).
25PhotoOptional Drag-and-drop upload zone. The file is uploaded to a temporary area immediately and moved to the asset's permanent file path when you save; only the first uploaded file is kept as the photo. When editing, the currently stored filename is shown under the dropzone with a paperclip icon. See the photo callout below for where it does (and does not) appear.
26LabelsOptional Multi-select tag field with suggestions from saved asset-entry labels. Visible and saved only if you hold asset_manage_labels — users without it never see this row, and their saves leave existing labels untouched.
⚠️
No uniqueness checks on Asset Tag or Serial no. The form happily saves two assets with the same tag or serial. That matters because the Asset Tag is the sole dedupe key for imports (a re-import matches by tag) and is what printed QR/barcode labels encode — duplicate tags make scans and imports ambiguous. Agree on a tag scheme (e.g. AST-000123) and keep it unique yourself. Also note: only the importer auto-generates tags for blank rows (AST- + zero-padded ID); this form never does.
⚠️
"Issued to" here bypasses the endorsement lifecycle. Assigning a user via this field skips the deployability check, does not set the endorsement status, writes no event to the Activity timeline, and logs only a change-log comment ("Issued to updated…"). For a proper chain of custody — AssignedAcknowledgedReturned — always use Check out asset instead.
ℹ️
Dates & the photo. All six date fields use the pop-up date picker — pick from the calendar rather than typing, so the value matches your workspace date format (the registry shows empty or legacy 0000-00-00 dates as -). The Photo is stored, but the asset detail page does not display it — the only places you'll see it are this Edit modal (filename) and the XLSX export's "Image" column. The same applies to Cost, Purchase date, warranty fields, Order Number, Condition, and custom-field values: they live in the Edit modal and the export, not on the detail page.

Model defaults — what picking an Asset Model fills in

The Asset Model catalog is the "product template" layer. When you pick a model in the form:

  1. Category and Brand default in — but never overwrite

    The form immediately fetches the model's defaults and fills Category and Brand only if those fields are still blank. Anything you already selected is left alone. The server repeats the same blank-only defaulting on save, so the rule holds even if JavaScript missed it.

  2. The category swap pulls in the model's custom fields

    If the model's category was applied, the Additional fields section re-renders with that category's field schema — you may suddenly see new inputs appear mid-form. That's expected.

  3. Depreciation and EOL stay on the model

    There is no depreciation or EOL field on the asset form — a model records its Depreciation profile and EOL (months) in the catalog. Note, however, that the monthly depreciation job and the Depreciation schedule report read a per-asset depreciation link that no screen currently sets (it can only be set directly in the database) — so picking a model does not, by itself, put the asset on the depreciation schedule.

????
Model vs. "Model". Row 4 (Asset Model, dropdown) is the structured catalog link that powers defaults, depreciation, and export round-tripping. Row 12 (Model, free text) is a legacy plain-text label shown in the registry's "Model" column. Fill the dropdown for anything you want reporting on; use the free-text field only for one-off descriptions.

The "Additional fields" section (custom fields)

Below the Category row, the form renders the section heading "Additional fields" whenever the selected category has a bound fieldset. Change the category and the whole block is torn down and rebuilt from the new category's compiled field schema — values already saved on the asset are re-filled where the field keys match. If the new category has no custom fields, the section disappears entirely.

How each field type renders

Field typeRenders asSaved value
Dropdown (select) — also Checkbox and Radio masters Searchable Select2 dropdown of the field's configured options, with a "-" blank first option The chosen option text
Yes / No (boolean)A single checkbox1 checked / 0 unchecked
NumberNumber inputThe number (validated — see below)
DateText input with the pop-up date pickerThe picked date
Text, Textarea, and everything elseSingle-line text inputThe text as typed

Fields marked required in the fieldset show a trailing * after their label. All values are stored together in the asset's meta JSON, keyed by each field's stable field key. While the form is open, swapping categories back and forth re-fills matching fields from the saved values — but once you save under a different category, only that category's fields are kept and the other saved values are discarded.

Validation messages (exact)

On save, the server validates the custom fields against the category schema and rejects the whole save with one of these messages (%s = the field's label):
  • "%s is required." — a required additional field was left empty (e.g. "RAM Size is required.").
  • "%s must be a number." — a Number-type field got a non-numeric value.
Nothing is saved until every additional field passes.

Clone mode & the Duplicate count

????
Purpose: register a batch of identical units (e.g. 15 identical monitors) in one pass.
Who: Administrators only — the "Clone" row action does not appear for non-admins, regardless of other asset permissions.
Preconditions: an existing asset to copy from.
  1. Open the Clone form

    On the Browse tab, open the row's hamburger menu and choose "Clone". The usual form opens pre-filled from the source asset, with one extra field at the very top: "Duplicate" (number, minimum 1, default 1).

  2. Adjust the copy and set the count

    Edit any fields you want the copies to carry (a shared title, model, location…), then set Duplicate to the number of copies you need.

  3. Save — N brand-new assets are created

    Save loops that many times, creating N fresh rows, then reloads the whole table with the toast "The record has been saved." Cloned rows are ordinary new creations: no change log, no lifecycle events, and each is stamped with you as creator.

⚠️
Clone copies field values only. Every copy gets the same Asset Tag and Serial no. you left in the form — blank them before saving and tag each unit individually afterwards, or you'll mint N duplicates of one tag. Also, in Clone mode a photo dropped into the uploader is not attached to the copies, and the description is copied as a field but the pinned description comment is not created — open each copy and re-save if you need those.

What happens when you save

  • Validation first: Title and Category must be present (Category must be a real pick); the Additional fields are validated as above. Permission is re-checked server-side — asset_create for new, asset_update for edits.
  • Success toast: "The record has been saved." If you opened the form from the asset detail page, the page reloads after about a second; from the registry, the table row is added or updated in place (Clone reloads the whole table).
  • Photo persisted: any temp-uploaded image is moved to the asset's permanent file path and its filename stored on the record.
  • Description pinned: the Description is stored as a static, non-deletable comment on the asset — on every save, so repeated edits accumulate pinned description entries in the comment stream.

The edit change log

When you save an edit, the controller compares old vs. new values and writes one change-log line per changed field. These appear as static comments in the asset's comment stream on the detail page (they are not Activity-timeline events, and they cannot be deleted). The messages read, with the value in bold:

Field changedLog line (first set / subsequent change)
Title"Title changed to X"
Issued to"Issued to updated to X" / "Issued to updated from A to B"
Vendor"Vendor updated to X" / "Vendor updated from A to B"
Type"Type updated to x" / "Type updated from a to b"
Brand"Brand updated to X" / "Brand updated from A to B"
Model (free text)"Model updated to X" / "Model updated from A to B"
Serial no."Serial no. updated to X" / "Serial no. updated from A to B"
Cost"Cost updated to X" / "Cost updated from A to B"
Purchase date"Purchase date updated to X" / "…updated from A to B"
Warranty expiry date"Warranty expiry date updated to X" / "…updated from A to B"
Location"Location updated to X" / "Location updated from A to B"
Labels"Labels updated to " + the new label chips; plus "Old Labels: " + the previous chips
Category"Category changed to X"
ℹ️
Not everything is change-logged. Edits to Asset Tag, Status, Asset Model, Order Number, Warranty (months), Condition, Issued at, Due / return by, Last Audit, Next Audit, the photo, the description, and the custom-field values are saved but produce no change-log line. If an audit trail on those matters to you (e.g. status history), record the change in a comment yourself. The change-log message text is also fixed English regardless of your language setting.
????️
Roadmap. A "Requestable" checkbox exists on Asset Models, and assets themselves carry a hidden Requestable flag that round-trips through import/export (the "Requestable" column, Yes/No) — but there is no request-an-asset workflow and no such field on this form yet. Likewise "Report an issue" exists only as wording, not a working action.

Deleting an asset

From the registry row menu, "Delete" (needs asset_delete) asks for confirmation and then soft-deletes the record — it disappears from all lists, tabs, exports, and reports, with the toast "The record has been deleted." There is no in-app restore screen, so treat delete as final; prefer setting an Archived status label for retired-but-remembered equipment.

Related pages

Was this guide helpful?

Report a content problem