feat(GRO-2319): surface active waitlist entries on portal appointments + seed #204

Merged
Flea Flicker merged 1 commits from feat/GRO-2319-portal-waitlist-surfacing into dev 2026-06-09 10:41:09 +00:00
Member

GRO-2319 (Phase 1: feature → dev) — Portal: surface + seed waitlist entries (api)

Companion to web PR. Follow-up to GRO-2313; CMPO sign-off on GRO-2326/GRO-2328.

Changes

  • GET /api/portal/appointments now also returns the client's ACTIVE waitlist_entries as synthetic waitlisted cards: id prefixed waitlist:, status: "waitlisted", confirmationStatus: null, and a startTime derived from the entry's preferred date/time so the portal classifies it as Upcoming.
  • Seed: one ACTIVE waitlist entry for the UAT customer. waitlist_entries is NOT truncated on the hourly reset, so it is upserted by fixed id with its preferred date refreshed to a future-relative value each reset (otherwise it would go stale and drop out of Upcoming). The existing scheduled row already carries confirmationStatus: "pending" which drives the live Pending badge.

Tests

  • portal.test.ts: two GET /portal/appointments waitlist-surfacing tests (active entry surfaced as waitlist: card; no waitlisted card when none active). Portal/waitlist/confirmation suites: 131 passing. Root tsc + packages/db tsc clean.

UAT Playbook

  • UAT_PLAYBOOK.md TC-API-8.19 — portal appointments surface active waitlist entries.

🤖 Generated with Claude Code

## GRO-2319 (Phase 1: feature → dev) — Portal: surface + seed waitlist entries (api) Companion to web PR. Follow-up to [GRO-2313](/GRO/issues/GRO-2313); CMPO sign-off on GRO-2326/GRO-2328. ### Changes - **`GET /api/portal/appointments`** now also returns the client's **ACTIVE** `waitlist_entries` as synthetic `waitlisted` cards: `id` prefixed `waitlist:`, `status: "waitlisted"`, `confirmationStatus: null`, and a `startTime` derived from the entry's preferred date/time so the portal classifies it as Upcoming. - **Seed:** one ACTIVE waitlist entry for the UAT customer. `waitlist_entries` is NOT truncated on the hourly reset, so it is upserted by fixed id with its preferred date refreshed to a future-relative value each reset (otherwise it would go stale and drop out of Upcoming). The existing `scheduled` row already carries `confirmationStatus: "pending"` which drives the live Pending badge. ### Tests - `portal.test.ts`: two GET `/portal/appointments` waitlist-surfacing tests (active entry surfaced as `waitlist:` card; no waitlisted card when none active). Portal/waitlist/confirmation suites: 131 passing. Root `tsc` + `packages/db` `tsc` clean. ### UAT Playbook - `UAT_PLAYBOOK.md` **TC-API-8.19** — portal appointments surface active waitlist entries. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Flea Flicker added 1 commit 2026-06-09 10:38:28 +00:00
feat(GRO-2319): surface active waitlist entries on portal appointments + seed
CI / Test (pull_request) Successful in 27s
CI / Lint & Typecheck (pull_request) Successful in 33s
CI / Build & Push Docker Images (pull_request) Successful in 1m24s
7523263072
- GET /api/portal/appointments now also returns the client's ACTIVE
  waitlist_entries as synthetic `waitlisted` cards (id prefixed `waitlist:`,
  status hard-set to waitlisted, startTime derived from preferred date/time)
  so the portal can render Waitlisted cards in the Upcoming list (item 2).
- Seed one active waitlist entry for the UAT customer. waitlist_entries is
  NOT truncated on the hourly reset, so the entry is upserted by fixed id and
  its preferred date refreshed to a future-relative value each reset to stay
  Upcoming. (The existing scheduled row already carries confirmationStatus
  pending, which drives the live Pending badge.)
- portal.test.ts: GET /portal/appointments waitlist-surfacing tests.
- UAT_PLAYBOOK.md TC-API-8.19 for the surfaced waitlist entries.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Flea Flicker merged commit ef18ed7376 into dev 2026-06-09 10:41:09 +00:00
Sign in to join this conversation.