<?php

declare(strict_types=1);

require_once __DIR__ . '/init.php';

if (!tiene_permiso('ver_manual_superadmin')) {
    header('Location: index.php?status=warning&msg=' . urlencode('No tienes permiso para ver el manual del Superadmin.'));
    exit;
}

function sm_count(PDO $pdo, string $sql): int
{
    try {
        return (int) $pdo->query($sql)->fetchColumn();
    } catch (Throwable $e) {
        return 0;
    }
}

$manualStats = [
    'plataformas' => sm_count($pdo, 'SELECT COUNT(*) FROM plataformas'),
    'asuntos' => sm_count($pdo, 'SELECT COUNT(*) FROM asuntos'),
    'planes' => sm_count($pdo, 'SELECT COUNT(*) FROM planes'),
    'suscriptores' => sm_count($pdo, 'SELECT COUNT(*) FROM suscripciones'),
    'roles' => sm_count($pdo, 'SELECT COUNT(*) FROM roles'),
    'plantillas' => sm_count($pdo, 'SELECT COUNT(*) FROM plantillas_whatsapp'),
];

$titulo_pagina = 'Manual premium del Superadmin';
require_once __DIR__ . '/admin_header.php';
?>
<style>
.sm-manual{--sm-red:#ef3b43;--sm-red-dark:#bd2029;--sm-blue:#2563eb;--sm-green:#159447;--sm-amber:#d97706;--sm-violet:#7c3aed;--sm-ink:#111827;--sm-muted:#64748b;--sm-line:#dce5ef;display:grid;gap:15px;width:100%;max-width:1480px;margin:0 auto}.sm-hero{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:18px 20px;border:1px solid #dfe7f1;border-radius:18px;background:linear-gradient(135deg,#fff 0%,#fff 68%,#fff1f2 100%);box-shadow:0 10px 30px rgba(15,23,42,.05)}.sm-hero-main{display:flex;align-items:flex-start;gap:14px}.sm-hero-icon{width:48px;height:48px;display:grid;place-items:center;flex:0 0 48px;border-radius:15px;background:#feecee;color:var(--sm-red);font-size:20px}.sm-eyebrow{display:block;margin-bottom:4px;color:#536a88;font-size:10px;font-weight:900;letter-spacing:.09em;text-transform:uppercase}.sm-hero h1{margin:0;color:var(--sm-ink);font-size:27px;line-height:1.08;font-weight:950;letter-spacing:-.035em}.sm-hero p{max-width:850px;margin:6px 0 0;color:var(--sm-muted);font-size:12.5px;line-height:1.55}.sm-hero-actions{display:flex;gap:8px;flex-wrap:wrap}.sm-btn{min-height:40px;display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 14px;border:1px solid #d7e0eb;border-radius:11px;background:#fff;color:#172033;font-size:11px;font-weight:900;text-decoration:none;cursor:pointer}.sm-btn.primary{border-color:transparent;background:linear-gradient(135deg,var(--sm-red),var(--sm-red-dark));color:#fff}.sm-stats{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}.sm-stat{display:flex;align-items:center;gap:10px;min-height:76px;padding:12px 13px;border:1px solid #dfe7f1;border-radius:14px;background:#fff;box-shadow:0 6px 18px rgba(15,23,42,.035)}.sm-stat>span{width:38px;height:38px;display:grid;place-items:center;flex:0 0 38px;border-radius:11px;background:#fff0f1;color:var(--sm-red)}.sm-stat small,.sm-stat strong,.sm-stat em{display:block}.sm-stat small{font-size:8.5px;font-weight:900;letter-spacing:.055em;text-transform:uppercase;color:#60748f}.sm-stat strong{margin-top:2px;color:#0f172a;font-size:20px;line-height:1}.sm-stat em{margin-top:4px;color:#7b8ba2;font-size:9px;font-style:normal}.sm-tools{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:12px;border:1px solid #dfe7f1;border-radius:15px;background:#fff}.sm-search{position:relative}.sm-search i{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:#94a3b8}.sm-search input{width:100%;height:42px;padding:0 14px 0 40px;border:1px solid #cfd9e6;border-radius:11px;background:#fff;color:#172033;font-size:12px;outline:none}.sm-search input:focus{border-color:#fb7185;box-shadow:0 0 0 3px rgba(239,68,68,.1)}.sm-nav{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px}.sm-nav a{display:flex;align-items:center;gap:8px;min-height:44px;padding:9px 10px;border:1px solid #dce5ef;border-radius:11px;background:#fff;color:#334155;text-decoration:none;font-size:10px;font-weight:900}.sm-nav a:hover{border-color:#fda4af;background:#fff7f8;color:#b91c1c}.sm-nav i{color:var(--sm-red)}.sm-section{overflow:hidden;border:1px solid #dfe7f1;border-radius:17px;background:#fff;box-shadow:0 9px 25px rgba(15,23,42,.04);scroll-margin-top:90px}.sm-section[hidden]{display:none}.sm-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:15px 17px;border-bottom:1px solid #e5ebf2;background:#fbfcfe}.sm-section-title{display:flex;align-items:flex-start;gap:11px}.sm-section-title>span{width:40px;height:40px;display:grid;place-items:center;flex:0 0 40px;border-radius:12px;background:#fff0f1;color:var(--sm-red)}.sm-section-title h2{margin:0;color:#0f172a;font-size:18px;font-weight:950}.sm-section-title p{margin:4px 0 0;color:#64748b;font-size:11px;line-height:1.45}.sm-section-number{padding:5px 8px;border-radius:999px;background:#eef4fa;color:#52647d;font-size:9px;font-weight:900}.sm-body{padding:16px}.sm-grid-2,.sm-grid-3,.sm-grid-4{display:grid;gap:11px}.sm-grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm-grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm-grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm-card{min-width:0;padding:13px;border:1px solid #dfe7f1;border-radius:13px;background:#fff}.sm-card>i{width:34px;height:34px;display:grid;place-items:center;margin-bottom:9px;border-radius:10px;background:#eef5ff;color:var(--sm-blue)}.sm-card h3{margin:0;color:#172033;font-size:13px;font-weight:950}.sm-card p{margin:5px 0 0;color:#52647d;font-size:10.8px;line-height:1.55}.sm-card ul,.sm-card ol{margin:8px 0 0;padding-left:18px;color:#475569;font-size:10.5px;line-height:1.55}.sm-card li+li{margin-top:4px}.sm-flow{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:9px;align-items:stretch}.sm-flow article{position:relative;display:flex;min-width:0;flex-direction:column;gap:5px;padding:12px;border:1px solid #dce5ef;border-radius:12px;background:#fff}.sm-flow article:not(:last-child)::after{content:'›';position:absolute;right:-9px;top:50%;z-index:3;transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;border-radius:50%;background:var(--sm-red);color:#fff;font-size:13px;font-weight:950}.sm-flow i{color:var(--sm-red);font-size:16px}.sm-flow strong{color:#172033;font-size:10.5px}.sm-flow small{color:#64748b;font-size:9.5px;line-height:1.4}.sm-steps{display:grid;gap:8px;margin:0;padding:0;list-style:none;counter-reset:step}.sm-steps li{display:grid;grid-template-columns:34px minmax(0,1fr);gap:10px;padding:11px 12px;border:1px solid #dfe7f1;border-radius:12px;background:#fff}.sm-steps li::before{counter-increment:step;content:counter(step);width:32px;height:32px;display:grid;place-items:center;border-radius:10px;background:#feecee;color:#c62530;font-size:12px;font-weight:950}.sm-steps strong{display:block;color:#172033;font-size:11.5px}.sm-steps p{margin:3px 0 0;color:#64748b;font-size:10.5px;line-height:1.5}.sm-callout{display:flex;align-items:flex-start;gap:10px;padding:11px 12px;border:1px solid #bfdbfe;border-radius:12px;background:#eff6ff;color:#1e40af}.sm-callout.warning{border-color:#fed7aa;background:#fff7ed;color:#9a5200}.sm-callout.danger{border-color:#fecdd3;background:#fff1f2;color:#9f1239}.sm-callout.success{border-color:#bbf7d0;background:#f0fdf4;color:#166534}.sm-callout i{margin-top:2px}.sm-callout strong{display:block;font-size:11.5px}.sm-callout p{margin:3px 0 0;font-size:10.5px;line-height:1.5}.sm-mock{overflow:hidden;border:1px solid #d9e3ee;border-radius:14px;background:#f8fafc}.sm-mock-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #dfe7f1;background:#fff}.sm-mock-head strong{font-size:11px;color:#172033}.sm-mock-dots{display:flex;gap:4px}.sm-mock-dots i{width:7px;height:7px;border-radius:50%;background:#cbd5e1}.sm-mock-body{padding:12px}.sm-mock-toolbar{display:grid;grid-template-columns:1.4fr repeat(3,1fr) auto;gap:7px;margin-bottom:9px}.sm-mock-field{height:30px;border:1px solid #d6e0ea;border-radius:8px;background:#fff}.sm-mock-button{height:30px;display:grid;place-items:center;padding:0 9px;border-radius:8px;background:var(--sm-red);color:#fff;font-size:9px;font-weight:900}.sm-mock-row{display:grid;grid-template-columns:1.4fr .8fr .8fr .7fr 1fr;gap:8px;align-items:center;padding:8px;border-top:1px solid #e3eaf2;background:#fff}.sm-mock-row b{font-size:9.5px}.sm-mock-row span{height:8px;border-radius:999px;background:#dbe4ef}.sm-mock-actions{display:flex;justify-content:flex-end;gap:4px}.sm-mock-actions i{width:24px;height:24px;display:grid;place-items:center;border:1px solid #dbe4ef;border-radius:7px;background:#fff;color:#2563eb;font-size:9px}.sm-actions{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px}.sm-action{display:flex;align-items:center;gap:8px;padding:9px;border:1px solid #dfe7f1;border-radius:11px;background:#fff}.sm-action>span{width:31px;height:31px;display:grid;place-items:center;flex:0 0 31px;border-radius:9px}.sm-action strong,.sm-action small{display:block}.sm-action strong{font-size:10px;color:#172033}.sm-action small{margin-top:2px;font-size:9px;color:#64748b}.sm-action .wa{background:#ecfdf3;color:#15803d}.sm-action .pay{background:#fffbeb;color:#b45309}.sm-action .edit{background:#eff6ff;color:#2563eb}.sm-action .promo{background:#f5f3ff;color:#7c3aed}.sm-action .delete{background:#fff1f2;color:#dc2633}.sm-action .user{background:#fff1f2;color:#8b1c25}.sm-table-wrap{overflow:auto}.sm-table{width:100%;border-collapse:collapse}.sm-table th,.sm-table td{padding:9px 10px;border:1px solid #dfe7f1;text-align:left;font-size:10.5px;vertical-align:top}.sm-table th{background:#eef4fa;color:#334155;font-size:9.5px;text-transform:uppercase;letter-spacing:.04em}.sm-table td{color:#475569}.sm-checklist{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.sm-checklist label{display:flex;align-items:flex-start;gap:8px;padding:10px 11px;border:1px solid #dfe7f1;border-radius:11px;background:#f8fafc;color:#334155;font-size:10.5px;line-height:1.45}.sm-checklist input{margin-top:2px}.sm-glossary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.sm-glossary article{padding:10px 11px;border:1px solid #dfe7f1;border-radius:11px;background:#fff}.sm-glossary strong{display:block;color:#172033;font-size:10.5px}.sm-glossary p{margin:4px 0 0;color:#64748b;font-size:9.8px;line-height:1.45}.sm-empty-search{display:none;padding:22px;border:1px dashed #cbd5e1;border-radius:14px;background:#fff;text-align:center;color:#64748b}.sm-empty-search.is-visible{display:block}@media(max-width:1250px){.sm-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.sm-nav{grid-template-columns:repeat(4,minmax(0,1fr))}.sm-flow{grid-template-columns:repeat(3,minmax(0,1fr))}.sm-flow article::after{display:none}.sm-actions{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:900px){.sm-hero{align-items:flex-start;flex-direction:column}.sm-grid-3,.sm-grid-4{grid-template-columns:repeat(2,minmax(0,1fr))}.sm-nav{grid-template-columns:repeat(3,minmax(0,1fr))}.sm-glossary{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:720px){.sm-stats,.sm-grid-2,.sm-grid-3,.sm-grid-4,.sm-flow,.sm-actions,.sm-checklist,.sm-glossary,.sm-nav{grid-template-columns:1fr}.sm-tools{grid-template-columns:1fr}.sm-hero-actions{width:100%}.sm-hero-actions .sm-btn{flex:1}.sm-mock-toolbar{grid-template-columns:1fr 1fr}.sm-mock-row{min-width:650px}}@media print{.admin-sidebar,.admin-header,.admin-footer,.sm-tools,.sm-nav,.sm-hero-actions{display:none!important}.admin-main{margin:0!important;padding:0!important}.sm-manual{max-width:none}.sm-section,.sm-hero,.sm-stats{box-shadow:none;break-inside:avoid}}
</style>

<div class="sm-manual" id="manualSuperadmin">
    <section class="sm-hero">
        <div class="sm-hero-main">
            <span class="sm-hero-icon"><i class="fas fa-book-open"></i></span>
            <div><span class="sm-eyebrow">GUÍA OPERATIVA, COMERCIAL Y DE SEGURIDAD</span><h1>Manual premium del Superadmin</h1><p>Esta guía explica qué hace cada módulo, qué debes revisar antes de guardar, qué consecuencias tiene cada acción y cómo resolver los problemas más frecuentes. Está organizada como un recorrido real: desde una instalación nueva hasta la venta, renovación, supervisión y puesta en marcha.</p></div>
        </div>
        <div class="sm-hero-actions"><button type="button" class="sm-btn" id="manualExpand"><i class="fas fa-up-down"></i> Abrir secciones</button><button type="button" class="sm-btn primary" onclick="window.print()"><i class="fas fa-print"></i> Imprimir manual</button></div>
    </section>

    <section class="sm-stats">
        <article class="sm-stat"><span><i class="fas fa-tv"></i></span><div><small>Plataformas</small><strong><?= number_format($manualStats['plataformas']) ?></strong><em>Catálogo global</em></div></article>
        <article class="sm-stat"><span><i class="fas fa-tags"></i></span><div><small>Asuntos</small><strong><?= number_format($manualStats['asuntos']) ?></strong><em>Reglas de detección</em></div></article>
        <article class="sm-stat"><span><i class="fas fa-layer-group"></i></span><div><small>Planes</small><strong><?= number_format($manualStats['planes']) ?></strong><em>Oferta comercial</em></div></article>
        <article class="sm-stat"><span><i class="fas fa-id-card"></i></span><div><small>Suscripciones</small><strong><?= number_format($manualStats['suscriptores']) ?></strong><em>Admins registrados</em></div></article>
        <article class="sm-stat"><span><i class="fas fa-user-shield"></i></span><div><small>Roles</small><strong><?= number_format($manualStats['roles']) ?></strong><em>Gobierno de acceso</em></div></article>
        <article class="sm-stat"><span><i class="fab fa-whatsapp"></i></span><div><small>Plantillas</small><strong><?= number_format($manualStats['plantillas']) ?></strong><em>Comunicación</em></div></article>
    </section>

    <section class="sm-tools">
        <div class="sm-search"><i class="fas fa-magnifying-glass"></i><input id="manualSearch" type="search" placeholder="Buscar: renovar, pagos, prueba gratis, permisos, marca blanca, plataforma…"></div>
        <a class="sm-btn" href="index.php"><i class="fas fa-gauge-high"></i> Volver al panel</a>
    </section>

    <nav class="sm-nav" aria-label="Índice del manual">
        <a href="#inicio"><i class="fas fa-flag-checkered"></i> Inicio correcto</a><a href="#catalogo"><i class="fas fa-boxes-stacked"></i> Catálogo</a><a href="#planes"><i class="fas fa-gem"></i> Planes</a><a href="#suscriptores"><i class="fas fa-id-card"></i> Suscriptores</a><a href="#finanzas"><i class="fas fa-coins"></i> Finanzas</a><a href="#pruebas"><i class="fas fa-flask"></i> Pruebas</a><a href="#comunicacion"><i class="fab fa-whatsapp"></i> Comunicación</a><a href="#permisos"><i class="fas fa-user-shield"></i> Permisos</a><a href="#reportes"><i class="fas fa-chart-line"></i> Reportes</a><a href="#marca"><i class="fas fa-palette"></i> Marca blanca</a><a href="#seguridad"><i class="fas fa-shield-halved"></i> Seguridad</a><a href="#problemas"><i class="fas fa-screwdriver-wrench"></i> Problemas</a>
    </nav>
    <div class="sm-empty-search" id="manualEmpty"><i class="fas fa-magnifying-glass"></i><strong>No se encontraron coincidencias.</strong><div>Prueba con otra palabra o limpia la búsqueda.</div></div>

    <section class="sm-section" id="inicio" data-manual-section data-search="inicio instalación primera configuración superadmin puesta en marcha orden recomendado">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-flag-checkered"></i></span><div><h2>1. Cómo comenzar una instalación nueva</h2><p>Orden recomendado para evitar errores de permisos, límites, consultas y facturación.</p></div></div><span class="sm-section-number">CAPÍTULO 01</span></header>
        <div class="sm-body">
            <div class="sm-flow">
                <article><i class="fas fa-palette"></i><strong>1. Marca</strong><small>Nombre, logo, fondo, colores, soporte y textos públicos.</small></article>
                <article><i class="fas fa-tv"></i><strong>2. Plataformas</strong><small>Servicios que aparecerán en cuentas y consultas.</small></article>
                <article><i class="fas fa-tags"></i><strong>3. Asuntos</strong><small>Frases reales que identifican los mensajes recibidos.</small></article>
                <article><i class="fas fa-layer-group"></i><strong>4. Planes</strong><small>Precios, vigencias y límites para cada Admin.</small></article>
                <article><i class="fas fa-user-shield"></i><strong>5. Permisos</strong><small>Acciones globales permitidas a cada rol.</small></article>
                <article><i class="fas fa-vial"></i><strong>6. Prueba real</strong><small>Crear un Admin de prueba y recorrer todo el flujo.</small></article>
            </div>
            <div class="sm-grid-2" style="margin-top:11px">
                <div><ol class="sm-steps"><li><div><strong>Completa Marca Blanca.</strong><p>Verifica logo, favicon, imagen de fondo, correo o WhatsApp de soporte y textos de acceso. Abre la portada, el login y la consulta en una ventana privada.</p></div></li><li><div><strong>Crea el catálogo mínimo.</strong><p>Registra al menos una plataforma y un asunto real. La consulta no funcionará correctamente si el asunto no coincide con el correo recibido.</p></div></li><li><div><strong>Configura planes antes de vender.</strong><p>Define precio mensual/anual, límites de buzones, dominios, cuentas y clientes. Evita editar límites durante una venta en curso.</p></div></li><li><div><strong>Prueba con un Admin no propietario.</strong><p>El Superadmin está protegido y no representa la experiencia real del cliente. Usa una cuenta Admin de prueba.</p></div></li></ol></div>
                <div class="sm-card"><i class="fas fa-triangle-exclamation"></i><h3>Regla principal</h3><p>El Superadmin administra el catálogo, las ventas, los pagos, los roles y la configuración global. Cada Admin administra sus propios buzones, dominios, cuentas y clientes.</p><div class="sm-callout warning" style="margin-top:10px"><i class="fas fa-ban"></i><div><strong>No mezcles responsabilidades.</strong><p>No crees cuentas operativas dentro del Superadmin para “probar rápido”. Esto dificulta entender qué recursos pertenecen a cada Admin.</p></div></div><div class="sm-callout success" style="margin-top:8px"><i class="fas fa-circle-check"></i><div><strong>Resultado esperado.</strong><p>Un Admin nuevo inicia sesión, ve únicamente los módulos de su operación y puede trabajar dentro de los límites de su plan.</p></div></div></div>
            </div>
        </div>
    </section>

    <section class="sm-section" id="catalogo" data-manual-section data-search="plataformas asuntos alias logo consulta correo imap catálogo servicios">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-boxes-stacked"></i></span><div><h2>2. Plataformas y asuntos: el motor de la consulta</h2><p>La plataforma identifica el servicio; el asunto identifica el tipo de mensaje que debe buscarse.</p></div></div><span class="sm-section-number">CAPÍTULO 02</span></header>
        <div class="sm-body">
            <div class="sm-grid-3">
                <article class="sm-card"><i class="fas fa-tv"></i><h3>Plataforma</h3><p>Representa Netflix, Disney+, Prime Video, Max u otro servicio. El nombre y el logo aparecen en la consulta pública y en los formularios del Admin.</p><ul><li>Usa un nombre corto y reconocible.</li><li>Sube un logo cuadrado, limpio y liviano.</li><li>Desactiva temporalmente servicios en mantenimiento.</li></ul></article>
                <article class="sm-card"><i class="fas fa-tags"></i><h3>Asunto</h3><p>Es el texto que llega en el asunto del correo, por ejemplo “Your sign-in code”. Debe coincidir con el mensaje real.</p><ul><li>Copia el asunto exactamente.</li><li>Evita palabras demasiado generales como “Código”.</li><li>Agrega variantes por idioma como alias.</li></ul></article>
                <article class="sm-card"><i class="fas fa-link"></i><h3>Relación</h3><p>Un asunto puede estar disponible para una o varias plataformas. La relación correcta reduce resultados equivocados.</p><ul><li>Asocia solo asuntos válidos.</li><li>Prueba con correos recientes.</li><li>Documenta cambios del proveedor.</li></ul></article>
            </div>
            <div class="sm-grid-2" style="margin-top:11px">
                <div><h3 style="margin:0 0 8px;font-size:13px">Paso a paso: agregar una plataforma</h3><ol class="sm-steps"><li><div><strong>Abre Plataformas y pulsa “Nueva plataforma”.</strong><p>Escribe nombre, estado y orden de aparición.</p></div></li><li><div><strong>Sube o indica el logo.</strong><p>Comprueba la vista en fondo claro y oscuro.</p></div></li><li><div><strong>Guarda y revisa la consulta pública.</strong><p>Confirma que se muestre en la página correcta y que el paginado funcione.</p></div></li><li><div><strong>Relaciona asuntos.</strong><p>Sin asuntos válidos la plataforma aparecerá, pero las búsquedas no devolverán mensajes útiles.</p></div></li></ol></div>
                <div><h3 style="margin:0 0 8px;font-size:13px">Diagrama de búsqueda</h3><div class="sm-flow" style="grid-template-columns:repeat(4,minmax(0,1fr))"><article><i class="fas fa-envelope"></i><strong>Correo</strong><small>El usuario escribe la cuenta completa.</small></article><article><i class="fas fa-tv"></i><strong>Plataforma</strong><small>Delimita el servicio consultado.</small></article><article><i class="fas fa-tag"></i><strong>Asunto</strong><small>Filtra el tipo exacto de mensaje.</small></article><article><i class="fas fa-code"></i><strong>Código</strong><small>El sistema devuelve el contenido permitido.</small></article></div><div class="sm-callout" style="margin-top:10px"><i class="fas fa-lightbulb"></i><div><strong>Cuando una consulta no encuentra correos.</strong><p>Primero revisa el asunto y la antigüedad del mensaje; después revisa IMAP. No cambies credenciales sin comprobar lo anterior.</p></div></div></div>
            </div>
        </div>
    </section>

    <section class="sm-section" id="planes" data-manual-section data-search="planes precio mensual anual límites buzones dominios cuentas clientes gratis prueba">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-gem"></i></span><div><h2>3. Planes: precios, modalidades y límites</h2><p>Cada plan define qué puede hacer un Admin y cuánto puede crecer su operación.</p></div></div><span class="sm-section-number">CAPÍTULO 03</span></header>
        <div class="sm-body">
            <div class="sm-grid-4">
                <article class="sm-card"><i class="fas fa-money-bill-wave"></i><h3>Precio</h3><p>Configura mensual, anual o ambos. El monto se propone automáticamente al renovar, pero puede ajustarse antes de confirmar.</p></article>
                <article class="sm-card"><i class="fas fa-calendar-days"></i><h3>Vigencia</h3><p>La modalidad determina el periodo añadido. Una renovación activa suma tiempo a la fecha final; una vencida comienza desde hoy.</p></article>
                <article class="sm-card"><i class="fas fa-gauge-high"></i><h3>Límites</h3><p>Controla buzones, dominios, clientes, cuentas y consultas. Los límites deben responder al precio real del plan.</p></article>
                <article class="sm-card"><i class="fas fa-eye"></i><h3>Visibilidad</h3><p>Un plan oculto puede mantenerse para operaciones internas, pero no aparecerá en la portada pública.</p></article>
            </div>
            <div class="sm-table-wrap" style="margin-top:11px"><table class="sm-table"><thead><tr><th>Situación</th><th>Configuración recomendada</th><th>Error que debes evitar</th></tr></thead><tbody><tr><td>Plan de prueba</td><td>Precio cero, duración corta, límites pequeños y estado visible solo si realmente se ofrece.</td><td>Usarlo como plan permanente o dejar límites iguales al plan pagado.</td></tr><tr><td>Plan básico</td><td>Capacidad suficiente para iniciar, con ruta clara de mejora.</td><td>Prometer funciones que el límite técnico no permite.</td></tr><tr><td>Plan anual</td><td>Precio anual menor que 12 mensualidades y beneficio claramente explicado.</td><td>Renovar por un año usando la modalidad mensual.</td></tr><tr><td>Plan interno</td><td>Solo para cuentas protegidas o de operación propia.</td><td>Mostrarlo en la portada o venderlo a clientes.</td></tr></tbody></table></div>
            <div class="sm-callout warning" style="margin-top:10px"><i class="fas fa-triangle-exclamation"></i><div><strong>Antes de bajar un límite.</strong><p>Revisa cuántos recursos ya utiliza cada Admin. Reducir el límite por debajo de su consumo puede impedir nuevas altas y generar confusión, aunque no elimine los recursos existentes.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="suscriptores" data-manual-section data-search="suscriptores nueva suscripción renovar editar eliminar whatsapp promoción fechas plan estado acciones">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-id-card"></i></span><div><h2>4. Suscriptores: alta, edición, renovación y baja</h2><p>Este es el centro comercial donde se controla la vigencia de cada Admin.</p></div></div><span class="sm-section-number">CAPÍTULO 04</span></header>
        <div class="sm-body">
            <div class="sm-mock"><div class="sm-mock-head"><strong>Ejemplo visual del listado</strong><span class="sm-mock-dots"><i></i><i></i><i></i></span></div><div class="sm-mock-body"><div class="sm-mock-toolbar"><span class="sm-mock-field"></span><span class="sm-mock-field"></span><span class="sm-mock-field"></span><span class="sm-mock-field"></span><span class="sm-mock-button">Limpiar</span></div><div class="sm-mock-row"><b>Admin suscriptor</b><span></span><span></span><span></span><div class="sm-mock-actions"><i class="fab fa-whatsapp"></i><i class="fas fa-wallet"></i><i class="fas fa-pen"></i><i class="fas fa-bullhorn"></i><i class="fas fa-trash"></i></div></div><div class="sm-mock-row"><b>Cliente ejemplo</b><span></span><span></span><span></span><div class="sm-mock-actions"><i class="fab fa-whatsapp"></i><i class="fas fa-wallet"></i><i class="fas fa-pen"></i><i class="fas fa-bullhorn"></i><i class="fas fa-trash"></i></div></div></div></div>
            <div class="sm-actions" style="margin-top:10px">
                <article class="sm-action"><span class="wa"><i class="fab fa-whatsapp"></i></span><div><strong>WhatsApp</strong><small>Prepara un mensaje usando una plantilla.</small></div></article><article class="sm-action"><span class="pay"><i class="fas fa-wallet"></i></span><div><strong>Renovar</strong><small>Registra pago y nueva fecha.</small></div></article><article class="sm-action"><span class="edit"><i class="fas fa-pen"></i></span><div><strong>Editar</strong><small>Cambia nombre, plan, modalidad o vigencia.</small></div></article><article class="sm-action"><span class="promo"><i class="fas fa-bullhorn"></i></span><div><strong>Promoción</strong><small>Envía campañas comerciales.</small></div></article><article class="sm-action"><span class="delete"><i class="fas fa-trash"></i></span><div><strong>Eliminar suscripción</strong><small>Quita la relación comercial.</small></div></article><article class="sm-action"><span class="user"><i class="fas fa-user-xmark"></i></span><div><strong>Eliminar suscriptor</strong><small>Borra al usuario y sus datos asociados.</small></div></article>
            </div>
            <div class="sm-grid-2" style="margin-top:11px">
                <div><h3 style="margin:0 0 8px;font-size:13px">Crear una nueva suscripción</h3><ol class="sm-steps"><li><div><strong>Verifica primero que el Admin exista.</strong><p>La suscripción se asigna a una cuenta Admin; no uses un correo improvisado.</p></div></li><li><div><strong>Selecciona el plan y la modalidad.</strong><p>Comprueba que el plan permita mensual, anual o prueba.</p></div></li><li><div><strong>Revisa fechas y estado.</strong><p>Una prueba debe usar modalidad y estado de prueba. Una venta confirmada debe quedar activa.</p></div></li><li><div><strong>Guarda y revisa el listado.</strong><p>Comprueba nombre, plan, inicio, fin y estado.</p></div></li></ol></div>
                <div><h3 style="margin:0 0 8px;font-size:13px">Renovar correctamente</h3><ol class="sm-steps"><li><div><strong>Pulsa el botón de cartera.</strong><p>El sistema carga el plan y calcula la nueva vigencia.</p></div></li><li><div><strong>Confirma modalidad y monto.</strong><p>No aceptes el valor automático sin verificar el pago real recibido.</p></div></li><li><div><strong>Compara fecha actual y nueva.</strong><p>El resumen verde debe reflejar exactamente el periodo vendido.</p></div></li><li><div><strong>Confirma una sola vez.</strong><p>La clave de idempotencia evita duplicados, pero igualmente debes esperar el resultado antes de volver a pulsar.</p></div></li></ol></div>
            </div>
            <div class="sm-callout danger" style="margin-top:10px"><i class="fas fa-user-xmark"></i><div><strong>Eliminar suscriptor es una acción destructiva.</strong><p>Puede borrar sus buzones, dominios, cuentas, clientes, pagos y demás datos asociados. Usa “Eliminar suscripción” si solo deseas terminar la relación comercial sin borrar toda la operación.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="finanzas" data-manual-section data-search="pagos créditos monedero referidos ingresos renovación factura historial finanzas">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-coins"></i></span><div><h2>5. Pagos, créditos, monederos y referidos</h2><p>Cómo registrar dinero sin perder trazabilidad ni duplicar movimientos.</p></div></div><span class="sm-section-number">CAPÍTULO 05</span></header>
        <div class="sm-body">
            <div class="sm-grid-4"><article class="sm-card"><i class="fas fa-receipt"></i><h3>Pago</h3><p>Representa dinero recibido por una renovación. Debe coincidir con suscriptor, plan, modalidad y periodo.</p></article><article class="sm-card"><i class="fas fa-wallet"></i><h3>Monedero</h3><p>Saldo disponible para operaciones internas. Cada movimiento debe tener concepto, fecha y responsable.</p></article><article class="sm-card"><i class="fas fa-arrow-right-arrow-left"></i><h3>Movimiento</h3><p>Entrada, salida, bono o ajuste. No edites directamente el saldo en base de datos.</p></article><article class="sm-card"><i class="fas fa-user-group"></i><h3>Referido</h3><p>El beneficio se valida después del primer pago correcto del referido y no debe duplicarse.</p></article></div>
            <div class="sm-grid-2" style="margin-top:11px"><div class="sm-card"><i class="fas fa-calendar-check"></i><h3>Cierre mensual recomendado</h3><ol><li>Filtra pagos por fecha.</li><li>Compara total con los comprobantes recibidos.</li><li>Revisa anulaciones o restauraciones.</li><li>Exporta o imprime el reporte.</li><li>Guarda una copia fuera del servidor.</li></ol></div><div class="sm-card"><i class="fas fa-magnifying-glass-dollar"></i><h3>Cuando el total no coincide</h3><ol><li>Busca pagos duplicados.</li><li>Revisa pagos anulados.</li><li>Comprueba zona horaria y rango de fechas.</li><li>Valida que el pago tenga suscripción relacionada.</li><li>No corrijas el total manualmente.</li></ol></div></div>
        </div>
    </section>

    <section class="sm-section" id="pruebas" data-manual-section data-search="prueba gratis liberar bloquear ip correo cookie navegador varias cuentas abuso">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-flask"></i></span><div><h2>6. Pruebas gratuitas y prevención de abuso</h2><p>El módulo registra identificadores usados y permite liberar únicamente casos verificados.</p></div></div><span class="sm-section-number">CAPÍTULO 06</span></header>
        <div class="sm-body">
            <div class="sm-flow" style="grid-template-columns:repeat(5,minmax(0,1fr))"><article><i class="fas fa-user-plus"></i><strong>Registro</strong><small>El usuario solicita una prueba.</small></article><article><i class="fas fa-fingerprint"></i><strong>Identificación</strong><small>Correo, IP, cookie y huella técnica.</small></article><article><i class="fas fa-database"></i><strong>Historial</strong><small>Se crea el registro de prueba utilizada.</small></article><article><i class="fas fa-ban"></i><strong>Bloqueo</strong><small>Una coincidencia impide otra prueba.</small></article><article><i class="fas fa-unlock"></i><strong>Liberación</strong><small>Solo un Superadmin elimina el bloqueo.</small></article></div>
            <div class="sm-grid-2" style="margin-top:11px"><div><ol class="sm-steps"><li><div><strong>Busca por correo, IP o usuario.</strong><p>Comprueba si el registro pertenece realmente a la persona que solicita ayuda.</p></div></li><li><div><strong>Revisa la suscripción actual.</strong><p>Liberar el bloqueo no elimina la cuenta ni amplía la fecha de prueba.</p></div></li><li><div><strong>Confirma el motivo.</strong><p>Ejemplos válidos: error durante el registro, correo mal escrito o prueba técnica autorizada.</p></div></li><li><div><strong>Libera y documenta.</strong><p>Después de liberar, verifica que el nuevo registro funcione una sola vez.</p></div></li></ol></div><div><div class="sm-callout warning"><i class="fas fa-triangle-exclamation"></i><div><strong>No existe un bloqueo infalible.</strong><p>Una persona puede cambiar correo, dispositivo y conexión. La combinación de señales reduce el abuso, pero debe acompañarse de límites pequeños y revisión comercial.</p></div></div><div class="sm-callout success" style="margin-top:8px"><i class="fas fa-shield-check"></i><div><strong>Configuración recomendada.</strong><p>Duración corta, límites bajos, una prueba por correo/IP/dispositivo y conversión a plan pagado mediante pago confirmado.</p></div></div><div class="sm-card" style="margin-top:8px"><i class="fas fa-list-check"></i><h3>Antes de liberar</h3><ul><li>Verifica correo y nombre.</li><li>Comprueba que no tenga otra cuenta activa.</li><li>Revisa la fecha de la prueba anterior.</li><li>No liberes solicitudes repetitivas sin explicación.</li></ul></div></div></div>
        </div>
    </section>

    <section class="sm-section" id="comunicacion" data-manual-section data-search="plantillas mensajes whatsapp variables promoción renovación aviso comunicación">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fab fa-whatsapp"></i></span><div><h2>7. Plantillas de WhatsApp y mensajes del sistema</h2><p>Separa la comunicación comercial de los textos automáticos de validación.</p></div></div><span class="sm-section-number">CAPÍTULO 07</span></header>
        <div class="sm-body">
            <div class="sm-grid-2"><article class="sm-card"><i class="fab fa-whatsapp"></i><h3>Plantillas</h3><p>Mensajes reutilizables para clientes, suscriptores, renovaciones y promociones. Admiten variables como nombre, plan o fecha.</p><ul><li>Usa un nombre fácil de identificar.</li><li>Selecciona público y módulo correctos.</li><li>Revisa la vista previa antes de guardar.</li><li>No inventes variables no disponibles.</li></ul></article><article class="sm-card"><i class="fas fa-bell"></i><h3>Mensajes</h3><p>Textos que la consulta, API o sistema muestran ante errores, vencimientos y validaciones.</p><ul><li>No elimines instrucciones esenciales.</li><li>Evita revelar datos internos.</li><li>Prueba el mensaje en el flujo real.</li><li>Mantén un tono consistente con la marca.</li></ul></article></div>
            <div class="sm-callout" style="margin-top:10px"><i class="fas fa-code"></i><div><strong>Variables.</strong><p>Una variable se escribe exactamente entre llaves, por ejemplo <code>{nombre_cliente}</code>. Si se cambia el nombre o se borra una llave, el sistema no podrá reemplazarla.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="permisos" data-manual-section data-search="roles permisos ayudantes superadmin admin acceso menú sesión promover revocar">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-user-shield"></i></span><div><h2>8. Roles, permisos y Ayudantes de Superadmin</h2><p>Los permisos globales se suman al acceso operativo del Admin promovido.</p></div></div><span class="sm-section-number">CAPÍTULO 08</span></header>
        <div class="sm-body">
            <div class="sm-grid-3"><article class="sm-card"><i class="fas fa-crown"></i><h3>Superadmin</h3><p>Rol protegido con control global. No debe compartirse ni utilizarse para el trabajo diario de varias personas.</p></article><article class="sm-card"><i class="fas fa-user-tie"></i><h3>Admin</h3><p>Gestiona sus buzones, dominios, cuentas, clientes, suscripción, monedero, referidos y manual propio.</p></article><article class="sm-card"><i class="fas fa-user-gear"></i><h3>Ayudante</h3><p>Conserva su operación de Admin y además recibe los permisos globales que se hayan activado para el rol Ayudante.</p></article></div>
            <div class="sm-grid-2" style="margin-top:11px"><div><h3 style="margin:0 0 8px;font-size:13px">Promover un ayudante</h3><ol class="sm-steps"><li><div><strong>Configura primero el rol Ayudante.</strong><p>Activa únicamente los módulos globales necesarios.</p></div></li><li><div><strong>Abre Ayudantes y pulsa Promover.</strong><p>Selecciona un Admin existente; no se crea una cuenta nueva.</p></div></li><li><div><strong>Revisa los permisos mostrados.</strong><p>El modal debe indicar qué acciones globales recibirá.</p></div></li><li><div><strong>Confirma y prueba con esa cuenta.</strong><p>Debe conservar buzones, dominios, cuentas y clientes propios, además de los accesos delegados.</p></div></li></ol></div><div><h3 style="margin:0 0 8px;font-size:13px">Revocar acceso</h3><ol class="sm-steps"><li><div><strong>Identifica al ayudante.</strong><p>Comprueba que no tenga una tarea crítica en curso.</p></div></li><li><div><strong>Revoca desde Ayudantes.</strong><p>El sistema restaura su rol operativo anterior.</p></div></li><li><div><strong>Comprueba el menú.</strong><p>Los módulos globales deben desaparecer, pero su panel de Admin permanece.</p></div></li><li><div><strong>Revisa sesiones abiertas.</strong><p>Los permisos se recalculan en la siguiente solicitud; solicita cerrar sesión si es necesario.</p></div></li></ol></div></div>
            <div class="sm-callout danger" style="margin-top:10px"><i class="fas fa-key"></i><div><strong>Principio de mínimo privilegio.</strong><p>No concedas “todos los permisos por comodidad”. Cada permiso adicional aumenta el impacto de un error o una cuenta comprometida.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="reportes" data-manual-section data-search="reportes globales ingresos actividad operación clientes suscripciones exportar imprimir filtros">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-chart-line"></i></span><div><h2>9. Reportes globales: cómo leerlos</h2><p>Los reportes ayudan a decidir; no reemplazan la validación de pagos ni la revisión operativa.</p></div></div><span class="sm-section-number">CAPÍTULO 09</span></header>
        <div class="sm-body">
            <div class="sm-grid-4"><article class="sm-card"><i class="fas fa-coins"></i><h3>Finanzas</h3><p>Ingresos del periodo, pagos por plan y evolución de cobros.</p></article><article class="sm-card"><i class="fas fa-chart-simple"></i><h3>Actividad</h3><p>Uso de consultas y señales de consumo del sistema.</p></article><article class="sm-card"><i class="fas fa-server"></i><h3>Operación</h3><p>Recursos administrados y distribución entre cuentas.</p></article><article class="sm-card"><i class="fas fa-users"></i><h3>Clientes y suscripciones</h3><p>Estados, vigencias, inactividad y oportunidades comerciales.</p></article></div>
            <div class="sm-grid-2" style="margin-top:11px"><div class="sm-card"><i class="fas fa-filter"></i><h3>Uso correcto de filtros</h3><ol><li>Selecciona fecha inicial y final.</li><li>Define el mes de consultas cuando corresponda.</li><li>Configura días de inactividad.</li><li>Pulsa Aplicar una vez.</li><li>Comprueba que todas las tarjetas y tablas usen el mismo periodo.</li></ol></div><div class="sm-card"><i class="fas fa-file-export"></i><h3>Exportar e imprimir</h3><p>Usa CSV para trabajar con datos y la impresión para compartir un resumen visual. Antes de enviar un informe, revisa si contiene correos, nombres o información privada.</p></div></div>
            <div class="sm-callout warning" style="margin-top:10px"><i class="fas fa-triangle-exclamation"></i><div><strong>“Reporte parcial”.</strong><p>Significa que una consulta no pudo ejecutarse con la estructura actual de la base de datos. Revisa el registro de errores y la existencia de tablas o columnas; no asumas que el valor cero es correcto.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="marca" data-manual-section data-search="marca blanca logo fondo colores textos login registro consulta footer soporte puesta en marcha">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-palette"></i></span><div><h2>10. Marca Blanca y experiencia pública</h2><p>Todo cambio debe revisarse en escritorio, móvil y ventana privada antes de publicarse.</p></div></div><span class="sm-section-number">CAPÍTULO 10</span></header>
        <div class="sm-body">
            <div class="sm-flow" style="grid-template-columns:repeat(5,minmax(0,1fr))"><article><i class="fas fa-signature"></i><strong>Identidad</strong><small>Nombre, logo, fondo, pie y soporte.</small></article><article><i class="fas fa-palette"></i><strong>Paleta</strong><small>Colores globales y contraste.</small></article><article><i class="fas fa-pen-ruler"></i><strong>Textos</strong><small>Login, registro, consulta y portada.</small></article><article><i class="fas fa-globe"></i><strong>SEO y contacto</strong><small>Empresa, región, enlaces legales.</small></article><article><i class="fas fa-rocket"></i><strong>Puesta en marcha</strong><small>Limpieza irreversible de datos de prueba.</small></article></div>
            <div class="sm-grid-3" style="margin-top:11px"><article class="sm-card"><i class="fas fa-image"></i><h3>Imágenes</h3><ul><li>Logo: preferentemente PNG/WebP transparente.</li><li>Fondo: 1920×1080 o superior.</li><li>Favicon: cuadrado y legible a 32 px.</li><li>Icono del footer: TV o streaming.</li></ul></article><article class="sm-card"><i class="fas fa-universal-access"></i><h3>Legibilidad</h3><ul><li>Texto oscuro sobre fondo claro.</li><li>Botones con contraste suficiente.</li><li>No uses fondos con texto difícil de leer.</li><li>Comprueba zoom de 125% y móvil.</li></ul></article><article class="sm-card"><i class="fas fa-headset"></i><h3>Soporte</h3><ul><li>Configura WhatsApp o correo real.</li><li>Escribe horario de atención.</li><li>Mantén términos y privacidad accesibles.</li><li>Prueba el enlace del pie.</li></ul></article></div>
            <div class="sm-callout danger" style="margin-top:10px"><i class="fas fa-rocket"></i><div><strong>Puesta en marcha elimina datos.</strong><p>Haz copia de la base de datos y archivos. Confirma que solo deseas conservar Superadmin, catálogo y configuración global. La limpieza de usuarios, pagos, cuentas y consultas no se puede deshacer desde el panel.</p></div></div>
        </div>
    </section>

    <section class="sm-section" id="seguridad" data-manual-section data-search="seguridad copia respaldo contraseña csrf auditoría permisos mantenimiento actualización">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-shield-halved"></i></span><div><h2>11. Seguridad, copias y mantenimiento</h2><p>Rutinas simples que reducen el riesgo de pérdida de datos y acceso no autorizado.</p></div></div><span class="sm-section-number">CAPÍTULO 11</span></header>
        <div class="sm-body">
            <div class="sm-checklist"><label><input type="checkbox"> Crear copia de archivos antes de instalar un parche.</label><label><input type="checkbox"> Exportar la base de datos antes de cambios destructivos.</label><label><input type="checkbox"> Probar el parche en un subdominio de desarrollo.</label><label><input type="checkbox"> Verificar permisos de archivos y carpetas.</label><label><input type="checkbox"> Revisar el registro de errores después del despliegue.</label><label><input type="checkbox"> Cambiar contraseñas de cuentas compartidas.</label><label><input type="checkbox"> Revocar ayudantes que ya no colaboran.</label><label><input type="checkbox"> Comprobar login, registro, consulta y recuperación.</label></div>
            <div class="sm-grid-2" style="margin-top:11px"><article class="sm-card"><i class="fas fa-database"></i><h3>Frecuencia de respaldo</h3><ul><li>Diario: base de datos.</li><li>Antes de cada parche: archivos y base.</li><li>Semanal: copia externa descargada.</li><li>Mensual: prueba de restauración.</li></ul></article><article class="sm-card"><i class="fas fa-user-lock"></i><h3>Accesos</h3><ul><li>Una cuenta por persona.</li><li>Contraseñas largas y únicas.</li><li>No enviar credenciales en grupos.</li><li>Eliminar o revocar accesos inactivos.</li></ul></article></div>
        </div>
    </section>

    <section class="sm-section" id="problemas" data-manual-section data-search="problemas solución error no guarda modal detrás reporte parcial consulta no encuentra correo menú permiso">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-screwdriver-wrench"></i></span><div><h2>12. Solución de problemas por síntoma</h2><p>Diagnóstico ordenado para evitar cambios innecesarios.</p></div></div><span class="sm-section-number">CAPÍTULO 12</span></header>
        <div class="sm-body"><div class="sm-table-wrap"><table class="sm-table"><thead><tr><th>Síntoma</th><th>Qué revisar primero</th><th>Qué no debes hacer</th></tr></thead><tbody>
            <tr><td>Un formulario no guarda.</td><td>Consola del navegador, respuesta de red, token CSRF, validaciones y registro PHP.</td><td>Modificar la base de datos directamente sin conocer el error.</td></tr>
            <tr><td>Una confirmación aparece detrás del modal.</td><td>Orden de capas, cierre previo del modal y z-index de SweetAlert.</td><td>Pulsar varias veces el botón mientras carga.</td></tr>
            <tr><td>La consulta no encuentra mensajes.</td><td>Plataforma, asunto exacto, antigüedad, correo e IMAP.</td><td>Cambiar contraseña del buzón antes de probar la conexión.</td></tr>
            <tr><td>Un usuario no ve un módulo.</td><td>Rol actual, permisos del rol, sesión y estado de suscripción.</td><td>Convertirlo en Superadmin para resolverlo rápido.</td></tr>
            <tr><td>Reporte parcial.</td><td>Tablas/columnas esperadas, filtros y error SQL registrado.</td><td>Usar el cero mostrado como dato confirmado.</td></tr>
            <tr><td>Una renovación parece duplicada.</td><td>Historial de pagos, clave idempotente y fecha final.</td><td>Eliminar pagos sin verificar cuál es el válido.</td></tr>
        </tbody></table></div></div>
    </section>

    <section class="sm-section" data-manual-section data-search="glosario definiciones conceptos admin superadmin suscripción asunto dominio buzón cuenta">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-spell-check"></i></span><div><h2>13. Glosario rápido</h2><p>Conceptos que conviene diferenciar antes de administrar el sistema.</p></div></div><span class="sm-section-number">CAPÍTULO 13</span></header>
        <div class="sm-body"><div class="sm-glossary"><article><strong>Superadmin</strong><p>Propietario global del sistema y del catálogo.</p></article><article><strong>Admin</strong><p>Cliente que administra su propia operación.</p></article><article><strong>Ayudante</strong><p>Admin con permisos globales delegados.</p></article><article><strong>Suscripción</strong><p>Plan, modalidad, estado y vigencia de un Admin.</p></article><article><strong>Buzón</strong><p>Conexión IMAP utilizada para leer mensajes.</p></article><article><strong>Dominio</strong><p>Regla que agrupa o autoriza correos.</p></article><article><strong>Cuenta</strong><p>Correo de un servicio asignado a un cliente.</p></article><article><strong>Cliente</strong><p>Usuario final administrado por un Admin.</p></article><article><strong>Asunto</strong><p>Texto que identifica el mensaje buscado.</p></article><article><strong>Plantilla</strong><p>Mensaje reutilizable de WhatsApp.</p></article><article><strong>Mensaje del sistema</strong><p>Respuesta automática visible en consultas o validaciones.</p></article><article><strong>Prueba liberada</strong><p>Identificador autorizado para volver a registrarse; no es una renovación.</p></article></div></div>
    </section>

    <section class="sm-section" data-manual-section data-search="lista final publicar parche revisión checklist">
        <header class="sm-section-head"><div class="sm-section-title"><span><i class="fas fa-list-check"></i></span><div><h2>14. Lista final antes de publicar cambios</h2><p>Marca cada punto durante la validación del despliegue.</p></div></div><span class="sm-section-number">CAPÍTULO 14</span></header>
        <div class="sm-body"><div class="sm-checklist"><label><input type="checkbox"> El ZIP conserva las rutas correctas de los PHP.</label><label><input type="checkbox"> Todos los PHP pasan validación de sintaxis.</label><label><input type="checkbox"> El login del Superadmin funciona.</label><label><input type="checkbox"> Un Admin conserva sus módulos y datos.</label><label><input type="checkbox"> Renovar cambia pago y vigencia una sola vez.</label><label><input type="checkbox"> Editar suscripción conserva el correo.</label><label><input type="checkbox"> Consulta pública muestra plataformas y resultados.</label><label><input type="checkbox"> Login con ID autoriza solo recursos asignados.</label><label><input type="checkbox"> Fondo, cabecera y pie se ven correctamente.</label><label><input type="checkbox"> En móvil no hay campos o botones cortados.</label><label><input type="checkbox"> Reportes usan el periodo seleccionado.</label><label><input type="checkbox"> Se revisó el registro de errores del servidor.</label></div></div>
    </section>
</div>

<script>
(() => {
    const search = document.getElementById('manualSearch');
    const sections = [...document.querySelectorAll('[data-manual-section]')];
    const empty = document.getElementById('manualEmpty');
    const normalize = value => (value || '').toLocaleLowerCase('es').normalize('NFD').replace(/[\u0300-\u036f]/g, '');
    const filter = () => {
        const term = normalize(search?.value.trim());
        let visible = 0;
        sections.forEach(section => {
            const haystack = normalize(section.dataset.search + ' ' + section.textContent);
            const show = term === '' || haystack.includes(term);
            section.hidden = !show;
            if (show) visible++;
        });
        empty?.classList.toggle('is-visible', visible === 0);
    };
    search?.addEventListener('input', filter);
    document.getElementById('manualExpand')?.addEventListener('click', () => {
        search.value = '';
        filter();
        sections[0]?.scrollIntoView({behavior:'smooth', block:'start'});
    });
})();
</script>
<?php require_once __DIR__ . '/admin_footer.php'; ?>
