Total AR Outstanding
$31,700
12 open invoices
68% of monthly revenue
Overdue 31+ Days
$5,100
⚠ 3 invoices need action
16% of total AR
Collection Rate
84%
↓3pts vs last month
Target: 90%+
Avg Days to Payment
18 days
↓2 days vs last month
Industry avg: 28 days
AR Aging Detail
Aging Bucket # Invoices Amount % of AR Action
Outstanding Invoices
Client Invoice # Amount Days Out Action
Jobs Board — April 2025
31 total jobs this month
Jobs Completed by Type — 6 Months
PM Repair
Tech Utilization — MTD
Technician Jobs MTD Revenue Generated Avg Job Value
${col.status} ${col.jobs.length}
${col.jobs.map(j => `
${j.client}
${j.tech}
${j.type} ${fmt$(j.amount)}
${j.id}
`).join('')} `).join(''); // ── Jobs by Type Chart ── const jobsCtx = document.getElementById('jobsChart').getContext('2d'); new Chart(jobsCtx, { type: 'bar', data: { labels: ['Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr'], datasets: [ { label: 'PM Jobs', data: [16, 14, 17, 18, 20, 19], backgroundColor: '#E60000', borderRadius: 3, stack: 'jobs' }, { label: 'Repair Jobs', data: [10, 9, 11, 10, 11, 12], backgroundColor: '#2e2e38', borderRadius: 3, stack: 'jobs' }, ] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { ...TS, mode: 'index', intersect: false } }, scales: { x: { grid: { color: GC }, stacked: true }, y: { grid: { color: GC }, stacked: true, ticks: { stepSize: 5 } } } } }); // ── Tech Utilization ── const techs = [ { name: 'Jake T.', jobs: 6, revenue: 7800, avg: 1300 }, { name: 'Carlos M.', jobs: 5, revenue: 5200, avg: 1040 }, { name: 'Darius W.', jobs: 5, revenue: 4900, avg: 980 }, { name: 'Ryan K.', jobs: 4, revenue: 3800, avg: 950 }, { name: 'Tyler B.', jobs: 4, revenue: 3600, avg: 900 }, { name: 'Marcus L.', jobs: 4, revenue: 3400, avg: 850 }, { name: 'Nate S.', jobs: 3, revenue: 2800, avg: 933 }, ]; const maxRev = Math.max(...techs.map(t => t.revenue)); document.getElementById('techBody').innerHTML = techs.map((t, i) => `
#${i+1} ${t.name}
${t.jobs}
${fmt$(t.revenue)}
${fmt$(t.avg)} `).join(''); // ── AI CFO Panel ── document.getElementById('panel').innerHTML = renderCFOPanel({ tabName: 'arJobs', scorecard: [ { label: 'AR Outstanding', value: '$31,700', color: 'var(--amber)', sub: '12 open invoices' }, { label: 'Overdue 31+', value: '$5,100', color: 'var(--red)', sub: '3 invoices' }, { label: 'Collection Rate', value: '84%', color: 'var(--amber)', sub: 'Target: 90%' }, { label: 'Avg Days Pay', value: '18 days', color: 'var(--green)', sub: '↓2 days MoM' }, ], chips: ['Who owes us the most?', 'Which invoices are 30+ days out?', 'Best tech by revenue generated?', 'How many jobs to hit goal?', 'What is our average days to pay?'] }); initChat('arJobs', { arOutstanding: 31700, overdue31Plus: 5100, collectionRate: 84, avgDaysToPay: 18, openInvoices: 12, overdueInvoices: [ { client: 'YMCA — Charlotte', amount: 1200, days: 35 }, { client: 'Crunch Fitness — Raleigh', amount: 1800, days: 45 }, { client: '24 Hour Fitness', amount: 600, days: 92 }, ], topTech: { name: 'Jake T.', revenue: 7800, jobs: 6 }, jobsThisMonth: 31, jobsNeededForGoal: 6, });