Assets Reference Public

Depreciations

Reusable straight-line depreciation profiles in Safekeep: the useful life and residual floor they hold, how a profile seeds an asset's financial book, what happens when one is edited or deleted, and why a book keeps its own copy.

Guide version: r2 Module version: 1.11.0 Updated: 2026-08-25 Estimated time: 10 min 11 views 0% helpful
Catalog & Setup

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.

ℹ️
Where it lives. Sidebar Safekeep → Setup → Depreciation Profiles (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.
⚠️
This screen no longer computes anything. It seeds. Valuation now lives in per-asset financial books on Safekeep → Finance, where depreciation is charged one reviewed, approved, posted period at a time. A profile is copied into a book once, when that book is opened — after which the book is the record, and editing the profile does not retrospectively change assets already booked against it. To change an asset's life or residual afterwards, request an estimate change on its book.

What a depreciation profile is

A depreciation profile is a small named recipe that answers two questions about an asset's value over time:

????
Useful life (months)

How many months the asset takes to depreciate from its cost down to its floor. E.g. 36 for a 3-year laptop.

????️
Residual / minimum value

The floor the book value never drops below — the salvage value in pesos.

????️
Name

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.

????️
Roadmap. Straight-line is the only depreciation method implemented. Other methods (declining balance, sum-of-years, etc.) are not available in this build.

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

ColumnWhat it shows
NameThe profile's name. Default sort, ascending.
Useful life (months)The depreciation period in months.
Field TypeThe 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 valueThe floor value, decimal-formatted ("-" if empty).
Created byLink to the creator's profile.
OptionsPencil = "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."

FieldRequiredInputNotes
NameRequiredText (autofocus)Validated client-side ("This field is required.") and server-side.
Useful life (months)OptionalNumber, min 0Leaving 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 TypeDefaultsSelect2: "Amount" / "Percentage (%)"Defaults to Amount. See the caveat below — Percentage currently has no effect.
Residual / minimum valueOptionalTextStored as a decimal (₱). Empty saves as blank (treated as 0 by the compute job).
⚠️
"Percentage (%)" is stored but not honored. The monthly compute job always treats Residual / minimum value as an absolute peso amount, regardless of the type you pick (the type is saved and listed, but the math never reads it). Until that changes, enter the residual as a ₱ amount and leave the type on Amount.

Attaching a profile to an Asset Model

Profiles are not picked on the asset form. The designed flow is Profile → Asset Model → Assets:

  1. Create the profile

    Safekeep → Setup → Depreciation Profiles → Add Depreciation, e.g. "3-year IT equipment", 36 months, residual ₱6,000.00.

  2. Attach it to a model

    Open Assets → Models tab, edit the model, and pick the profile in the "Depreciation" dropdown. See Asset Models.

  3. 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.

⚠️
Model-to-asset wiring caveat (verified in this build). The compute job and the Depreciation schedule report select assets by a per-asset depreciation link (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:

PrerequisiteWhere it's setIf missing
Cost greater than 0Asset Edit modal → CostNo book is opened, and none is faked — the asset simply does not appear in Finance until somebody fills the cost in.
Purchase date setAsset Edit modal → Purchase dateSame: 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 recordDesigned to flow from the model's "Depreciation" dropdown; see the wiring caveat aboveThe 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 0The Depreciation modalSame: 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 it

Written 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 value
₱60,000
Cost (month 0)
₱45,000
Month 10
₱24,000
Month 24
₱6,000
Month 36+ (floor)

Once 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.

????
Figures move when a period is posted, not when a page is opened. A book value is the result of the last posted run, so a month that is prepared but not yet approved and posted is not in the numbers yet. That is deliberate: a valuation nobody has signed should not be quoted as one. See the monthly cycle.

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 "Current value" figure is now a copy, not a source. It is refreshed from the book after every posting so the Depreciation schedule report and any existing integration keep working — but the book is the truth, and where the two disagree, believe the book. Treat this figure as a compatibility leftover rather than something to build on.

The older Asset Reports → "Depreciation schedule" report (ams/reports/depreciation_schedule) still lists every depreciable asset with:

ColumnMeaning
AssetA link to the asset view page, displayed as "Asset #<id>" — the asset's title is not shown (a known rough edge of this report).
CostThe asset's cost, decimal-formatted.
Purchase dateStart of the depreciation clock.
Useful life (months)From the linked profile.
Residual / minimum valueFrom the linked profile.
Current valueThe stored book value — "-" until the compute job has run at least once for this asset.
Computed atDate/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

Deletes are unconditional. There is no in-use check anywhere on this screen: deleting a profile that models or assets still reference succeeds immediately (soft delete, toast "The record has been deleted."). The failure message "The record is in use, you can't delete the record!" exists in the code but is effectively never shown.

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.

Related pages

Was this guide helpful?

Report a content problem