Overview
Assets carry purchasePrice, purchaseDate, and currentValue, but nothing computes depreciation — the #1 feature finance teams expect from an asset register (Snipe-IT, Asset Panda, and every ITAM tool ship it). Charts are planned as [FE-23].
What to Build
A DepreciationModule in backend/src/depreciation/:
- Asset entity additions (coordinate with [BE-06]/[BE-14]):
depreciationMethod (enum NONE | STRAIGHT_LINE | DECLINING_BALANCE), usefulLifeMonths, salvageValue
DepreciationService:
getSchedule(assetId) → array of { period, openingValue, depreciation, closingValue } over the useful life
getCurrentBookValue(assetId) → value as of today
- Endpoints:
| Method |
Path |
Description |
GET |
/api/assets/:id/depreciation |
Full schedule + current book value |
GET |
/api/reports/depreciation |
Org-wide: total book value, monthly depreciation expense, top depreciating categories |
- Nightly cron updates
currentValue from the schedule for assets with a method set
References
- Blocked by [BE-06], [BE-14]; feeds [FE-23] and extends [BE-13]
Acceptance Criteria
Overview
Assets carry
purchasePrice,purchaseDate, andcurrentValue, but nothing computes depreciation — the #1 feature finance teams expect from an asset register (Snipe-IT, Asset Panda, and every ITAM tool ship it). Charts are planned as [FE-23].What to Build
A
DepreciationModuleinbackend/src/depreciation/:depreciationMethod(enumNONE | STRAIGHT_LINE | DECLINING_BALANCE),usefulLifeMonths,salvageValueDepreciationService:getSchedule(assetId)→ array of{ period, openingValue, depreciation, closingValue }over the useful lifegetCurrentBookValue(assetId)→ value as of todayGET/api/assets/:id/depreciationGET/api/reports/depreciationcurrentValuefrom the schedule for assets with a method setReferences
Acceptance Criteria
(cost − salvage) / usefulLifeMonthsper month, verified against a hand-computed example in the issue/PR description