Files
policy-ui/app/data/mock-customers.ts
Jordan Weingarten 67482f6629 WIP jordan
2026-04-16 11:11:44 -05:00

462 lines
23 KiB
TypeScript

/**
* Mock customer data for visual design & demo.
* Each client has realistic policies, claims, payments, and activity.
*/
export type MockPolicy = {
id: string
line: string
carrier: string
product: string
premium: number
status: 'Active' | 'Pending' | 'Lapsed' | 'Cancelled'
renewal: string
icon: string
details?: string
referralChannel?: string
}
export type MockClaim = {
id: string
policy: string
type: string
date: string
amount: number
status: 'In progress' | 'Resolved' | 'Denied' | 'Under review'
}
export type MockPayment = {
date: string
amount: number
policy: string
method: string
status: 'Paid' | 'Pending' | 'Overdue' | 'Failed'
}
export type MockActivityEvent = {
date: string
text: string
type: 'claim' | 'payment' | 'renewal' | 'quote' | 'note' | 'policy' | 'onboarding'
}
/**
* Customer tier — derived from data completeness & policy status:
* quick_lead — minimal capture (name + phone/email only)
* lead — profile info but no policies yet
* customer — has at least one active policy
* cancelled — had policies but all cancelled / lapsed
*/
export type CustomerTier = 'quick_lead' | 'lead' | 'customer' | 'cancelled'
export type MockCustomer = {
id: string
name: string
initials: string
type: 'Individual' | 'Corporate'
documentId: string
email: string
phone: string
birthDate: string
gender: string
address: string
since: string
agent: string
preferredLang: string
tags: string[]
policies: MockPolicy[]
claims: MockClaim[]
payments: MockPayment[]
activity: MockActivityEvent[]
paymentStatus: 'Current' | 'Overdue' | 'Grace period' | 'N/A'
}
/** Derive tier from customer data */
export function customerTier(c: MockCustomer): CustomerTier {
if (c.policies.length === 0 && (!c.documentId || c.documentId === '—') && !c.address) return 'quick_lead'
if (c.policies.length === 0) return 'lead'
const hasActive = c.policies.some(p => p.status === 'Active' || p.status === 'Pending')
if (!hasActive) return 'cancelled'
return 'customer'
}
/* ────────────────────────────────────────────── */
/* 1 · María Elena Pérez Solano */
/* ────────────────────────────────────────────── */
const maria: MockCustomer = {
id: 'cust-001',
name: 'María Elena Pérez Solano',
initials: 'MP',
type: 'Individual',
documentId: '1-0456-0812',
email: 'maria.perez@email.com',
phone: '+506 8834-2291',
birthDate: '1988-03-14',
gender: 'Female',
address: 'San José, Escazú, Trejos Montealegre',
since: '2021-06-10',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['VIP', 'Referral source'],
paymentStatus: 'Current',
policies: [
{ id: 'POL-2024-4412', line: 'Auto', carrier: 'ASSA', product: '2023 Toyota RAV4 — SJO-4412', premium: 1840, status: 'Active', renewal: '2025-06-15', icon: 'i-heroicons-truck', details: 'Comprehensive • $500 deductible', referralChannel: 'Direct walk-in' },
{ id: 'POL-2024-7788', line: 'Life', carrier: 'INS', product: 'Individual health plan', premium: 3200, status: 'Active', renewal: '2025-09-01', icon: 'i-heroicons-heart', details: 'Gold tier • Dental included', referralChannel: 'Direct walk-in' },
{ id: 'POL-2023-1190', line: 'Life', carrier: 'Mapfre', product: 'Term life — 20yr, $250K', premium: 960, status: 'Active', renewal: '2026-01-10', icon: 'i-heroicons-shield-check', details: 'Beneficiary: Carlos Pérez (spouse)', referralChannel: 'Cross-sell' },
],
claims: [
{ id: 'CL-2891', policy: 'POL-2024-4412', type: 'Collision', date: '2025-02-18', amount: 4200, status: 'In progress' },
{ id: 'CL-2204', policy: 'POL-2024-7788', type: 'Medical reimbursement', date: '2024-08-05', amount: 1100, status: 'Resolved' },
],
payments: [
{ date: '2025-04-01', amount: 540, policy: 'POL-2024-4412', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-04-01', amount: 267, policy: 'POL-2024-7788', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-03-01', amount: 540, policy: 'POL-2024-4412', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-03-01', amount: 267, policy: 'POL-2024-7788', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-03-01', amount: 80, policy: 'POL-2023-1190', method: 'Transfer', status: 'Paid' },
],
activity: [
{ date: 'Today', text: 'Auto claim CL-2891 — adjuster report uploaded', type: 'claim' },
{ date: 'Yesterday', text: 'Health premium payment confirmed ($267)', type: 'payment' },
{ date: 'Mar 28', text: 'Renewal notice sent for Auto policy', type: 'renewal' },
{ date: 'Mar 15', text: 'Quote requested: Home insurance', type: 'quote' },
{ date: 'Feb 18', text: 'Collision claim filed — CL-2891', type: 'claim' },
],
}
/* ────────────────────────────────────────────── */
/* 2 · Roberto Jiménez Mora */
/* ────────────────────────────────────────────── */
const roberto: MockCustomer = {
id: 'cust-002',
name: 'Roberto Jiménez Mora',
initials: 'RJ',
type: 'Individual',
documentId: '3-0321-0654',
email: 'roberto.jimenez@correo.cr',
phone: '+506 7012-8845',
birthDate: '1975-11-22',
gender: 'Male',
address: 'Heredia, Belén, La Asunción',
since: '2019-02-15',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['Long-term client'],
paymentStatus: 'Current',
policies: [
{ id: 'POL-2023-3301', line: 'Auto', carrier: 'Qualitas', product: '2021 Hyundai Tucson — HER-9901', premium: 1520, status: 'Active', renewal: '2025-08-20', icon: 'i-heroicons-truck', details: 'Comprehensive • $750 deductible', referralChannel: 'Referral — client' },
{ id: 'POL-2023-3302', line: 'Auto', carrier: 'Qualitas', product: '2019 Honda CRV — HER-6632', premium: 1280, status: 'Active', renewal: '2025-08-20', icon: 'i-heroicons-truck', details: 'Comprehensive • $750 deductible • Spouse vehicle', referralChannel: 'Referral — client' },
{ id: 'POL-2022-1010', line: 'Home', carrier: 'ASSA', product: 'Homeowner — Belén residence', premium: 890, status: 'Active', renewal: '2025-11-01', icon: 'i-heroicons-home-modern', details: 'Dwelling $185K • Contents $40K • Earthquake included', referralChannel: 'Cross-sell' },
{ id: 'POL-2024-5500', line: 'Life', carrier: 'Pan-American Life', product: 'Whole life — $150K', premium: 1440, status: 'Active', renewal: '2026-02-15', icon: 'i-heroicons-shield-check', details: 'Beneficiary: Lucía Jiménez (spouse)', referralChannel: 'Cross-sell' },
{ id: 'POL-2024-5501', line: 'General Risk', carrier: 'INS', product: 'Personal umbrella — $1M', premium: 420, status: 'Active', renewal: '2025-12-01', icon: 'i-heroicons-shield-exclamation', details: 'Excess liability over auto + home', referralChannel: 'Cross-sell' },
],
claims: [
{ id: 'CL-1840', policy: 'POL-2022-1010', type: 'Water damage', date: '2024-04-12', amount: 6800, status: 'Resolved' },
{ id: 'CL-2105', policy: 'POL-2023-3301', type: 'Windshield', date: '2024-11-28', amount: 450, status: 'Resolved' },
],
payments: [
{ date: '2025-04-01', amount: 233, policy: 'POL-2023-3301', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-04-01', amount: 197, policy: 'POL-2023-3302', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-04-01', amount: 74, policy: 'POL-2022-1010', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-04-01', amount: 120, policy: 'POL-2024-5500', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-03-01', amount: 233, policy: 'POL-2023-3301', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-03-01', amount: 197, policy: 'POL-2023-3302', method: 'Auto-debit', status: 'Paid' },
],
activity: [
{ date: 'Yesterday', text: 'Monthly premium auto-debited ($624)', type: 'payment' },
{ date: 'Mar 30', text: 'Umbrella policy annual review scheduled', type: 'renewal' },
{ date: 'Mar 15', text: 'Quote requested: Teen driver add-on', type: 'quote' },
{ date: 'Feb 20', text: 'Home policy endorsement — added jewelry rider', type: 'policy' },
{ date: 'Jan 10', text: 'Windshield claim CL-2105 resolved ($450)', type: 'claim' },
{ date: 'Dec 15', text: 'Year-end portfolio review completed', type: 'note' },
],
}
/* ────────────────────────────────────────────── */
/* 3 · Carolina Fallas Vargas */
/* ────────────────────────────────────────────── */
const carolina: MockCustomer = {
id: 'cust-003',
name: 'Carolina Fallas Vargas',
initials: 'CF',
type: 'Individual',
documentId: '2-0589-0177',
email: 'carolina.fallas@gmail.com',
phone: '+506 6198-3340',
birthDate: '1992-07-30',
gender: 'Female',
address: 'Cartago, Paraíso, Orosí',
since: '2023-09-05',
agent: 'Marco V.',
preferredLang: 'Spanish',
tags: ['New client'],
paymentStatus: 'Current',
policies: [
{ id: 'POL-2024-8810', line: 'Auto', carrier: 'INS', product: '2024 Kia Sportage — CAR-1177', premium: 1650, status: 'Active', renewal: '2025-09-05', icon: 'i-heroicons-truck', details: 'Comprehensive • $500 deductible', referralChannel: 'Facebook campaign' },
{ id: 'POL-2024-8811', line: 'Home', carrier: 'ASSA', product: "Renter's insurance — Paraíso apt", premium: 320, status: 'Active', renewal: '2025-09-05', icon: 'i-heroicons-home-modern', details: 'Contents $25K • Liability $100K', referralChannel: 'Facebook campaign' },
],
claims: [],
payments: [
{ date: '2025-04-01', amount: 138, policy: 'POL-2024-8810', method: 'Credit card', status: 'Paid' },
{ date: '2025-04-01', amount: 27, policy: 'POL-2024-8811', method: 'Credit card', status: 'Paid' },
{ date: '2025-03-01', amount: 138, policy: 'POL-2024-8810', method: 'Credit card', status: 'Paid' },
{ date: '2025-03-01', amount: 27, policy: 'POL-2024-8811', method: 'Credit card', status: 'Paid' },
],
activity: [
{ date: 'Mar 25', text: 'Monthly payment processed ($165)', type: 'payment' },
{ date: 'Mar 10', text: 'Renter policy — updated inventory list', type: 'policy' },
{ date: 'Feb 05', text: 'Welcome call completed by Marco V.', type: 'onboarding' },
{ date: 'Sep 05', text: 'Policies issued — Auto + Renter', type: 'policy' },
],
}
/* ────────────────────────────────────────────── */
/* 4 · Luis Andrés Solís Calderón */
/* ────────────────────────────────────────────── */
const luis: MockCustomer = {
id: 'cust-004',
name: 'Luis Andrés Solís Calderón',
initials: 'LS',
type: 'Individual',
documentId: '1-1102-0398',
email: 'luis.solis@outlook.com',
phone: '+506 8455-7721',
birthDate: '1968-01-09',
gender: 'Male',
address: 'San José, Santa Ana, Pozos',
since: '2017-11-20',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['High-value', 'Referral source', 'Multi-line'],
paymentStatus: 'Overdue',
policies: [
{ id: 'POL-2022-2200', line: 'Auto', carrier: 'Qualitas', product: '2022 BMW X5 — SJO-2200', premium: 3200, status: 'Active', renewal: '2025-05-01', icon: 'i-heroicons-truck', details: 'Comprehensive • $1,000 deductible', referralChannel: 'Referral — client' },
{ id: 'POL-2022-2201', line: 'Auto', carrier: 'Qualitas', product: '2020 Mercedes GLC — SJO-7788', premium: 2800, status: 'Active', renewal: '2025-05-01', icon: 'i-heroicons-truck', details: 'Comprehensive • $1,000 deductible • Spouse vehicle', referralChannel: 'Referral — client' },
{ id: 'POL-2020-0055', line: 'Home', carrier: 'ASSA', product: 'Homeowner — Santa Ana residence', premium: 2100, status: 'Active', renewal: '2025-07-15', icon: 'i-heroicons-home-modern', details: 'Dwelling $420K • Contents $95K • Flood + Earthquake', referralChannel: 'Cross-sell' },
{ id: 'POL-2021-0750', line: 'Life', carrier: 'Pan-American Life', product: 'Whole life — $500K', premium: 4800, status: 'Active', renewal: '2025-11-20', icon: 'i-heroicons-shield-check', details: 'Beneficiaries: Patricia Calderón (60%), Children (40%)', referralChannel: 'Google Ads' },
{ id: 'POL-2023-6600', line: 'Life', carrier: 'Blue Cross', product: 'Family health — Platinum', premium: 8400, status: 'Active', renewal: '2025-10-01', icon: 'i-heroicons-heart', details: '4 members • Dental + Vision • Intl coverage', referralChannel: 'Google Ads' },
{ id: 'POL-2023-6601', line: 'General Risk', carrier: 'INS', product: 'Personal umbrella — $2M', premium: 680, status: 'Active', renewal: '2025-12-01', icon: 'i-heroicons-shield-exclamation', details: 'Excess liability over auto + home', referralChannel: 'Cross-sell' },
],
claims: [
{ id: 'CL-3020', policy: 'POL-2022-2200', type: 'Collision — rear-end', date: '2025-03-08', amount: 9500, status: 'In progress' },
{ id: 'CL-2650', policy: 'POL-2023-6600', type: 'Surgery reimbursement', date: '2024-10-15', amount: 12400, status: 'Resolved' },
{ id: 'CL-2102', policy: 'POL-2020-0055', type: 'Storm damage — roof', date: '2024-06-22', amount: 8200, status: 'Resolved' },
],
payments: [
{ date: '2025-04-01', amount: 1832, policy: 'Multiple', method: 'Auto-debit', status: 'Failed' },
{ date: '2025-03-01', amount: 1832, policy: 'Multiple', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-02-01', amount: 1832, policy: 'Multiple', method: 'Auto-debit', status: 'Paid' },
{ date: '2025-01-01', amount: 1832, policy: 'Multiple', method: 'Auto-debit', status: 'Paid' },
],
activity: [
{ date: 'Today', text: 'ALERT: April payment failed — auto-debit declined', type: 'payment' },
{ date: 'Yesterday', text: 'Collision claim CL-3020 — repair estimate received ($9,500)', type: 'claim' },
{ date: 'Mar 20', text: 'Auto policies up for renewal May 1 — quote comparison started', type: 'renewal' },
{ date: 'Mar 08', text: 'Collision claim filed — CL-3020 (BMW rear-end)', type: 'claim' },
{ date: 'Feb 15', text: 'Annual portfolio review — recommended umbrella increase', type: 'note' },
{ date: 'Jan 20', text: 'Health claim CL-2650 resolved — $12,400 reimbursed', type: 'claim' },
],
}
/* ────────────────────────────────────────────── */
/* 5 · Sofía Campos Rojas */
/* ────────────────────────────────────────────── */
const sofia: MockCustomer = {
id: 'cust-005',
name: 'Sofía Campos Rojas',
initials: 'SC',
type: 'Individual',
documentId: '4-0220-0561',
email: 'sofia.campos@icloud.com',
phone: '+506 7233-0098',
birthDate: '1995-12-03',
gender: 'Female',
address: 'Guanacaste, Liberia, Centro',
since: '2024-01-15',
agent: 'Marco V.',
preferredLang: 'Spanish',
tags: ['Young professional'],
paymentStatus: 'Grace period',
policies: [
{ id: 'POL-2024-9901', line: 'Auto', carrier: 'INS', product: '2024 Mazda CX-30 — GUA-0098', premium: 1380, status: 'Active', renewal: '2026-01-15', icon: 'i-heroicons-truck', details: 'Comprehensive • $500 deductible', referralChannel: 'Instagram campaign' },
{ id: 'POL-2024-9902', line: 'Life', carrier: 'Mapfre', product: 'Term life — 10yr, $100K', premium: 360, status: 'Active', renewal: '2026-01-15', icon: 'i-heroicons-shield-check', details: 'Beneficiary: Elena Rojas (mother)', referralChannel: 'Cross-sell' },
],
claims: [
{ id: 'CL-3101', policy: 'POL-2024-9901', type: 'Fender bender', date: '2025-03-20', amount: 1800, status: 'Under review' },
],
payments: [
{ date: '2025-04-01', amount: 145, policy: 'POL-2024-9901', method: 'Transfer', status: 'Pending' },
{ date: '2025-03-01', amount: 145, policy: 'POL-2024-9901', method: 'Transfer', status: 'Paid' },
{ date: '2025-03-01', amount: 30, policy: 'POL-2024-9902', method: 'Transfer', status: 'Paid' },
{ date: '2025-02-01', amount: 145, policy: 'POL-2024-9901', method: 'Transfer', status: 'Paid' },
],
activity: [
{ date: 'Today', text: 'Grace period — April auto premium not yet received', type: 'payment' },
{ date: 'Mar 22', text: 'Fender bender claim CL-3101 filed', type: 'claim' },
{ date: 'Mar 01', text: 'Monthly payment received ($175)', type: 'payment' },
{ date: 'Jan 15', text: 'Policies renewed — Auto + Life', type: 'renewal' },
],
}
/* ────────────────────────────────────────────── */
/* 6 · Quick Lead — Diego Herrera */
/* ────────────────────────────────────────────── */
const diego: MockCustomer = {
id: 'cust-006',
name: 'Diego Herrera',
initials: 'DH',
type: 'Individual',
documentId: '—',
email: 'diego.h@gmail.com',
phone: '+506 6100-4422',
birthDate: '',
gender: '',
address: '',
since: '2026-03-28',
agent: 'Marco V.',
preferredLang: 'Spanish',
tags: ['Quick lead', 'Referral'],
paymentStatus: 'N/A',
policies: [],
claims: [],
payments: [],
activity: [
{ date: 'Mar 28', text: 'Quick lead captured — referred by Roberto Jiménez', type: 'onboarding' },
],
}
/* ────────────────────────────────────────────── */
/* 7 · Quick Lead — Valeria Núñez */
/* ────────────────────────────────────────────── */
const valeria: MockCustomer = {
id: 'cust-007',
name: 'Valeria Núñez',
initials: 'VN',
type: 'Individual',
documentId: '—',
email: '',
phone: '+506 8899-1100',
birthDate: '',
gender: '',
address: '',
since: '2026-04-01',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['Quick lead', 'Walk-in'],
paymentStatus: 'N/A',
policies: [],
claims: [],
payments: [],
activity: [
{ date: 'Apr 01', text: 'Walk-in lead — interested in auto insurance', type: 'onboarding' },
],
}
/* ────────────────────────────────────────────── */
/* 8 · Lead — Andrés Mora Villalobos */
/* ────────────────────────────────────────────── */
const andres: MockCustomer = {
id: 'cust-008',
name: 'Andrés Mora Villalobos',
initials: 'AM',
type: 'Individual',
documentId: '1-1450-0221',
email: 'andres.mora@empresa.cr',
phone: '+506 7744-5566',
birthDate: '1990-05-18',
gender: 'Male',
address: 'San José, Moravia, San Vicente',
since: '2026-03-15',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['Lead', 'Corporate referral'],
paymentStatus: 'N/A',
policies: [],
claims: [],
payments: [],
activity: [
{ date: 'Mar 15', text: 'Lead created — needs auto + health quotes', type: 'onboarding' },
{ date: 'Mar 20', text: 'Discovery call completed — family of 3', type: 'note' },
],
}
/* ────────────────────────────────────────────── */
/* 9 · Lead — Corporación Tecnológica del Valle */
/* ────────────────────────────────────────────── */
const corpTech: MockCustomer = {
id: 'cust-009',
name: 'Corporación Tecnológica del Valle',
initials: 'CT',
type: 'Corporate',
documentId: '3-101-789456',
email: 'rrhh@corptech.cr',
phone: '+506 2234-8800',
birthDate: '',
gender: '',
address: 'Heredia, Heredia, Zona Franca',
since: '2026-02-10',
agent: 'Marco V.',
preferredLang: 'Spanish',
tags: ['Lead', 'Corporate', 'Group health prospect'],
paymentStatus: 'N/A',
policies: [],
claims: [],
payments: [],
activity: [
{ date: 'Feb 10', text: 'Corporate lead — 45 employees, group health RFP', type: 'onboarding' },
{ date: 'Mar 05', text: 'Census received — quoting in progress', type: 'quote' },
],
}
/* ────────────────────────────────────────────── */
/* 10 · Cancelled — Fernando Arias Blanco */
/* ────────────────────────────────────────────── */
const fernando: MockCustomer = {
id: 'cust-010',
name: 'Fernando Arias Blanco',
initials: 'FA',
type: 'Individual',
documentId: '1-0892-0344',
email: 'fernando.arias@hotmail.com',
phone: '+506 8322-0017',
birthDate: '1982-09-14',
gender: 'Male',
address: 'Alajuela, San Carlos, Ciudad Quesada',
since: '2020-04-01',
agent: 'Ana R.',
preferredLang: 'Spanish',
tags: ['Cancelled', 'Win-back opportunity'],
paymentStatus: 'N/A',
policies: [
{ id: 'POL-2020-1100', line: 'Auto', carrier: 'INS', product: '2018 Toyota Hilux — ALJ-4400', premium: 1200, status: 'Cancelled', renewal: '2024-04-01', icon: 'i-heroicons-truck', details: 'Cancelled — non-payment', referralChannel: 'Direct walk-in' },
{ id: 'POL-2021-2200', line: 'Home', carrier: 'ASSA', product: 'Homeowner — Ciudad Quesada', premium: 650, status: 'Lapsed', renewal: '2024-06-15', icon: 'i-heroicons-home-modern', details: 'Lapsed — did not renew', referralChannel: 'Direct walk-in' },
],
claims: [
{ id: 'CL-1200', policy: 'POL-2020-1100', type: 'Theft attempt', date: '2023-08-10', amount: 3200, status: 'Resolved' },
],
payments: [
{ date: '2024-01-01', amount: 154, policy: 'POL-2020-1100', method: 'Transfer', status: 'Paid' },
{ date: '2024-02-01', amount: 154, policy: 'POL-2020-1100', method: 'Transfer', status: 'Overdue' },
{ date: '2024-03-01', amount: 154, policy: 'POL-2020-1100', method: 'Transfer', status: 'Overdue' },
],
activity: [
{ date: 'Apr 01', text: 'Auto policy cancelled — 3 months unpaid', type: 'policy' },
{ date: 'Jun 15', text: 'Home policy lapsed — did not renew', type: 'policy' },
{ date: 'Aug 20', text: 'Win-back call attempted — no answer', type: 'note' },
],
}
/* ────────────────────────────────────────────── */
/* Exports */
/* ────────────────────────────────────────────── */
export const MOCK_CUSTOMERS: MockCustomer[] = [maria, roberto, carolina, luis, sofia, diego, valeria, andres, corpTech, fernando]
export const MOCK_CUSTOMERS_BY_ID: Record<string, MockCustomer> = Object.fromEntries(
MOCK_CUSTOMERS.map((c) => [c.id, c])
)
/** Helper to format currency */
export function fmtMoney(n: number): string {
return `$${n.toLocaleString()}`
}