fix(data): tune PRJ-004/005 to healthy margins (PRJ-019 stays the sole problem job); compute owner portfolio count

This commit is contained in:
Satyam Rastogi
2026-05-29 18:42:03 +05:30
parent a8ed0c0034
commit c27d64d75e
2 changed files with 24 additions and 24 deletions
+23 -23
View File
@@ -2395,17 +2395,17 @@ const MOCK_PROJECTS = [
phase: 'Finishing',
budget: 55000,
approvedBudget: 55000,
committedCost: 62300,
actualCost: 62300,
spent: 62300,
variancePercent: 13.3,
margin: -0.13,
committedCost: 43000,
actualCost: 41000,
spent: 41000,
variancePercent: -25.5,
margin: 0.22,
commissionType: 'custom',
commissionRate: 5500,
commission: 5500,
startDate: '2025-12-01',
endDate: '2026-02-28',
healthScore: 76,
healthScore: 84,
openRFIs: 1,
changeOrderCount: 2,
pendingInvoiceCount: 2,
@@ -2420,13 +2420,13 @@ const MOCK_PROJECTS = [
{ id: 'ms_004_7', name: 'Final Punch List', dueDate: '2026-02-25', status: 'pending', assignedTo: 'con_001' }
],
budgetBreakdown: [
{ name: 'DemoCrew Pro', category: 'Demolition', allocated: 5000, committed: 5500, actual: 5500 },
{ name: 'Texas Builders LLC', category: 'Framing & Structural', allocated: 8000, committed: 8500, actual: 8500 },
{ name: 'Sparky Electric', category: 'Electrical', allocated: 7000, committed: 4800, actual: 4800 },
{ name: 'DFW Foundation Pros', category: 'Plumbing', allocated: 6000, committed: 6500, actual: 6500 },
{ name: 'Premier Finishes', category: 'Drywall & Paint', allocated: 9000, committed: 10000, actual: 10000 },
{ name: 'FloorCraft Inc.', category: 'Flooring & Trim', allocated: 12000, committed: 15500, actual: 15500 },
{ name: 'Reserve Fund', category: 'Contingency', allocated: 8000, committed: 11500, actual: 11500 }
{ name: 'DemoCrew Pro', category: 'Demolition', allocated: 5000, committed: 4800, actual: 4800 },
{ name: 'Texas Builders LLC', category: 'Framing & Structural', allocated: 8000, committed: 7800, actual: 7800 },
{ name: 'Sparky Electric', category: 'Electrical', allocated: 7000, committed: 6000, actual: 6000 },
{ name: 'DFW Foundation Pros', category: 'Plumbing', allocated: 6000, committed: 5500, actual: 5500 },
{ name: 'Premier Finishes', category: 'Drywall & Paint', allocated: 9000, committed: 8500, actual: 8500 },
{ name: 'FloorCraft Inc.', category: 'Flooring & Trim', allocated: 12000, committed: 8400, actual: 6400 },
{ name: 'Reserve Fund', category: 'Contingency', allocated: 8000, committed: 2000, actual: 2000 }
],
changeOrders: [
{ id: 'CO-004-01', title: 'Scope Expansion - Kitchen Island', amount: 4500, status: 'approved', dateSubmitted: '2026-01-10', description: 'Add a custom 6ft island with quartz countertop and built-in microwave.' },
@@ -2451,12 +2451,12 @@ const MOCK_PROJECTS = [
{ date: '2026-01-18', action: 'Inspection Passed', user: 'City Inspector', details: 'Plumbing rough-in re-inspection passed' }
],
invoices: [
{ id: 'inv_004_1', amount: 18000, submittedBy: 'con_001', status: 'paid', dueDate: '2025-12-15', datePaid: '2025-12-16' },
{ id: 'inv_004_2', amount: 15500, submittedBy: 'con_001', status: 'paid', dueDate: '2026-01-10', datePaid: '2026-01-12' },
{ id: 'inv_004_3', amount: 12800, submittedBy: 'v3', status: 'paid', dueDate: '2026-01-20', datePaid: '2026-01-22' },
{ id: 'inv_004_1', amount: 14000, submittedBy: 'con_001', status: 'paid', dueDate: '2025-12-15', datePaid: '2025-12-16' },
{ id: 'inv_004_2', amount: 12000, submittedBy: 'con_001', status: 'paid', dueDate: '2026-01-10', datePaid: '2026-01-12' },
{ id: 'inv_004_3', amount: 8000, submittedBy: 'v3', status: 'paid', dueDate: '2026-01-20', datePaid: '2026-01-22' },
{ id: 'inv_004_3b', amount: 4800, submittedBy: 'sub_001', status: 'paid', dueDate: '2026-01-12', datePaid: '2026-01-14' },
{ id: 'inv_004_4', amount: 8750, submittedBy: 'v1', status: 'pending', dueDate: '2026-02-25' },
{ id: 'inv_004_5', amount: 7250, submittedBy: 'con_001', status: 'pending', dueDate: '2026-02-28' }
{ id: 'inv_004_4', amount: 4000, submittedBy: 'v1', status: 'pending', dueDate: '2026-02-25' },
{ id: 'inv_004_5', amount: 2200, submittedBy: 'con_001', status: 'pending', dueDate: '2026-02-28' }
],
documents: [
{ name: 'Interior Renovation Contract', url: '#', type: 'contract' },
@@ -2494,7 +2494,7 @@ const MOCK_PROJECTS = [
phase: 'Structural',
budget: 28000,
approvedBudget: 28000,
committedCost: 28850,
committedCost: 21000,
actualCost: 14200,
spent: 14200,
variancePercent: -49.3,
@@ -2518,11 +2518,11 @@ const MOCK_PROJECTS = [
{ id: 'ms_005_5', name: 'Trim and Caulking', dueDate: '2026-02-15', status: 'pending', assignedTo: 'con_001' }
],
budgetBreakdown: [
{ name: 'ABC Supply Co.', category: 'Materials - Siding', allocated: 12000, committed: 12000, actual: 8000 },
{ name: 'Siding Solutions TX', category: 'Labor - Prep & Install', allocated: 9000, committed: 9000, actual: 3500 },
{ name: 'Sunbelt Rentals', category: 'Equipment Rental', allocated: 2000, committed: 2000, actual: 1500 },
{ name: 'ABC Supply Co.', category: 'Materials - Siding', allocated: 12000, committed: 10000, actual: 8000 },
{ name: 'Siding Solutions TX', category: 'Labor - Prep & Install', allocated: 9000, committed: 7000, actual: 3500 },
{ name: 'Sunbelt Rentals', category: 'Equipment Rental', allocated: 2000, committed: 1800, actual: 1500 },
{ name: 'Texas Builders LLC', category: 'Structural Repairs (CO)', allocated: 0, committed: 850, actual: 850 },
{ name: 'Reserve Fund', category: 'Contingency', allocated: 5000, committed: 5000, actual: 350 }
{ name: 'Reserve Fund', category: 'Contingency', allocated: 5000, committed: 1350, actual: 350 }
],
invoices: [
{ id: 'inv_005_1', amount: 8400, submittedBy: 'con_001', status: 'paid', dueDate: '2026-01-12', datePaid: '2026-01-13' },
+1 -1
View File
@@ -185,7 +185,7 @@ const OwnerSnapshot = () => {
{greeting}, {user?.name?.split(' ')[0] || 'Owner'}
</h1>
<p className="text-zinc-500 dark:text-zinc-400 mt-2 font-light">
{owner ? `${owner.companyName}${owner.portfolioSize} projects in portfolio` : "Here's your business snapshot for today."}
{owner ? `${owner.companyName}${ownerProjects.length} project${ownerProjects.length === 1 ? '' : 's'} in portfolio` : "Here's your business snapshot for today."}
</p>
</div>
<div className="mt-4 md:mt-0 flex flex-wrap gap-3">