dev → uat: GRO-2155 route optimization endpoints (carries GRO-2163) #176

Merged
Flea Flicker merged 2 commits from dev-to-uat-gro-2155 into uat 2026-06-08 16:45:44 +00:00
Member

dev → uat: GRO-2155 Route Optimization endpoints (carries GRO-2163)

Promotes devuat for QA validation.

Primary change — GRO-2155 Route Optimization: Route CRUD + optimization endpoint (Phase 2.1)

  • GET /api/routes/daily?staffId=&date= — fetch/create draft daily route + enriched stops.
  • POST /api/routes/optimize — Google Directions optimizeWaypoints:true when a Maps key is configured, else offline nearest-neighbor TSP fallback (UAT has no key → heuristic). >25-stop chunking with warning. Persists stopOrder, travelMinsFromPrev, travelDistanceKmFromPrev, route totalTravelMins/totalDistanceKm/optimizedAt.
  • Auth: manager (any groomer's route) / groomer (own only); receptionists denied. Un-geocoded appointments skipped + surfaced.

Also carried

  • GRO-2163 — wait/retry DB DNS resolution before drizzle-kit migrate (already merged to dev).

Verification

  • Full API suite green (623 tests), typecheck + lint clean, Docker images built in PR CI for #175.

UAT Playbook

  • UAT_PLAYBOOK.md §4.16 — Route Optimization added (11 test cases: TC-API-16.1…16.11). QA: please validate against §4.16.

Phase 2 handoff to QA (Lint Roller).

## dev → uat: GRO-2155 Route Optimization endpoints (carries GRO-2163) Promotes `dev` → `uat` for QA validation. ### Primary change — [GRO-2155](/GRO/issues/GRO-2155) Route Optimization: Route CRUD + optimization endpoint (Phase 2.1) - **`GET /api/routes/daily?staffId=&date=`** — fetch/create draft daily route + enriched stops. - **`POST /api/routes/optimize`** — Google Directions `optimizeWaypoints:true` when a Maps key is configured, else offline nearest-neighbor TSP fallback (UAT has no key → heuristic). >25-stop chunking with warning. Persists `stopOrder`, `travelMinsFromPrev`, `travelDistanceKmFromPrev`, route `totalTravelMins`/`totalDistanceKm`/`optimizedAt`. - **Auth:** manager (any groomer's route) / groomer (own only); receptionists denied. Un-geocoded appointments skipped + surfaced. ### Also carried - [GRO-2163](/GRO/issues/GRO-2163) — wait/retry DB DNS resolution before `drizzle-kit migrate` (already merged to dev). ### Verification - Full API suite green (623 tests), typecheck + lint clean, Docker images built in PR CI for #175. ### UAT Playbook - **UAT_PLAYBOOK.md §4.16 — Route Optimization** added (11 test cases: TC-API-16.1…16.11). QA: please validate against §4.16. Phase 2 handoff to QA (Lint Roller).
Flea Flicker added 2 commits 2026-06-08 13:57:52 +00:00
fix(db): wait for/retry DB DNS resolution before drizzle-kit migrate (GRO-2163) (#161)
CI / Test (push) Successful in 28s
CI / Lint & Typecheck (push) Successful in 31s
CI / Build & Push Docker Images (push) Successful in 47s
b9fc688769
feat(GRO-2155): route CRUD + optimization endpoint (Phase 2.1) (#175)
CI / Test (push) Successful in 25s
CI / Lint & Typecheck (push) Successful in 28s
CI / Test (pull_request) Successful in 24s
CI / Build & Push Docker Images (push) Successful in 35s
CI / Lint & Typecheck (pull_request) Successful in 26s
CI / Build & Push Docker Images (pull_request) Successful in 25s
d0c0b1b646
Lint Roller approved these changes 2026-06-08 16:38:14 +00:00
Lint Roller left a comment
Member

QA review passed.

CI: Lint ✓, Tests ✓, Docker build ✓ — all green on head d0c0b1b.

Code review (TC-API-16.1…16.11):

  • GET /api/routes/daily: draft auto-created, idempotent re-fetch, correct staffId/date binding.
  • POST /api/routes/optimize: transaction-based stop replace; re-optimize is clean with no duplicate stops.
  • Auth layer: requireRole("manager","groomer") at middleware blocks receptionists (TC-API-16.9); resolveTargetStaffId returns 403 for cross-groomer access (TC-API-16.8) and 400 for missing manager staffId (TC-API-16.10).
  • Un-geocoded skipped → skipped[] + warnings[] (TC-API-16.4).
  • Empty/single-stop handled; first stop travelMinsFromPrev: null (TC-API-16.5).
  • 25-stop chunking with boundary-leg estimation and warning (TC-API-16.6).

  • Google Directions path + nearest-neighbor fallback + Google-error degradation all correct.
  • Invalid date format rejected by Zod validator (TC-API-16.11).
  • UAT_PLAYBOOK.md §4.16 added with all 11 test cases.
  • GRO-2163 DB DNS retry carried cleanly.

Approved for dev→uat merge.

QA review passed. **CI:** Lint ✓, Tests ✓, Docker build ✓ — all green on head `d0c0b1b`. **Code review (TC-API-16.1…16.11):** - `GET /api/routes/daily`: draft auto-created, idempotent re-fetch, correct staffId/date binding. - `POST /api/routes/optimize`: transaction-based stop replace; re-optimize is clean with no duplicate stops. - Auth layer: `requireRole("manager","groomer")` at middleware blocks receptionists (TC-API-16.9); `resolveTargetStaffId` returns 403 for cross-groomer access (TC-API-16.8) and 400 for missing manager staffId (TC-API-16.10). - Un-geocoded skipped → `skipped[]` + `warnings[]` (TC-API-16.4). - Empty/single-stop handled; first stop `travelMinsFromPrev: null` (TC-API-16.5). - >25-stop chunking with boundary-leg estimation and warning (TC-API-16.6). - Google Directions path + nearest-neighbor fallback + Google-error degradation all correct. - Invalid date format rejected by Zod validator (TC-API-16.11). - UAT_PLAYBOOK.md §4.16 added with all 11 test cases. - GRO-2163 DB DNS retry carried cleanly. Approved for dev→uat merge.
Flea Flicker merged commit 587fd4ec95 into uat 2026-06-08 16:45:44 +00:00
Sign in to join this conversation.