---
title: "Test de Franquiciabilidad"
id: "2255"
type: "page"
slug: "test-de-franquiciabilidad"
published_at: "2026-05-09T14:03:31+00:00"
modified_at: "2026-08-31T04:14:40+00:00"
url: "https://novofranquicias.com/test-de-franquiciabilidad/"
markdown_url: "https://novofranquicias.com/test-de-franquiciabilidad.md"
excerpt: "¿Tu Negocio Está Listo para Franquiciar? Diagnóstico de Franquiciabilidad NVF Diagnóstico de Franquiciabilidad NVF ¿Tu negocioestá listo parafranquiciar? Responde 24 preguntas y evalúa seis condiciones que determinan qué tan preparado está tu negocio para iniciar un proceso de franquicia: rentabilidad,..."
---

¿Tu Negocio Está Listo para Franquiciar? Diagnóstico de Franquiciabilidad NVFDiagnóstico de Franquiciabilidad NVF

# ¿Tu negocio está listo para *franquiciar?*

Responde **24 preguntas** y evalúa seis condiciones que determinan qué tan preparado está tu negocio para iniciar un proceso de franquicia: rentabilidad, replicabilidad, transferibilidad, estandarización, diferenciación y capacidad franquiciante.

24Preguntas

6Dimensiones

5'Duración

 Iniciar diagnóstico  Diagnóstico orientativo · Resultado inmediato · No reemplaza una evaluación profesional

NVF · Diagnóstico de FranquiciabilidadDimensión 11 / 24

Anterior  Siguiente

## Cuestionario *completado.*

Tu diagnóstico está listo. Déjanos tus datos para mostrarte el resultado completo y permitirte descargar tu reporte. **Si deseas avanzar, podremos contactarte con base en las brechas detectadas.**

Tu nombre

Nombre de tu negocio / marca

Correo electrónico

WhatsApp

  Acepto que NVF use estos datos para entregarme el diagnóstico y contactarme respecto a una evaluación de franquiciabilidad. Usaremos tus datos para entregarte el resultado y, si corresponde, dar seguimiento a tu interés. Puedes solicitar dejar de recibir comunicaciones en cualquier momento.

 Ver mi resultado

### Analizando tu negocio

Procesando respuestas

NVF · Resultado del diagnóstico  Descargar PDF

${q.texto}

${q.opciones.map((opt, i) => `  ${opt.key}

 ${opt.label}

 ${opt.desc ? `${opt.desc}

` : ''}

  `).join('')}

 `; // Re-trigger animation card.style.animation = 'none'; card.offsetHeight; card.style.animation = ''; } function selectOption(pts) { respuestas[currentQ] = pts; document.querySelectorAll('.q-option').forEach(btn => btn.classList.remove('selected')); // Find which button was clicked const opts = document.querySelectorAll('.q-option'); const q = PREGUNTAS[currentQ]; q.opciones.forEach((opt, i) => { if (opt.pts === pts) opts[i].classList.add('selected'); }); document.getElementById('btn-next').classList.add('enabled'); } function nextQuestion() { if (respuestas[currentQ] === null) return; if (currentQ === PREGUNTAS.length - 1) { showScreen('screen-email'); return; } currentQ++; renderQuestion(); window.scrollTo(0, 0); } function prevQuestion() { if (currentQ === 0) return; currentQ--; renderQuestion(); window.scrollTo(0, 0); } /* ═══════════════════════════════════════════ EMAIL GATE ═══════════════════════════════════════════ */ function submitEmail() { const nombre = document.getElementById('input-nombre').value.trim(); const empresa = document.getElementById('input-empresa').value.trim(); const email = document.getElementById('input-email').value.trim(); const phone = document.getElementById('input-phone').value.trim(); const consent = document.getElementById('input-consent').checked; if (!nombre || !empresa) { showToast('Completa tu nombre y el nombre de tu negocio'); return; } if (!email || !email.includes('@')) { showToast('Por favor ingresa un correo válido'); return; } if (!phone || phone.replace(/\D/g,'').length { const pregsOfDim = PREGUNTAS.map((p, i) => ({ ...p, idx: i })).filter(p => p.dim === di); const total = pregsOfDim.reduce((sum, p) => sum + (respuestas[p.idx] || 2), 0); const max = pregsOfDim.length * 4; return Math.round((total / max) * 100); }); const overall = Math.round(dimScores.reduce((a, b) => a + b, 0) / dimScores.length); return { dimScores, overall }; } function getVerdict(score) { if (score >= 82) return { nivel:'Nivel 4', titulo:'Alta preparación para estructurarse', desc:'Tu negocio muestra una base sólida para iniciar una evaluación profesional y estructurar un sistema de franquicia. El test no sustituye la validación técnica, financiera y legal.', color:'#6FCF97' }; if (score >= 68) return { nivel:'Nivel 3', titulo:'Preparado para iniciar estructuración', desc:'Existen condiciones favorables para avanzar, pero algunas brechas deben cerrarse durante la preparación antes de comercializar franquicias.', color:'#F2C94C' }; if (score >= 52) return { nivel:'Nivel 2', titulo:'Negocio con potencial de franquicia', desc:'Hay fundamentos valiosos, pero todavía existen brechas importantes de sistema, transferencia, economía o capacidad franquiciante.', color:'#F2994A' }; return { nivel:'Nivel 1', titulo:'Negocio por consolidar', desc:'Antes de iniciar un desarrollo de franquicia conviene fortalecer el modelo actual y reducir dependencias críticas.', color:'#EB5757' }; } function getDimInsight(dimIdx, score) { const insights = [ [ 'La economía del negocio está bien medida y ofrece una base razonable para modelar una futura unidad franquiciada.', 'La rentabilidad tiene una base positiva, pero faltan validaciones para proyectarla con seguridad a una unidad franquiciada.', 'La economía de unidad todavía tiene brechas de información o estabilidad que deben resolverse antes de estructurar regalías y canon.', 'No existe evidencia financiera suficiente para afirmar que el modelo puede sostener una franquicia.' ], [ 'El modelo presenta una buena capacidad de repetirse fuera de la operación original.', 'La replicabilidad es prometedora, aunque todavía depende de algunas condiciones que conviene convertir en criterios explícitos.', 'La réplica aún está poco validada y depende de factores del contexto actual.', 'El negocio depende demasiado de condiciones difíciles de reproducir en otra unidad.' ], [ 'El know-how puede enseñarse y ejecutarse por terceros con una base sólida.', 'La transferencia es viable, aunque todavía existen conocimientos o estándares dependientes de personas clave.', 'Gran parte del aprendizaje sigue siendo informal y necesita estructurarse.', 'El conocimiento crítico permanece concentrado en el fundador o en pocas personas.' ], [ 'Los procesos, controles e información forman una base consistente para operar más de una unidad.', 'Existe una buena base de estandarización, con brechas puntuales por cerrar.', 'La operación todavía cambia demasiado según la persona o la supervisión directa.', 'Sin procesos y controles consistentes, replicar aumentaría el riesgo operativo.' ], [ 'La propuesta y la marca tienen atributos reconocibles que pueden sostener una expansión.', 'Existe diferenciación, aunque conviene formalizar y proteger mejor los elementos de marca.', 'La propuesta es parcialmente diferenciada y puede perder fuerza al salir de su contexto actual.', 'La marca o propuesta todavía es fácilmente sustituible o demasiado dependiente del fundador.' ], [ 'La empresa muestra capacidad para asumir el rol de franquiciante y sostener una red.', 'Hay una base de liderazgo y recursos, aunque el sistema de soporte aún debe diseñarse.', 'La empresa quiere expandirse, pero todavía no cuenta con suficiente capacidad instalada para acompañar franquiciados.', 'La operación actual absorbería casi toda la capacidad del equipo; franquiciar ahora podría desbordarla.' ], ]; const idx = score >= 80 ? 0 : score >= 65 ? 1 : score >= 45 ? 2 : 3; return insights[dimIdx][idx]; } /* ═══════════════════════════════════════════ BANCO DE TEXTOS — ANÁLISIS POR NIVEL 4 rangos × estructura narrativa dinámica ═══════════════════════════════════════════ */ const ANALISIS_GENERAL = { alto: (empresa, fortalezas, brechas) => ` **${empresa}** presenta una alta preparación para iniciar la estructuración de una franquicia. El resultado indica que el negocio ha desarrollado una base favorable en varias de las condiciones que permiten replicar un modelo con mayor control. **Tus principales fortalezas** son **${fortalezas}**. Estas dimensiones deberían convertirse en activos explícitos del futuro sistema de franquicia. **Las áreas que todavía requieren validación o fortalecimiento** son **${brechas}**. Incluso con un resultado alto, conviene confirmar estas condiciones con evidencia operativa, financiera, legal y de mercado. El siguiente paso no es vender franquicias todavía. Es realizar una evaluación profesional, diseñar la arquitectura del sistema y definir qué debe quedar listo antes de salir a expansión.`, medio_alto: (empresa, fortalezas, brechas) => ` **${empresa}** presenta condiciones favorables para iniciar un proceso de estructuración, aunque todavía existen brechas que deben cerrarse antes de comercializar una franquicia. **Las fortalezas sobre las que puedes construir** son **${fortalezas}**. Allí existe una base que puede acelerar el desarrollo. **Las brechas prioritarias** son **${brechas}**. Estas áreas deben abordarse dentro de la preparación del negocio para evitar trasladar problemas de la unidad actual a futuras unidades. La recomendación es avanzar a una evaluación técnica y convertir las brechas detectadas en un plan de preparación antes de definir canon, regalías, contratos o salir a buscar franquiciados.`, medio_bajo: (empresa, fortalezas, brechas) => ` **${empresa}** tiene potencial de franquicia, pero todavía necesita fortalecer su estructura antes de iniciar un desarrollo formal. **Lo que hoy juega a favor** es **${fortalezas}**. Estas dimensiones muestran que existe una base sobre la cual construir. **Las brechas que más limitan la franquiciabilidad** son **${brechas}**. Antes de pensar en expansión conviene mejorar sistemas, transferencia, economía o capacidad de soporte según corresponda. El camino recomendado es preparar primero la empresa. Una franquicia sostenible nace de un negocio que puede operar, enseñar, controlar y replicar su modelo con consistencia.`, bajo: (empresa, fortalezas, brechas) => ` **${empresa}** todavía debe consolidar condiciones fundamentales antes de iniciar un desarrollo de franquicia. **Los elementos con mejor base** son **${fortalezas}**. Esos activos pueden convertirse en el punto de partida del fortalecimiento. **Las áreas críticas** son **${brechas}**. El resultado sugiere que el modelo actual todavía depende de variables que dificultarían una réplica responsable. La prioridad ahora es fortalecer la empresa actual, reducir dependencia del fundador, mejorar información y sistemas, y validar la economía del modelo. La franquicia puede seguir siendo una meta, pero no debería convertirse todavía en el siguiente movimiento comercial.` }; /* ═══════════════════════════════════════════ BANCO DE RECOMENDACIONES POR DIMENSIÓN Y NIVEL [dimIdx][nivel 0=alto 1=medio_alto 2=medio_bajo 3=bajo] ═══════════════════════════════════════════ */ const RECOMENDACIONES = [ [ { titulo:'Modela la economía del futuro franquiciado', descripcion:'Construye escenarios con inversión total, ventas, costos, capital de trabajo, punto de equilibrio y contraprestaciones de la franquicia antes de definir la oferta.' }, { titulo:'Valida la economía de unidad', descripcion:'Completa y contrasta los números del negocio actual para saber qué tan sostenible sería una unidad operada por un tercero.' }, { titulo:'Ordena la información financiera', descripcion:'Define ventas, costos, margen, punto de equilibrio y capital de trabajo por unidad antes de proyectar una franquicia.' }, { titulo:'Primero demuestra rentabilidad', descripcion:'Sin información confiable y una economía sostenible, cualquier proyección para un futuro franquiciado sería demasiado especulativa.' }, ], [ { titulo:'Formaliza los criterios de réplica', descripcion:'Convierte la experiencia de las unidades actuales en criterios de plaza, local, proveedores, formato y operación que puedan repetirse.' }, { titulo:'Prueba las variables críticas', descripcion:'Identifica qué depende de la ubicación, proveedores o personas y valida cómo se comporta el modelo fuera de su contexto original.' }, { titulo:'Haz una prueba de réplica', descripcion:'Antes de escalar, valida el modelo en otra unidad, formato o plaza y documenta qué tuvo que cambiar.' }, { titulo:'Reduce la dependencia del contexto actual', descripcion:'Define qué elementos hacen funcionar al negocio hoy y cuáles tendrían que rediseñarse para operar en otro lugar.' }, ], [ { titulo:'Convierte know-how en sistema de transferencia', descripcion:'Diseña el recorrido de capacitación, materiales, evaluaciones y criterios que permitan enseñar el negocio a terceros.' }, { titulo:'Cierra brechas de conocimiento tácito', descripcion:'Identifica lo que todavía vive en la cabeza del fundador o de personas clave y conviértelo en contenidos y estándares transferibles.' }, { titulo:'Estructura roles y capacitación', descripcion:'Define puestos, responsabilidades, competencias y una ruta de aprendizaje antes de pensar en capacitar franquiciados.' }, { titulo:'Desconcentra el conocimiento', descripcion:'Mientras el negocio dependa de unas pocas personas, la transferencia a una red seguirá siendo frágil.' }, ], [ { titulo:'Prepara el sistema operativo para escalar', descripcion:'Integra procesos, indicadores, controles y responsabilidades en una estructura que pueda auditarse entre unidades.' }, { titulo:'Completa la estandarización', descripcion:'Cierra los procesos que todavía son informales y define mecanismos de control para asegurar consistencia.' }, { titulo:'Prioriza procesos críticos y KPIs', descripcion:'Empieza por los procesos que más afectan cliente, caja, producto y calidad, y define cómo medir su cumplimiento.' }, { titulo:'Construye primero el sistema empresarial', descripcion:'Si la operación cambia según quién esté presente, todavía no existe una base suficiente para replicarla con control.' }, ], [ { titulo:'Protege y codifica la propuesta de marca', descripcion:'Asegura protección de marca y documenta los elementos de experiencia, identidad y propuesta que deben mantenerse en toda la red.' }, { titulo:'Fortalece el diferencial', descripcion:'Haz explícito por qué el cliente te elige y qué parte de esa ventaja debe conservarse al abrir nuevas unidades.' }, { titulo:'Reduce la dependencia de precio o fundador', descripcion:'Trabaja una propuesta más reconocible y una experiencia que pueda sostenerse sin depender de una sola persona.' }, { titulo:'Construye una propuesta defendible', descripcion:'Antes de vender una franquicia, el mercado debe tener razones claras para elegir la marca frente a alternativas.' }, ], [ { titulo:'Diseña la central de franquicias', descripcion:'Define quién capacita, quién da soporte, quién audita, cómo se controlan indicadores y qué recursos requiere la red.' }, { titulo:'Prepara el equipo para el nuevo rol', descripcion:'Asigna responsables y presupuesto para soporte, control, capacitación y expansión antes de incorporar franquiciados.' }, { titulo:'Construye capacidad franquiciante', descripcion:'Desarrolla liderazgo, recursos y una visión de expansión antes de asumir compromisos con terceros.' }, { titulo:'Fortalece primero la empresa actual', descripcion:'Si el equipo ya está saturado, una red de franquicias multiplicará la complejidad. Construye capacidad antes de expandirte.' }, ], ]; /* ═══════════════════════════════════════════ INTEGRACIÓN DE LEADS Coloca aquí la URL de tu webhook (Make, Zapier, CRM, etc.). Si se deja vacío, el diagnóstico funciona pero NO envía los datos. ═══════════════════════════════════════════ */ const NVF_WEBHOOK_URL = ''; async function sendLeadPayload(payload) { if (!NVF_WEBHOOK_URL) return; try { await fetch(NVF_WEBHOOK_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), keepalive: true }); } catch (e) { console.warn('No se pudo enviar el lead al webhook', e); } } /* ═══════════════════════════════════════════ MOTOR DE ANÁLISIS ESTÁTICO ═══════════════════════════════════════════ */ function runAnalysis() { const { dimScores, overall } = calcularScores(); const verdict = getVerdict(overall); // Simular carga breve (UX) const loadingSteps = [ 'Calculando score por dimensión', 'Identificando fortalezas y brechas', 'Construyendo análisis ejecutivo', 'Preparando recomendaciones', ]; let stepIdx = 0; const stepEl = document.getElementById('loading-step'); const stepTimer = setInterval(() => { stepEl.innerHTML = loadingSteps[Math.min(stepIdx, loadingSteps.length - 1)] + ''; stepIdx++; }, 700); setTimeout(() => { clearInterval(stepTimer); // Ordenar dimensiones por score const ranked = dimScores .map((s, i) => ({ s, i })) .sort((a, b) => b.s - a.s); const top2 = ranked.slice(0, 2).map(r => DIMENSIONES[r.i].nombre).join(' y '); const bottom2 = ranked.slice(-2).map(r => DIMENSIONES[r.i].nombre).join(' y '); const bottom3 = ranked.slice(-3); // para recomendaciones // Seleccionar nivel de análisis const nivelKey = overall >= 82 ? 'alto' : overall >= 68 ? 'medio_alto' : overall >= 52 ? 'medio_bajo' : 'bajo'; const analisis = ANALISIS_GENERAL[nivelKey]( userData.empresa || 'Tu negocio', top2, bottom2 ); // Recomendaciones: top 3 dimensiones más débiles const recs = bottom3.map(({ i, s }) => { const nivelIdx = s >= 80 ? 0 : s >= 65 ? 1 : s >= 45 ? 2 : 3; return RECOMENDACIONES[i][nivelIdx]; }); resultData = { dimScores, overall, verdict, analisis, recs }; sendLeadPayload({ source: 'Diagnostico Franquiciabilidad NVF MR2.0', capturedAt: new Date().toISOString(), user: userData, overall, level: verdict.nivel, verdict: verdict.titulo, dimensions: DIMENSIONES.map((d, i) => ({ id:d.id, name:d.nombre, score:dimScores[i] })), answers: respuestas }); renderResults(); showScreen('screen-results'); }, 2800); } /* ═══════════════════════════════════════════ RENDER RESULTADOS ═══════════════════════════════════════════ */ function renderResults() { const { dimScores, overall, verdict, analisis, recs } = resultData; const body = document.getElementById('results-body'); // Ring color según score const ringColor = verdict.color; const circumference = 2 * Math.PI * 54; // r=54 const offset = circumference * (1 - overall / 100); body.innerHTML = ` Diagnóstico completado

# ${userData.empresa ? `*${userData.empresa}* —` : ''} ${verdict.titulo}

Índice orientativo de franquiciabilidad

0/ 100

${verdict.nivel} · ${verdict.titulo}

${verdict.desc}

### Perfil por dimensión

Detalle por dimensión

${DIMENSIONES.map((d, i) => ` ${d.nombre}${dimScores[i]}

${getDimInsight(i, dimScores[i])}

 `).join('')}

Diagnóstico ejecutivo

${analisis.split('\n').filter(p=>p.trim()).map(p=>`${p}

`).join('')}

Próximos pasos recomendados

${recs.map((r, i) => ` 0${i+1}${r.titulo}

${r.descripcion}

 `).join('')}

**Importante:** este resultado es una herramienta orientativa basada en tus respuestas. No certifica que un negocio sea franquiciable ni reemplaza una evaluación técnica, financiera, legal y de mercado.

### ¿Quieres validar profesionalmente tu resultado?

NVF puede revisar tus brechas, validar si el negocio está en condiciones de avanzar y definir qué debe fortalecerse antes de estructurar la franquicia. **El objetivo es saber qué hacer ahora, no vender una franquicia antes de tiempo.**

[Validar mi resultado](https://wa.me/51981043449?text=%24%7BencodeURIComponent(%60Hola,%20acabo%20de%20completar%20el%20Diagn%C3%B3stico%20de%20Franquiciabilidad%20NVF.%20Mi%20negocio%20es%20%24%7BuserData.empresa%7D,%20obtuve%20%24%7Boverall%7D/100%20(%24%7Bverdict.nivel%7D%20-%20%24%7Bverdict.titulo%7D)%20y%20quiero%20validar%20profesionalmente%20el%20resultado.%60)%7D)

 `; // Animar score counter animateCounter('score-counter', 0, overall, 1200); // Animar ring setTimeout(() => { const ring = document.getElementById('ring-fill-anim'); if (ring) { const c = 2 * Math.PI * 54; ring.style.strokeDashoffset = c * (1 - overall / 100); ring.style.transition = 'stroke-dashoffset 1.2s ease'; } }, 100); // Animar barras setTimeout(() => { document.querySelectorAll('.dim-bar-fill').forEach(el => { el.style.width = el.dataset.target; }); }, 200); // Radar chart setTimeout(() => buildRadar(), 300); } function animateCounter(id, from, to, dur) { const el = document.getElementById(id); if (!el) return; const start = performance.now(); function update(now) { const t = Math.min((now - start) / dur, 1); const ease = 1 - Math.pow(1 - t, 3); el.textContent = Math.round(from + (to - from) * ease); if (t d.nombre), datasets: [{ data: resultData.dimScores, backgroundColor: 'rgba(201,168,76,0.12)', borderColor: '#C9A84C', borderWidth: 2, pointBackgroundColor: '#C9A84C', pointBorderColor: '#0D0D0D', pointRadius: 4, }] }, options: { responsive: true, maintainAspectRatio: true, scales: { r: { min: 0, max: 100, ticks: { stepSize: 25, color: 'rgba(255,255,255,0.2)', backdropColor: 'transparent', font: { size: 9, family: 'DM Sans' }, }, grid: { color: 'rgba(255,255,255,0.06)' }, angleLines: { color: 'rgba(255,255,255,0.06)' }, pointLabels: { color: '#888888', font: { size: 11, family: 'DM Sans', weight: '600' }, } } }, plugins: { legend: { display: false } } } }); } /* ═══════════════════════════════════════════ GENERAR PDF ═══════════════════════════════════════════ */ async function generatePDF() { if (!resultData) return; showToast('Generando PDF…'); const { dimScores, overall, verdict, analisis, recs } = resultData; const date = new Date().toLocaleDateString('es-PE', { year:'numeric', month:'long', day:'numeric' }); // Construir zona PDF const zone = document.getElementById('pdf-zone'); const cleanAnalysis = analisis.replace(/**/g,'').replace(//g,''); zone.innerHTML = ` NVF · NovofranquiciasEmitido el ${date} · ${userData.email}

 Diagnóstico de Franquiciabilidad NVF — Resultado

# ${userData.empresa || 'Mi Negocio'} *${verdict.titulo}*

Análisis generado para: ${userData.nombre || userData.email}

 ${overall}

${verdict.nivel} · ${verdict.titulo}

${verdict.desc}

 ${DIMENSIONES.map((d, i) => ` ${d.nombre}${dimScores[i]}

 `).join('')}

 Diagnóstico ejecutivo

 ${cleanAnalysis.replace(/\n/g,'  
')}

   
  
 Recomendaciones prioritarias

 ${recs.map((r, i) => ` ${i+1}. ${r.titulo}

${r.descripcion}

 `).join('')} Resultado orientativo basado en las respuestas proporcionadas. No constituye certificación de franquiciabilidad ni reemplaza una evaluación técnica, financiera, legal y de mercado.

 NVF · Novofranquiciasnovofranquicias.com · comercial@novofranquicias.com  
 +51 981 043 449 · Elías Aguirre 180, Miraflores, Lima

 `; // Mover temporalmente a visible para captura zone.style.position = 'static'; zone.style.top = 'auto'; zone.style.left = 'auto'; try { await new Promise(r => setTimeout(r, 300)); const canvas = await html2canvas(zone, { scale: 2, backgroundColor: '#0D0D0D', useCORS: true, logging: false, }); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' }); const pageW = 210; const imgH = (canvas.height / canvas.width) * pageW; const pageH = 297; let yPos = 0; while (yPos 0) pdf.addPage(); const srcY = (yPos / imgH) * canvas.height; const srcH = Math.min((pageH / imgH) * canvas.height, canvas.height - srcY); const tmpCanvas = document.createElement('canvas'); tmpCanvas.width = canvas.width; tmpCanvas.height = srcH; const tmpCtx = tmpCanvas.getContext('2d'); tmpCtx.drawImage(canvas, 0, srcY, canvas.width, srcH, 0, 0, canvas.width, srcH); const imgData = tmpCanvas.toDataURL('image/jpeg', 0.95); const sliceH = (srcH / canvas.height) * imgH; pdf.addImage(imgData, 'JPEG', 0, 0, pageW, sliceH); yPos += pageH; } const filename = `NVF-Franquiciabilidad-${(userData.empresa || 'Resultado').replace(/\s+/g,'-')}.pdf`; pdf.save(filename); showToast('PDF descargado correctamente'); } catch(e) { showToast('Error generando PDF. Intenta de nuevo.'); } finally { zone.style.position = 'fixed'; zone.style.top = '-9999px'; zone.style.left = '-9999px'; } } /* ═══════════════════════════════════════════ TOAST ═══════════════════════════════════════════ */ function showToast(msg) { const t = document.getElementById('toast'); t.textContent = msg; t.classList.add('show'); setTimeout(() => t.classList.remove('show'), 3000); }**
