/* Dashboard Executivo — CEO / Sócios */ const { useState:dS, useMemo:dM } = React; function Dashboard({profile, onToast}){ const [period,setPeriod]=dS('mes'); const [units,setUnits]=dS([]); // [] = todas const restricted = profile.unit ? [profile.unit] : null; // gestor vê só a unidade const activeUnits = restricted || (units.length?units:MX.units.map(u=>u.id)); const isAll = !restricted && units.length===0; const pf = period==='mes'?1 : period==='tri'?2.96 : 7.0; const pLabel = period==='mes'?'no mês':period==='tri'?'no trimestre':'no ano'; const prevLabel = period==='mes'?'vs. abril':period==='tri'?'vs. tri. anterior':'vs. 2025'; const selUnits = MX.units.filter(u=>activeUnits.includes(u.id)); const fatBase = selUnits.reduce((a,u)=>a+u.fatMes,0); const metaBase = selUnits.reduce((a,u)=>a+u.metaMes,0); const fat = Math.round(fatBase*pf); const meta = Math.round(metaBase*pf); const casosAtivos = selUnits.reduce((a,u)=>a+u.casosAtivos,0); const casosEnc = selUnits.reduce((a,u)=>a+u.casosEnc,0); const share = fatBase / MX.units.reduce((a,u)=>a+u.fatMes,0); // série da linha const consolSerie = activeUnits.reduce((acc,id)=>{ const s=MX.seriePorUnidade[id]; return acc.map((v,i)=>v+s[i]); }, new Array(MX.meses.length).fill(0)); const metaSerie = MX.serieMetaConsol.map(v=>Math.round(v*share)); const anoAntSerie = MX.serieAnoAnterior.map(v=>Math.round(v*share)); const lineSeries=[ {name:'Realizado', data:consolSerie, color:'#b68b4c', fill:true}, {name:'Meta', data:metaSerie, color:'#3a4159', dashed:true}, {name:'Ano anterior', data:anoAntSerie, color:'#c2b9a6', dashed:true}, ]; const unitBars = MX.units.map(u=>({label:u.nome.split(' ')[0], value:Math.round(u.fatMes*pf), color: activeUnits.includes(u.id)? u.cor : '#dcd5c7'})); const areaDonut = MX.areas.map(a=>({label:a.nome, value:Math.round(a.fatMes*pf*share), color:a.cor})); const ranked = [...MX.people].filter(p=>activeUnits.includes(p.unit)).sort((a,b)=>b.fatMes-a.fatMes).slice(0,7); const maxRank = ranked.length?ranked[0].fatMes:1; const casosFiltrados = MX.casos.filter(c=>activeUnits.includes(c.unit)); const criticos = casosFiltrados.filter(c=>c.critico || c.status==='suspenso'); const f = (n)=>MX.fmtBRL(n,{compact:true}); const toggleUnit=(id)=> setUnits(prev=> prev.includes(id)? prev.filter(x=>x!==id) : [...prev,id]); return (