{"id":3469,"date":"2026-05-12T23:17:44","date_gmt":"2026-05-12T23:17:44","guid":{"rendered":"https:\/\/quantumlink.pro\/?page_id=3469"},"modified":"2026-06-01T18:59:21","modified_gmt":"2026-06-01T18:59:21","slug":"iso-27001","status":"publish","type":"page","link":"https:\/\/quantumlink.pro\/?page_id=3469","title":{"rendered":"ISO 27001"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3469\" class=\"elementor elementor-3469\">\n\t\t\t\t<div class=\"elementor-element elementor-element-19f8050 e-flex e-con-boxed e-con e-parent\" data-id=\"19f8050\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-979db85 elementor-widget elementor-widget-heading\" data-id=\"979db85\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Seguridad de Clase Mundial: Certificaci\u00f3n ISO 27001<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8e5072b e-flex e-con-boxed e-con e-parent\" data-id=\"8e5072b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-adb2fe8 elementor-widget elementor-widget-heading\" data-id=\"adb2fe8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">NO SOLO PROTEGEMOS SUS DATOS, BLINDAMOS LA CONTINUIDAD DE SU NEGOCIO<\/h4>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a642c75 e-flex e-con-boxed e-con e-parent\" data-id=\"a642c75\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8ec7f76 elementor-widget elementor-widget-heading\" data-id=\"8ec7f76\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">En el panorama digital actual, la informaci\u00f3n es el activo m\u00e1s valioso y, al mismo tiempo, el m\u00e1s vulnerable. En Quantum Link Systems operamos bajo los estrictos est\u00e1ndares de la norma ISO\/IEC 27001, el marco internacional m\u00e1s reconocido para la Gesti\u00f3n de la Seguridad de la Informaci\u00f3n.<\/p>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-aeffd01 e-flex e-con-boxed e-con e-parent\" data-id=\"aeffd01\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ef8b154 elementor-widget elementor-widget-image\" data-id=\"ef8b154\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"640\" height=\"427\" src=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-1024x683.jpg\" class=\"attachment-large size-large wp-image-3596\" alt=\"\" srcset=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-1024x683.jpg 1024w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-300x200.jpg 300w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-768x512.jpg 768w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-1536x1025.jpg 1536w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-2048x1366.jpg 2048w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-900x600.jpg 900w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/programming-background-with-html-570x380.jpg 570w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-738a3c0 e-flex e-con-boxed e-con e-parent\" data-id=\"738a3c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-33757c1 elementor-widget elementor-widget-heading\" data-id=\"33757c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Beneficio Fiscal: La certificaci\u00f3n ISO 27001 es deducible de impuestos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9b5380a e-flex e-con-boxed e-con e-parent\" data-id=\"9b5380a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-12ab764 elementor-widget elementor-widget-noile-features\" data-id=\"12ab764\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"noile-features.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n\t<div class=\"service-details-page__inner-row\">\r\n\t\t<div class=\"service-details-page__join-img-box wow animated fadeInUp\" data-wow-delay=\"0.1s\" data-wow-duration=\"1500ms\">\r\n\t\t\t<img decoding=\"async\" src=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/standard-quality-control-concept-m-scaled.jpg\" alt=\"standard-quality-control-concept-m\" title=\"standard-quality-control-concept-m\" class=\"service-details-page__join-img\" >\t\t<\/div><!-- \/.service-details-page__join-img-box -->\r\n\t\t<div class=\"service-details-page__join-content wow animated fadeInUp\" data-wow-delay=\"0.3s\" data-wow-duration=\"1500ms\">\r\n\t\t\t<h2 class=\"service-details-page__join-title\">Aproveche los beneficios fiscales ante el SAT mientras protege su empresa<\/h2>\t\t\t<p class=\"service-details-page__join-desc\">La certificaci\u00f3n ISO 27001 protege sus activos de informaci\u00f3n, mitiga riesgos operativos, legales y financieros, y es requisito comercial para cerrar contratos con clientes o participar en licitaciones.<\/p>\r\n\t\t\t<div class=\"service-details-page__service-box\">\r\n\t\t\t\t\t\t\t<\/div><!-- \/.service-details-page__service-box -->\r\n\t\t<\/div><!-- \/.service-details-page__join-content -->\r\n\t<\/div><!-- \/.service-details-page__inner-row -->\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a804941 e-con e-atomic-element e-flexbox-base e-4e4a975 \" data-id=\"a804941\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"a804941\">\n    <div class=\"elementor-element elementor-element-c37a4a4 e-con e-atomic-element e-flexbox-base e-f1c05be \" data-id=\"c37a4a4\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"c37a4a4\">\n    \t\t<div class=\"elementor-element elementor-element-3163483 elementor-widget elementor-widget-heading\" data-id=\"3163483\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">CONVIERTA SU INVERSI\u00d3N EN SEGURIDAD EN UNA VENTAJA FISCAL PARA SU EMPRESA<\/p>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-237a684 e-con e-atomic-element e-flexbox-base e-fe0dd9d \" data-id=\"237a684\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"237a684\">\n    \t\t<div class=\"elementor-element elementor-element-50c6c32 elementor-widget elementor-widget-image\" data-id=\"50c6c32\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"640\" height=\"427\" src=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-1024x683.jpg\" class=\"attachment-large size-large wp-image-3604\" alt=\"\" srcset=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-1024x683.jpg 1024w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-300x200.jpg 300w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-768x512.jpg 768w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-1536x1024.jpg 1536w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-2048x1365.jpg 2048w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-900x600.jpg 900w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/anastassia-anufrieva-ecHGTPfjNfA-unsplash-570x380.jpg 570w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-7f5b8ba e-con e-atomic-element e-flexbox-base e-1689262 \" data-id=\"7f5b8ba\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"7f5b8ba\">\n    <div class=\"elementor-element elementor-element-ab09937 e-con e-atomic-element e-flexbox-base e-d442550 \" data-id=\"ab09937\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"ab09937\">\n    \t\t<div class=\"elementor-element elementor-element-0a58bb6 elementor-widget elementor-widget-image\" data-id=\"0a58bb6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"640\" height=\"427\" src=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-1024x683.jpg\" class=\"attachment-large size-large wp-image-3606\" alt=\"\" srcset=\"https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-1024x683.jpg 1024w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-300x200.jpg 300w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-768x512.jpg 768w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-1536x1024.jpg 1536w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-2048x1365.jpg 2048w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-900x600.jpg 900w, https:\/\/quantumlink.pro\/wp-content\/uploads\/2026\/05\/dimitri-karastelev-ZH4FUYiaczY-unsplash-570x380.jpg 570w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-5f1c726 e-con e-atomic-element e-flexbox-base e-564e642 \" data-id=\"5f1c726\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"5f1c726\">\n    \t\t<div class=\"elementor-element elementor-element-47cba22 elementor-widget elementor-widget-text-editor\" data-id=\"47cba22\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Los gastos asociados a la obtenci\u00f3n y mantenimiento de la certificaci\u00f3n ISO 27001 son deducibles de impuestos \u200bante el SAT en M\u00e9xico, siempre y cuando se cumplan con los requisitos establecidos en la Ley del Impuesto Sobre la Renta (LISR).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-6f3afac e-con e-atomic-element e-flexbox-base e-7e3cfba \" data-id=\"6f3afac\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"6f3afac\">\n    \t\t<div class=\"elementor-element elementor-element-94342f4 elementor-widget elementor-widget-heading\" data-id=\"94342f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">\u00bfSABE REALMENTE QU\u00c9 TAN PROTEGIDA EST\u00c1 SU EMPRESA? RESPONDA ESTAS PREGUNTAS Y LO SABR\u00c1.<\/div>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-781ebe0 e-flex e-con-boxed e-con e-parent\" data-id=\"781ebe0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-25ce53c elementor-widget elementor-widget-html\" data-id=\"25ce53c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- =========================\r\nISO 27001 DIAGNOSTIC APP\r\nVERSI\u00d3N FINAL + API + MYSQL + CLOUDFLARE + VALIDACIONES + EMAIL\r\nPEGAR EN WIDGET HTML DE ELEMENTOR\r\n========================= -->\r\n\r\n<!-- Agregar SweetAlert2 CSS y JS -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\/dist\/sweetalert2.min.css\">\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\"><\/script>\r\n\r\n<style>\r\n*{\r\nbox-sizing:border-box;\r\n}\r\n\r\n#iso27001-wrapper{\r\nfont-family:Arial,sans-serif;\r\nbackground:#f8fafc;\r\npadding:40px 20px;\r\n}\r\n\r\n.iso-container{\r\nmax-width:1000px;\r\nmargin:auto;\r\n}\r\n\r\n.iso-card{\r\nbackground:#fff;\r\nborder-radius:24px;\r\noverflow:hidden;\r\nbox-shadow:0 10px 40px rgba(0,0,0,.08);\r\n}\r\n\r\n.iso-hidden{\r\ndisplay:none !important;\r\n}\r\n\r\n\/* HEADER *\/\r\n\r\n.iso-hero{\r\nbackground:#2563eb;\r\npadding:60px 40px;\r\ntext-align:center;\r\ncolor:#fff;\r\n}\r\n\r\n.iso-hero-icon{\r\nfont-size:70px;\r\nmargin-bottom:20px;\r\n}\r\n\r\n.iso-hero h1{\r\nfont-size:42px;\r\nfont-weight:800;\r\nmargin-bottom:20px;\r\n}\r\n\r\n.iso-hero p{\r\nfont-size:18px;\r\nline-height:1.7;\r\nmax-width:700px;\r\nmargin:auto;\r\nopacity:.95;\r\n}\r\n\r\n\/* INTRO *\/\r\n\r\n.iso-intro{\r\npadding:40px;\r\n}\r\n\r\n.iso-grid{\r\ndisplay:grid;\r\ngrid-template-columns:repeat(3,1fr);\r\ngap:20px;\r\nmargin-bottom:40px;\r\n}\r\n\r\n.iso-grid-card{\r\nbackground:#f8fafc;\r\npadding:30px;\r\nborder-radius:18px;\r\ntext-align:center;\r\nborder:1px solid #e5e7eb;\r\ntransition:.25s;\r\n}\r\n\r\n.iso-grid-card:hover{\r\ntransform:translateY(-4px);\r\nbox-shadow:0 10px 20px rgba(0,0,0,.06);\r\n}\r\n\r\n.iso-grid-card h3{\r\nmargin-top:15px;\r\nmargin-bottom:10px;\r\nfont-size:20px;\r\n}\r\n\r\n.iso-grid-card p{\r\ncolor:#6b7280;\r\n}\r\n\r\n.iso-start-btn{\r\nbackground:#2563eb;\r\ncolor:#fff;\r\npadding:18px 35px;\r\nborder:none;\r\nborder-radius:14px;\r\nfont-size:18px;\r\nfont-weight:700;\r\ncursor:pointer;\r\ntransition:.3s;\r\n}\r\n\r\n.iso-start-btn:hover{\r\nbackground:#1d4ed8;\r\ntransform:translateY(-2px);\r\n}\r\n\r\n\/* STEP *\/\r\n\r\n.iso-step{\r\npadding:40px;\r\n}\r\n\r\n.iso-progress-top{\r\nmargin-bottom:35px;\r\n}\r\n\r\n.iso-progress-info{\r\ndisplay:flex;\r\njustify-content:space-between;\r\nmargin-bottom:12px;\r\nfont-size:14px;\r\nfont-weight:600;\r\ncolor:#6b7280;\r\n}\r\n\r\n.iso-progress-bar{\r\nheight:12px;\r\nbackground:#e5e7eb;\r\nborder-radius:999px;\r\noverflow:hidden;\r\n}\r\n\r\n.iso-progress-fill{\r\nheight:100%;\r\nwidth:0%;\r\nbackground:#2563eb;\r\ntransition:.4s;\r\n}\r\n\r\n.iso-section-header{\r\ndisplay:flex;\r\nalign-items:center;\r\ngap:15px;\r\npadding:25px;\r\nbackground:#eff6ff;\r\nborder-bottom:1px solid #dbeafe;\r\n}\r\n\r\n.iso-section-header h2{\r\nmargin:0;\r\nfont-size:30px;\r\ncolor:#111827;\r\n}\r\n\r\n.iso-warning{\r\nbackground:#fef2f2;\r\nborder:1px solid #fecaca;\r\ncolor:#b91c1c;\r\npadding:16px 18px;\r\nborder-radius:14px;\r\nmargin:25px 35px 0 35px;\r\nfont-weight:600;\r\ndisplay:flex;\r\nalign-items:center;\r\ngap:10px;\r\nanimation:fadeIn .3s ease;\r\n}\r\n\r\n.iso-warning.hidden{\r\ndisplay:none;\r\n}\r\n\r\n.iso-questions{\r\npadding:35px;\r\n}\r\n\r\n.iso-question{\r\nmargin-bottom:45px;\r\npadding-bottom:25px;\r\nborder-bottom:1px solid #f3f4f6;\r\ntransition:.25s;\r\n}\r\n\r\n.iso-question.error{\r\nborder:2px solid #fca5a5;\r\npadding:20px;\r\nborder-radius:18px;\r\nbackground:#fff5f5;\r\nanimation:shake .25s ease;\r\n}\r\n\r\n.iso-question:last-child{\r\nborder-bottom:none;\r\n}\r\n\r\n.iso-question-title{\r\nfont-size:19px;\r\nfont-weight:700;\r\nline-height:1.7;\r\nmargin-bottom:20px;\r\ncolor:#111827;\r\n}\r\n\r\n.iso-options{\r\ndisplay:grid;\r\ngrid-template-columns:repeat(3,1fr);\r\ngap:15px;\r\n}\r\n\r\n.iso-option{\r\nborder:2px solid #e5e7eb;\r\npadding:18px;\r\nborder-radius:18px;\r\ntext-align:center;\r\ncursor:pointer;\r\nfont-weight:700;\r\ntransition:.25s;\r\nbackground:#fff;\r\ntransform:translateY(0);\r\n}\r\n\r\n.iso-option:hover{\r\nborder-color:#93c5fd;\r\nbackground:#f8fbff;\r\ntransform:translateY(-2px);\r\nbox-shadow:0 8px 18px rgba(37,99,235,.12);\r\n}\r\n\r\n.iso-option.active{\r\nborder-color:#2563eb;\r\nbackground:#eff6ff;\r\ncolor:#2563eb;\r\nbox-shadow:0 8px 20px rgba(37,99,235,.12);\r\n}\r\n\r\n\/* FOOTER *\/\r\n\r\n.iso-footer{\r\npadding:25px 35px;\r\nbackground:#f8fafc;\r\ndisplay:flex;\r\njustify-content:space-between;\r\nalign-items:center;\r\nborder-top:1px solid #e5e7eb;\r\n}\r\n\r\n.iso-btn{\r\npadding:14px 24px;\r\nborder:none;\r\nborder-radius:14px;\r\nfont-weight:700;\r\ncursor:pointer;\r\nfont-size:15px;\r\ntransition:.3s;\r\n}\r\n\r\n.iso-btn-primary{\r\nbackground:#2563eb;\r\ncolor:#fff;\r\n}\r\n\r\n.iso-btn-primary:hover{\r\nbackground:#1d4ed8;\r\ntransform:translateY(-1px);\r\n}\r\n\r\n.iso-btn-secondary{\r\nbackground:#e5e7eb;\r\ncolor:#111827;\r\n}\r\n\r\n.iso-btn:disabled{\r\nopacity:.5;\r\ncursor:not-allowed;\r\n}\r\n\r\n\/* FORM *\/\r\n\r\n.iso-form-grid{\r\ndisplay:grid;\r\ngap:20px;\r\npadding:35px;\r\n}\r\n\r\n.iso-input{\r\nwidth:100%;\r\npadding:16px;\r\nborder:2px solid #d1d5db;\r\nborder-radius:14px;\r\nfont-size:16px;\r\ntransition:.3s;\r\n}\r\n\r\n.iso-input:focus{\r\noutline:none;\r\nborder-color:#2563eb;\r\nbox-shadow:0 0 0 4px rgba(37,99,235,.1);\r\n}\r\n\r\n.iso-input.invalid{\r\nborder-color:#dc2626;\r\nbackground-color:#fef2f2;\r\n}\r\n\r\n.iso-input.valid{\r\nborder-color:#10b981;\r\nbackground-color:#f0fdf4;\r\n}\r\n\r\n.iso-input-error{\r\ncolor:#dc2626;\r\nfont-size:12px;\r\nmargin-top:4px;\r\ndisplay:block;\r\n}\r\n\r\n\/* RESULTS *\/\r\n\r\n.iso-results{\r\npadding:40px;\r\n}\r\n\r\n.iso-result-box{\r\npadding:35px;\r\nborder-radius:22px;\r\nmargin-bottom:30px;\r\nanimation:fadeIn .4s ease;\r\n}\r\n\r\n.iso-result-box h2{\r\nfont-size:40px;\r\nmargin-bottom:20px;\r\n}\r\n\r\n.iso-risk-high{\r\nbackground:#fee2e2;\r\ncolor:#991b1b;\r\n}\r\n\r\n.iso-risk-medium{\r\nbackground:#fef3c7;\r\ncolor:#92400e;\r\n}\r\n\r\n.iso-risk-low{\r\nbackground:#dcfce7;\r\ncolor:#166534;\r\n}\r\n\r\n.iso-analysis{\r\nline-height:1.8;\r\nfont-size:17px;\r\n}\r\n\r\n.iso-submit-btn{\r\nwidth:100%;\r\npadding:18px;\r\nbackground:#2563eb;\r\ncolor:#fff;\r\nborder:none;\r\nborder-radius:16px;\r\nfont-size:18px;\r\nfont-weight:700;\r\ncursor:pointer;\r\ntransition:.3s;\r\n}\r\n\r\n.iso-submit-btn:hover{\r\nbackground:#1d4ed8;\r\ntransform:translateY(-2px);\r\n}\r\n\r\n.iso-submit-btn:disabled{\r\nopacity:0.6;\r\ncursor:not-allowed;\r\ntransform:none;\r\n}\r\n\r\n.iso-success{\r\ndisplay:none;\r\nmargin-top:25px;\r\nbackground:#dcfce7;\r\npadding:25px;\r\nborder-radius:18px;\r\ncolor:#166534;\r\nfont-weight:700;\r\nanimation:fadeIn .3s ease;\r\n}\r\n\r\n.iso-loading{\r\ndisplay:inline-block;\r\nwidth:18px;\r\nheight:18px;\r\nborder:3px solid rgba(255,255,255,.3);\r\nborder-top-color:white;\r\nborder-radius:50%;\r\nanimation:spin .8s linear infinite;\r\nmargin-right:10px;\r\nvertical-align:middle;\r\n}\r\n\r\n#introScreen,\r\n#questionScreen,\r\n#formScreen,\r\n#resultsScreen{\r\nanimation:fadeScreen .35s ease;\r\n}\r\n\r\n@keyframes fadeScreen{\r\nfrom{\r\nopacity:0;\r\ntransform:translateY(10px);\r\n}\r\nto{\r\nopacity:1;\r\ntransform:translateY(0);\r\n}\r\n}\r\n\r\n@keyframes shake{\r\n0%{transform:translateX(0);}\r\n25%{transform:translateX(-4px);}\r\n50%{transform:translateX(4px);}\r\n75%{transform:translateX(-4px);}\r\n100%{transform:translateX(0);}\r\n}\r\n\r\n@keyframes fadeIn{\r\nfrom{\r\nopacity:0;\r\ntransform:translateY(-5px);\r\n}\r\nto{\r\nopacity:1;\r\ntransform:translateY(0);\r\n}\r\n}\r\n\r\n@keyframes spin{\r\nto{\r\ntransform:rotate(360deg);\r\n}\r\n}\r\n\r\n@media(max-width:768px){\r\n\r\n.iso-grid{\r\ngrid-template-columns:1fr;\r\n}\r\n\r\n.iso-options{\r\ngrid-template-columns:1fr;\r\n}\r\n\r\n.iso-footer{\r\nflex-direction:column;\r\ngap:15px;\r\n}\r\n\r\n.iso-hero h1{\r\nfont-size:32px;\r\n}\r\n\r\n.iso-section-header h2{\r\nfont-size:24px;\r\n}\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n<div id=\"iso27001-wrapper\">\r\n\r\n<div class=\"iso-container\">\r\n\r\n<div class=\"iso-card\">\r\n\r\n<!-- INTRO -->\r\n\r\n<div id=\"introScreen\">\r\n\r\n<div class=\"iso-hero\">\r\n\r\n<div class=\"iso-hero-icon\">\r\n\ud83d\udee1\ufe0f\r\n<\/div>\r\n\r\n<h1>\r\nDiagn\u00f3stico de Seguridad ISO 27001\r\n<\/h1>\r\n\r\n<p style=\"color:white;\">\r\nDescubre en menos de 3 minutos el nivel de madurez de la seguridad de la informaci\u00f3n en tu empresa y qu\u00e9 pasos debes seguir para proteger tus activos.\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<div class=\"iso-intro\">\r\n\r\n<div class=\"iso-grid\">\r\n\r\n<div class=\"iso-grid-card\">\r\n\ud83d\udcca\r\n<h3>15 Preguntas<\/h3>\r\n<p>Evaluaci\u00f3n r\u00e1pida<\/p>\r\n<\/div>\r\n\r\n<div class=\"iso-grid-card\">\r\n\ud83d\udd12\r\n<h3>5 \u00c1reas Clave<\/h3>\r\n<p>Cobertura integral<\/p>\r\n<\/div>\r\n\r\n<div class=\"iso-grid-card\">\r\n\u26a1\r\n<h3>Reporte Inmediato<\/h3>\r\n<p>Resultados al instante<\/p>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<div style=\"text-align:center;\">\r\n\r\n<button class=\"iso-start-btn\" id=\"startBtn\">\r\nComenzar Diagn\u00f3stico Gratuito \u2192\r\n<\/button>\r\n\r\n<p style=\"margin-top:20px;color:#9ca3af;font-size:13px;\">\r\nTus respuestas son confidenciales.\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<!-- QUESTIONS -->\r\n\r\n<div id=\"questionScreen\" class=\"iso-hidden\">\r\n\r\n<div class=\"iso-step\">\r\n\r\n<div class=\"iso-progress-top\">\r\n\r\n<div class=\"iso-progress-info\">\r\n\r\n<span id=\"stepText\">\r\nPaso 1 de 5\r\n<\/span>\r\n\r\n<span id=\"progressText\">\r\n20% completado\r\n<\/span>\r\n\r\n<\/div>\r\n\r\n<div class=\"iso-progress-bar\">\r\n<div class=\"iso-progress-fill\" id=\"progressFill\"><\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<div class=\"iso-section-header\">\r\n<h2 id=\"sectionTitle\"><\/h2>\r\n<\/div>\r\n\r\n<div id=\"stepWarning\" class=\"iso-warning hidden\">\r\n\u26a0\ufe0f Debes responder todas las preguntas antes de continuar.\r\n<\/div>\r\n\r\n<div class=\"iso-questions\" id=\"questionsContainer\"><\/div>\r\n\r\n<div class=\"iso-footer\">\r\n\r\n<button class=\"iso-btn iso-btn-secondary\" id=\"prevBtn\">\r\n\u2190 Anterior\r\n<\/button>\r\n\r\n<button class=\"iso-btn iso-btn-primary\" id=\"nextBtn\">\r\nSiguiente \u2192\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<!-- FORM -->\r\n\r\n<div id=\"formScreen\" class=\"iso-hidden\">\r\n\r\n<div class=\"iso-step\">\r\n\r\n<div class=\"iso-section-header\">\r\n<h2>\r\nDatos de Contacto\r\n<\/h2>\r\n<\/div>\r\n\r\n<div class=\"iso-form-grid\">\r\n\r\n<div style=\"position:relative;\">\r\n<input\r\ntype=\"text\"\r\nid=\"nombre\"\r\nclass=\"iso-input\"\r\nplaceholder=\"Nombre completo\"\r\nmaxlength=\"100\"\r\n>\r\n<span class=\"iso-input-error\" id=\"nombreError\" style=\"display:none;\"><\/span>\r\n<\/div>\r\n\r\n<div style=\"position:relative;\">\r\n<input\r\ntype=\"text\"\r\nid=\"empresa\"\r\nclass=\"iso-input\"\r\nplaceholder=\"Empresa\"\r\nmaxlength=\"100\"\r\n>\r\n<span class=\"iso-input-error\" id=\"empresaError\" style=\"display:none;\"><\/span>\r\n<\/div>\r\n\r\n<div style=\"position:relative;\">\r\n<input\r\ntype=\"email\"\r\nid=\"correo\"\r\nclass=\"iso-input\"\r\nplaceholder=\"Correo corporativo\"\r\nmaxlength=\"100\"\r\n>\r\n<span class=\"iso-input-error\" id=\"correoError\" style=\"display:none;\"><\/span>\r\n<\/div>\r\n\r\n<div style=\"position:relative;\">\r\n<input\r\ntype=\"tel\"\r\nid=\"telefono\"\r\nclass=\"iso-input\"\r\nplaceholder=\"Tel\u00e9fono (10 n\u00fameros)\"\r\nmaxlength=\"10\"\r\npattern=\"[0-9]{10}\"\r\n>\r\n<span class=\"iso-input-error\" id=\"telefonoError\" style=\"display:none;\"><\/span>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<div class=\"iso-footer\">\r\n\r\n<button class=\"iso-btn iso-btn-secondary\" id=\"backQuestions\">\r\n\u2190 Anterior\r\n<\/button>\r\n\r\n<button class=\"iso-btn iso-btn-primary\" id=\"showResults\">\r\nFinalizar Diagn\u00f3stico \u2192\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<!-- RESULTS -->\r\n\r\n<div id=\"resultsScreen\" class=\"iso-hidden\">\r\n\r\n<div class=\"iso-results\">\r\n\r\n<div id=\"resultBox\"><\/div>\r\n\r\n<button class=\"iso-submit-btn\" id=\"submitBtn\">\r\nSolicitar Asesor\u00eda\r\n<\/button>\r\n\r\n<div class=\"iso-success\" id=\"successMessage\">\r\n\u2705 \u00a1Solicitud enviada correctamente! Nos pondremos en contacto contigo.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n\/\/ \u2500\u2500\u2500 UTILIDADES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction sanitizeString(str) {\r\n    if (!str) return '';\r\n    return str.replace(\/[<>'\"]\/g, function(match) {\r\n        if (match === '<') return '&lt;';\r\n        if (match === '>') return '&gt;';\r\n        if (match === \"'\") return '&#39;';\r\n        if (match === '\"') return '&quot;';\r\n        return match;\r\n    });\r\n}\r\n\r\nfunction validatePhone(phone) {\r\n    const cleaned = phone.toString().replace(\/\\s\/g, '');\r\n    return \/^\\d{10}$\/.test(cleaned);\r\n}\r\n\r\nfunction validateEmail(email) {\r\n    const emailRegex = \/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\/;\r\n    return emailRegex.test(email);\r\n}\r\n\r\nfunction validateName(name) {\r\n    return \/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\u00d1\u00fc\u00dc\\s-]{2,100}$\/.test(name.trim());\r\n}\r\n\r\nfunction validateCompany(company) {\r\n    if (!company || company.trim().length < 2 || company.trim().length > 100) return false;\r\n    return !\/[<>'\";\\\\(){}[\\]|`~]\/.test(company);\r\n}\r\n\r\nfunction getRiskLevel(score) {\r\n    const pct = (score \/ 30) * 100;\r\n    if (pct <= 33)  return { level: 'CR\u00cdTICO', color: '#dc2626', text: 'Se requiere acci\u00f3n inmediata' };\r\n    if (pct <= 66)  return { level: 'MEDIO',   color: '#f59e0b', text: 'Se requieren mejoras significativas' };\r\n    return              { level: 'ALTO',    color: '#10b981', text: 'Buen nivel de madurez, continuar mejorando' };\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 DATOS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst sections = [\r\n{\r\n    title:'Liderazgo y Contexto Organizacional',\r\n    questions:[\r\n        {id:'q1', text:'\u00bfLa alta direcci\u00f3n ha definido, documentado y comunicado una Pol\u00edtica de Seguridad de la Informaci\u00f3n en toda la empresa?'},\r\n        {id:'q2', text:'\u00bfSe han identificado y documentado los requisitos legales, regulatorios y contractuales relacionados con la seguridad de los datos de sus clientes?'},\r\n        {id:'q3', text:'\u00bfEst\u00e1n definidos claramente los roles y responsabilidades en materia de seguridad de la informaci\u00f3n dentro de la organizaci\u00f3n?'}\r\n    ]\r\n},\r\n{\r\n    title:'Gesti\u00f3n de Riesgos',\r\n    questions:[\r\n        {id:'q4', text:'\u00bfCuenta la empresa con una metodolog\u00eda formal y documentada para identificar y evaluar los riesgos de seguridad?'},\r\n        {id:'q5', text:'\u00bfSe realiza una evaluaci\u00f3n de riesgos al menos una vez al a\u00f1o?'},\r\n        {id:'q6', text:'\u00bfExiste un plan de tratamiento de riesgos implementado?'}\r\n    ]\r\n},\r\n{\r\n    title:'Recursos Humanos y Accesos',\r\n    questions:[\r\n        {id:'q7', text:'\u00bfSe firman acuerdos de confidencialidad con empleados y proveedores?'},\r\n        {id:'q8', text:'\u00bfSe imparte capacitaci\u00f3n peri\u00f3dica en ciberseguridad?'},\r\n        {id:'q9', text:'\u00bfExiste un proceso formal de alta y baja de accesos?'}\r\n    ]\r\n},\r\n{\r\n    title:'Seguridad T\u00e9cnica y F\u00edsica',\r\n    questions:[\r\n        {id:'q10', text:'\u00bfSe utiliza autenticaci\u00f3n multifactor (MFA)?'},\r\n        {id:'q11', text:'\u00bfSe realizan backups automatizados?'},\r\n        {id:'q12', text:'\u00bfExisten controles f\u00edsicos de acceso?'}\r\n    ]\r\n},\r\n{\r\n    title:'Respuesta a Incidentes y Mejora',\r\n    questions:[\r\n        {id:'q13', text:'\u00bfExiste un procedimiento documentado para incidentes de seguridad?'},\r\n        {id:'q14', text:'\u00bfSe realizan auditor\u00edas internas peri\u00f3dicas?'},\r\n        {id:'q15', text:'\u00bfExiste un Plan de Continuidad del Negocio?'}\r\n    ]\r\n}\r\n];\r\n\r\n\/\/ Mapa r\u00e1pido id \u2192 texto (se genera din\u00e1micamente para no repetirlo)\r\nconst questionTexts = {};\r\nsections.forEach(s => s.questions.forEach(q => { questionTexts[q.id] = q.text; }));\r\n\r\n\/\/ \u2500\u2500\u2500 ESTADO \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nlet currentStep      = 0;\r\nlet answers          = {};\r\n\r\nconst introScreen    = document.getElementById('introScreen');\r\nconst questionScreen = document.getElementById('questionScreen');\r\nconst formScreen     = document.getElementById('formScreen');\r\nconst resultsScreen  = document.getElementById('resultsScreen');\r\n\r\n\/\/ \u2500\u2500\u2500 VALIDACI\u00d3N EN TIEMPO REAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction validateFormFields() {\r\n    const nombre   = document.getElementById('nombre').value;\r\n    const empresa  = document.getElementById('empresa').value;\r\n    const correo   = document.getElementById('correo').value;\r\n    const telefono = document.getElementById('telefono').value;\r\n    let isValid = true;\r\n\r\n    function setField(inputId, errorId, valid, emptyOk, msg) {\r\n        const inp = document.getElementById(inputId);\r\n        const err = document.getElementById(errorId);\r\n        const isEmpty = (document.getElementById(inputId).value === '');\r\n        if (isEmpty) {\r\n            inp.classList.remove('valid', 'invalid');\r\n            err.style.display = 'none';\r\n        } else if (!valid) {\r\n            inp.classList.add('invalid'); inp.classList.remove('valid');\r\n            err.textContent   = msg;\r\n            err.style.display = 'block';\r\n            isValid = false;\r\n        } else {\r\n            inp.classList.add('valid'); inp.classList.remove('invalid');\r\n            err.style.display = 'none';\r\n        }\r\n    }\r\n\r\n    setField('nombre',   'nombreError',   validateName(nombre),        true, '\u274c Solo letras y espacios (m\u00ednimo 2 caracteres)');\r\n    setField('empresa',  'empresaError',  validateCompany(empresa),    true, '\u274c M\u00ednimo 2 caracteres, sin caracteres especiales');\r\n    setField('correo',   'correoError',   validateEmail(correo),       true, '\u274c Email inv\u00e1lido o de dominio no corporativo (e.g., gmail, hotmail)');\r\n    setField('telefono', 'telefonoError', validatePhone(telefono),     true, '\u274c Debe tener exactamente 10 d\u00edgitos num\u00e9ricos');\r\n    return isValid;\r\n}\r\n\r\ndocument.getElementById('nombre').addEventListener('input',   validateFormFields);\r\ndocument.getElementById('empresa').addEventListener('input',  validateFormFields);\r\ndocument.getElementById('correo').addEventListener('input',   validateFormFields);\r\ndocument.getElementById('telefono').addEventListener('input', function() {\r\n    this.value = this.value.replace(\/[^0-9]\/g, '').slice(0, 10);\r\n    validateFormFields();\r\n});\r\n\r\n\/\/ \u2500\u2500\u2500 VERIFICAR CORREO DUPLICADO EN LA API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ Llama a tu endpoint con ?action=check_email&email=... y espera { exists: true\/false }\r\n\/\/ Ajusta la URL si tu API tiene otro endpoint espec\u00edfico para esto.\r\n\r\nasync function checkEmailExists(email) {\r\n    const controller = new AbortController();\r\n    const timeoutId = setTimeout(() => controller.abort(), 10000); \/\/ 10 segundos de timeout\r\n\r\n    try {\r\n        const res = await fetch(\r\n            `https:\/\/api.quantumlink.pro\/api\/guardar.php?action=check_email&email=${encodeURIComponent(email)}`,\r\n            { \r\n                method: 'GET', \r\n                headers: { 'Content-Type': 'application\/json' },\r\n                signal: controller.signal \r\n            }\r\n        );\r\n        clearTimeout(timeoutId);\r\n\r\n        if (!res.ok) {\r\n            throw new Error(`Error del servidor: ${res.status}`);\r\n        }\r\n\r\n        const data = await res.json();\r\n        return data.exists === true;\r\n    } catch (e) {\r\n        clearTimeout(timeoutId);\r\n        console.error('Error al verificar duplicado de correo:', e);\r\n        \/\/ Lanzamos un error para que sea manejado por la funci\u00f3n que llama\r\n        throw new Error('No fue posible validar el correo en este momento. Intenta de nuevo m\u00e1s tarde.');\r\n    }\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 RENDERIZADO DE PASOS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction renderStep() {\r\n    const section = sections[currentStep];\r\n    document.getElementById('sectionTitle').innerText  = section.title;\r\n    document.getElementById('stepText').innerText      = `Paso ${currentStep + 1} de ${sections.length}`;\r\n    const progress = ((currentStep + 1) \/ sections.length) * 100;\r\n    document.getElementById('progressText').innerText  = `${Math.round(progress)}% completado`;\r\n    document.getElementById('progressFill').style.width = `${progress}%`;\r\n\r\n    const container = document.getElementById('questionsContainer');\r\n    container.innerHTML = '';\r\n\r\n    section.questions.forEach((q, index) => {\r\n        const div = document.createElement('div');\r\n        div.className = 'iso-question';\r\n\r\n        div.innerHTML = `\r\n        <div class=\"iso-question-title\">${index + 1}. ${sanitizeString(q.text)}<\/div>\r\n        <div class=\"iso-options\">\r\n          <div class=\"iso-option ${answers[q.id] === 2 ? 'active' : ''}\" data-id=\"${q.id}\" data-value=\"si\">S\u00ed, totalmente<\/div>\r\n          <div class=\"iso-option ${answers[q.id] === 1 ? 'active' : ''}\" data-id=\"${q.id}\" data-value=\"parcial\">Parcialmente<\/div>\r\n          <div class=\"iso-option ${answers[q.id] === 0 ? 'active' : ''}\" data-id=\"${q.id}\" data-value=\"no\">No \/ No lo s\u00e9<\/div>\r\n        <\/div>`;\r\n\r\n        container.appendChild(div);\r\n    });\r\n\r\n    document.querySelectorAll('.iso-option').forEach(opt => {\r\n        opt.addEventListener('click', function() {\r\n            const id  = this.dataset.id;\r\n            const val = this.dataset.value;\r\n            document.querySelectorAll(`[data-id=\"${id}\"]`).forEach(el => el.classList.remove('active'));\r\n            this.classList.add('active');\r\n            answers[id] = (val === 'si') ? 2 : (val === 'parcial') ? 1 : 0;\r\n            document.getElementById('stepWarning').classList.add('hidden');\r\n            document.querySelectorAll('.iso-question.error').forEach(q => q.classList.remove('error'));\r\n        });\r\n    });\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 NAVEGACI\u00d3N \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ndocument.getElementById('startBtn').addEventListener('click', () => {\r\n    introScreen.classList.add('iso-hidden');\r\n    questionScreen.classList.remove('iso-hidden');\r\n    renderStep();\r\n});\r\n\r\ndocument.getElementById('nextBtn').addEventListener('click', () => {\r\n    const section  = sections[currentStep];\r\n    const complete = section.questions.every(q => answers[q.id] !== undefined);\r\n    document.querySelectorAll('.iso-question').forEach(q => q.classList.remove('error'));\r\n\r\n    if (!complete) {\r\n        document.getElementById('stepWarning').classList.remove('hidden');\r\n        section.questions.forEach((q, i) => {\r\n            if (answers[q.id] === undefined)\r\n                document.querySelectorAll('.iso-question')[i].classList.add('error');\r\n        });\r\n        Swal.fire({\r\n            icon: 'warning', title: 'Preguntas sin responder',\r\n            text: 'Por favor, responde todas las preguntas antes de continuar.',\r\n            confirmButtonColor: '#2563eb'\r\n        });\r\n        return;\r\n    }\r\n\r\n    document.getElementById('stepWarning').classList.add('hidden');\r\n    if (currentStep < sections.length - 1) {\r\n        currentStep++;\r\n        renderStep();\r\n    } else {\r\n        questionScreen.classList.add('iso-hidden');\r\n        formScreen.classList.remove('iso-hidden');\r\n    }\r\n});\r\n\r\ndocument.getElementById('prevBtn').addEventListener('click', () => {\r\n    if (currentStep > 0) { currentStep--; renderStep(); }\r\n});\r\n\r\ndocument.getElementById('backQuestions').addEventListener('click', () => {\r\n    formScreen.classList.add('iso-hidden');\r\n    questionScreen.classList.remove('iso-hidden');\r\n});\r\n\r\n\/\/ \u2500\u2500\u2500 MOSTRAR RESULTADOS (con validaci\u00f3n de duplicado) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ndocument.getElementById('showResults').addEventListener('click', async () => {\r\n    const nombre   = document.getElementById('nombre').value.trim();\r\n    const empresa  = document.getElementById('empresa').value.trim();\r\n    const correo   = document.getElementById('correo').value.trim();\r\n    const telefono = document.getElementById('telefono').value.trim();\r\n    const btn      = document.getElementById('showResults');\r\n\r\n    \/\/ 1. Campos obligatorios\r\n    if (!nombre || !empresa || !correo || !telefono) {\r\n        Swal.fire({ icon:'error', title:'Campos incompletos',\r\n            text:'Por favor, completa todos los campos del formulario.',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n\r\n    \/\/ 2. Formato de cada campo\r\n    if (!validateName(nombre)) {\r\n        Swal.fire({ icon:'error', title:'Nombre inv\u00e1lido',\r\n            text:'El nombre solo debe contener letras y espacios (m\u00ednimo 2 caracteres).',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n    if (!validateCompany(empresa)) {\r\n        Swal.fire({ icon:'error', title:'Empresa inv\u00e1lida',\r\n            text:'El nombre de la empresa no debe contener caracteres especiales.',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n    if (!validateEmail(correo)) {\r\n        Swal.fire({ icon:'error', title:'Email inv\u00e1lido',\r\n            text:'Por favor, ingresa un correo electr\u00f3nico corporativo v\u00e1lido (no se aceptan dominios como gmail, hotmail, etc.).',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n    if (!validatePhone(telefono)) {\r\n        Swal.fire({ icon:'error', title:'Tel\u00e9fono inv\u00e1lido',\r\n            text:'El tel\u00e9fono debe tener exactamente 10 d\u00edgitos num\u00e9ricos.',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n\r\n    \/\/ 3. Verificar correo duplicado en la BD\r\n    btn.innerHTML  = `<span class=\"iso-loading\"><\/span>Verificando...`;\r\n    btn.disabled   = true;\r\n\r\n    try {\r\n        const isDuplicate = await checkEmailExists(correo);\r\n\r\n        if (isDuplicate) {\r\n            const correoInput = document.getElementById('correo');\r\n            const correoError = document.getElementById('correoError');\r\n            correoInput.classList.add('invalid');\r\n            correoInput.classList.remove('valid');\r\n            correoError.textContent  = '\u274c Este correo ya realiz\u00f3 un diagn\u00f3stico.';\r\n            correoError.style.display = 'block';\r\n\r\n            Swal.fire({\r\n                icon: 'warning',\r\n                title: 'Correo ya registrado',\r\n                html: `El correo <strong>${correo}<\/strong> ya ha realizado un diagn\u00f3stico anteriormente.<br><br>Si deseas una nueva evaluaci\u00f3n o crees que es un error, cont\u00e1ctanos directamente.`,\r\n                confirmButtonColor: '#2563eb',\r\n                confirmButtonText: 'Entendido'\r\n            });\r\n            btn.innerHTML  = 'Finalizar Diagn\u00f3stico \u2192';\r\n            btn.disabled   = false;\r\n            return;\r\n        }\r\n    } catch (error) {\r\n        Swal.fire({ icon: 'error', title: 'Error de Verificaci\u00f3n', text: error.message, confirmButtonColor: '#2563eb' });\r\n        btn.innerHTML  = 'Finalizar Diagn\u00f3stico \u2192';\r\n        btn.disabled   = false;\r\n        return;\r\n    }\r\n    \r\n    \/\/ 4. Mostrar pantalla de \"Resultados\" (que ahora es solo un paso intermedio)\r\n    document.getElementById('resultBox').innerHTML = `\r\n        <div class=\"iso-result-box\" style=\"background:#eff6ff; color:#1e40af; text-align:center;\">\r\n        \r\n        <div style=\"font-size:70px; margin-bottom:20px;\">\ud83d\udee1\ufe0f<\/div>\r\n\r\n        <h2 style=\"font-size:32px; margin-bottom:20px;\">\r\n            \u00a1Tu an\u00e1lisis est\u00e1 listo!\r\n        <\/h2>\r\n\r\n        <div style=\"\r\n            background:white;\r\n            border-radius:12px;\r\n            padding:30px;\r\n            margin:20px 0;\r\n            border-left:5px solid #2563eb;\r\n        \">\r\n            <h3 style=\"margin-bottom:20px;\">\r\n                Diagn\u00f3stico ISO 27001 completado\r\n            <\/h3>\r\n\r\n            <p style=\"font-size:17px; line-height:1.8;\">\r\n                Hemos procesado correctamente las respuestas de tu organizaci\u00f3n y generado un diagn\u00f3stico personalizado.\r\n            <\/p>\r\n\r\n            <p style=\"font-size:17px; line-height:1.8; font-weight:600;\">\r\n                Un especialista revisar\u00e1 tu diagn\u00f3stico y se pondr\u00e1 en contacto contigo para compartir los resultados y resolver cualquier duda.\r\n            <\/p>\r\n        <\/div>\r\n\r\n        <p style=\"font-size:14px; margin-top:20px; opacity:0.8;\">\r\n            La informaci\u00f3n proporcionada ser\u00e1 utilizada \u00fanicamente para fines de evaluaci\u00f3n y asesor\u00eda.\r\n        <\/p>\r\n\r\n        <\/div>`;\r\n\r\n    formScreen.classList.add('iso-hidden');\r\n    resultsScreen.classList.remove('iso-hidden');\r\n    btn.innerHTML  = 'Finalizar Diagn\u00f3stico \u2192';\r\n    btn.disabled   = false;\r\n});\r\n\r\n\/\/ \u2500\u2500\u2500 SOLICITAR ASESOR\u00cdA (env\u00edo final) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ndocument.getElementById('submitBtn').addEventListener('click', async () => {\r\n    const btn      = document.getElementById('submitBtn');\r\n    const nombre   = sanitizeString(document.getElementById('nombre').value.trim());\r\n    const empresa  = sanitizeString(document.getElementById('empresa').value.trim());\r\n    const correo   = document.getElementById('correo').value.trim();\r\n    const telefono = document.getElementById('telefono').value.trim().replace(\/[^\\d]\/g,'');\r\n\r\n    if (!validateName(nombre) || !validateCompany(empresa) || !validateEmail(correo) || !validatePhone(telefono)) {\r\n        Swal.fire({ icon:'error', title:'Datos inv\u00e1lidos',\r\n            text:'Por favor, verifica que todos los datos sean correctos antes de enviar.',\r\n            confirmButtonColor:'#2563eb' });\r\n        return;\r\n    }\r\n\r\n    btn.innerHTML = `<span class=\"iso-loading\"><\/span>Enviando...`;\r\n    btn.disabled  = true;\r\n\r\n    const controller = new AbortController();\r\n    const timeoutId = setTimeout(() => controller.abort(), 10000); \/\/ 10 segundos de timeout\r\n\r\n    try {\r\n        \/\/ Enviar solo los datos crudos a la API.\r\n        \/\/ El backend se encargar\u00e1 de calcular el score y generar el correo.\r\n        const apiRes  = await fetch('https:\/\/api.quantumlink.pro\/api\/guardar.php', {\r\n            method: 'POST',\r\n            headers: { 'Content-Type': 'application\/json' },\r\n            signal: controller.signal,\r\n            body: JSON.stringify({\r\n                nombre,\r\n                empresa,\r\n                correo,\r\n                telefono,\r\n                resultado: answers \/\/ Objeto con respuestas {q1: 2, q2: 1, ...}\r\n            })\r\n        });\r\n\r\n        clearTimeout(timeoutId);\r\n        const apiData = await apiRes.json();\r\n\r\n        if (!apiRes.ok || !apiData.success) {\r\n            \/\/ Si la API devuelve un error (HTTP status no es 2xx o success:false)\r\n            \/\/ Lanza un error para ser capturado por el bloque catch.\r\n            \/\/ Manejo espec\u00edfico para duplicados desde el backend.\r\n            if (apiData.duplicate) {\r\n                 Swal.fire({\r\n                    icon: 'warning', title: 'Correo ya registrado',\r\n                    text: apiData.message || 'Este correo ya realiz\u00f3 un diagn\u00f3stico anteriormente.',\r\n                    confirmButtonColor: '#2563eb'\r\n                });\r\n                 btn.innerHTML = 'Solicitar Asesor\u00eda';\r\n                 btn.disabled  = false;\r\n                 return; \/\/ Detiene la ejecuci\u00f3n aqu\u00ed\r\n            }\r\n            throw new Error(apiData.message || 'Ocurri\u00f3 un error en el servidor.');\r\n        }\r\n\r\n        \/\/ \u00c9xito: La API confirm\u00f3 que todo se proces\u00f3 correctamente\r\n        document.getElementById('successMessage').style.display = 'block';\r\n        btn.remove(); \/\/ Elimina el bot\u00f3n para evitar doble env\u00edo\r\n\r\n        Swal.fire({\r\n            icon: 'success',\r\n            title: '\u00a1Diagn\u00f3stico Recibido!',\r\n            text: 'Tu diagn\u00f3stico fue recibido correctamente. Uno de nuestros especialistas revisar\u00e1 la informaci\u00f3n proporcionada y se pondr\u00e1 en contacto contigo para compartir los resultados y recomendaciones correspondientes.',\r\n            confirmButtonColor: '#2563eb',\r\n            timer: 6000,\r\n            showConfirmButton: false\r\n        });\r\n\r\n    } catch (error) {\r\n        clearTimeout(timeoutId);\r\n        console.error('Error al enviar:', error);\r\n        btn.innerHTML = 'Solicitar Asesor\u00eda';\r\n        btn.disabled  = false;\r\n        Swal.fire({\r\n            icon: 'error', title: 'Error de Conexi\u00f3n',\r\n            text: error.name === 'AbortError' ? 'La solicitud tard\u00f3 demasiado en responder. Revisa tu conexi\u00f3n a internet.' : (error.message || 'Ocurri\u00f3 un error al enviar los datos. Por favor, intenta nuevamente.'),\r\n            confirmButtonColor: '#2563eb'\r\n        });\r\n    }\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Seguridad de Clase Mundial: Certificaci\u00f3n ISO 27001 NO SOLO PROTEGEMOS SUS DATOS, BLINDAMOS LA CONTINUIDAD DE SU NEGOCIO En el panorama digital actual, la informaci\u00f3n es el activo m\u00e1s valioso y, al mismo tiempo, el m\u00e1s vulnerable. En Quantum Link Systems operamos bajo los estrictos est\u00e1ndares de la norma ISO\/IEC 27001, el marco internacional m\u00e1s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_joinchat":[],"footnotes":""},"class_list":["post-3469","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/pages\/3469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/quantumlink.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3469"}],"version-history":[{"count":64,"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/pages\/3469\/revisions"}],"predecessor-version":[{"id":3683,"href":"https:\/\/quantumlink.pro\/index.php?rest_route=\/wp\/v2\/pages\/3469\/revisions\/3683"}],"wp:attachment":[{"href":"https:\/\/quantumlink.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}