diff --git a/docs/launch-readiness.md b/docs/launch-readiness.md index 9713ead6..ae73ca21 100644 --- a/docs/launch-readiness.md +++ b/docs/launch-readiness.md @@ -91,20 +91,24 @@ everything else is post-launch polish unless promoted. spec's "on every report" — Operational uses a different "vs period start" baseline; reconcile the two semantics if a single consistent comparison is wanted. -- ❌ **Rep multi-select filter** — exists implicitly via the single-rep - leaderboard collapse, but no explicit multi-select dropdown. -- ❌ **Source multi-select filter** — Sales has lead-category + outcome - filters; the spec also calls for a generic `source` filter (website / - referral / broker / manual) on every report. +- ✅ **Rep multi-select filter** — **SHIPPED in b97f6e94** (Sales). + Dynamic "Assigned to" multi-select populated from a window-independent + `getRepFilterOptions` (distinct assigned reps port-wide); hidden when + the port has no assigned interests. +- ✅ **Source multi-select filter** — **SHIPPED in b97f6e94** (Sales). + Static Source multi-select (website / manual / referral / broker / + other) allowlisted against `SOURCES`. Both filters thread through the 5 + filtered Sales queries via a pure, unit-tested `parseSalesFilters`. + _Still open: replicate both on Operational + the other report pages._ - ❌ **Empty-state copy per report** — currently shows a skeleton; spec wants a "this report needs data first" hint pointing at the right onboarding step. #### Phase 2 — Sales report gaps -- ❌ **Operational-style filter set on Sales** — beyond stage / lead-cat / - outcome that shipped, the cross-cutting filters above (period - comparison, rep multi-select, source multi-select) are missing. +- ✅ **Operational-style filter set on Sales** — stage / lead-cat / + outcome + period comparison + rep multi-select + source multi-select + all shipped (rep/source in b97f6e94). Sales filter set is complete. #### Phase 2 — Operational report gaps @@ -585,19 +589,16 @@ unproven full builds onto a same-day prod launch. 6 of 10 entities, per-role PII column whitelist. Architecture decided (per-column expression map + generic Drizzle query composer); spec deferred. Basic builder ships as-is. -- **Berth Waiting List** — un-hide the existing `WaitingListManager` - (component + API already built) + build the availability-triggered +- **Berth Waiting List** — ✅ **SHIPPED in 8be7a6e2.** `WaitingListManager` + tab un-hidden + wired. _Still deferred: the availability-triggered next-in-line notification (today only a `notifyPref` column is stored; - no sender exists). Component currently orphaned; berth tab removed. -- **Berth Maintenance Log** — backend (API + service) exists; needs a UI - tab mirroring the waiting-list manager. -- **Contract/Reservation paper-upload misroute (BUG)** — the "Upload - paper-signed copy" button on the contract/reservation tabs POSTs to the - EOI-only endpoint (`/external-eoi`), filing a paper-signed - contract/reservation as an EOI. Fix: add contract/reservation - paper-upload endpoints + point `ExternalEoiUploadDialog` at the right - one per docType. ("Mark as signed without file" already works for all - three types.) + no sender exists)._ +- **Berth Maintenance Log** — ✅ **SHIPPED in 8be7a6e2.** UI tab mirroring + the waiting-list manager, on the existing API + service. +- **Contract/Reservation paper-upload misroute (BUG)** — ✅ **SHIPPED in + d98aa5cc.** Added contract/reservation paper-upload endpoints + + pointed `ExternalEoiUploadDialog` at the right one per docType, so a + paper-signed contract/reservation no longer files as an EOI. - **Marketing + Financial reports** — remain unbuilt + now hidden; gated on Init 1b (website UTM/inquiry cutover) and Init 1c (invoices-module decision) respectively.