Appearance
Asset Master Data
| Backlog field | Value |
|---|---|
| Story ID | AP-FA-003 |
| Epic | Fixed Assets |
| Story type | Business workflow |
| Review status | Draft - business analyst and business owner review required |
| Source evidence | AppsPortal.Apis controller, application command/query handlers, validators, domain entities, and matching MFE workflow where available |
| Last source review | 2026-07-10 |
User story
As asset accountants, I want to maintain asset groups, assets, locations, useful life, and accounting defaults so that each controlled asset has a complete financial identity.
Acceptance criteria
- Only authorized users can view or execute the feature's actions.
- Required business data, active dependencies, tenant/branch scope, and current document state are validated.
- Invalid requests return actionable validation errors without applying a partial change.
- Search, list, view, print, and export operations use the same authorized business scope.
- Material create, edit, status, approval, posting, reversal, and integration actions are auditable where applicable.
- Financial or stock effects are applied atomically and no more than once.
Configuration hierarchy
An asset requires code/name, asset group, location/custody context, acquisition data, useful life/depreciation method and start data where depreciable, currency/local value, and active/status data. Serial/reference, supplier, notes, attachments, item linkage, and asset-specific account overrides are conditional.
Account priority used by sales/disposal/returns is asset-level account first, then asset-group account. Profit/Loss additionally falls back to Fixed Assets General Settings Assets Sales P/L account. Missing required Asset, Accumulated Depreciation, Expense, or P/L account blocks the relevant Post.
Master edits affect future calculations only; posted purchase, depreciation, transfer, sale, or disposal history remains unchanged.
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/page | Component | Mode | Route permission/guard | Mapping confidence | Source |
|---|---|---|---|---|---|
| (module default) | GeneralSettingComponent | List/navigation | Permission: AppFixedAssetsPermissions.FixedAssetsGeneralSettings_Edit , AppFixedAssetsPermissions.FixedAssetsGeneralSettings_View; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/general-settings/general-settings-routing.module.ts:17 |
| (module default) | ListAssetsDefinitionsComponent | List/navigation | Permission: AppFixedAssetsPermissions.AssetsDefault_List,; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:27 |
| (module default) | ListAssetsGroupsComponent | List/navigation | Permission: AppFixedAssetsPermissions.FixedAssetsGroups_List; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:21 |
| (module default) | MainAssetsDefinitionsComponent | List/navigation | Permission: AppFixedAssetsPermissions.AssetsDefault_List,; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:19 |
| (module default) | MainAssetsGroupsComponent | List/navigation | Permission: AppFixedAssetsPermissions.FixedAssetsGroups_List; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:13 |
| (module default) | MainGeneralSettingsComponent | List/navigation | Permission: AppFixedAssetsPermissions.FixedAssetsGeneralSettings_Edit , AppFixedAssetsPermissions.FixedAssetsGeneralSettings_View; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/general-settings/general-settings-routing.module.ts:9 |
| (module default) | TreeAssetsLocationComponent | List/navigation | Permission: AppFixedAssetsPermissions.AssetsLocation_List; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/assets-location-routing.module.ts:8 |
| add | AddAssetsGroupsComponent | Add | Permission: AppFixedAssetsPermissions.FixedAssetsGroups_Add; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:31 |
| assets-definitions | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/masterdata-routing.module.ts:10 |
| assets-groups | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/masterdata-routing.module.ts:5 |
| assets-locations | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/masterdata-routing.module.ts:17 |
| edit/:id | EditAssetsDefinitionsComponent | Edit | Permission: AppFixedAssetsPermissions.AssetsDefault_Edit,; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:40 |
| edit/:id | EditAssetsGroupsComponent | Edit | Permission: AppFixedAssetsPermissions.FixedAssetsGroups_Edit; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:41 |
| general-settings | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/masterdata-routing.module.ts:22 |
| import/:errorType | ListFileComponent | Import | Permission: AppFixedAssetsPermissions.AssetsDefault_Add,; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:74 |
| sequence | SequenceComponent | Sequence | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:64 |
| sequence | SequenceComponent | Sequence | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:61 |
| sequence | SequenceComponent | Sequence | No route-level permission/guard found in source window | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/assets-location-routing.module.ts:18 |
| view/:id | ViewAssetsDefinitionsComponent | View/detail | Permission: AppFixedAssetsPermissions.AssetsDefault_View,; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/assets-definitions-routing.module.ts:52 |
| view/:id | ViewAssetsGroupsComponent | View/detail | Permission: AppFixedAssetsPermissions.FixedAssetsGroups_View; Guards: PolicyAuthGuard | Feature token match | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/assets-groups-routing.module.ts:51 |
Observed frontend fields and validation
| Component | Control | Observed frontend rule | Component source |
|---|---|---|---|
| AssetsGroupsComponent | accumulatedDepreciationAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | assetAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | assetExpenseAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | depreciationMethod | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | depreciationRate | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | isDepreciate | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | name | Required in component validator | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | plAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | salvageValue | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| AssetsGroupsComponent | usefulLife | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-groups/component/assets-groups/assets-groups.component.ts |
| EditAssetsDefinitionsComponent | assetGroupId | Required in component validator | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | barcode | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | depreciationMethod | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | depreciationRate | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | name | Required in component validator | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | salvageValue | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| EditAssetsDefinitionsComponent | usefulLife | Conditionally required/validated in component | apps/fixedAssets/src/app/remote-entry/master-data/assets-definitions/pages/edit-assets-definitions/edit-assets-definitions.component.ts |
| GeneralSettingComponent | assetsDisposalAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/general-settings/pages/general-settings/general-setting.component.ts |
| GeneralSettingComponent | assetsSalesPLAccountId | Visible control; optional or API-dependent | apps/fixedAssets/src/app/remote-entry/master-data/general-settings/pages/general-settings/general-setting.component.ts |
Observed frontend actions
| Component | Click action/handler | Business review requirement | Component source |
|---|---|---|---|
| AddAssetsLocationsComponent | onCancel | Leave or close without persisting; warn when the current form has unsaved changes and restore the prior list/filter context. | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/component/add-assets-locations/add-assets-locations.component.ts |
| AddAssetsLocationsComponent | save | Validate the concrete form and line collection, prevent duplicate submission, persist once, show API field/business errors in context, and navigate/refresh only after success. | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/component/add-assets-locations/add-assets-locations.component.ts |
| EditAssetsLocationsComponent | onCancel | Leave or close without persisting; warn when the current form has unsaved changes and restore the prior list/filter context. | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/component/edit-assets-locations/edit-assets-locations.component.ts |
| EditAssetsLocationsComponent | save | Validate the concrete form and line collection, prevent duplicate submission, persist once, show API field/business errors in context, and navigate/refresh only after success. | apps/fixedAssets/src/app/remote-entry/master-data/assets-location/component/edit-assets-locations/edit-assets-locations.component.ts |
| ListAssetsDefinitionsComponent | onDelete | Available 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/master-data/assets-definitions/pages/list-assets-definitions/list-assets-definitions.component.ts |
| ListAssetsDefinitionsComponent | onEdit | Open 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/master-data/assets-definitions/pages/list-assets-definitions/list-assets-definitions.component.ts |
| ListAssetsDefinitionsComponent | onView | Open 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/master-data/assets-definitions/pages/list-assets-definitions/list-assets-definitions.component.ts |
| ListAssetsGroupsComponent | onDelete | Available 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/master-data/assets-groups/pages/list-assets-groups/list-assets-groups.component.ts |
| ListAssetsGroupsComponent | onEdit | Open 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/master-data/assets-groups/pages/list-assets-groups/list-assets-groups.component.ts |
| ListAssetsGroupsComponent | onView | Open 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/master-data/assets-groups/pages/list-assets-groups/list-assets-groups.component.ts |
| TreeAssetsLocationComponent | addChild | Document 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| TreeAssetsLocationComponent | deleteAccount | Available 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| TreeAssetsLocationComponent | editAccount | Open 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| TreeAssetsLocationComponent | handleTabClick | Document 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| TreeAssetsLocationComponent | newChild | Document 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| TreeAssetsLocationComponent | toggelTree | Document 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/master-data/assets-location/pages/tree-assets-location/tree-assets-location.component.ts |
| ViewAssetsLocationsComponent | routeToEdit | Open 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/master-data/assets-location/component/view-assets-locations/view-assets-locations.component.ts |
Page-specific frontend acceptance criteria
- (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.FixedAssetsGroups_List; Guards: PolicyAuthGuard
- add - Add: Render permitted fields, required indicators, defaults, dependent lookups, validation, Save/Cancel, loading, success, and API-error states. Security observed: Permission: AppFixedAssetsPermissions.FixedAssetsGroups_Add; Guards: PolicyAuthGuard
- assets-definitions - 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
- assets-groups - 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
- assets-locations - 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
- 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.FixedAssetsGroups_Edit; Guards: PolicyAuthGuard
- general-settings - 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
- import/:errorType - Import: Provide template/download and upload flow, file/type/size validation, row-level preview/errors, confirmation, duplicate policy, and partial-failure rules. Security observed: Permission: AppFixedAssetsPermissions.AssetsDefault_Add,; Guards: PolicyAuthGuard
- 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
- 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.FixedAssetsGroups_View; Guards: PolicyAuthGuard