Maintenance
Record every repair, upgrade, calibration, and support engagement against an asset —
what was done, by which vendor, when it started and finished, and what it cost. The
Safekeep → Maintenance screen (ams/maintenances) is the module's service
logbook and feeds both the asset's Activity timeline and the
Maintenance log report.
Where it lives & who can use it
Maintenance sits in the Safekeep sidebar group (wrench icon), between
Custom Fields and Asset Reports. Opening it requires the Assets module to be enabled and the base
asset permission ("Assets: Entries") — but seeing the list and changing it are gated
separately:
| Action | Permission key | Roles-editor label |
|---|---|---|
| View the Maintenance list (and the Maintenance log report) | asset | Assets: Entries |
| Add, edit, or delete a maintenance record | asset_maintenance | Assets: Maintenance |
Without asset_maintenance, the "Add Maintenance" button and the per-row edit/delete
icons are hidden — the screen becomes read-only. See Permissions &
Roles for the full RBAC table.
asset view permit; the module now requires the dedicated
asset_maintenance permission for all write actions. If a teammate suddenly lost the
"Add Maintenance" button after an upgrade, grant them Assets: Maintenance in the Roles
editor.
The Maintenance list
The page is a single panel titled "Maintenance" with one button in the title bar —
"Add Maintenance" (shown only with the asset_maintenance permission). The
table sorts by Start date, newest first, has a refresh button, and offers an Excel export
of all eight data columns. There are no filter controls on this screen — no date range,
asset, or type filter.
| Column | What it shows |
|---|---|
| Asset | The linked asset's title. Plain text here — not a link to the asset page. |
| Title | Your name for the job, e.g. "Replace SSD", "Annual aircon service". |
| Maintenance Type | The stored type shown Title-Cased (e.g. "Hardware Support"); blank if none was picked. |
| Vendor | The supplier's name (from the shared Vendors master). |
| Start date | Formatted date, or "-" if empty. |
| Completion date | Formatted date, or "-" if empty. Empty = the job is still open. |
| Cost | Plain number with decimals (no currency symbol), or "-" if empty. Enter it in your books' currency, e.g. ₱ for Philippine ledgers. |
| Warranty work | "Yes" / "No" — whether the work was covered by warranty (i.e. at no cost to you). |
| Options (☰) | Edit pencil ("Edit") and delete × ("Delete", with a confirmation prompt). Both appear only with asset_maintenance. |
Deleting a record is a soft delete — on success you get "The record has been deleted." (failure: "Record cannot be deleted!"). Saving shows "The record has been saved." and updates the row in place without a page reload.
The Add / Edit Maintenance modal
"Add Maintenance" (or the row's edit pencil) opens a standard modal form with a single "Save" footer button. Fields, top to bottom:
| Field | Input | Required | Notes |
|---|---|---|---|
| Asset | Select2 dropdown of all assets by title (first option "-") | Required | Client-side message: "This field is required."; also enforced server-side. Any asset can be picked — the list is not limited by status or assignment. |
| Title | Text | Required | What the job is, in a few words. |
| Maintenance Type | Select2 | Optional | One of the six types below, or "-" for none. |
| Vendor | Select2 of vendors (first option "-") | Optional | Drawn from the shared Vendors master (also reachable at ams/vendors); the outside shop or service provider doing the work. |
| Start date | Date picker | Optional | When the work began (or the asset was handed over). Also used as the date of the Activity event — see below. |
| Completion date | Date picker | Optional | Fill in when the work is done — this is the only "completed" marker there is. |
| Cost | Text | Optional | Stored to 2 decimals. There is no numeric validation on the input — whatever you type is passed straight to the database, so enter a plain number (no currency symbol or thousands separators). |
| URL | Text | Optional | E.g. a link to the vendor's ticket or invoice. Quirk: it is saved but currently displayed nowhere — not in the list, not in the reports. Keep the reference in Notes too if you need to see it later. |
| Warranty work | Checkbox | Optional | Defaults unchecked. Tick when the repair is covered by the manufacturer's/vendor's warranty; it drives the list's Yes/No column. |
| Notes | Textarea | Optional | Not shown in the list, but it becomes the body of the Activity timeline event on the asset — a good place for diagnosis and resolution details. |
The six maintenance types
The Maintenance Type dropdown offers exactly these options:
The type is free of side effects — it is a reporting label only. The app ships just the six labels and shows the type as plain text; the badge colors and one-line descriptions above are this guide's suggested convention for choosing between them.
What a maintenance record writes to the asset's Activity
When you create a maintenance record, the module also writes a
Maintenance event into the asset's chain-of-custody log
(asset_events):
- Event type
- "Maintenance" (as shown in the Activity timeline and the Activity log report)
- Event title
- The maintenance record's Title
- Event body
- The maintenance record's Notes
- Event date
- The Start date (or the moment of creation, if no start date was set)
Where maintenance history is visible (and where it isn't)
The Maintenance list is the full editable history across all assets — the only place to edit or delete records.
An asset's detail page shows no per-asset maintenance list — only the single "Maintenance" event per record in its Activity timeline.
The Maintenance log report, in brief
Under Safekeep → Asset Reports, the first tab is "Maintenance log"
(ams/reports/maintenance_log — it is also where the Asset Reports menu item lands).
It answers: "What maintenance/repair work has been done, on what, by which vendor, and what did
it cost?" Columns are identical to this screen minus the options column — Asset, Title,
Maintenance Type, Vendor, Start date, Completion date, Cost, Warranty work — sorted by Start date
descending, with Excel export and no filters. Anyone with the base asset
permission can view it. Full details on Asset Reports.
Tip: park the asset "In Repair" while it's being serviced
Maintenance records don't touch the asset's status — but you can (and should) pair them with the seeded In Repair status label. "In Repair" has deploy type Undeployable, and the module blocks checkout of any asset whose status is not Deployable:
So while a device sits at the repair shop, setting it to In Repair guarantees nobody endorses it to a user by mistake. When it comes back, set it back to Ready to Deploy (or Deployed if it goes straight back to its holder).
SOP: a full repair cycle
Who: IT admin / asset custodian with
asset, asset_maintenance,
asset_update, and asset_checkout permissions.Preconditions: the asset exists in the registry; if an outside shop does the work, the vendor exists in the Vendors master (
ams/vendors).
-
Recover the device from its holder (if endorsed)
On the asset's detail page, use "Check in asset" to end the current endorsement. In the check-in modal, use "Set status to" and pick In Repair in the same step. (If the asset is unassigned, just edit it and set the status to In Repair.)
-
Open a maintenance record
Go to Safekeep → Maintenance and click "Add Maintenance". Pick the asset, give the job a clear Title, choose a Maintenance Type (usually Repair), select the Vendor, and set the Start date. Put the fault description in Notes — it becomes the Activity event's body. Leave Completion date empty. Save.
-
While the work is in progress
The open record (no completion date) is your "in service" marker, and the In Repair status keeps the asset out of checkout. Anyone with the
assetpermission can see the job on this screen or the Maintenance log report. -
Close out the job
When the device comes back, edit the record: set the Completion date, enter the final Cost (a plain number), and tick "Warranty work" if the vendor covered it. Remember the Activity timeline keeps the original event — the authoritative closed record is the row on this screen.
-
Return the asset to service
Edit the asset and set its status back to Ready to Deploy. If it goes back to the same user, run "Check out asset" again (checkout requires a Deployable status) and have the holder "Confirm receipt" — see Checkout & Check-in.
-
Verify the trail
The asset's Activity timeline now shows Check-in → Maintenance → Checkout events, and the Maintenance log report carries the cost line for finance.
Known quirks on this screen
| Quirk | Practical impact |
|---|---|
| The URL field is saved but never displayed. | Don't rely on it — duplicate important links into Notes. |
| Edits and deletes don't sync the asset's Activity timeline. | The "Maintenance" event reflects the record as first created, forever. |
| No status/lifecycle field on maintenance records. | An empty Completion date is the only "still open" indicator. |
| Cost has no numeric input validation. | Enter plain numbers only — the value is saved as typed into a 2-decimal numeric column, so symbols or separators may not be stored as intended. |
| No filters on the list or the report. | Use the table's search box; export to Excel for heavier analysis. |
| Asset names in the list are plain text, not links. | Open the asset from the Asset Registry when you need its detail page. |