/* global React */ const { useState: useStateGap, useEffect: useEffectGap, useRef: useRefGap } = React; const QUESTIONS = [ { id: 'continuidad', category: 'Continuidad Operativa', icon: 'shield', color: '#FB881D', question: '¿Cuánto tiempo puede operar su empresa si sus servidores principales se caen hoy?', options: [ { label: 'Más de 24 horas con plan probado (BCP/DRP activo)', score: 0 }, { label: 'Entre 4 y 24 horas, tenemos backups pero sin pruebas recientes', score: 1 }, { label: 'Menos de 4 horas, dependemos de TI para improvisar', score: 2 }, { label: 'No lo sabemos / nunca lo medimos', score: 3 }, ], }, { id: 'darkweb', category: 'Exposición Externa', icon: 'eye', color: '#EC008C', question: '¿Tienen visibilidad de si sus credenciales corporativas están filtradas en la Dark Web?', options: [ { label: 'Sí, monitoreo continuo con alertas automatizadas', score: 0 }, { label: 'Hicimos un análisis puntual hace más de 6 meses', score: 1 }, { label: 'No, pero confiamos en la seguridad de nuestros proveedores', score: 2 }, { label: 'No tenemos forma de saberlo', score: 3 }, ], }, { id: 'segmentacion', category: 'Arquitectura', icon: 'cpu', color: '#3551E7', question: '¿Su red está segmentada o un atacante podría moverse lateralmente?', options: [ { label: 'Segmentación zero-trust con microsegmentación validada', score: 0 }, { label: 'VLANs y firewalls perimetrales, sin auditoría reciente', score: 1 }, { label: 'Red plana o segmentación parcial heredada', score: 2 }, { label: 'No sé cómo está la arquitectura', score: 3 }, ], }, { id: 'phishing', category: 'Factor Humano', icon: 'users', color: '#A335E7', question: '¿Realizan simulacros de phishing y capacitación en seguridad para empleados?', options: [ { label: 'Simulacros mensuales con métricas y entrenamiento dirigido', score: 0 }, { label: 'Entre 1 y 2 veces al año, sin seguimiento sistemático', score: 1 }, { label: 'Solo onboarding inicial cuando alguien ingresa', score: 2 }, { label: 'Nunca lo hicimos', score: 3 }, ], }, { id: 'cumplimiento', category: 'Cumplimiento Regional', icon: 'globe', color: '#35E7C7', question: '¿Cumplen con la Ley 25.326 de Protección de Datos Personales (Argentina) y normativas regionales?', options: [ { label: 'Sí, certificados ISO 27001 y registro AAIP vigente', score: 0 }, { label: 'Cumplimiento parcial documentado, sin certificación', score: 1 }, { label: 'Sabemos que aplica pero no formalizamos los controles', score: 2 }, { label: 'No conocemos los requisitos legales aplicables', score: 3 }, ], }, { id: 'incidentes', category: 'Detección y Respuesta', icon: 'alert', color: '#EC4D2A', question: '¿Cuánto tardan en detectar y contener un incidente de seguridad?', options: [ { label: 'SOC 24x7 con MTTD < 15 min y runbooks probados', score: 0 }, { label: 'Tenemos SIEM pero la respuesta es manual y horaria', score: 1 }, { label: 'Solo nos enteramos cuando algo deja de funcionar', score: 2 }, { label: 'Nunca tuvimos un incidente / no sabríamos detectarlo', score: 3 }, ], }, { id: 'pentest', category: 'Validación Ofensiva', icon: 'zap', color: '#35E747', question: '¿Cuándo fue su último Ethical Hacking o test de penetración?', options: [ { label: 'Hace menos de 6 meses, con re-test de remediaciones', score: 0 }, { label: 'Entre 6 y 18 meses atrás', score: 1 }, { label: 'Hace más de 2 años o solo escaneos automáticos', score: 2 }, { label: 'Nunca contratamos un pentest profesional', score: 3 }, ], }, ]; const GapAnalysis = () => { const { Eyebrow, Btn, Icon, GlassCard, Light } = window; const [stage, setStage] = useStateGap('intro'); // intro | quiz | gate | result const [step, setStep] = useStateGap(0); const [answers, setAnswers] = useStateGap({}); const [form, setForm] = useStateGap({ nombre: '', empresa: '', email: '' }); const [submitting, setSubmitting] = useStateGap(false); const [errorMsg, setErrorMsg] = useStateGap(''); const total = QUESTIONS.length; const progress = stage === 'intro' ? 0 : stage === 'result' || stage === 'gate' ? 100 : Math.round((step / total) * 100); const select = (qId, score) => { const next = { ...answers, [qId]: score }; setAnswers(next); setTimeout(() => { if (step + 1 < total) setStep(step + 1); else setStage('gate'); }, 220); }; const scores = Object.values(answers); const totalScore = scores.reduce((a, b) => a + b, 0); const maxScore = total * 3; const exposurePct = Math.round((totalScore / maxScore) * 100); const criticalPoints = scores.filter(s => s >= 2).length; const submit = async (e) => { e.preventDefault(); if (!form.nombre || !form.empresa || !form.email) return; setSubmitting(true); setErrorMsg(''); try { const { ok, data } = await window.brotekFetch('/api/procesar_envio.php', { body: { ...form, answers, exposurePct, criticalPoints, totalQuestions: total, submittedAt: new Date().toISOString(), source: 'gap-analysis-home', website: '', }, }); if (!ok) { const msg = (data && data.message) ? data.message : 'No pudimos enviar el informe. Intentá nuevamente en unos minutos.'; setErrorMsg(msg); setSubmitting(false); return; } setSubmitting(false); setStage('result'); } catch (err) { setErrorMsg('Error de red. Verificá tu conexión e intentá de nuevo.'); setSubmitting(false); } }; const current = QUESTIONS[step]; return (
{/* Header */}
Diagnóstico interactivo · 5 minutos

Diagnóstico de Brechas y Continuidad Operativa

Identifique en 5 minutos los puntos ciegos de su arquitectura que están poniendo en riesgo su operación en Argentina y la región.

{/* Wizard card */} {/* Progress bar */}
{/* INTRO */} {stage === 'intro' && (

7 preguntas. Resultado inmediato.

Evaluación basada en NIST CSF 2.0 y la Comunicación A 7724 del BCRA. Sus respuestas son confidenciales.

setStage('quiz')}> Iniciar Evaluación Gratuita
· 5 min · Sin tarjeta de crédito · Datos cifrados
)} {/* QUIZ */} {stage === 'quiz' && current && (
{current.category}
Pregunta {step + 1} de {total}
{step > 0 && ( )}

{current.question}

{current.options.map((opt, i) => { const selected = answers[current.id] === opt.score; return ( ); })}
)} {/* GATE — preview + lead form */} {stage === 'gate' && (
Adelanto del informe

Hemos detectado {criticalPoints} {criticalPoints === 1 ? 'punto crítico' : 'puntos críticos'} que comprometen su continuidad operativa en este momento.

Su exposición global es del {exposurePct}% según el modelo NIST CSF 2.0 + BCRA A 7724. Para acceder al informe detallado con plan de remediación priorizado, necesitamos sus datos:

setForm({ ...form, nombre: e.target.value })} style={inputStyle}/> setForm({ ...form, empresa: e.target.value })} style={inputStyle}/> setForm({ ...form, email: e.target.value })} style={inputStyle}/> {errorMsg && (

{errorMsg}

)}

Sus datos están protegidos según Ley 25.326. No spam.

)} {/* RESULT */} {stage === 'result' && (

Informe enviado a {form.email}

Un consultor senior de Brotek revisará su diagnóstico y se contactará en menos de 24hs hábiles para coordinar la sesión de presentación.

Agendar reunión ahora Ver servicios
)}
); }; const inputStyle = { width:'100%', boxSizing:'border-box', background:'rgba(255,255,255,.04)', border:'1px solid rgba(255,255,255,.12)', borderRadius:12, padding:'14px 16px', color:'var(--fg)', fontFamily:'var(--font-body)', fontSize:15, outline:'none', }; // Risk radar — 7-axis SVG plot of the user's exposure const RiskRadar = ({ answers, questions, exposurePct }) => { const size = 320; const cx = size / 2, cy = size / 2; const radius = 120; const n = questions.length; const points = questions.map((q, i) => { const score = answers[q.id] ?? 0; const r = (score / 3) * radius; const angle = (Math.PI * 2 * i) / n - Math.PI / 2; return { x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle), color: q.color }; }); const polygon = points.map(p => `${p.x},${p.y}`).join(' '); const axes = questions.map((q, i) => { const angle = (Math.PI * 2 * i) / n - Math.PI / 2; return { x2: cx + radius * Math.cos(angle), y2: cy + radius * Math.sin(angle), label: q.category }; }); return (
{/* Concentric rings */} {[0.33, 0.66, 1].map((f, i) => ( ))} {/* Axes */} {axes.map((a, i) => ( ))} {/* Risk polygon */} {/* Vertices */} {points.map((p, i) => ( ))} {/* Center exposure pct */} {exposurePct}% EXPOSICIÓN
); }; window.GapAnalysis = GapAnalysis;