fix(legacy-stage): purge 9-stage enum keys from rank tables and stale copy
Some checks failed
Build & Push Docker Images / lint (push) Successful in 2m4s
Build & Push Docker Images / build-and-push (push) Has been cancelled

L-001 hunt landed these:

  - src/lib/services/clients.service.ts — stageRank used pre-refactor
    9-stage names exclusively (`contract_signed`, `deposit_10pct`, …).
    Every modern 7-stage interest fell to rank 0, making client-list
    "most-progressed deal" sort effectively random. Modern values now
    own the canonical ranks; legacy aliases map to their 7-stage
    equivalents so historical audit data still sorts.

  - src/lib/services/berth-recommender.service.ts — STAGE_ORDER had
    the same 9-stage shape. LATE_STAGE_THRESHOLD pointed at the (now
    nonexistent) `deposit_10pct` slot. Reworked to the 7-stage scale;
    threshold now at `deposit_paid` (5).

  - Stale comments referencing `deposit_10pct` in schema (clients,
    financial) and client-archive services updated to current copy.

  - Smart-archive dialog rendered `i.pipelineStage` as raw enum; now
    routes through `stageLabelFor` (the new helper added with A2).

Test fixture updates: berth-recommender.test.ts numeric inputs
re-mapped to the new 7-stage scale (eoi_signed=5 → eoi=3, etc.).
1373/1373 vitest pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-15 01:18:13 +02:00
parent 0d9208a052
commit 98211066a5
10 changed files with 65 additions and 31 deletions

View File

@@ -184,20 +184,32 @@ export async function loadRecommenderSettings(portId: string): Promise<Recommend
// ─── Tier mapping ──────────────────────────────────────────────────────────
// L-001: modern 7-stage ranks own the canonical positions; legacy 9-stage
// keys map to their post-refactor equivalents so historical interests in
// the recommender stage-aware queries continue to rank correctly.
const STAGE_ORDER: Record<string, number> = {
// modern
enquiry: 1,
qualified: 2,
nurturing: 2,
eoi: 3,
reservation: 4,
deposit_paid: 5,
contract: 6,
// legacy aliases
open: 1,
details_sent: 2,
in_communication: 3,
eoi_sent: 4,
eoi_signed: 5,
deposit_10pct: 6,
contract_sent: 7,
contract_signed: 8,
completed: 9,
details_sent: 1,
in_communication: 2,
eoi_sent: 3,
eoi_signed: 3,
deposit_10pct: 5,
contract_sent: 6,
contract_signed: 6,
completed: 6,
};
/** Stage at which a berth is "in late stage" (Tier D when active). */
const LATE_STAGE_THRESHOLD = STAGE_ORDER.deposit_10pct!; // 6
const LATE_STAGE_THRESHOLD = STAGE_ORDER.deposit_paid!; // 5
export type Tier = 'A' | 'B' | 'C' | 'D';