Depreciations
Define reusable straight-line depreciation profiles — a useful life in months plus a residual floor — and attach one to an Asset Model. A profile is the starting point for valuation: when an asset's financial book is opened, the profile is what seeds its useful life and residual value. 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 → Setup → Depreciation Profiles → 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 job
On the 1st of each month at 01:10, the job "Compute asset depreciation"
(compute_asset_depreciation) opens a financial book for every asset that should have
one and does not, then prepares and calculates last month's depreciation run and leaves it
in draft. It never posts: what you find on the 1st is a set of numbers waiting for a person
to review, approve and post. See
the monthly cycle for what happens next,
and Automation & Reminders for the full cron catalog.
What it takes for a book to open
An asset gets a book — and therefore a valuation — only when all of these hold:
| Prerequisite | Where it's set | If missing |
|---|---|---|
| Cost greater than 0 | Asset Edit modal → Cost | No book is opened, and none is faked — the asset simply does not appear in Finance until somebody fills the cost in. |
| Purchase date set | Asset Edit modal → Purchase date | Same: no book. A depreciation start date is never invented, because a guessed date produces a confident wrong number in a ledger. |
| A depreciation profile linked on the asset record | Designed to flow from the model's "Depreciation" dropdown; see the wiring caveat above | The book still opens, marked non-depreciable — visible, reportable and fixable. Refusing to open it would hide the asset from finance entirely, which is how assets get forgotten. |
| Profile's Useful life (months) greater than 0 | The Depreciation modal | Same: the book opens non-depreciable and stays at full cost, because with no life there is nothing to spread the cost over. Fix it with an estimate change. |
How the value is worked out
Straight-line, one month at a time, floored at the residual value. Each period spreads what is still on the books over the life that is left:
this month's charge = (value still on the books − residual) ÷ months of life remaining
the final month absorbs any rounding remainder, so the book lands
exactly on its residual value — never a few centavos away from itWritten that way rather than as a fixed monthly amount for one reason: it is still classic straight-line while nothing changes, and it stays correct after something does. Shorten the useful life, or write the asset down, and the remaining value simply re-spreads over the remaining months from the next period onward — without touching a single month that has already been posted. See estimate changes and impairments.
Worked example (₱)
A laptop bought for ₱60,000.00 on a "3-year IT equipment" profile (useful life 36 months, residual ₱6,000.00):
depreciable amount = 60,000 − 6,000 = ₱54,000.00
monthly charge = 54,000 ÷ 36 = ₱1,500.00
after 10 posted months: 60,000 − 15,000 = ₱45,000.00 ← net book valueOnce the residual is reached the book is marked fully depreciated and stops being charged. It never goes below the floor — and an asset sitting there while somebody is still using it is a finding worth acting on, which is what the Fully Depreciated but Still in Use report is for.
Where the values surface
Valuation now has a home of its own: the Valuation tab on Safekeep → Finance lists every book with cost, accumulated depreciation and net book value (and totals), and five finance reports read from posted periods — roll-forward, book value register, fully depreciated but still in use, impairments, and disposal gain/loss.
The older Asset Reports → "Depreciation schedule" report
(ams/reports/depreciation_schedule) still 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 is exported from the server, so the spreadsheet carries the whole thing rather than the page you are looking at. It is one of twenty-three reports, grouped by the question they answer: Asset Reports.
Deleting a profile — no in-use protection
Consequences of deleting a profile that's in use:
- Books already open are unaffected. A book copied its life and residual from the profile when it opened and has owned them ever since, so depreciation carries on exactly as before. This is the safety net that makes a deletion survivable.
- Assets not yet booked lose their seed. A book opened for one afterwards has no useful life and comes out non-depreciable until somebody sets an estimate on it.
- Assets linked to it drop off the older Depreciation schedule report, which still needs a live profile to join on.
- 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 "-"?
Books open and last month's run is prepared on the 1st at 01:10 — and the figure only moves once that run has been posted. A newly registered asset waits for the next cycle, or an administrator can open its book straight away with Ensure books on the Valuation tab.
Leaving "Useful life (months)" blank saves 0, and a book opened from it is marked non-depreciable — nothing is charged, because there is no life to spread the cost over. Fix the profile for future books; for one already open, request an estimate change.
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.