Skip to content

Asset Depreciation

Backlog fieldValue
Story IDAP-FA-001
EpicFixed Assets
Story typeBusiness workflow
Review statusDraft - business analyst and business owner review required
Source evidenceAppsPortal.Apis controller, application command/query handlers, validators, domain entities, and matching MFE workflow where available
Last source review2026-07-10

User story

As asset accountants, I want to calculate, review, and post depreciation by period so that book value and expense follow configured policy.

Posting reference: AppsPortal Posting Ledger explains debit/credit construction. Delegation and Interaction Contracts explains module ownership, delegated commands, linked records, commit boundaries, and reversal propagation.

Acceptance criteria

  1. Only authorized users can view or execute the feature's actions.
  2. Required business data, active dependencies, tenant/branch scope, and current document state are validated.
  3. Invalid requests return actionable validation errors without applying a partial change.
  4. Search, list, view, print, and export operations use the same authorized business scope.
  5. Material create, edit, status, approval, posting, reversal, and integration actions are auditable where applicable.
  6. Financial or stock effects are applied atomically and no more than once.

Posting details

  1. Validate Draft/allowed state, open period, eligible active assets, method/useful life/start date, remaining depreciable value, and configured Expense and Accumulated Depreciation accounts.
  2. Calculate each asset amount without exceeding depreciable base or duplicating an already-posted period.
  3. Delegate the journal to Accounting: debit Depreciation Expense and credit Accumulated Depreciation, with applicable cost-center dimensions.
  4. Update accumulated depreciation, net book value, latest posted period, journal link, and Posted status.
  5. All asset lines and journal commit together; later depreciation/lifecycle activity controls reversal eligibility.

General ledger posting

ComponentDebitCreditAmount basis
Period depreciationDepreciation ExpenseAccumulated DepreciationCalculated eligible period amount, not above depreciable base.

Other module and document effects

AreaEffectConditional/no effect
Asset registerIncreases accumulated depreciation, reduces NBV, stores latest period/journal.Does not change acquisition cost, inventory, payable/receivable, or cash.
LifecycleAffects later sale/return/disposal calculations.Duplicate period and ineligible asset are blocked.

Core acceptance scenarios

  1. Given eligible active assets with remaining depreciable value and configured expense/accumulated accounts, when the period depreciation is posted, then expense is debited, accumulated depreciation credited, and each net book value updated.
  2. Given the period is duplicate/closed or value would exceed depreciable base, when the operation is attempted, then Post is rejected.
  3. Given the same Post request is retried after success, when the source is no longer Draft, then no duplicate journal, stock, balance, payment, or lifecycle effect is created.

Required data and Post

Depreciation period/date, eligible active depreciable assets, useful-life/method/start data, remaining depreciable value, and Asset Group Accumulated Depreciation and Expense accounts are required. Calculation must not exceed depreciable base or duplicate an already-posted period.

Post debits depreciation expense, credits accumulated depreciation, updates each asset's accumulated depreciation and net book value, records latest posted depreciation, links the journal, and marks Posted. Asset/group cost centers are applied where configured. Recalculation or reversal is blocked by later posted depreciation or lifecycle events unless a dedicated reverse workflow permits it.

Frontend page coverage

The following UI coverage is sourced from the pulled MFE route configuration. A Module-level supporting artifact mapping is evidence of a reachable screen, but requires BA confirmation that it belongs to this story rather than a more specific feature story.

Route/pageComponentModeRoute permission/guardMapping confidenceSource
(module default)AssetsDepreciationComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsDepreciation_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:12
(module default)AssetsOpeningaBalanceComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsOpeningBalance_List; Guards: PolicyAuthGuardFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:12
(module default)DashboardComponentDashboardNo route-level permission/guard found in source windowModule-level supporting artifactapps/fixedAssets/src/app/remote-entry/routes.ts:14
(module default)LayoutPageComponentList/navigationNo route-level permission/guard found in source windowModule-level supporting artifactapps/fixedAssets/src/app/remote-entry/routes.ts:6
(module default)ListAssetsDepreciationComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsDepreciation_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:20
(module default)ListAssetsOpeningaBalanceComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsOpeningBalance_List; Guards: PolicyAuthGuardFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:20
addAddAssetsDepreciationComponentAddPermission: AppFixedAssetsPermissions.AssetsDepreciation_Add; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:29
addAddAssetsOpeningaBalanceComponentAddPermission: AppFixedAssetsPermissions.AssetsOpeningBalance_Add; Guards: PolicyAuthGuardFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:29
assets-depreciationLazy-loaded routeList/navigationNo route-level permission/guard found in source windowExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/transactions-routing.module.ts:27
assets-depreciation-reportAssetsDeprecationReportComponentReport/printNo route-level permission/guard found in source windowFeature token matchapps/fixedAssets/src/app/remote-entry/reports/reports-routing.module.ts:10
edit/:idEditAssetsDepreciationComponentEditPermission: AppFixedAssetsPermissions.AssetsDepreciation_Edit; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:59
edit/:idEditAssetsOpeningaBalanceComponentEditPermission: AppFixedAssetsPermissions.AssetsOpeningBalance_Edit; Guards: PolicyAuthGuardFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:39
masterdataLazy-loaded routeList/navigationNo route-level permission/guard found in source windowModule-level supporting artifactapps/fixedAssets/src/app/remote-entry/routes.ts:22
sequenceSequenceComponentSequencePermission: AppFixedAssetsPermissions.AssetsDepreciation_Edit; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:49
sequenceSequenceComponentSequenceNo route-level permission/guard found in source windowFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:59
transactionsLazy-loaded routeList/navigationNo route-level permission/guard found in source windowModule-level supporting artifactapps/fixedAssets/src/app/remote-entry/routes.ts:29
view/:idViewAssetsDepreciationComponentView/detailPermission: AppFixedAssetsPermissions.AssetsDepreciation_View; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/assets-depreciation-routing.module.ts:39
view/:idViewAssetsOpeningaBalanceComponentView/detailPermission: AppFixedAssetsPermissions.AssetsOpeningBalance_View; Guards: PolicyAuthGuardFeature token matchapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/assets-openinga-balance-routing.module.ts:49

Observed frontend fields and validation

ComponentControlObserved frontend ruleComponent source
AssetsDeprecationReportComponentAssetGroupIdsVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/reports/assets-depreciation-report/assets-deprecation-report.component.ts
AssetsDeprecationReportComponentFromDateVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/reports/assets-depreciation-report/assets-deprecation-report.component.ts
AssetsDeprecationReportComponentToDateVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/reports/assets-depreciation-report/assets-deprecation-report.component.ts
HeaderAssetsDepreciationComponentassetsDepreciationSelcetedAssetsVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/header-assets-depreciation/header-assets-depreciation.component.ts
HeaderAssetsDepreciationComponentdepreciationDateRequired in component validatorapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/header-assets-depreciation/header-assets-depreciation.component.ts
HeaderAssetsDepreciationComponentdescriptionRequired in component validatorapps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/header-assets-depreciation/header-assets-depreciation.component.ts
HeaderOpeningBalanceComponentaccumulatedDepOpeningBalanceJournalEntryLineIdRequired in component validatorapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/component/header-opening-balance/header-opening-balance.component.ts
HeaderOpeningBalanceComponentassetOpeningBalanceJournalEntryLineIdRequired in component validatorapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/component/header-opening-balance/header-opening-balance.component.ts
HeaderOpeningBalanceComponentopeningBalanceJournalEntryLineIdRequired in component validatorapps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/component/header-opening-balance/header-opening-balance.component.ts

Observed frontend actions

ComponentClick action/handlerBusiness review requirementComponent source
AssetsDeprecationReportComponentprintReportGenerate the printout for the selected record and authorized branch/tenant; use posted/current values and surface print, template, ZATCA/ETA, or popup failures without changing transaction state.apps/fixedAssets/src/app/remote-entry/reports/assets-depreciation-report/assets-deprecation-report.component.ts
AssetsDeprecationReportComponentviewDataOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/fixedAssets/src/app/remote-entry/reports/assets-depreciation-report/assets-deprecation-report.component.ts
BodyAssetsDepreciationComponentonDeleteRowAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/body-assets-depreciation/body-assets-depreciation.component.ts
BodyAssetsDepreciationComponentopenDialogOpen the item/lookup/tracking dialog with the current warehouse, item, UOM, and remaining quantity context; accepted values must return to the correct line and cancel must not mutate it.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/body-assets-depreciation/body-assets-depreciation.component.ts
BodyAssetsDepreciationComponentopenDistributionModalDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/body-assets-depreciation/body-assets-depreciation.component.ts
BodyOpeningBalanceComponentdeleteAssetsLineAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/component/body-opening-balance/body-opening-balance.component.ts
BodyOpeningBalanceComponentopenDialogOpen the item/lookup/tracking dialog with the current warehouse, item, UOM, and remaining quantity context; accepted values must return to the correct line and cancel must not mutate it.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/component/body-opening-balance/body-opening-balance.component.ts
HeaderAssetsDepreciationComponentopenDialogOpen the item/lookup/tracking dialog with the current warehouse, item, UOM, and remaining quantity context; accepted values must return to the correct line and cancel must not mutate it.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/components/header-assets-depreciation/header-assets-depreciation.component.ts
ListAssetsDepreciationComponentonDeleteAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsDepreciationComponentonEditOpen the identified editable record only with Edit permission; posted/locked records remain blocked by route or action state and list context must be recoverable on return.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsDepreciationComponentonPostAvailable only for a postable Draft and Post permission; confirm the document, prevent a second submission, call the posting API, and refresh status, journal/stock links, and row actions. Failure must keep the pre-post state.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsDepreciationComponentonViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsDepreciationComponentprintoutGenerate the printout for the selected record and authorized branch/tenant; use posted/current values and surface print, template, ZATCA/ETA, or popup failures without changing transaction state.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsDepreciationComponentrouteToJournalViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/list-assets-depreciation/list-assets-depreciation.component.ts
ListAssetsOpeningaBalanceComponentonDeleteAvailable only in deletable states with Delete permission; identify the record in confirmation, call delete once, remove/refresh the list row on success, and retain the row with the API reason on failure.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/pages/list-assets-openinga-balance/list-assets-openinga-balance.component.ts
ListAssetsOpeningaBalanceComponentonEditOpen the identified editable record only with Edit permission; posted/locked records remain blocked by route or action state and list context must be recoverable on return.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/pages/list-assets-openinga-balance/list-assets-openinga-balance.component.ts
ListAssetsOpeningaBalanceComponentonPostAvailable only for a postable Draft and Post permission; confirm the document, prevent a second submission, call the posting API, and refresh status, journal/stock links, and row actions. Failure must keep the pre-post state.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/pages/list-assets-openinga-balance/list-assets-openinga-balance.component.ts
ListAssetsOpeningaBalanceComponentonUnPostAvailable only for a postable Draft and Post permission; confirm the document, prevent a second submission, call the posting API, and refresh status, journal/stock links, and row actions. Failure must keep the pre-post state.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/pages/list-assets-openinga-balance/list-assets-openinga-balance.component.ts
ListAssetsOpeningaBalanceComponentonViewOpen the authorized record in view mode with its status, totals, lines, source and generated-document links; handle deleted, forbidden, and missing records without exposing stale data.apps/fixedAssets/src/app/remote-entry/transactions/assets-openinga-balance/pages/list-assets-openinga-balance/list-assets-openinga-balance.component.ts
ViewAssetsDepreciationComponentopenDistributionModalDocument the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler.apps/fixedAssets/src/app/remote-entry/transactions/assets-depreciation/pages/view-assets-depreciation/view-assets-depreciation.component.ts

Page-specific frontend acceptance criteria

  1. (module default) - Dashboard: Load authorized summary values consistently with source reports, support exposed date/branch filters, and handle empty/error states. Security observed: No route-level permission/guard found in source window
  2. (module default) - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: Permission: AppFixedAssetsPermissions.AssetsOpeningBalance_List; Guards: PolicyAuthGuard
  3. add - Add: Render permitted fields, required indicators, defaults, dependent lookups, validation, Save/Cancel, loading, success, and API-error states. Security observed: Permission: AppFixedAssetsPermissions.AssetsOpeningBalance_Add; Guards: PolicyAuthGuard
  4. assets-depreciation - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: No route-level permission/guard found in source window
  5. assets-depreciation-report - Report/print: Expose documented filters, validation, empty/loading/error states, authorized results, totals, drill-through, print, and export behavior where present. Security observed: No route-level permission/guard found in source window
  6. edit/:id - Edit: Load the identified record, enforce state/permission field locks, preserve concurrency identity, validate changes, and return without losing filters. Security observed: Permission: AppFixedAssetsPermissions.AssetsOpeningBalance_Edit; Guards: PolicyAuthGuard
  7. masterdata - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: No route-level permission/guard found in source window
  8. sequence - Sequence: Show current numbering scope and permit only authorized, valid sequence configuration without retroactively renumbering posted documents. Security observed: No route-level permission/guard found in source window
  9. transactions - List/navigation: Load an authorized paged/searchable list or navigation page; preserve filters/sort/paging and expose only permitted row and bulk actions. Security observed: No route-level permission/guard found in source window
  10. view/:id - View/detail: Load an authorized immutable/detail representation with status-aware actions, linked records, print/export where exposed, and not-found/forbidden handling. Security observed: Permission: AppFixedAssetsPermissions.AssetsOpeningBalance_View; Guards: PolicyAuthGuard

Internal Documentation — Microtec