Skip to content

Asset Disposal

Backlog fieldValue
Story IDAP-FA-002
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 retire an asset with an approved disposal reason and value so that the asset is removed from active service with correct accounting.

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, open period, eligible asset state, disposal reason/proceeds, and resolved Asset, Accumulated Depreciation, and P/L accounts.
  2. Resolve Asset and Accumulated Depreciation from asset then group; resolve P/L from asset then group then Fixed Assets settings.
  3. Delegate the disposal journal to Accounting: remove asset cost, remove accumulated depreciation, and post residual net book value/proceeds difference to P/L.
  4. Link the journal, mark the asset Disposed, and mark the disposal Posted.
  5. Journal and lifecycle change commit together; sold, locked, already-disposed, or missing-account assets are rejected.

General ledger posting

ComponentDebitCreditRule
Remove accumulated depreciationAccumulated Depreciation-Asset then group account.
Remove asset cost-Asset GLAsset then group account.
Residual NBV/proceeds differenceDisposal Loss / proceeds accountDisposal Gain / proceeds accountP/L asset then group then Fixed Assets settings.

Other module and document effects

AreaEffectConditional/no effect
Asset registerMarks asset Disposed and stores journal/reason/proceeds.No Inventory Stock Out; asset register owns lifecycle.
Finance/customer/vendorNo automatic cash or party balance unless a separate proceeds transaction exists.Zero-proceeds disposal has no receipt effect.

Core acceptance scenarios

  1. Given an eligible asset with resolved cost, accumulated depreciation, and P&L accounts, when the disposal is posted, then cost and accumulated depreciation are removed, residual value/proceeds post to P&L, and the asset becomes Disposed.
  2. Given the asset is sold, locked, already disposed, or missing accounts, 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.

Disposal requires Draft, open date/period, eligible asset, disposal reason, proceeds/scrap value where applicable, and resolved Asset, Accumulated Depreciation, and P/L accounts. Account priority is asset then group; P/L may fall back to Fixed Assets settings.

Post removes asset cost, removes accumulated depreciation, posts the residual net book value/proceeds difference to P/L, changes asset lifecycle status to disposed, links the journal, and marks Posted. Sold, transferred/locked, already disposed, or improperly valued assets are rejected.

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)AssetsDisposalMainComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsDisposal_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:12
(module default)ListAssetsDisposalComponentList/navigationPermission: AppFixedAssetsPermissions.AssetsDisposal_List; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:20
addAddAssetsDisposalComponentAddPermission: AppFixedAssetsPermissions.AssetsDisposal_Add; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:29
assets-disposalLazy-loaded routeList/navigationNo route-level permission/guard found in source windowExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/transactions-routing.module.ts:41
edit/:idEditAssetsDisposalComponentEditPermission: AppFixedAssetsPermissions.AssetsDisposal_Edit; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:39
sequenceSequenceComponentSequenceNo route-level permission/guard found in source windowExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:59
view/:idViewAssetsDisposalComponentView/detailPermission: AppFixedAssetsPermissions.AssetsDisposal_View; Guards: PolicyAuthGuardExplicit frontend feature ruleapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/assets-disposal-routing.module.ts:49

Observed frontend fields and validation

ComponentControlObserved frontend ruleComponent source
HeaderAssetsDisposalComponentdateVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/component/header-assets-disposal/header-assets-disposal.component.ts
HeaderAssetsDisposalComponentdescriptionVisible control; optional or API-dependentapps/fixedAssets/src/app/remote-entry/transactions/assets-disposal/component/header-assets-disposal/header-assets-disposal.component.ts

Observed frontend actions

ComponentClick action/handlerBusiness review requirementComponent source
BodyAssetsDisposalComponentdeleteDetailLineAvailable 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-disposal/component/body-assets-disposal/body-assets-disposal.component.ts
BodyAssetsDisposalComponentopenAssetsDialogOpen 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-disposal/component/body-assets-disposal/body-assets-disposal.component.ts
BodyAssetsDisposalComponentopenDialogOpen 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-disposal/component/body-assets-disposal/body-assets-disposal.component.ts
HeaderAssetsDisposalComponentopenAttachmentsDocument 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-disposal/component/header-assets-disposal/header-assets-disposal.component.ts
ListAssetsDisposalComponentonDeleteAvailable 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ListAssetsDisposalComponentonEditOpen 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ListAssetsDisposalComponentonPostAvailable 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ListAssetsDisposalComponentonPrintGenerate 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ListAssetsDisposalComponentonViewOpen 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ListAssetsDisposalComponentrouteToJournalViewOpen 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-disposal/pages/list-assets-disposal/list-assets-disposal.component.ts
ViewAssetsDisposalComponentopenAttachmentsDocument 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-disposal/pages/view-assets-disposal/view-assets-disposal.component.ts

Page-specific frontend acceptance criteria

  1. (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.AssetsDisposal_List; Guards: PolicyAuthGuard
  2. add - Add: Render permitted fields, required indicators, defaults, dependent lookups, validation, Save/Cancel, loading, success, and API-error states. Security observed: Permission: AppFixedAssetsPermissions.AssetsDisposal_Add; Guards: PolicyAuthGuard
  3. assets-disposal - 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
  4. 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.AssetsDisposal_Edit; Guards: PolicyAuthGuard
  5. 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
  6. 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.AssetsDisposal_View; Guards: PolicyAuthGuard

Internal Documentation — Microtec