/* Máquina de resultados — sección premium (Home) */ /* usa los globals useState/useEffect/useRef (declarados en kanban.jsx) */ /* ---- contador con formato es-CO ---- */ function CountKPI({ to, dec = 0, prefix = "", anim = 1 }) { const [v, setV] = useState(0); const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; let done = false; const run = () => { if (anim <= 0) { setV(to); return; } const D = 1800 / Math.max(0.35, anim), t0 = performance.now(); const tick = (now) => { const p = Math.min(1, (now - t0) / D); setV(to * (1 - Math.pow(1 - p, 3))); if (p < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); }; const check = () => { if (done) return; const r = el.getBoundingClientRect(); if (r.top < window.innerHeight * 0.9 && r.bottom > 0) { done = true; window.removeEventListener("scroll", check); run(); } }; check(); window.addEventListener("scroll", check, { passive: true }); return () => window.removeEventListener("scroll", check); }, []); const fmt = dec > 0 ? v.toFixed(dec) : Math.round(v).toLocaleString("es-CO"); return {prefix}{fmt}; } /* ---- datos ---- */ const MQ_IDEAS = [ "Automatizar conciliación financiera", "Agente IA para servicio al cliente", "Dashboard ejecutivo", "Integración SAP", "Predicción de demanda", "Automatización de compras", "Portal de proveedores", ]; const MQ_RESULTS = [ { ttl: "Automatizar conciliación financiera", b: "320 h", s: "recuperadas al mes" }, { ttl: "Agente IA Comercial", b: "+18%", s: "velocidad de respuesta" }, { ttl: "Predicción de demanda", b: "+12%", s: "precisión operacional" }, { ttl: "Dashboard Ejecutivo", b: "100%", s: "visibilidad de indicadores" }, ]; const MQ_CAPS = ["IA", "Software", "Automatización", "Datos", "Cloud"]; const MQ_KPIS = [ { to: 1240, prefix: "$", u: "M COP", lbl: "Utilidad generada", trend: "▲ este trimestre" }, { to: 18450, u: "", lbl: "Horas recuperadas", trend: "▲ acumulado" }, { to: 47, u: "", lbl: "Iniciativas completadas", trend: "" }, { to: 6, u: "", lbl: "Iniciativas activas", trend: "" }, { to: 6.4, dec: 1, u: "x", lbl: "ROI estimado", trend: "▲" }, ]; const MQ_VALUES = [ { num: "+37", u: "%", lbl: "Incremento de productividad", d: "Automatización de tareas repetitivas y reducción de trabajo manual." }, { num: "$850", u: "M COP", lbl: "Ahorro operativo", d: "Costos eliminados mediante automatización y optimización." }, { num: "4", u: "x", lbl: "Velocidad de ejecución", d: "Más rápido que construir capacidades internas desde cero." }, ]; const MKB_COLS = [ { h: "Backlog", t: "Motor de precios dinámicos" }, { h: "Diseño", t: "Portal de proveedores" }, { h: "Construcción", t: "Dashboard financiero" }, { h: "Validación", t: "Integración SAP" }, { h: "Producción", t: "Forecast de demanda" }, ]; /* ---- núcleo + flujo ---- */ function CoreFlow({ anim }) { const [off, setOff] = useState(0); useEffect(() => { if (anim <= 0) return; const t = setInterval(() => setOff((o) => o + 1), 4800 / Math.max(0.4, anim)); return () => clearInterval(t); }, [anim]); const ideas = [0, 1, 2].map((i) => MQ_IDEAS[(off + i) % MQ_IDEAS.length]); const res = [0, 1, 2].map((i) => MQ_RESULTS[(off + i) % MQ_RESULTS.length]); return (
{ideas.map((t, i) => (
Iniciativa
{t}
))}
Bacatá Dynamics
{MQ_CAPS.map((c, i) => (
{c}
))}
{res.map((r, i) => (
Resultado
{r.ttl}
{r.b}{r.s}
))}
); } /* ---- mini kanban ejecutivo (conveyor con fade) ---- */ function MiniKanban({ anim }) { const [cols, setCols] = useState({ k0: 0, k1: 1, k2: 2, k3: 3, k4: 4 }); const recRef = useRef(new Set()); const nodes = useRef({}); const rects = useRef({}); useEffect(() => { // FLIP Object.entries(nodes.current).forEach(([id, n]) => { if (!n) return; const nr = n.getBoundingClientRect(), prev = rects.current[id]; if (prev && recRef.current.has(id)) { n.style.transition = "none"; n.style.opacity = "0"; requestAnimationFrame(() => requestAnimationFrame(() => { n.style.transition = ""; n.style.opacity = "1"; })); } else if (prev) { const dx = prev.left - nr.left, dy = prev.top - nr.top; if (Math.abs(dx) > .5 || Math.abs(dy) > .5) { n.style.transition = "none"; n.style.transform = `translate(${dx}px,${dy}px)`; requestAnimationFrame(() => requestAnimationFrame(() => { n.style.transition = ""; n.style.transform = ""; })); } } rects.current[id] = nr; }); recRef.current.clear(); }, [cols]); useEffect(() => { if (anim <= 0) return; const interval = Math.max(1700, 3400 / Math.max(0.4, anim)); const t = setInterval(() => setCols((prev) => { const next = {}, rec = new Set(); for (const id in prev) { const v = (prev[id] + 1) % 5; if (prev[id] === 4) rec.add(id); next[id] = v; } recRef.current = rec; return next; }), interval); return () => clearInterval(t); }, [anim]); const ids = Object.keys(cols); return (
Kanban ejecutivo
{MKB_COLS.map((c, ci) => { const here = ids.filter((id) => cols[id] === ci); return (
{c.h}
{here.map((id) => (
{ nodes.current[id] = n; }}>{MKB_COLS[+id.slice(1)].t}
))}
); })}
); } function Portal({ anim }) { return (
portal.bacatadynamics.com En vivo
Resumen Ejecutivo
Su suscripción, traducida a impacto medible.
{MQ_KPIS.map((k) => (
{k.u && {k.u}}
{k.lbl}
{k.trend &&
{k.trend}
}
))}
Impacto acumulado▲ +42% YTD
+42% YTD
); } function Maquina({ anim = 1 }) { return (
La suscripción en acción

Transforme iniciativas en resultados.

Obtenga capacidad técnica bajo demanda para ejecutar software, automatización, inteligencia artificial y analítica mediante una suscripción mensual.

{MQ_VALUES.map((v, i) => (
{v.num}{v.u}
{v.lbl}
{v.d}
))}
); } window.Maquina = Maquina;