'use client'; import { AlertCircle } from 'lucide-react'; import { PIPELINE_STAGES, type PipelineStage } from '@/lib/constants'; interface SkipAheadInterest { pipelineStage: string; dateEoiSent?: string | null; dateEoiSigned?: string | null; dateReservationSigned?: string | null; dateDepositReceived?: string | null; dateContractSent?: string | null; dateContractSigned?: string | null; eoiDocStatus?: string | null; reservationDocStatus?: string | null; contractDocStatus?: string | null; } /** * Soft banner that fires when a rep skip-advanced a deal past earlier * milestones without backfilling the matching dates / doc-status badges. * * Why we care: the funnel/conversion analytics rely on these timestamps to * compute how long deals sit in each stage. A deal that jumped straight to * deposit_paid with no dateEoiSent looks like a 0-day-EOI in the report, * which skews the cohort. * * The banner is informational only — no enforcement. Reps still have the * override path; we just nudge them to fill in the gaps. */ export function SkipAheadBanner({ interest }: { interest: SkipAheadInterest }) { const stageIdx = PIPELINE_STAGES.indexOf(interest.pipelineStage as PipelineStage); if (stageIdx < 0) return null; const eoiIdx = PIPELINE_STAGES.indexOf('eoi'); const reservationIdx = PIPELINE_STAGES.indexOf('reservation'); const depositIdx = PIPELINE_STAGES.indexOf('deposit_paid'); const gaps: string[] = []; // Past EOI but never stamped sent → likely a skip. if (stageIdx > eoiIdx && !interest.dateEoiSent) gaps.push('EOI sent date'); if (stageIdx > eoiIdx && interest.eoiDocStatus !== 'signed' && !interest.dateEoiSigned) { gaps.push('EOI signed date'); } if ( stageIdx > reservationIdx && interest.reservationDocStatus !== 'signed' && !interest.dateReservationSigned ) { gaps.push('Reservation signed date'); } if (stageIdx > depositIdx && !interest.dateDepositReceived) { gaps.push('Deposit received date'); } if (gaps.length === 0) return null; return (
{gaps.length === 1 ? 'A past milestone is missing its date.' : `${gaps.length} past milestones are missing their dates.`}
Backfill {gaps.join(' · ')} below so reports show accurate cycle times.