Depreciations
Define reusable straight-line depreciation profiles — a useful life in months plus a residual floor — attach one to an Asset Model, and let the monthly compute job keep every depreciable asset's Current value (book value) up to date on the Depreciation schedule report. Note the model-to-asset wiring caveat below before relying on this.
ams/depreciations),
a standalone page with the heading "Depreciations". Viewing, adding, editing, and
deleting profiles are all gated on the single base permission asset
("Assets: Entries") — there are no separate create/update/delete permits for this screen.
See Permissions & Roles.
What a depreciation profile is
A depreciation profile is a small named recipe that answers two questions about an asset's value over time:
How many months the asset takes to depreciate from its cost down to its floor. E.g. 36 for a 3-year laptop.
The floor the book value never drops below — the salvage value in pesos.
A label you'll pick from the Asset Model form, e.g. "3-year IT equipment".
One profile can serve many models: create "3-year IT equipment" once, then attach it to every laptop, desktop, and monitor model that follows the same schedule. The math itself is straight-line only — the value falls by the same amount every month until it reaches the residual floor.
The Depreciations screen
The page is a single DataTable listing every profile, with a table-refresh button and an Excel export of the data columns. The one header button is "Add Depreciation" (plus-circle icon), which opens the add/edit modal.
List columns
| Column | What it shows |
|---|---|
| Name | The profile's name. Default sort, ascending. |
| Useful life (months) | The depreciation period in months. |
| Field Type | The profile's type — Amount or Percent ("-" if unset). Yes, the header really says "Field Type"; this generic header is reused on several Safekeep screens with different meanings (here it means the residual-value type). |
| Residual / minimum value | The floor value, decimal-formatted ("-" if empty). |
| Created by | Link to the creator's profile. |
| Options | Pencil = "Edit Depreciation" (opens the modal pre-filled); × = delete, with a delete-confirmation prompt. |
The Add / Edit Depreciation modal
Reached from Add Depreciation (blank) or the pencil icon (pre-filled). A standard modal form with a single footer button "Save"; a successful save shows the toast "The record has been saved."
| Field | Required | Input | Notes |
|---|---|---|---|
| Name | Required | Text (autofocus) | Validated client-side ("This field is required.") and server-side. |
| Useful life (months) | Optional | Number, min 0 | Leaving it blank saves 0 — and a 0-month profile never computes a value (the compute job skips it). Always set a real useful life. |
| Field Type | Defaults | Select2: "Amount" / "Percentage (%)" | Defaults to Amount. See the caveat below — Percentage currently has no effect. |
| Residual / minimum value | Optional | Text | Stored as a decimal (₱). Empty saves as blank (treated as 0 by the compute job). |
Attaching a profile to an Asset Model
Profiles are not picked on the asset form. The designed flow is Profile → Asset Model → Assets:
Create the profile
Safekeep → Depreciations → Add Depreciation, e.g. "3-year IT equipment", 36 months, residual ₱6,000.00.
Attach it to a model
Open Assets → Models tab, edit the model, and pick the profile in the "Depreciation" dropdown. See Asset Models.
Give each asset a cost and purchase date
On the asset's Edit modal, fill in Cost and Purchase date — both are required for the book value to compute.
asset_entries.depreciation_id) — they do not follow the model's
Depreciation dropdown. The Add/Edit Asset form has no depreciation field, and choosing a
model does not copy the model's profile onto the asset (only blank Category and
Manufacturer default from the model). In practice the per-asset link can currently only be
set directly in the database — so if your Depreciation schedule report stays empty even
though your models carry profiles, this is why. Ask your system administrator to set the
per-asset link, and treat automatic model inheritance as not yet wired.
The monthly compute job
Book values are calculated by the cron job "Compute asset depreciation"
(slug compute_asset_depreciation): "Recomputes the straight-line book value for
every depreciable asset and stores it into the asset meta." It runs monthly, on the 1st
of the month at 01:10, per tenant, and raises no notification — results appear only
in the report. See Widgets, Reminders & Settings for the full
cron catalog.
What it takes for a value to compute
An asset is picked up by the job (and by the Depreciation schedule report) only when all of these hold:
| Prerequisite | Where it's set | If missing |
|---|---|---|
| A depreciation profile linked on the asset record | Designed to flow from the model's "Depreciation" dropdown; see the wiring caveat above | Asset is skipped entirely — never appears in the report |
| Cost greater than 0 | Asset Edit modal → Cost | Skipped |
| Purchase date set | Asset Edit modal → Purchase date | Skipped |
| Profile's Useful life (months) greater than 0 | The Depreciation modal | Listed in the report but never computed — "Current value" stays "-" |
The formula
Straight-line, floored at the residual value, rounded to 2 decimals:
current value = cost − (cost − residual) × (months elapsed ÷ useful-life months)
months elapsed = whole months since the purchase date
(counted with a 30.4375-day average month, clamped to 0…useful-life)
if current value < residual → current value = residualThe result is written into the asset's meta as current_value, together with a
depreciation_computed_at timestamp — the two right-hand columns of the report.
Custom-field values already stored in the meta are preserved.
Worked example (₱)
A laptop bought for ₱60,000.00 on a "3-year IT equipment" profile (useful life 36 months, residual ₱6,000.00), 10 whole months after the purchase date:
depreciable base = 60,000 − 6,000 = ₱54,000.00
depreciation so far = 54,000 × (10 ÷ 36) = ₱15,000.00
current value = 60,000 − 15,000 = ₱45,000.00 ← shown as "Current value"After month 36 the elapsed-months figure is clamped to 36, so the value parks at the residual ₱6,000.00 forever — it never goes below the floor.
Where the values surface
Book values appear in exactly one place: Asset Reports → "Depreciation schedule"
(ams/reports/depreciation_schedule). The asset detail page does not show
cost, purchase date, or current value. The report lists every depreciable asset with:
| Column | Meaning |
|---|---|
| Asset | A link to the asset view page, displayed as "Asset #<id>" — the asset's title is not shown (a known rough edge of this report). |
| Cost | The asset's cost, decimal-formatted. |
| Purchase date | Start of the depreciation clock. |
| Useful life (months) | From the linked profile. |
| Residual / minimum value | From the linked profile. |
| Current value | The stored book value — "-" until the compute job has run at least once for this asset. |
| Computed at | Date/time of the last computation ("-" if never). |
The report has no filter controls and supports Excel export of all data columns. Full details of all four reports: Asset Reports.
Deleting a profile — no in-use protection
Consequences of deleting a profile that's in use:
- Assets linked to it drop off the Depreciation schedule report and stop being recomputed — the join requires a live (non-deleted) profile.
- The last stored Current value remains in each asset's meta, but with the asset gone from the report there is no screen left that displays it.
- Models keep pointing at the deleted profile until you edit them and pick another.
Since a single shared asset permission covers this whole screen, anyone who can
browse assets can also delete depreciation profiles — restrict the permission accordingly
(see Permissions & Roles).
Why is "Current value" showing "-"?
It runs monthly on the 1st at 01:10. A newly linked asset waits until the next run (or a manual run by an administrator — see Automation).
Leaving "Useful life (months)" blank saves 0, and the job skips 0-month profiles. Edit the profile and set a real month count.
Both are required. Fill them in on the asset's Edit modal — see Adding & Editing Assets.
The asset has no per-asset depreciation link (see the wiring caveat under Attaching a profile) — attaching the profile to the model alone is not enough in this build.