Assets Reference Public

Depreciations

Catalog & Setup 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…

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 8 min 1 views
Catalog & Setup

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.

ℹ️
Where it lives. Sidebar Safekeep → Depreciations (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:

????
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 → Depreciations → 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 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:

PrerequisiteWhere it's setIf missing
A depreciation profile linked on the asset recordDesigned to flow from the model's "Depreciation" dropdown; see the wiring caveat aboveAsset is skipped entirely — never appears in the report
Cost greater than 0Asset Edit modal → CostSkipped
Purchase date setAsset Edit modal → Purchase dateSkipped
Profile's Useful life (months) greater than 0The Depreciation modalListed 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 = residual

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

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.

????
Figures are at most one month fresh. The job runs only on the 1st of each month, and the report does no math of its own — it just displays the job's last stored result. An asset registered mid-month shows "-" until the next 1st-of-month run (an administrator can trigger the job early from the cron console — see Automation).

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:

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

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:

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

Related pages

Was this guide helpful?

Report a content problem