// The four operational worklist screens. Each lists the leads at the lifecycle // states it owns; every row carries its one primary action (+ Disqualify), // launched in a modal. Each screen shows a few compact stat tiles over its rows. // (The Lead Pipeline screen is the read-only all-leads dashboard.) import { Worklist, type TileSpec } from '../components/activities'; import { formatINR } from '../components'; import type { LeadRecord } from '../api/types'; const count = (rows: LeadRecord[]) => String(rows.length); const countWhere = (pred: (r: LeadRecord) => boolean) => (rows: LeadRecord[]) => String(rows.filter(pred).length); const sumINR = (col: keyof LeadRecord) => (rows: LeadRecord[]) => `₹${formatINR(rows.reduce((s, r) => s + (Number(r[col]) || 0), 0))}`; const avg = (col: keyof LeadRecord) => (rows: LeadRecord[]) => { const vals = rows.map((r) => Number(r[col])).filter((n) => !Number.isNaN(n)); return vals.length ? String(Math.round(vals.reduce((a, b) => a + b, 0) / vals.length)) : '—'; }; /** Qualify (New Lead) + Assign (Qualified). */ const QUALIFY_TILES: TileSpec[] = [ { label: 'In queue', value: count }, { label: 'Avg lead score', value: avg('lead_score') }, ]; export function QualificationScreen() { return ( ); } /** Log Contact (Assigned) · Schedule (Contacted) · Recommend (Meeting Scheduled). */ const ENGAGE_TILES: TileSpec[] = [ { label: 'In queue', value: count }, { label: 'Meetings booked', value: countWhere((r) => !!r.meeting_mode) }, { label: 'Total premium', value: sumINR('premium_amount') }, ]; export function InteractionScreen() { return ( ); } /** Collect Documents (Product Recommended) · Assess Eligibility (Documents Collected). */ const DOCS_TILES: TileSpec[] = [ { label: 'In queue', value: count }, { label: 'Docs collected', value: countWhere((r) => r.current_state_name === 'Documents Collected') }, ]; export function DocAssessmentScreen() { return ( ); } /** Underwrite (Eligibility Assessed) · Issue (Underwriting) · Onboard (Policy Issued). */ const UW_TILES: TileSpec[] = [ { label: 'In queue', value: count }, { label: 'Policies issued', value: countWhere((r) => r.current_state_name === 'Policy Issued') }, { label: 'Total premium', value: sumINR('premium_amount') }, ]; export function UnderwritingPolicyScreen() { return ( ); }