// Ejecutora — Dashboard Screen (La Rutina que Vende™ — Vista General) const DashboardScreen = () => { const [data, setData] = React.useState(null); const [kpis, setKpis] = React.useState(null); const [campanas, setCampanas] = React.useState([]); const [loading, setLoading] = React.useState(true); const load = () => { const mes = window.mesActual(); Promise.all([ API.get('/dashboard'), API.get(`/kpis?mes=${mes}`), API.get(`/campanas?mes=${mes}`) ]).then(([d, k, c]) => { if (d) setData(d); if (k) setKpis(k); if (c) setCampanas(c); setLoading(false); }); }; React.useEffect(() => { load(); }, []); if (loading || !data || !kpis) return (

Cargando dashboard estratégico...

); const today = new Date(); const days = ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado']; const months = ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre']; const dateStr = `${days[today.getDay()]}, ${today.getDate()} de ${months[today.getMonth()]} · ${today.getHours() < 12 ? 'Buenos días' : today.getHours() < 19 ? 'Buenas tardes' : 'Buenas noches'} ✦`; const metaPct = data.meta_facturacion > 0 ? Math.min(100, Math.round(data.facturacion / data.meta_facturacion * 100)) : 0; const isMobile = window.__isMobile; const campanaActiva = campanas[0]; return (
{/* Welcome */}
{dateStr}

¡Hola, {(data.user_name || 'Wuilldelys').split(' ')[0]}! ✦

Foco de hoy: Ventas & Seguimiento · {data.ventas_count} ventas en {window.mesNombre(data.mes)}
{/* Meta progress */}
Meta del mes
{metaPct}%
= 80 ? EJ.green : EJ.cyan} />
{window.fmtMoney(data.facturacion)} / {window.fmtMoney(data.meta_facturacion)}
{/* Sugerencia de Elia */}
Elia
Sugerencia Estratégica de Elia
Este mes te toca una campaña de {data.nextCampaignType || 'Adquisición'}. ¿Ya tienes listo el producto estrella?
window.__setScreen?.('campanas')} style={{ position:'relative', zIndex:1 }}>Crear campaña
{/* Indicadores Clave (Pilar 1) */}
{/* Main Card */}
Facturación Real
{window.fmtMoney(data.facturacion)}
Meta: {window.fmtMoney(data.meta_facturacion)}
{[ { label: 'Conversión', value: (kpis.conversion || 0)+'%', icon: '🎯', color: EJ.green, sub: 'Meta: 30%' }, { label: 'Leads Mes', value: data.clientes_nuevas, icon: '👥', color: EJ.violet, sub: '↑ 8 esta sem.' }, { label: 'Ticket Prom.', value: window.fmtMoney(data.ticket_promedio), icon: '📊', color: EJ.cyan, sub: 'por venta' }, { label: 'Reactivación', value: data.clientes_reactivadas, icon: '🔁', color: EJ.pink, sub: 'este mes' }, { label: 'Canal Top', value: kpis.canal_top || 'WApp', icon: '📱', color: EJ.navy, sub: 'mayor cierre' }, ].map((k, i) => (
{k.label}
{k.icon}
{k.value}
{k.sub}
))}
{/* Los 3 Pilares RQV */}
{[ { num: 1, name: 'Planificación', freq: '1 vez al mes · Último viernes', color: EJ.cyan, icon: '📋', sc: 'planificacion' }, { num: 2, name: 'Campañas', freq: 'Cada lunes · 60-90 min', color: EJ.violet, icon: '📣', sc: 'campanas' }, { num: 3, name: 'Rutina', freq: '60-75 min al día · 3 bloques', color: EJ.pink, icon: '⏰', sc: 'rutina' }, ].map(p => ( window.__setScreen?.(p.sc)} className="hover-scale">
Pilar {p.num}
{p.icon} {p.name}
{p.freq}
))}
{/* Campaña activa */}

📣 Campaña activa

window.__setScreen('campanas')}>Ver todas →
{campanaActiva ? (
{campanaActiva.tipo?.toUpperCase()}
{campanaActiva.producto || '—'}
{campanaActiva.fecha_inicio} → {campanaActiva.fecha_cierre}
Progreso de ventas Meta: {campanaActiva.meta_ventas}
) : (
📣

Sin campaña activa. Pilar 2 sin ejecutar.

window.__setScreen?.('campanas')}>Definir campaña
)}
{/* Acciones Rápidas */}

⚡ Acciones rápidas

{[ { label: '💰 Registrar una venta', sc: 'ventas', color: EJ.green }, { label: '👤 Nueva clienta en CRM', sc: 'crm', color: EJ.violet }, { label: '⏰ Ejecutar Rutina', sc: 'rutina', color: EJ.pink }, { label: '📋 Planificar mes', sc: 'planificacion', color: EJ.cyan }, ].map((a, i) => ( ))}
{/* Árbol de diagnóstico mini */}

Diagnóstico Rápido

{[ { s: 'Publico pero no vendo', d: 'Falta CTA claro o seguimiento.', p: 'Bloque 2' }, { s: 'No sé qué vender hoy', d: 'Define campaña en Pilar 2.', p: 'Pilar 2' }, { s: 'Mucho trabajo, poco ingreso', d: 'Revisa tu meta en Pilar 1.', p: 'Pilar 1' }, ].map((x, i) => (
{x.p}
"{x.s}"
→ {x.d}
))}
); }; Object.assign(window, { DashboardScreen });