feat(kanban): Project Pipeline board with drag-and-drop, lead drawer, and full project view

- 44 mock leads across 7 stage columns + 2 bucket columns (Stuck, Follow-up) with seeded activity logs
- dnd-kit drag-and-drop: cross-column card movement, bucket logic, DragOverlay preview
- Campaign toast on stage drop: 20s countdown, Edit button opens message editor, auto-sends if ignored
- KanbanColumn: droppable zones, stage progress bar (position/total), column color accents, Add/Rename/Delete (Admin+Owner)
- KanbanCard: initials avatar, job type pill, insurance badge, assigned agent, days-in-stage counter, left color accent bar
- ColumnManagerModal: add/rename/delete stages with name, color picker, campaign message; delete blocked if leads exist
- LeadInfoDrawer: right slide-in with progress bar + stage steps, Details and Activity tabs, More Details CTA
- ActivityTimeline: color-coded entries (created/forward/regression/bucket), stage arrows, notes, agent + date
- LeadProjectPage: full project view at /*/leads/:leadId — progress bar, stage mover dropdown, info panels, full activity log, stats
- Routes: /*/kanban + /*/leads/:leadId for Owner, Admin, Field Agent
- Pipeline nav item added for all three roles
This commit is contained in:
Satyam-Rastogi
2026-04-08 19:56:42 +05:30
parent c927f4c44d
commit b1ece35ac8
11 changed files with 2440 additions and 1 deletions
+740
View File
@@ -3617,6 +3617,708 @@ const MOCK_ESTIMATES_INITIAL = [
},
];
// ---------------------------------------------------------------------------
// KANBAN BOARD DATA
// ---------------------------------------------------------------------------
const KANBAN_COLUMNS_INITIAL = [
{ id: 'kc_new', type: 'stage', name: 'New Lead', order: 0, color: '#3B82F6', campaignMessage: "Hi {name}, thanks for reaching out to Plano Realty! We'll be in touch shortly to schedule your free roof inspection. — Plano Roofing Team" },
{ id: 'kc_contacted',type: 'stage', name: 'Contacted', order: 1, color: '#6366F1', campaignMessage: "Hi {name}, great connecting with you today! I'll send over some info and follow up with next steps this week. — Plano Roofing Team" },
{ id: 'kc_appt', type: 'stage', name: 'Appt Scheduled', order: 2, color: '#8B5CF6', campaignMessage: "Hi {name}, your inspection appointment is confirmed! We look forward to meeting you and assessing your roof. — Plano Roofing Team" },
{ id: 'kc_estimate', type: 'stage', name: 'Estimate Sent', order: 3, color: '#F59E0B', campaignMessage: "Hi {name}, your detailed estimate has been sent! Please review at your convenience and reach out with any questions. — Plano Roofing Team" },
{ id: 'kc_signed', type: 'stage', name: 'Signed', order: 4, color: '#10B981', campaignMessage: "Hi {name}, welcome to the Plano Roofing family! Your contract is signed and we're excited to get your project underway. — Plano Roofing Team" },
{ id: 'kc_progress', type: 'stage', name: 'In Progress', order: 5, color: '#06B6D4', campaignMessage: "Hi {name}, just a quick update — your roofing project is now actively in progress! We'll keep you posted on key milestones. — Plano Roofing Team" },
{ id: 'kc_complete', type: 'stage', name: 'Complete', order: 6, color: '#22C55E', campaignMessage: "Hi {name}, your project is complete! We hope you love the results. A 5-star review would mean the world to us. — Plano Roofing Team" },
{ id: 'kc_stuck', type: 'bucket', name: 'Stuck', order: 7, color: '#EF4444', campaignMessage: null },
{ id: 'kc_followup', type: 'bucket', name: 'Follow-up', order: 8, color: '#F97316', campaignMessage: null },
];
const KANBAN_LEADS_INITIAL = [
// ── NEW LEAD (6 leads) ──────────────────────────────────────────────────
{
id: 'kl_001', name: 'Derek Holloway', address: '2814 Ravenswood Dr, Plano TX 75023',
phone: '(972) 555-0101', email: 'derek.holloway@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_new', bucketId: null,
notes: 'Hail damage from March storm. Insurance adjuster coming next week.',
createdDate: '2026-03-31',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-31', note: 'Lead created via door knock — visible hail damage on ridge line.' },
],
},
{
id: 'kl_002', name: 'Brenda Castillo', address: '5501 Shady Brook Ln, Plano TX 75093',
phone: '(972) 555-0102', email: 'bcastillo@yahoo.com',
jobType: 'Roof Inspection', insuranceType: 'Retail',
assignedAgentId: null, assignedAgentName: null,
columnId: 'kc_new', bucketId: null,
notes: 'Walked in via website form. No agent assigned yet.',
createdDate: '2026-04-01',
activity: [
{ from: null, to: 'New Lead', by: 'System', date: '2026-04-01', note: 'Lead submitted via website form — Google Ads campaign.' },
],
},
{
id: 'kl_003', name: 'Antonio Reyes', address: '1122 Custer Rd, Plano TX 75075',
phone: '(972) 555-0103', email: 'a.reyes@outlook.com',
jobType: 'Gutter Replacement', insuranceType: 'Retail',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_new', bucketId: null,
notes: 'Referred by neighbor on Oak Creek Blvd. Wants full gutter system.',
createdDate: '2026-04-02',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-04-02', note: 'Referral from existing client Tom Hargrove.' },
],
},
{
id: 'kl_004', name: 'Sylvia Nguyen', address: '3308 Roundrock Trl, Plano TX 75023',
phone: '(972) 555-0104', email: 'sylvia.nguyen@icloud.com',
jobType: 'Siding Repair', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_new', bucketId: null,
notes: 'Storm damage to siding on north face. Photos sent.',
createdDate: '2026-04-03',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-04-03', note: 'Canvassing lead — storm damage clearly visible.' },
],
},
{
id: 'kl_005', name: 'Raymond Osei', address: '4720 Preston Rd, Plano TX 75024',
phone: '(972) 555-0105', email: 'rosei@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: null, assignedAgentName: null,
columnId: 'kc_new', bucketId: null,
notes: 'Called in from radio ad. Wants urgent inspection.',
createdDate: '2026-04-04',
activity: [
{ from: null, to: 'New Lead', by: 'System', date: '2026-04-04', note: 'Inbound call — radio ad source.' },
],
},
{
id: 'kl_006', name: 'Carolyn Estrada', address: '6013 Ohio Dr, Plano TX 75093',
phone: '(972) 555-0106', email: 'carolyn.e@gmail.com',
jobType: 'Window Replacement', insuranceType: 'Retail',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_new', bucketId: null,
notes: 'Wants 4 windows replaced. Budget is flexible.',
createdDate: '2026-04-05',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-04-05', note: 'Door knock — homeowner interested in window upgrade.' },
],
},
// ── CONTACTED (5 leads) ─────────────────────────────────────────────────
{
id: 'kl_007', name: 'Marcus Tillman', address: '2201 Willow Bend Dr, Plano TX 75093',
phone: '(972) 555-0107', email: 'mtillman@hotmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_contacted', bucketId: null,
notes: 'Spoke on the phone. Wants appointment next Tuesday.',
createdDate: '2026-03-25',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-25', note: 'Canvassing — hail dents visible on ridge cap.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-27', note: 'Spoke by phone, confirmed homeowner interest. Appointment TBD.' },
],
},
{
id: 'kl_008', name: 'Diane Kowalski', address: '815 Independence Pkwy, Plano TX 75023',
phone: '(972) 555-0108', email: 'diane.k@gmail.com',
jobType: 'Roof Inspection', insuranceType: 'Retail',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_contacted', bucketId: null,
notes: 'Older roof, no storm damage. Wants inspection for peace of mind.',
createdDate: '2026-03-26',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-03-26', note: 'Website form submission.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-28', note: 'Left voicemail and sent email. Customer responded via email.' },
],
},
{
id: 'kl_009', name: 'Joel Fernandez', address: '3901 Legacy Dr, Plano TX 75023',
phone: '(972) 555-0109', email: 'joel.f@yahoo.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_contacted', bucketId: null,
notes: 'Insurance claim in process. Wants estimate ASAP.',
createdDate: '2026-03-24',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-24', note: 'Door knock — wind damage to siding panels.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-26', note: 'Phone call completed. Adjuster visit scheduled for Mar 30.' },
],
},
{
id: 'kl_010', name: 'Patricia Yuen', address: '7742 Kings Rd, Plano TX 75024',
phone: '(972) 555-0110', email: 'pyuen@outlook.com',
jobType: 'Gutter Repair', insuranceType: 'Retail',
assignedAgentId: 'e3', assignedAgentName: 'Fred Flyer',
columnId: 'kc_contacted', bucketId: null,
notes: 'Gutters pulling away from fascia. Straightforward repair job.',
createdDate: '2026-03-27',
activity: [
{ from: null, to: 'New Lead', by: 'Fred Flyer', date: '2026-03-27', note: 'Referral from neighborhood Facebook group.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fred Flyer', date: '2026-03-29', note: 'Quick call — confirmed issue and availability. Working on appointment.' },
],
},
{
id: 'kl_011', name: 'Gerald Obi', address: '5220 Midway Rd, Plano TX 75093',
phone: '(972) 555-0111', email: 'gerald.obi@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_contacted', bucketId: null,
notes: 'Large home — 3,200 sq ft. Multiple storm claims history.',
createdDate: '2026-03-22',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-22', note: 'Canvassing — prior storm claim visible in public records.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-25', note: 'Met in person at door. Very interested — asked for references.' },
],
},
// ── APPT SCHEDULED (6 leads) ────────────────────────────────────────────
{
id: 'kl_012', name: 'Vanessa Obrien', address: '1450 Park Blvd, Plano TX 75074',
phone: '(972) 555-0112', email: 'vanessa.ob@icloud.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_appt', bucketId: null,
notes: 'Appointment Apr 9 at 10am. Adjuster already completed visit.',
createdDate: '2026-03-18',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-18', note: 'Storm canvassing — visible hail damage.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-20', note: 'Phone call — very interested, adjuster already came out.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-03-22', note: 'Appointment confirmed for Apr 9 at 10am.' },
],
},
{
id: 'kl_013', name: 'Thomas Greer', address: '892 Mapleshade Ln, Plano TX 75075',
phone: '(972) 555-0113', email: 'thomas.g@yahoo.com',
jobType: 'Roof Inspection', insuranceType: 'Retail',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_appt', bucketId: null,
notes: 'Appointment Apr 8 at 2pm. Retired homeowner, very detail-oriented.',
createdDate: '2026-03-20',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-03-20', note: 'Referral from existing client.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-22', note: 'Email exchange — wants full report after inspection.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-03-25', note: 'Confirmed Apr 8 at 2pm via email.' },
],
},
{
id: 'kl_014', name: 'Lashonda Webb', address: '3015 Plano Pkwy, Plano TX 75074',
phone: '(972) 555-0114', email: 'lashonda.w@gmail.com',
jobType: 'Siding + Gutters', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_appt', bucketId: null,
notes: 'Combo job — siding and gutters. Apr 10 morning slot.',
createdDate: '2026-03-15',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-15', note: 'Door knock — wind damage to siding and gutters overflowing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-17', note: 'Called and texted. Customer confirmed she filed insurance.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-03-21', note: 'Apr 10 morning slot — customer will have spouse present.' },
],
},
{
id: 'kl_015', name: 'Winston Park', address: '6601 Ohio Dr, Plano TX 75093',
phone: '(972) 555-0115', email: 'wpark@outlook.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_appt', bucketId: null,
notes: 'Large flat-roof section at the back. Appointment Apr 11.',
createdDate: '2026-03-19',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-03-19', note: 'Website lead — searched storm damage repair.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-03-21', note: 'Spoke on phone. Mentioned flat roof section in addition to pitched.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-03-24', note: 'Confirmed Apr 11 at 9am. Will need extra time for flat section.' },
],
},
{
id: 'kl_016', name: 'Ingrid Solis', address: '2244 Aster Ct, Plano TX 75025',
phone: '(972) 555-0116', email: 'ingrid.s@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_appt', bucketId: null,
notes: 'Cash purchase — no insurance. Appointment Apr 12.',
createdDate: '2026-03-23',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-23', note: 'Referral. Cash buyer — no insurance involved.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-25', note: 'Spoke briefly. She is very decisive — ready to move fast.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-03-27', note: 'Apr 12 at 11am confirmed.' },
],
},
{
id: 'kl_017', name: 'Darnell Brooks', address: '4408 Springbrook Dr, Plano TX 75024',
phone: '(972) 555-0117', email: 'd.brooks@yahoo.com',
jobType: 'Chimney + Roof Repair', insuranceType: 'Insurance',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_appt', bucketId: null,
notes: 'Chimney flashing leaking badly. Appointment rescheduled twice — Apr 14 final.',
createdDate: '2026-03-10',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-03-10', note: 'Inbound call — chimney leak causing interior ceiling damage.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-12', note: 'Full conversation — insurance claim open. Adjuster not yet assigned.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-03-14', note: 'Apr 1 appointment set.' },
{ from: 'Appt Scheduled', to: 'Contacted', by: 'Fiona Field', date: '2026-03-30', note: 'Customer rescheduled — work conflict. Moved back to Contacted.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-04-01', note: 'Rescheduled again — Apr 14 this time. Confirmed via text.' },
],
},
// ── ESTIMATE SENT (5 leads) ─────────────────────────────────────────────
{
id: 'kl_018', name: 'Gloria Hutchins', address: '1738 Roundrock Trl, Plano TX 75023',
phone: '(972) 555-0118', email: 'gloria.h@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_estimate', bucketId: null,
notes: 'Estimate sent Mar 28. Waiting on her to review with husband.',
createdDate: '2026-03-05',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-05', note: 'Canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-07', note: 'Phone call — confirmed hail damage.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-03-10', note: 'Appointment set for Mar 15.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-03-28', note: 'Inspection completed. Estimate emailed + printed copy left.' },
],
},
{
id: 'kl_019', name: 'Devon Mathis', address: '5902 Braewood Dr, Plano TX 75093',
phone: '(972) 555-0119', email: 'devon.m@hotmail.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_estimate', bucketId: null,
notes: 'Estimate under review. Customer comparing quotes.',
createdDate: '2026-03-08',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-08', note: 'Storm canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-10', note: 'Met at door — comparing two companies.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-03-13', note: 'Appointment Mar 18.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-03-25', note: 'Estimate sent via email. Mentioned competitor quote is $1,200 less.' },
],
},
{
id: 'kl_020', name: 'Karen Blankenship', address: '3127 Arbor Creek Dr, Plano TX 75025',
phone: '(972) 555-0120', email: 'karen.b@yahoo.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_estimate', bucketId: null,
notes: 'Cash deal. Estimate $24K. Very interested — just reviewing financing options.',
createdDate: '2026-03-12',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-03-12', note: 'Referral from sister who is an existing client.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-14', note: 'Long first call — very motivated buyer.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-03-16', note: 'Inspection Mar 20 at 9am.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fiona Field', date: '2026-03-22', note: 'Detailed estimate sent. Customer asked about payment plans.' },
],
},
{
id: 'kl_021', name: 'Lionel Chambers', address: '720 Coit Rd, Plano TX 75075',
phone: '(972) 555-0121', email: 'lionel.c@gmail.com',
jobType: 'Gutters + Fascia', insuranceType: 'Insurance',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_estimate', bucketId: null,
notes: 'Adjuster approved full replacement. Estimate matches scope perfectly.',
createdDate: '2026-03-01',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-03-01', note: 'Referral — gutters completely detached on one side.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-03-03', note: 'Spoke on phone — insurance claim already filed.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-03-05', note: 'Mar 10 appointment.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felix Fixer', date: '2026-03-18', note: 'Estimate emailed. Adjuster scope matches ours exactly — good sign.' },
],
},
{
id: 'kl_022', name: 'Ruthanne Patel', address: '4321 Hedgcoxe Rd, Plano TX 75024',
phone: '(972) 555-0122', email: 'rpatel@outlook.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_estimate', bucketId: null,
notes: 'Estimate sent 3 weeks ago. Not responding to follow-ups.',
createdDate: '2026-02-20',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-02-20', note: 'Canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-02-22', note: 'Brief call — seemed interested.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-02-25', note: 'Mar 1 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-03-10', note: 'Estimate sent. No response to 3 follow-up texts since.' },
],
},
// ── SIGNED (5 leads) ────────────────────────────────────────────────────
{
id: 'kl_023', name: 'Charlotte Norris', address: '2908 Roundabout Ln, Plano TX 75023',
phone: '(972) 555-0123', email: 'charlotte.n@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_signed', bucketId: null,
notes: 'Signed Mar 22. Install scheduled for Apr 14.',
createdDate: '2026-03-01',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-01', note: 'Storm canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-03', note: 'Phone call — eager to move quickly.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-03-05', note: 'Inspection Mar 8.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-03-10', note: 'Estimate sent — $18,200.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felicity Fast', date: '2026-03-22', note: 'Contract signed! Install Apr 14. Deposit received.' },
],
},
{
id: 'kl_024', name: 'Henry Castaneda', address: '5614 Ridgewood Dr, Plano TX 75093',
phone: '(972) 555-0124', email: 'hcastaneda@yahoo.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_signed', bucketId: null,
notes: 'Signed. Full siding replacement — 2,400 sq ft. Production queue.',
createdDate: '2026-02-28',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-02-28', note: 'Referral.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-02', note: 'Phone call and site visit same day.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-03-04', note: 'Mar 7 appointment.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fiona Field', date: '2026-03-12', note: 'Estimate $31,500 for full siding.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Fiona Field', date: '2026-03-20', note: 'Signed. Insurance approved full scope.' },
],
},
{
id: 'kl_025', name: 'Yvonne Blackwell', address: '3401 Parker Rd, Plano TX 75023',
phone: '(972) 555-0125', email: 'yblackwell@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_signed', bucketId: null,
notes: 'Cash client. Signed fast — paid 50% deposit upfront.',
createdDate: '2026-03-05',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-05', note: 'Referral — cash buyer, wants premium materials.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-06', note: 'Met same day — very decisive.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-03-07', note: 'Next-day inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-03-09', note: 'Same-day estimate — $27,800 for full replacement + ice/water barrier.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Frank Agent', date: '2026-03-11', note: 'Signed within 48 hrs. 50% deposit paid.' },
],
},
{
id: 'kl_026', name: 'Emmanuel Okafor', address: '4812 Mapleshade Ln, Plano TX 75075',
phone: '(972) 555-0126', email: 'e.okafor@outlook.com',
jobType: 'Roof + Gutters', insuranceType: 'Insurance',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_signed', bucketId: null,
notes: 'Combined roof and gutter job. Production scheduled Apr 18.',
createdDate: '2026-03-03',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-03-03', note: 'Storm canvassing — gutters completely detached on west side.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-03-05', note: 'Called and texted. Confirmed both roof and gutter damage.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-03-08', note: 'Mar 12 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felix Fixer', date: '2026-03-15', note: 'Combined estimate $22,400 sent.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felix Fixer', date: '2026-03-25', note: 'Signed after adjuster confirmation. Install Apr 18.' },
],
},
{
id: 'kl_027', name: 'Adriana Voss', address: '1820 Custer Rd, Plano TX 75075',
phone: '(972) 555-0127', email: 'adriana.v@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_signed', bucketId: null,
notes: 'Signed after lengthy negotiation on supplemental items.',
createdDate: '2026-02-15',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-02-15', note: 'Canvassing after January wind event.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-02-17', note: 'Called — open to inspection.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-02-19', note: 'Feb 22 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-02-25', note: 'Estimate sent $19,600.' },
{ from: 'Estimate Sent', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-05', note: 'Customer pushed back on supplement items — moved back to review.' },
{ from: 'Contacted', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-03-10', note: 'Revised estimate sent after supplement agreement with adjuster.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felicity Fast', date: '2026-03-28', note: 'Signed after adjuster approved supplemental items.' },
],
},
// ── IN PROGRESS (6 leads) ───────────────────────────────────────────────
{
id: 'kl_028', name: 'Marvin Delgado', address: '6820 Windhaven Pkwy, Plano TX 75024',
phone: '(972) 555-0128', email: 'mdelgado@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_progress', bucketId: null,
notes: 'Tear-off complete. New decking going on today.',
createdDate: '2026-02-10',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-02-10', note: 'Storm canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-02-12', note: 'Call completed.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-02-14', note: 'Feb 17 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-02-20', note: 'Estimate sent $16,800.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Frank Agent', date: '2026-02-28', note: 'Signed. Production team notified.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-03-18', note: 'Production started — tear-off crew on site.' },
],
},
{
id: 'kl_029', name: 'Sandra Tran', address: '2506 Springpark Dr, Plano TX 75023',
phone: '(972) 555-0129', email: 's.tran@yahoo.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_progress', bucketId: null,
notes: 'Day 3 of install. On track for completion Friday.',
createdDate: '2026-02-08',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-02-08', note: 'Referral.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-02-10', note: 'Initial call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-02-12', note: 'Feb 15 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fiona Field', date: '2026-02-18', note: 'Estimate $28,500 for full siding.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Fiona Field', date: '2026-02-25', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-03-25', note: 'Siding crew on site — Day 1.' },
],
},
{
id: 'kl_030', name: 'Reginald Hopper', address: '1504 Estates Dr, Plano TX 75093',
phone: '(972) 555-0130', email: 'reg.hopper@icloud.com',
jobType: 'Roof + Gutters', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_progress', bucketId: null,
notes: 'Roofing done. Gutters crew arriving tomorrow.',
createdDate: '2026-02-05',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-02-05', note: 'Door knock.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-02-07', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-02-10', note: 'Feb 14 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-02-17', note: 'Estimate sent $21,200.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felicity Fast', date: '2026-02-24', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Amanda Manager',date: '2026-03-20', note: 'Production underway — roofing crew Day 1.' },
],
},
{
id: 'kl_031', name: 'Nadia Thornton', address: '5150 Preston Rd, Plano TX 75024',
phone: '(972) 555-0131', email: 'nadia.t@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_progress', bucketId: null,
notes: 'Premium GAF Timberline HDZ install. Custom color.',
createdDate: '2026-02-12',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-02-12', note: 'Referral — high-end home.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-02-14', note: 'Met in person. Requested premium material options.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-02-17', note: 'Feb 20 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felix Fixer', date: '2026-02-24', note: 'Premium estimate $34,500 including ice/water and lifetime warranty.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felix Fixer', date: '2026-03-03', note: 'Signed — wants Barkwood color. Special order placed.' },
{ from: 'Signed', to: 'In Progress', by: 'Amanda Manager',date: '2026-03-28', note: 'Materials arrived. Install started today.' },
],
},
{
id: 'kl_032', name: 'Clifford Aguilar', address: '3822 Haverwood Ln, Plano TX 75023',
phone: '(972) 555-0132', email: 'c.aguilar@outlook.com',
jobType: 'Siding Repair', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_progress', bucketId: null,
notes: 'Partial siding repair only — south and west faces. 2 days left.',
createdDate: '2026-02-18',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-02-18', note: 'Storm canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-02-20', note: 'Called.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-02-22', note: 'Feb 25 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-02-28', note: 'Partial repair estimate $9,400.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Frank Agent', date: '2026-03-07', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-04-01', note: 'Crew on site — south face complete.' },
],
},
{
id: 'kl_033', name: 'Tamara Owens', address: '2010 Oak Creek Blvd, Plano TX 75023',
phone: '(972) 555-0133', email: 'tamara.o@yahoo.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_progress', bucketId: null,
notes: 'Large job — 3,600 sq ft. Day 1 of 3.',
createdDate: '2026-02-01',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-02-01', note: 'Referral — large home, significant hail damage.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-02-03', note: 'Met in person — urgent, water coming in.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-02-04', note: 'Next-day inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fiona Field', date: '2026-02-08', note: 'Estimate $42,000 for 3,600 sq ft.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Fiona Field', date: '2026-02-15', note: 'Signed — largest job this quarter.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-04-05', note: 'Production started — 3-day job. Two crews deployed.' },
],
},
// ── COMPLETE (5 leads) ──────────────────────────────────────────────────
{
id: 'kl_034', name: 'Craig Singleton', address: '4110 Lorimar Dr, Plano TX 75093',
phone: '(972) 555-0134', email: 'craig.s@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_complete', bucketId: null,
notes: 'Job complete. Final walkthrough done. Client extremely happy.',
createdDate: '2026-01-15',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-01-15', note: 'Canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-01-17', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-01-20', note: 'Jan 23 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-01-25', note: 'Estimate $17,200.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Frank Agent', date: '2026-02-01', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-02-20', note: 'Install Day 1.' },
{ from: 'In Progress', to: 'Complete', by: 'Adam Admin', date: '2026-03-01', note: 'Job complete. Final walkthrough passed. Client left 5-star review.' },
],
},
{
id: 'kl_035', name: 'Bertha Fleming', address: '6230 West Parker Rd, Plano TX 75093',
phone: '(972) 555-0135', email: 'bertha.f@hotmail.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_complete', bucketId: null,
notes: 'Complete. Insurance check received and deposited.',
createdDate: '2026-01-10',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-01-10', note: 'Referral.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-01-12', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-01-14', note: 'Jan 17 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-01-20', note: 'Estimate $26,400.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felicity Fast', date: '2026-01-28', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Amanda Manager',date: '2026-02-15', note: 'Production started.' },
{ from: 'In Progress', to: 'Complete', by: 'Amanda Manager',date: '2026-02-22', note: 'Complete. Insurance proceeds processed.' },
],
},
{
id: 'kl_036', name: 'Oliver Stanton', address: '3750 Legacy Dr, Plano TX 75023',
phone: '(972) 555-0136', email: 'oliver.st@outlook.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_complete', bucketId: null,
notes: 'Cash deal done. Referral bonus owed to Oliver per agreement.',
createdDate: '2026-01-20',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-01-20', note: 'Referral — cash buyer.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-01-22', note: 'Same-day call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fiona Field', date: '2026-01-23', note: 'Jan 25 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fiona Field', date: '2026-01-27', note: 'Estimate $22,100.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Fiona Field', date: '2026-01-30', note: 'Signed within 72 hrs. Full payment upfront.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-02-18', note: 'Install started.' },
{ from: 'In Progress', to: 'Complete', by: 'Adam Admin', date: '2026-02-20', note: 'Complete — quick 2-day job. Outstanding quality.' },
],
},
{
id: 'kl_037', name: 'Daphne Garrett', address: '1912 Mira Vista Dr, Plano TX 75025',
phone: '(972) 555-0137', email: 'daphne.g@gmail.com',
jobType: 'Gutters + Fascia', insuranceType: 'Insurance',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_complete', bucketId: null,
notes: 'Complete. Customer requested referral card — strong close.',
createdDate: '2026-01-25',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-01-25', note: 'Door knock.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-01-27', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-01-29', note: 'Feb 1 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felix Fixer', date: '2026-02-04', note: 'Estimate $8,900.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felix Fixer', date: '2026-02-10', note: 'Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Adam Admin', date: '2026-02-28', note: 'Install started.' },
{ from: 'In Progress', to: 'Complete', by: 'Adam Admin', date: '2026-03-02', note: 'Job done. Customer gave referral card to 3 neighbors.' },
],
},
{
id: 'kl_038', name: 'Nathaniel Cruz', address: '5808 Tennyson Pkwy, Plano TX 75024',
phone: '(972) 555-0138', email: 'ncruz@icloud.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_complete', bucketId: null,
notes: 'Complete. Longest pipeline — 7 week close. Insurance supplemental was complex.',
createdDate: '2026-01-05',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-01-05', note: 'Canvassing post-December storm.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-01-07', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felicity Fast', date: '2026-01-10', note: 'Jan 14 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-01-17', note: 'Estimate $19,400.' },
{ from: 'Estimate Sent', to: 'Contacted', by: 'Felicity Fast', date: '2026-01-28', note: 'Insurance underpaid — back to negotiation.' },
{ from: 'Contacted', to: 'Estimate Sent', by: 'Felicity Fast', date: '2026-02-05', note: 'Revised estimate submitted to adjuster.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Felicity Fast', date: '2026-02-18', note: 'Adjuster approved supplement. Signed.' },
{ from: 'Signed', to: 'In Progress', by: 'Amanda Manager',date: '2026-03-05', note: 'Production started.' },
{ from: 'In Progress', to: 'Complete', by: 'Amanda Manager',date: '2026-03-12', note: 'Job complete. Long road but great outcome.' },
],
},
// ── STUCK bucket (3 leads — have columnId from last stage + bucketId) ───
{
id: 'kl_039', name: 'Jasmine Fowler', address: '2730 Hedgcoxe Rd, Plano TX 75024',
phone: '(972) 555-0139', email: 'jasmine.f@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e3', assignedAgentName: 'Fred Flyer',
columnId: 'kc_estimate', bucketId: 'kc_stuck',
notes: 'Stuck — adjuster denied claim. Customer disputing. No movement for 3 weeks.',
createdDate: '2026-02-25',
activity: [
{ from: null, to: 'New Lead', by: 'Fred Flyer', date: '2026-02-25', note: 'Canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fred Flyer', date: '2026-02-27', note: 'Call — insurance claim just filed.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fred Flyer', date: '2026-03-01', note: 'Mar 5 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fred Flyer', date: '2026-03-10', note: 'Estimate sent $15,800. Adjuster denied most of scope.' },
{ from: 'Estimate Sent', to: 'Stuck', by: 'Fred Flyer', date: '2026-03-18', note: 'Moved to Stuck — adjuster denial under dispute. Waiting on public adjuster.' },
],
},
{
id: 'kl_040', name: 'Calvin Merritt', address: '3640 Alma Dr, Plano TX 75023',
phone: '(972) 555-0140', email: 'calvin.m@yahoo.com',
jobType: 'Siding Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e2', assignedAgentName: 'Fiona Field',
columnId: 'kc_contacted', bucketId: 'kc_stuck',
notes: 'Stuck — homeowner going through divorce. Put project on hold indefinitely.',
createdDate: '2026-03-10',
activity: [
{ from: null, to: 'New Lead', by: 'Fiona Field', date: '2026-03-10', note: 'Referral.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fiona Field', date: '2026-03-12', note: 'Good initial call but complicated personal situation mentioned.' },
{ from: 'Contacted', to: 'Stuck', by: 'Fiona Field', date: '2026-03-20', note: 'Moved to Stuck — customer put everything on hold due to divorce proceedings.' },
],
},
{
id: 'kl_041', name: 'Harriet Simmons', address: '4905 Ohio Dr, Plano TX 75093',
phone: '(972) 555-0141', email: 'harriet.s@outlook.com',
jobType: 'Roof Replacement', insuranceType: 'Retail',
assignedAgentId: 'e5', assignedAgentName: 'Felix Fixer',
columnId: 'kc_appt', bucketId: 'kc_stuck',
notes: 'Stuck — missed 3 appointments. No answer on phone. Left door hanger.',
createdDate: '2026-03-05',
activity: [
{ from: null, to: 'New Lead', by: 'Felix Fixer', date: '2026-03-05', note: 'Door knock — interested in retail replacement.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felix Fixer', date: '2026-03-07', note: 'Brief call — set appointment.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Felix Fixer', date: '2026-03-09', note: 'Mar 14 appointment set.' },
{ from: 'Appt Scheduled',to: 'Stuck', by: 'Felix Fixer', date: '2026-03-28', note: 'No-showed 3 appointments. Phone goes to voicemail. Marked stuck.' },
],
},
// ── FOLLOW-UP bucket (3 leads) ───────────────────────────────────────────
{
id: 'kl_042', name: 'Floyd Saunders', address: '1344 Spring Creek Pkwy, Plano TX 75023',
phone: '(972) 555-0142', email: 'floyd.s@gmail.com',
jobType: 'Roof Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e1', assignedAgentName: 'Frank Agent',
columnId: 'kc_estimate', bucketId: 'kc_followup',
notes: 'Follow-up Apr 10 — customer said to call after spring break. Very warm lead.',
createdDate: '2026-03-15',
activity: [
{ from: null, to: 'New Lead', by: 'Frank Agent', date: '2026-03-15', note: 'Storm canvassing.' },
{ from: 'New Lead', to: 'Contacted', by: 'Frank Agent', date: '2026-03-17', note: 'Call — interested but said call back after spring break.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Frank Agent', date: '2026-03-18', note: 'Mar 20 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Frank Agent', date: '2026-03-22', note: 'Estimate sent $17,600.' },
{ from: 'Estimate Sent', to: 'Follow-up', by: 'Frank Agent', date: '2026-03-25', note: 'Moved to Follow-up — scheduled callback Apr 10.' },
],
},
{
id: 'kl_043', name: 'Miriam Obando', address: '2217 Independence Pkwy, Plano TX 75025',
phone: '(972) 555-0143', email: 'miriam.o@icloud.com',
jobType: 'Roof Inspection', insuranceType: 'Retail',
assignedAgentId: 'e4', assignedAgentName: 'Felicity Fast',
columnId: 'kc_contacted', bucketId: 'kc_followup',
notes: 'Follow-up Apr 15 — currently traveling abroad. Callback confirmed via text.',
createdDate: '2026-03-20',
activity: [
{ from: null, to: 'New Lead', by: 'Felicity Fast', date: '2026-03-20', note: 'Website form lead.' },
{ from: 'New Lead', to: 'Contacted', by: 'Felicity Fast', date: '2026-03-22', note: 'Text conversation — customer is abroad until Apr 13.' },
{ from: 'Contacted', to: 'Follow-up', by: 'Felicity Fast', date: '2026-03-23', note: 'Moved to Follow-up — callback Apr 15 confirmed via text.' },
],
},
{
id: 'kl_044', name: 'Jerome Watkins', address: '3908 Plano Pkwy, Plano TX 75074',
phone: '(972) 555-0144', email: 'jerome.w@yahoo.com',
jobType: 'Gutter Replacement', insuranceType: 'Insurance',
assignedAgentId: 'e3', assignedAgentName: 'Fred Flyer',
columnId: 'kc_signed', bucketId: 'kc_followup',
notes: 'Signed but waiting on HOA approval before starting. Follow-up Apr 20.',
createdDate: '2026-03-08',
activity: [
{ from: null, to: 'New Lead', by: 'Fred Flyer', date: '2026-03-08', note: 'Referral.' },
{ from: 'New Lead', to: 'Contacted', by: 'Fred Flyer', date: '2026-03-10', note: 'Call.' },
{ from: 'Contacted', to: 'Appt Scheduled', by: 'Fred Flyer', date: '2026-03-12', note: 'Mar 15 inspection.' },
{ from: 'Appt Scheduled', to: 'Estimate Sent', by: 'Fred Flyer', date: '2026-03-18', note: 'Estimate $6,200.' },
{ from: 'Estimate Sent', to: 'Signed', by: 'Fred Flyer', date: '2026-03-25', note: 'Signed — waiting on HOA approval to start.' },
{ from: 'Signed', to: 'Follow-up', by: 'Fred Flyer', date: '2026-03-28', note: 'HOA review pending. Follow-up Apr 20 for approval status.' },
],
},
];
// --- CONTEXT SETUP ---
const MockStoreContext = createContext();
@@ -3642,6 +4344,8 @@ export const MockStoreProvider = ({ children }) => {
const [templateAccessRoles, setTemplateAccessRoles] = useState([]);
const [templateAccessUsers, setTemplateAccessUsers] = useState([]);
const [templateAccessExcluded, setTemplateAccessExcluded] = useState([]);
const [kanbanColumns, setKanbanColumns] = useState(KANBAN_COLUMNS_INITIAL);
const [kanbanLeads, setKanbanLeads] = useState(KANBAN_LEADS_INITIAL);
// Initialize properties once
useEffect(() => {
@@ -3762,6 +4466,42 @@ export const MockStoreProvider = ({ children }) => {
setTemplateAccessUsers,
setTemplateAccessExcluded,
// Kanban
kanbanColumns,
kanbanLeads,
moveKanbanLead: (leadId, newColumnId, newBucketId) => {
setKanbanLeads(prev => prev.map(l => {
if (l.id !== leadId) return l;
const col = KANBAN_COLUMNS_INITIAL.find(c => c.id === newColumnId) ||
kanbanColumns.find(c => c.id === newColumnId);
const stageName = col?.name ?? newColumnId;
const newActivity = {
from: l.bucketId
? l.kanbanColumns?.find?.(c => c.id === l.bucketId)?.name ?? 'Bucket'
: (kanbanColumns.find(c => c.id === l.columnId)?.name ?? l.columnId),
to: stageName,
by: 'You',
date: new Date().toISOString().slice(0, 10),
note: null,
};
return { ...l, columnId: newColumnId, bucketId: newBucketId ?? null, activity: [newActivity, ...l.activity] };
}));
},
addKanbanColumn: (col) => {
const newCol = { ...col, id: `kc_custom_${Date.now()}` };
setKanbanColumns(prev => [...prev, newCol]);
return newCol;
},
updateKanbanColumn: (id, data) => {
setKanbanColumns(prev => prev.map(c => c.id === id ? { ...c, ...data } : c));
},
deleteKanbanColumn: (id) => {
setKanbanColumns(prev => prev.filter(c => c.id !== id));
},
updateKanbanLead: (id, data) => {
setKanbanLeads(prev => prev.map(l => l.id === id ? { ...l, ...data } : l));
},
// Estimates
estimates,
addEstimate: (est) => {