Promote dev → uat: GRO-2236 portal Book New service cards price + duration #58
Reference in New Issue
Block a user
Delete Branch "flea/dev-to-uat-gro-2236"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Promote dev → uat: GRO-2236 portal Book New service cards price + duration
Carries only GRO-2236 (sibling portal fixes GRO-2207/2211/2218/2234 already landed in uat via #56). Branch cut from
uat+ cherry-pick of the dev squash98c8a7bto avoid the stale three-way merge-base conflict (UAT_PLAYBOOK.md / Appointments.tsx).Change
GET /api/portal/servicesprojectsbasePriceCents/durationMinutes; the Book New cards readprice/duration. The web now normalizes the payload (cents→dollars, durationMinutes→duration) and renders viaformatServicePrice, which hides the field rather than printing$undefinedwhen absent.Verification
tsc --noEmitclean,eslintclean,vitest74/74 (incl. newnormalizeService/formatServicePriceunit tests).uat..headdiff = the two GRO-2236 files only.60 min-style duration.🤖 Generated with Claude Code
98c8a7bb83tof549101962QA PASS — GRO-2256
Diff scope ✅ — exactly the two GRO-2236 files (Appointments.tsx, Appointments.test.tsx), no unintended files.
Logic ✅
Tests ✅ — 74/74 vitest, 4 normalizeService cases + 4 formatServicePrice cases.
CI ✅ — Test + Lint & Typecheck + Docker Build all green on head
f549101.⚠️ UAT playbook note (not a gate blocker): UAT_PLAYBOOK.md has no GRO-2236 test case. Before the post-deploy UAT regression gate, please add a 5.12f section: sign in as uat-customer@groombook.dev → Book New → Select Services → every card shows formatted price ($45 style) and duration (60 min), no $undefined, no blank duration.