update docs
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 11 — Route & Sales Visit Management
|
||||
|
||||
**Status**: Not Started
|
||||
**Status**: Partially Implemented
|
||||
**Depends On**: 00 — Existing Gap Fixes
|
||||
|
||||
---
|
||||
@@ -62,10 +62,41 @@ access grant which may cover multiple users (e.g. a Supervisor overseeing severa
|
||||
## Open Questions
|
||||
|
||||
- Is route sequence optimization (`optimizeRouteSequence`) a manual reorder endpoint, or does it
|
||||
need actual distance/priority-based computation (external mapping API)?
|
||||
need actual distance/priority-based computation (external mapping API)? — **Deferred.** The
|
||||
endpoint is stubbed (`501 Not Implemented`) until this is decided.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
> Fill this section in during planning discussion before writing any code.
|
||||
Implemented: `assignOutletsToRoute`, `assignRouteToSalesRep`/`reassignRoute` (same endpoint),
|
||||
`recordRouteCheckIn`/`recordRouteCheckOut`, and `getStoreVisitHistory` (§4, now reads from
|
||||
`RouteVisitLog`). See [BACKEND_API_REFERENCE.md §6.6](../../sharedDocs/BACKEND_API_REFERENCE.md#66-routes)
|
||||
for full request/response shapes.
|
||||
|
||||
Deliberately deferred, not oversights:
|
||||
- **`optimizeRouteSequence`** — stubbed as `501 Not Implemented`; no distance/priority computation
|
||||
exists (see Open Questions above).
|
||||
- **`getRouteAdherence`** / **`getRoutePerformance`** — not built; the underlying metrics
|
||||
(adherence %, strike rate, missed-visit count) were never defined, so there was nothing concrete
|
||||
to implement against.
|
||||
- **`sendRouteDeviationAlert`** — check-in computes and stores a basic `IsDeviationFlagged` boolean
|
||||
(Haversine distance > 500m from the store's registered `Latitude`/`Longitude`) but does not call
|
||||
any alert/notification pipeline, since [09_fraud_controls.md](./09_fraud_controls.md) itself is
|
||||
not implemented yet.
|
||||
|
||||
Data model differs slightly from the original sketch above: `RouteId`/`OwnerUserId` became a
|
||||
nullable `FK_OwnerUserId` directly on `Route` (no separate ownership table needed for a
|
||||
single-owner field), and `Route Visit Log`'s `CheckInGps` became two decimal columns
|
||||
(`CheckInLatitude`/`CheckInLongitude`) to match the existing `Store.Latitude`/`Longitude` shape
|
||||
and make the distance calculation straightforward.
|
||||
|
||||
Authorization for the new endpoints follows the `RegionService.CanManageRegionAsync` pattern
|
||||
(scope check via `IScopeAccessService`, no dedicated `routes.*` permission code): bulk store
|
||||
assignment and owner assignment require `IScopeAccessService.HasRouteScopeAsync` plus role level
|
||||
≥ 20 (Supervisor+); check-in/check-out require route scope only, no role floor, since any rep with
|
||||
access to the route should be able to log their own visits.
|
||||
|
||||
Frontend: implemented in `distribution_fe` — an admin "Manage" dialog on the Routes page (owner +
|
||||
bulk store assignment), a read-only visit-history dialog on the Stores page, and a new rep-facing
|
||||
`/sales-visits` page for GPS check-in/check-out (see `distribution_fe/app/(dashboard)/sales-visits/`).
|
||||
|
||||
Reference in New Issue
Block a user