Appearance
Device Management
| Backlog field | Value |
|---|---|
| Story ID | AP-VAN-001 |
| Epic | Van Sales |
| 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 distribution administrators, I want to register, verify, activate, and manage salesperson devices so that only approved devices perform mobile distribution work.
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.
Business rules
Required
Unique device identity, assigned salesperson/user, branch/company, verification/activation status are required.
Optional or conditional
Metadata, push token, last-seen, and notes are optional.
Action behavior
Verify/activate enables authorized field use; deactivate/revoke blocks future synchronization.
Blocking rule or downstream effect
Device actions create no GL/stock until business transactions synchronize/post.
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) | JourneyPlanComponent | List/navigation | Permission: 'ALL_PERMISSIONS', AppDistributionPermissions.JourneyPlan_List; Guards: PolicyAuthGuard | Module-level supporting artifact | apps/distribution/src/app/remote-entry/distribution/distribution-routing.module.ts:39 |
| (module default) | LayoutPageComponent | List/navigation | Guards: AuthGuard, moduleLicenseGuard | Module-level supporting artifact | apps/distribution/src/app/remote-entry/entry.routes.ts:6 |
| (module default) | MainTransferComponent | List/navigation | Guards: PolicyAuthGuard | Module-level supporting artifact | apps/distribution/src/app/remote-entry/transactions/transactions-routing.module.ts:9 |
| (module default) | TransferManagementComponent | List/navigation | Permission: 'ALL_PERMISSIONS', AppDistributionPermissions.TransferRequest_List; Guards: PolicyAuthGuard | Module-level supporting artifact | apps/distribution/src/app/remote-entry/transactions/transactions-routing.module.ts:16 |
| masterdata | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Module-level supporting artifact | apps/distribution/src/app/remote-entry/entry.routes.ts:20 |
| sequence | SequenceComponent | Sequence | Permission: 'ALL_PERMISSIONS'; Guards: PolicyAuthGuard | Module-level supporting artifact | apps/distribution/src/app/remote-entry/distribution/distribution-routing.module.ts:49 |
| transactions | Lazy-loaded route | List/navigation | No route-level permission/guard found in source window | Module-level supporting artifact | apps/distribution/src/app/remote-entry/entry.routes.ts:27 |
| transfer-management/view/:id | ViewTransferComponent | View/detail | Permission: 'ALL_PERMISSIONS', AppDistributionPermissions.TransferRequest_View; Guards: PolicyAuthGuard | Feature token match | apps/distribution/src/app/remote-entry/transactions/transactions-routing.module.ts:31 |
Observed frontend fields and validation
| Component | Control | Observed frontend rule | Component source |
|---|---|---|---|
| - | - | No reactive formControlName controls were found for the routed components; review template-driven/shared child components. | Route sources above |
Observed frontend actions
| Component | Click action/handler | Business review requirement | Component source |
|---|---|---|---|
| JourneyPlanComponent | routeToSequence | Document the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler. | apps/distribution/src/app/remote-entry/distribution/pages/journey-plan/journey-plan.component.ts |
| SalesManCardComponent | delete | 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/distribution/src/app/remote-entry/distribution/components/schedule-date-card/schedule-date-card.component.ts |
| SalesManCardComponent | onAdd | Document the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler. | apps/distribution/src/app/remote-entry/distribution/components/schedule-date-card/schedule-date-card.component.ts |
| SalesManCardComponent | 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/distribution/src/app/remote-entry/distribution/components/schedule-date-card/schedule-date-card.component.ts |
| SalesManCardComponent | 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/distribution/src/app/remote-entry/distribution/components/schedule-date-card/schedule-date-card.component.ts |
| TransferManagementComponent | onAcceptTransfer | Document the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler. | apps/distribution/src/app/remote-entry/transactions/pages/main-transfer/transfer-management/transfer-management.component.ts |
| TransferManagementComponent | onDecline | Document the enabled state, permission, input context, resulting API or navigation effect, success refresh, and concrete failure behavior for this handler. | apps/distribution/src/app/remote-entry/transactions/pages/main-transfer/transfer-management/transfer-management.component.ts |
| TransferManagementComponent | onViewDetails | 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/distribution/src/app/remote-entry/transactions/pages/main-transfer/transfer-management/transfer-management.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: Guards: PolicyAuthGuard
- 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
- sequence - Sequence: Show current numbering scope and permit only authorized, valid sequence configuration without retroactively renumbering posted documents. Security observed: Permission: 'ALL_PERMISSIONS'; Guards: PolicyAuthGuard
- 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
- transfer-management/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: 'ALL_PERMISSIONS', AppDistributionPermissions.TransferRequest_View; Guards: PolicyAuthGuard