fix(pipeline-refactor): purge stale 9-stage name references
Audit of every '*_sent' / '*_signed' / 'in_communication' / 'details_sent' / 'deposit_10pct' / 'completed' literal under src/ caught four genuinely broken sites that migration 0062 collapsed away but the runtime code never followed through on: 1. alert-rules.ts: `interest.stale` matched 'details_sent' / 'in_communication' / 'eoi_sent' — none of which exist post-migration. The alert never fired. Updated to the new mid-funnel canon (enquiry / qualified / nurturing). 2. berth-recommender.service.ts: TWO copies of the same stage-rank CASE (one for active history, one for fallthrough scoring) referenced the full legacy 8-stage ladder. Every WHEN missed → MAX(...) returned 0 → tier-ladder + heat-score logic collapsed silently. Rebuilt both against the 7-stage canon mirroring getHotDeals. 3. interests.service.ts: clearInterestOutcome reopen default was the dead 'in_communication'. Switched to 'qualified' (closest analog; rep can still override via data.reopenStage). Pre-fix, any reopened deal fell through safeStage() to 'enquiry'. 4. report-generators.ts: revenue-PDF "total completed" filter intersected pipeline_stage='completed' AND outcome='won'. The stage filter is redundant today (setInterestOutcome always writes 'completed' for terminal outcomes) and is brittle to the upcoming sentinel-stage cleanup. Dropped the stage filter — outcome='won' is the canonical money-changed-hands signal. Follow-up flagged: setInterestOutcome still writes pipeline_stage = 'completed' as a sentinel, which is non-canonical under the new 7-stage type (PIPELINE_STAGES doesn't include 'completed'). Migration 0062's intent is `outcome` carries terminal state forward; pipeline_stage stays in-canon. Cleaning up requires sweeping every consumer of pipeline_stage='completed' as a terminal marker — separate commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -482,14 +482,13 @@ export async function recommendBerths(args: RecommendBerthsArgs): Promise<Recomm
|
||||
) AS lost_count,
|
||||
COALESCE(
|
||||
MAX(CASE i.pipeline_stage
|
||||
WHEN 'open' THEN 1
|
||||
WHEN 'details_sent' THEN 2
|
||||
WHEN 'in_communication' THEN 3
|
||||
WHEN 'eoi_sent' THEN 4
|
||||
WHEN 'eoi_signed' THEN 5
|
||||
WHEN 'deposit_10pct' THEN 6
|
||||
WHEN 'contract_sent' THEN 7
|
||||
WHEN 'contract_signed' THEN 8
|
||||
WHEN 'enquiry' THEN 1
|
||||
WHEN 'nurturing' THEN 2
|
||||
WHEN 'qualified' THEN 3
|
||||
WHEN 'eoi' THEN 4
|
||||
WHEN 'reservation' THEN 5
|
||||
WHEN 'deposit_paid' THEN 6
|
||||
WHEN 'contract' THEN 7
|
||||
ELSE 0 END
|
||||
) FILTER (WHERE i.archived_at IS NULL AND i.outcome IS NULL),
|
||||
0
|
||||
@@ -499,14 +498,13 @@ export async function recommendBerths(args: RecommendBerthsArgs): Promise<Recomm
|
||||
) AS latest_fallthrough_at,
|
||||
COALESCE(
|
||||
MAX(CASE i.pipeline_stage
|
||||
WHEN 'open' THEN 1
|
||||
WHEN 'details_sent' THEN 2
|
||||
WHEN 'in_communication' THEN 3
|
||||
WHEN 'eoi_sent' THEN 4
|
||||
WHEN 'eoi_signed' THEN 5
|
||||
WHEN 'deposit_10pct' THEN 6
|
||||
WHEN 'contract_sent' THEN 7
|
||||
WHEN 'contract_signed' THEN 8
|
||||
WHEN 'enquiry' THEN 1
|
||||
WHEN 'nurturing' THEN 2
|
||||
WHEN 'qualified' THEN 3
|
||||
WHEN 'eoi' THEN 4
|
||||
WHEN 'reservation' THEN 5
|
||||
WHEN 'deposit_paid' THEN 6
|
||||
WHEN 'contract' THEN 7
|
||||
ELSE 0 END
|
||||
) FILTER (WHERE i.outcome IS NOT NULL AND (i.outcome::text LIKE 'lost%' OR i.outcome = 'cancelled')),
|
||||
0
|
||||
|
||||
Reference in New Issue
Block a user