<?php /* @var \dokuwiki\plugin\bez\meta\Tpl $tpl */ ?>
<?php
// Permiso de edición de proyecto: grupo "editarproyecto", "manager", "sie" o admin_group (director)
// grupo "admin" (sysadmin) NO puede editar proyectos
global $INFO, $conf;
$_bez_adm_grp = !empty($conf['plugin']['bez']['admin_group']) ? $conf['plugin']['bez']['admin_group'] : 'bez_admin';
$_user_grps = isset($INFO['userinfo']['grps']) ? $INFO['userinfo']['grps'] : [];
$esEditor = (
    in_array('editarproyecto', $_user_grps) ||
    in_array('manager', $_user_grps) ||
    in_array($_bez_adm_grp, $_user_grps)
);
// Sysadmin (grupo admin DW) explícitamente NO es editor de proyectos
$esSysadmin = in_array('admin', $_user_grps) && !in_array('manager', $_user_grps) && !in_array($_bez_adm_grp, $_user_grps);
if ($esSysadmin) $esEditor = false;
?>

<!--ESTILOS TABLA PROGRESO R**G -->
<style>
    .color-name {
        color: #090913;
    }

    /* Aislar estilos para esta tabla */
    #unique-table-container {
        width: 95%;
        background: #ffffff;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        border-radius: 8px;
        overflow: hidden;
        margin: auto;
    }

    #unique-table-scroll {
        max-height: 300px; /* Altura máxima del cuerpo de la tabla */
        overflow-y: auto; /* Scroll vertical */
    }

    #unique-table {
        border-collapse: collapse;
        width: 100%;
    }

    #unique-table thead {
        background: linear-gradient(45deg, #673ab7, #2196f3);
        color: white;
        position: sticky; /* Fija el encabezado */
        top: 0;
        z-index: 2;
    }

    #unique-table thead th {
        padding: 12px 15px;
        text-align: center;
        background-color: #c5d6ff;
        vertical-align: middle;
    }

    #unique-table tbody tr:nth-child(even) {
        background: #f3f4f6;
    }

    #unique-table tbody tr:nth-child(odd) {
        background: #ffffff;
    }

    #unique-table tbody td {
        padding: 12px 15px;
        text-align: center;
        font-size: 12px;
        vertical-align: middle;
    }

    /* Barra de progreso aislada */
    .unique-progress-bar-container {
        position: relative;
        height: 20px;
        background: #c8bfbf;
        border-radius: 10px;
        overflow: hidden;
    }

    .unique-progress-bar {
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        color: white;
        font-weight: bold;
        font-size: 12px;
        transition: width 0.3s ease;
    }

    .unique-progress-bar {
        height: 100%;
        transition: width 0.3s ease;
    }

    .unique-progress-blue {
        background: #2196f3;
    }

    .unique-progress-green {
        background: #4caf50;
    }

    .unique-progress-orange {
        background: #ff9800;
    }

    .unique-progress-red {
        background: #f44336;
    }
    .boton_edicion {
        cursor: pointer;
        margin-bottom: 3px;
        padding-bottom: 3px;
    }
    .boton_visualizar {
        cursor: pointer;
        margin-bottom: 3px;
        padding-bottom: 3px;
    }
    .boton_eliminar {
        cursor: pointer;
        margin-bottom: 3px;
        padding-bottom: 3px;
    }
    .boton_ejecucion {
        cursor: pointer;
        margin-bottom: 3px;
        padding-bottom: 3px;
    }
    .btn-confirm {
        background-color: #5b9df8 !important; /* Verde */
        color: white !important;
    }

    .btn-confirm:focus {
        background-color: #5b9df8 !important; /* Verde */
        color: white !important;
        background-image : none !important
    }

    .btn-cancel {
        background-color: #fd6473 !important; /* Rojo */
        color: white !important;
    }

    .color-agregar-btn:hover {
        color: #818181 !important;
    }

    .svg-acciones {
        width: 18px !important; 
        height: 18px !important;
    }
    
    .dokuwiki .page ul li, .dokuwiki .aside ul li {
        color: #424242;
    }

    #tituloIA{
        display: none;
        text-align: center;
    }

    .cajon-ia {
        height: 250px; 
        overflow-y: auto; 
        border: 1px solid #ababab; 
        display: none;
        margin-bottom: 40px;
        margin-top: 15px;
        background-color: #00a9ff17;
        border-radius: 25px;
        padding: 40px;
    }

    /* Overlay del loader */
    #loader-overlay {
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        background-color: rgba(0, 0, 0, 0.62); /* Fondo opaco */
        display: none;
        justify-content: center;
        align-items: center;
        z-index: 9999;
    }

    /* Loader (círculo girando) */
    #loader {
        width: 100px;
        height: 100px;
        border: 8px solid #ccc;
        border-top: 8px solid #4a90e2;
        border-radius: 50%;
        animation: spin 1s linear infinite;
    }

    @keyframes spin {
        to { transform: rotate(360deg); }
    }

</style>
<?php
// Variables de estilo con valores por defecto
$styleVars = [
    'sidebar_start' => '#667eea',
    'sidebar_end' => '#764ba2',
    'avatar_bg' => 'rgba(255,255,255,0.2)',
    'status_open' => 'rgba(76,175,80,0.3)',
    'status_closed' => 'rgba(244,67,54,0.3)',
    'icon_type' => '#11998e',
    'icon_type_end' => '#38ef7d',
    'icon_year' => '#fc4a1a',
    'icon_year_end' => '#f7b733',
    'icon_norm' => '#4776E6',
    'icon_norm_end' => '#8E54E9',
    'icon_creator' => '#00b4db',
    'icon_creator_end' => '#0083b0',
    'icon_coord' => '#ed213a',
    'icon_coord_end' => '#93291e',
    'btn_start' => '#667eea',
    'btn_end' => '#764ba2',
    'btn_active' => '#3d4852',
];
?>
<style>
    /* === DISEÑO 4: SIDEBAR STYLE - INFO PROYECTO R**G === */
    .project-card-v4 {
        width: 100%;
        margin: 10px auto;
        background: white;
        border-radius: 16px;
        box-shadow: 0 4px 20px rgba(0,0,0,0.08);
        display: flex;
        overflow: hidden;
    }

    .project-sidebar-v4 {
        width: 260px;
        background: linear-gradient(180deg, <?php echo $styleVars['sidebar_start']; ?> 0%, <?php echo $styleVars['sidebar_end']; ?> 100%);
        color: white;
        padding: 30px 20px;
        display: flex;
        flex-direction: column;
        align-items: center;
        text-align: center;
    }

    .project-avatar-v4 {
        width: 90px;
        height: 90px;
        background: <?php echo $styleVars['avatar_bg']; ?>;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-bottom: 15px;
        border: 4px solid rgba(255,255,255,0.4);
        box-shadow: 0 4px 15px rgba(0,0,0,0.2);
        padding: 0;
    }

    .project-avatar-v4 svg {
        width: 50px;
        height: 50px;
        display: block;
        margin: auto;
    }

    .project-sidebar-v4 h2 {
        font-size: 22px;
        margin-bottom: 5px;
        font-weight: 700;
        line-height: 1.3;
    }

    .project-sidebar-v4 .project-id-v4 {
        opacity: 0.85;
        font-size: 14px;
        margin-bottom: 20px;
        font-weight: 500;
    }

    .project-status-v4 {
        background: rgba(255,255,255,0.2);
        padding: 8px 20px;
        border-radius: 20px;
        font-size: 13px;
        font-weight: 600;
        display: flex;
        align-items: center;
        gap: 6px;
    }

    .project-status-v4.status-open { background: <?php echo $styleVars['status_open']; ?>; }
    .project-status-v4.status-closed { background: <?php echo $styleVars['status_closed']; ?>; }
    .project-status-v4.status-proposal { background: rgba(255, 152, 0, 0.3); }

    .project-content-v4 {
        flex: 1;
        padding: 25px 30px;
    }

    .project-content-v4 h3 {
        font-size: 16px;
        color: #333;
        margin-bottom: 20px;
        padding-bottom: 12px;
        border-bottom: 2px solid #f0f0f0;
        display: flex;
        align-items: center;
        gap: 8px;
    }

    .project-list-v4 {
        list-style: none;
        padding: 0;
        margin: 0;
    }

    .project-list-v4 li {
        display: flex;
        align-items: center;
        padding: 14px 0;
        border-bottom: 1px solid #f5f5f5;
    }

    .project-list-v4 li:last-child {
        border-bottom: none;
    }

    .project-list-v4 .icon-v4 {
        width: 40px;
        height: 40px;
        border-radius: 10px;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-right: 15px;
        flex-shrink: 0;
    }

    .project-list-v4 .icon-v4 svg {
        width: 20px;
        height: 20px;
    }

    .project-list-v4 .icon-v4.icon-type { background: linear-gradient(135deg, <?php echo $styleVars['icon_type']; ?> 0%, <?php echo $styleVars['icon_type_end']; ?> 100%); }
    .project-list-v4 .icon-v4.icon-year { background: linear-gradient(135deg, <?php echo $styleVars['icon_year']; ?> 0%, <?php echo $styleVars['icon_year_end']; ?> 100%); }
    .project-list-v4 .icon-v4.icon-norm { background: linear-gradient(135deg, <?php echo $styleVars['icon_norm']; ?> 0%, <?php echo $styleVars['icon_norm_end']; ?> 100%); }
    .project-list-v4 .icon-v4.icon-creator { background: linear-gradient(135deg, <?php echo $styleVars['icon_creator']; ?> 0%, <?php echo $styleVars['icon_creator_end']; ?> 100%); }
    .project-list-v4 .icon-v4.icon-coordinator { background: linear-gradient(135deg, <?php echo $styleVars['icon_coord']; ?> 0%, <?php echo $styleVars['icon_coord_end']; ?> 100%); }

    .project-list-v4 .icon-v4 svg path { fill: white; }

    .project-list-v4 .info-v4 {
        flex: 1;
    }

    .project-list-v4 .info-v4 .label-v4 {
        font-size: 11px;
        color: #888;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        font-weight: 600;
    }

    .project-list-v4 .info-v4 .value-v4 {
        font-size: 14px;
        color: #333;
        font-weight: 600;
        margin-top: 2px;
    }

    /* Botón desplegable */
    .toggle-progress-btn {
        width: 100%;
        margin: 0 auto 10px auto;
        background: #3d4852;
        color: #ffffff;
        border: none;
        padding: 14px 25px;
        border-radius: 12px;
        font-size: 15px;
        font-weight: 600;
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 10px;
        transition: all 0.3s ease;
        box-shadow: 0 4px 15px rgba(61, 72, 82, 0.3);
    }

    .toggle-progress-btn svg path {
        fill: #ffffff;
    }

    /* Hover: fondo claro, texto oscuro */
    .toggle-progress-btn:hover {
        transform: translateY(-2px);
        background: #e8e8e8;
        color: #1a1a1a;
        box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
    }

    .toggle-progress-btn:hover svg path {
        fill: #1a1a1a;
    }

    /* Activo: fondo azul oscuro, texto blanco */
    .toggle-progress-btn.active {
        background: #1e3a5f;
        color: #ffffff;
        box-shadow: 0 4px 15px rgba(30, 58, 95, 0.4);
    }

    .toggle-progress-btn.active svg path {
        fill: #ffffff;
    }

    /* Activo + Hover: mantener azul oscuro */
    .toggle-progress-btn.active:hover {
        background: #2a4a73;
        color: #ffffff;
    }

    .toggle-progress-btn.active:hover svg path {
        fill: #ffffff;
    }

    .toggle-progress-btn .arrow-icon {
        transition: transform 0.3s ease;
    }

    .toggle-progress-btn.active .arrow-icon {
        transform: rotate(180deg);
    }

    /* Contenedor de progreso colapsable */
    .progress-section-wrapper {
        width: 100%;
        margin: 0 auto;
        max-height: 0;
        overflow: hidden;
        transition: max-height 0.4s ease-out;
    }

    .progress-section-wrapper.expanded {
        max-height: 2000px;
        transition: max-height 0.6s ease-in;
    }

    .progress-section-inner {
        background: white;
        border-radius: 0 0 16px 16px;
        box-shadow: 0 4px 20px rgba(0,0,0,0.08);
        padding: 10px 5px;
        margin-bottom: 10px;
    }

    /* Responsive */
    @media (max-width: 768px) {
        .project-card-v4 {
            flex-direction: column;
            width: 95%;
        }
        
        .project-sidebar-v4 {
            width: 100%;
            padding: 25px 20px;
        }

        .toggle-progress-btn {
            width: 100%;
        }

        .progress-section-wrapper {
            width: 100%;
        }
    }
    /* === FIN DISEÑO 4 === */
</style>
<!--FIN ESTILOS TABLA-->

<div data-type="<?php echo $tpl->get('thread')->type ?>"
    class="bez_thread
        <?php
        if ($tpl->get('thread')->state == 'opened') {
            echo 'priority_' . $tpl->get('thread')->priority;
        }
        ?>">


    <h1 class="thread_box_header">

        <a href="<?php echo $tpl->url('thread', 'id', $tpl->get('thread')->id) ?>">
            Proyecto:<?php echo $tpl->get('thread')->id ?>
        </a>
<!--elimnacion de nombre -->
  
    </h1>
    <!--tabla de definicion de proyectos -->

<?php 

global $INFO;
global $conf;
$ano = date("Y");
$titulo = $tpl->get('thread')->title;

// === CORRECCIÓN: Extraer el año correctamente del título R**G ===
// Formato típico: "Revisoría fiscal (D) Año: 2025 -Thiago boomm"
$anioProyecto = 'N/A';
if (preg_match('/Año:\s*(\d{4})/', $titulo, $matchAnio)) {
    $anioProyecto = $matchAnio[1];
} elseif (preg_match('/(\d{4})/', $titulo, $matchAnio)) {
    $anioProyecto = $matchAnio[1];
}

$variable = explode('-', $titulo);
$titulo1 = isset($variable[0]) ? $variable[0] : '';
$variable2 = explode(': ', $titulo);
$titulo3 = $anioProyecto; // Usar el año extraído correctamente
$auditadopropio = isset($variable2[1]) ? $variable2[1] : '';

If (isset($titulo1) && $titulo1 != '')
{
    $titulo2 = $titulo1;
}
else
{
    $titulo2 = $titulo;
}

If (isset($auditadopropio) && $auditadopropio != '')
{
    $auditado = $auditadopropio;
}

// Mapeo centralizado de tipos de proyecto (reemplaza ~50 líneas de if/elseif).
include_once __DIR__ . '/../meta/project_types.php';
$_tipoInfo = getProjectTypeInfo($titulo, $codigo);
$formtipo = $_tipoInfo['formtipo'];
$rest     = $_tipoInfo['rest_box'];


?>
    

<?php
// Determinar clase de estado
$estadoClase = 'status-proposal';
$estadoThread = $tpl->get('thread')->state;
if ($estadoThread == 'opened') {
    $estadoClase = 'status-open';
} elseif ($estadoThread == 'closed' || $estadoThread == 'rejected') {
    $estadoClase = 'status-closed';
}

// Obtener nombre del cliente para mostrar
$nombreCliente = !empty($tpl->get('thread')->label_name) ? $tpl->get('thread')->label_name : 'No especificado';
?>

<!-- === DISEÑO 4: SIDEBAR STYLE - INFO PROYECTO R**G === -->
<div class="project-card-v4">
    <!-- Sidebar con info del cliente -->
    <div class="project-sidebar-v4">
        <div class="project-avatar-v4">
            <!-- Icono Escudo Verificado - Centrado -->
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                <path fill="white" d="M12,1L3,5V11C3,16.55 6.84,21.74 12,23C17.16,21.74 21,16.55 21,11V5L12,1M10,17L6,13L7.41,11.59L10,14.17L16.59,7.58L18,9L10,17Z"/>
            </svg>
        </div>
        <h2><?php echo $nombreCliente ?></h2>
        <div class="project-id-v4">Proyecto:<?php echo $tpl->get('thread')->id ?></div>
        <div class="project-status-v4 <?php echo $estadoClase ?>"><?php if ($tpl->get('thread')->private == '1'): ?>
                <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
                    <path d="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z"/>
                </svg>
            <?php endif ?>
            <?php echo $tpl->getLang('state_' . $estadoThread) ?>
        </div>
    </div>

    <!-- Contenido con detalles -->
    <div class="project-content-v4">
        <h3>
            <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="#667eea">
                <path d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M12,17V15H17V17H12M7,17V15H9V17H7M7,13V11H9V13H7M12,13V11H17V13H12Z"/>
            </svg>
            Información del Proyecto
        </h3>
        <ul class="project-list-v4">
            <!-- Tipo de Proyecto -->
            <li>
                <span class="icon-v4 icon-type">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="22" height="22">
                        <path fill="white" d="M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3M19,5V19H5V5H19M10.5,11A0.5,0.5 0 0,1 11,11.5V15.5A0.5,0.5 0 0,1 10.5,16H9.5A0.5,0.5 0 0,1 9,15.5V11.5A0.5,0.5 0 0,1 9.5,11H10.5M14.5,8A0.5,0.5 0 0,1 15,8.5V15.5A0.5,0.5 0 0,1 14.5,16H13.5A0.5,0.5 0 0,1 13,15.5V8.5A0.5,0.5 0 0,1 13.5,8H14.5Z"/>
                    </svg>
                </span>
                <div class="info-v4">
                    <div class="label-v4">Tipo de Proyecto</div>
                    <div class="value-v4"><?php echo $rest ?></div>
                </div>
            </li>
            <!-- Año -->
            <li>
                <span class="icon-v4 icon-year">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="22" height="22">
                        <path fill="white" d="M19,19H5V8H19M16,1V3H8V1H6V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3H18V1M17,12H12V17H17V12Z"/>
                    </svg>
                </span>
                <div class="info-v4">
                    <div class="label-v4">Año</div>
                    <div class="value-v4"><?php echo $titulo3 ?></div>
                </div>
            </li>
            <!-- Marco Normativo -->
            <li>
                <span class="icon-v4 icon-norm">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="22" height="22">
                        <path fill="white" d="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"/>
                    </svg>
                </span>
                <div class="info-v4">
                    <div class="label-v4">Marco Normativo</div>
                    <div class="value-v4"><?php echo (!empty($formtipo) ? $formtipo : 'Normas Contables') ?></div>
                </div>
            </li>
            <!-- Creador -->
            <li>
                <span class="icon-v4 icon-creator">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="22" height="22">
                        <path fill="white" d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,6A2,2 0 0,0 10,8A2,2 0 0,0 12,10A2,2 0 0,0 14,8A2,2 0 0,0 12,6M12,13C14.67,13 20,14.33 20,17V20H4V17C4,14.33 9.33,13 12,13M12,14.9C9.03,14.9 5.9,16.36 5.9,17V18.1H18.1V17C18.1,16.36 14.97,14.9 12,14.9Z"/>
                    </svg>
                </span>
                <div class="info-v4">
                    <div class="label-v4">Creador</div>
                    <div class="value-v4"><?php echo $tpl->user_name($tpl->get('thread')->original_poster) ?></div>
                </div>
            </li>
            <!-- Coordinador -->
            <li>
                <span class="icon-v4 icon-coordinator">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="22" height="22">
                        <path fill="white" d="M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z"/>
                    </svg>
                </span>
                <div class="info-v4">
                    <div class="label-v4">Coordinador</div>
                    <div class="value-v4"><?php echo $tpl->user_name($tpl->get('thread')->coordinator) ?></div>
                </div>
            </li>
        </ul>
    </div>
</div>
<!-- FIN DISEÑO 4 -->

<!-- Botón para mostrar/ocultar Resumen de Cumplimiento -->
<button class="toggle-progress-btn" onclick="toggleProgressSection()" id="toggleProgressBtn">
    <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
        <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20M9,13V19H7V13H9M15,15V19H17V15H15M11,11V19H13V11H11Z"/>
    </svg>
    <span id="toggleProgressText">Ver Resumen de Cumplimiento</span>
    <svg class="arrow-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
        <path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z"/>
    </svg>
</button>

<!-- Contenedor colapsable para la sección de progreso -->
<div class="progress-section-wrapper" id="progressSectionWrapper">
    <div class="progress-section-inner">

    <!-- Tabla de progeso tareas R**G -->
    <?php 
    $proyectoId = $tpl->get('thread')->id;
    $requerimientos = $tpl->getPorcentajeProyectoDetalle($proyectoId);
    if (empty($requerimientos)){ ?>
        <div style="text-align: center; margin-bottom: 15px;">
            <span class="color-agregar-btn" style="font-weight: 600; cursor: pointer; color: #d71e34 !important;" title="Recargar Modulos" onclick="recargarModulos(<?php echo $tpl->get('thread')->id ?>);" >¡Recargar Modulos!
                <svg style='margin-left: 0px !important;' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class='svg-acciones'>
                    <path fill='#d71e34' d="M2 12C2 17 6 21 11 21C13.4 21 15.7 20.1 17.4 18.4L15.9 16.9C14.6 18.3 12.9 19 11 19C4.8 19 1.6 11.5 6.1 7.1S18 5.8 18 12H15L19 16H19.1L23 12H20C20 7 16 3 11 3S2 7 2 12M10 15H12V17H10V15M10 7H12V13H10V7" />
                </svg>
            </span>
        </div>
    <?php } else { ?>

    <div style="text-align: center; padding-bottom: 10px;">
        <div id="unique-table-container" style="margin-top: 12px;">
            <div id="unique-table-scroll">
                <table id="unique-table">
                    <thead>
                        <tr>
                            <th class="color-name"><?php echo $tpl->getLang('actividades_planeacion_barra')?></th>
                            <th class="color-name"><?php echo $tpl->getLang('total_actividades_barra')?></th>
                            <th class="color-name"><?php echo $tpl->getLang('actividades_finalizadas_barra')?></th>
                            <th class="color-name"><?php echo $tpl->getLang('progreso_barra')?></th>
                            <?php if ($INFO['perm'] >= AUTH_EDIT && $esEditor) :?>
                            <th class="color-name"><?php echo $tpl->getLang('accion')?></th>
                            <?php endif; ?>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        $referencia_ejecucion = 0;
                        $contador = 0;
                        $contadorFinalizados = 0;
                        $procesoEjecucion = false;

                        foreach ($requerimientos as $item) {
                            if (intval($item["procesos_ejecucion"]) === 1){
                                $partes = explode(' ', $item["nombre_submodulo"], 2);
                                $referencia_ejecucion = $partes[0]; 
                                $procesoEjecucion = true;
                            }

                            if ($referencia_ejecucion != 0 && stripos($item['nombre_submodulo'], $referencia_ejecucion) !== false) {
                                $contador++;
                                if (isset($item['total_requerimientos']) && isset($item['requerimientos_terminados']) &&  $item['total_requerimientos'] == $item['requerimientos_terminados']){
                                    $contadorFinalizados++;
                                }
                            }
                        }

                        foreach ($requerimientos as $item) {
                            $nombre = $item["nombre_submodulo"];
                            $visualizar_submodulo = $item['mostrar_submodulo'];
                            $estado_ejecucion = $item["procesos_ejecucion"];
                            $total = ($item["total_requerimientos"] != '' ? $item["total_requerimientos"] : 'N/A');
                            $ruta_submodulo = $item["ruta_submodulo"];
                            $terminados = ($item["requerimientos_terminados"] != '' ? $item["requerimientos_terminados"] : 0);
                            $porcentaje = $item["total_requerimientos"] > 0 ? round(($item["requerimientos_terminados"] / $item["total_requerimientos"]) * 100, 2) : 0;
                            
                            if (intval($estado_ejecucion) === 1) {
                                if ($contador > 0){
                                    $total = $contador - 1;
                                    $terminados = "{$contadorFinalizados}/{$total}";
                                    $porcentaje = $total > 0 ? round(($contadorFinalizados / $total) * 100, 2) : 0;
                                }else{
                                    $total = '0';
                                    $terminados = '<b>'.$tpl->getLang('mensaje_ejecucion').'</b>';
                                    $porcentaje = 0;
                                }
                            }

                            // Determinar la clase de la barra de progreso
                            $colorClass = "unique-progress-red";
                            if ($porcentaje == 100) {
                                $colorClass = "unique-progress-green";
                            } elseif ($porcentaje >= 50) {
                                $colorClass = "unique-progress-blue";
                            } elseif ($porcentaje >= 30) {
                                $colorClass = "unique-progress-orange";
                            }

                            if(intval($visualizar_submodulo) === 1 || ($INFO['perm'] >= AUTH_EDIT && $esEditor)){
                                echo "<tr>";
                                echo "<td>
                                        <a href='?id={$ruta_submodulo}'>
                                            {$nombre}
                                        </a>
                                        <p class='boton_ejecucion' title='Historico Resumen SIEinteligente' onclick='consultarHistoricoIA(\"{$ruta_submodulo}\", \"{$nombre}\")'>
                                            <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                <path fill='#dddf42c2' d='M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z' />
                                            </svg>
                                        </p>
                                    </td>";
                                echo "<td>
                                        <input type='hidden' id='requerimientos_totales_{$item["id_progreso"]}' value='{$total}'>
                                        {$total}
                                    </td>";
                                echo "<td>{$terminados}</td>";
                                echo "<td>
                                        <div class='unique-progress-bar-container'>
                                            <div class='unique-progress-bar {$colorClass}' style='width: {$porcentaje}%;'>
                                            {$porcentaje}%
                                            </div>
                                        </div>
                                    </td>";

                                if ($INFO['perm'] >= AUTH_EDIT && $esEditor) {
                                    
                                    echo "<td style='vertical-align: middle;'>";
                                        echo "";
                                            if(intval($visualizar_submodulo) === 0){
                                                echo "<p class='boton_visualizar' title='Activar Actividad' onclick='visualizarActividad({$item["id_progreso"]}, 1)'>
                                                            <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                                <path fill='#9faea0' d='M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z' />
                                                            </svg>
                                                        </p>";
                                            }else{
                                                echo "<p class='boton_visualizar' title='Inhabilitar Actividad' onclick='visualizarActividad({$item["id_progreso"]}, 0)'>
                                                            <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                                <path fill='#4caf50' d='M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z'/>
                                                            </svg>
                                                        </p>";   
                                            }
                                            echo "<p class='boton_edicion' title='Editar Actividad' onclick='actualizarActividad({$item["id_progreso"]}, \"{$nombre}\")'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#2196f3' d='M21.04,12.13C21.18,12.13 21.31,12.19 21.42,12.3L22.7,13.58C22.92,13.79 22.92,14.14 22.7,14.35L21.7,15.35L19.65,13.3L20.65,12.3C20.76,12.19 20.9,12.13 21.04,12.13M19.07,13.88L21.12,15.93L15.06,22H13V19.94L19.07,13.88M10,2H14A2,2 0 0,1 16,4V6H20A2,2 0 0,1 22,8L20,10V8H4V19H11V21H4A2,2 0 0,1 2,19V8A2,2 0 0,1 4,6H8V4A2,2 0 0,1 10,2M14,6V4H10V6H14Z' />
                                                </svg>
                                            </p>";
                                    if(intval($estado_ejecucion) === 1){
                                            echo "<p class='boton_ejecucion' title='Retirar como Ejecución' onclick='activarEjecucion({$item["id_progreso"]}, 0)'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#4caf50' d='M6 5C4.9 5 4 5.9 4 7V15C4 16.1 4.9 17 6 17H11V19H10C9.4 19 9 19.4 9 20H2V22H9C9 22.6 9.4 23 10 23H14C14.6 23 15 22.6 15 22H22V20H15C15 19.4 14.6 19 14 19H13V17H18C19.1 17 20 16.1 20 15V9C20 7.9 19.1 7 18 7H12L10 5H6M9 9C10.3 9 11.4 9.8 11.8 11H18V13H16V15H14V13H11.8C11.4 14.2 10.3 15 9 15C7.3 15 6 13.7 6 12S7.3 9 9 9M9 11C8.4 11 8 11.4 8 12C8 12.6 8.4 13 9 13C9.6 13 10 12.6 10 12S9.6 11 9 11Z' />
                                                </svg>
                                            </p>"; 
                                    } else if (!$procesoEjecucion && intval($estado_ejecucion) === 0) {
                                            echo "<p class='boton_ejecucion' title='Establecer como Ejecución' onclick='activarEjecucion({$item["id_progreso"]}, 1)'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#999' d='M15 20C15 19.45 14.55 19 14 19H13V17H19C20.11 17 21 16.11 21 15V7C21 5.9 20.11 5 19 5H13L11 3H5C3.9 3 3 3.9 3 5V15C3 16.11 3.9 17 5 17H11V19H10C9.45 19 9 19.45 9 20H2V22H9C9 22.55 9.45 23 10 23H14C14.55 23 15 22.55 15 22H22V20H15M5 15V7H19V15H5Z' />
                                                </svg>
                                            </p>";
                                    }
                                            echo "
                                            <p class='boton_ejecucion' title='Generar Resumen SIEinteligente' onclick='consultarArchivosProyecto(\"{$ruta_submodulo}\", \"{$nombre}\", \"{$rest}\")'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#dcdf42ff' d='M7 5.6L5.6 7L3.5 4.9L4.9 3.5L7 5.6M1 13H4V11H1V13M13 1H11V4H13V1M10 22C10 22.6 10.4 23 11 23H13C13.6 23 14 22.6 14 22V21H10V22M20 11V13H23V11H20M19.1 3.5L17 5.6L18.4 7L20.5 4.9L19.1 3.5M18 12C18 14.2 16.8 16.2 15 17.2V19C15 19.6 14.6 20 14 20H10C9.4 20 9 19.6 9 19V17.2C7.2 16.2 6 14.2 6 12C6 8.7 8.7 6 12 6S18 8.7 18 12M8.56 10H15.44C14.75 8.81 13.5 8 12 8S9.25 8.81 8.56 10Z' />
                                                </svg>
                                            </p>
                                            <p class='boton_ejecucion' title='Finalizar Actividad' onclick='finalizarActividad({$item["id_progreso"]})'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#f0a32fff' d='M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z' />
                                                </svg>
                                            </p>
                                            <p class='boton_eliminar' title='Eliminar Modulo' onclick='eliminarActividad({$item["id_progreso"]})'>
                                                <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                                                    <path fill='#f44336' d='M17 4V6H3V4H6.5L7.5 3H12.5L13.5 4H17M4 19V7H16V19C16 20.1 15.1 21 14 21H6C4.9 21 4 20.1 4 19M19 15H21V17H19V15M19 7H21V13H19V7Z' />
                                                </svg>
                                            </p>";
                                            
                                    echo "</td>";
                                }
                                echo "</tr>";
                            }
                        } 
                         ?>
                    </tbody>
                </table>
            </div>
        </div>
        <?php if ($INFO['perm'] >= AUTH_EDIT && $esEditor) : ?>
        <div style="display: flex; justify-content: flex-end; gap: 12px; margin-top: 10px; padding-right: 5px;">
            <span class="color-agregar-btn" style="font-weight: 600; cursor: pointer; font-size: 13px;" title="Crear nuevo modulo" onclick="agregarActividad(<?php echo $tpl->get('thread')->id ?>);">
                Crear Nuevo Modulo
                <svg style='margin-left: 0px !important' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class='svg-acciones'>
                    <path fill='#4caf50' d="M5 19V5H12V12H19V13C19.7 13 20.37 13.13 21 13.35V9L15 3H5C3.89 3 3 3.89 3 5V19C3 20.1 3.89 21 5 21H13.35C13.13 20.37 13 19.7 13 19H5M14 4.5L19.5 10H14V4.5M23 18V20H20V23H18V20H15V18H18V15H20V18H23Z" />
                </svg>
            </span>
            <span class="color-agregar-btn" style="font-weight: 600; cursor: pointer; font-size: 13px; color: #f0a32f;" title="Finalizar todo el proyecto" onclick="finalizarTodoProyecto(<?php echo $tpl->get('thread')->id ?>);">
                Finalizar Proyecto
                <svg style='margin-left: 0px !important' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class='svg-acciones'>
                    <path fill='#f0a32f' d="M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z" />
                </svg>
            </span>
        </div>
        <?php endif; ?>
        <br>
    </div>
    <?php }?>
    <!-- Fin Tabla de progeso tareas -->

    </div><!-- Cierra progress-section-inner -->
</div><!-- Cierra progress-section-wrapper -->

    <!-- Contenedor SIEinteligente -->
    <h3 id="tituloIA" style="text-align: center;"></h3>
    <div id="campoIA" class="cajon-ia"></div>
    <!-- FIN Contenedor SIEinteligente -->


    <?php echo $tpl->get('thread')->content_html ?>
    <?php if (!$tpl->get('no_actions')): ?>
        <div class="bez_buttons">
            <?php if (
                $tpl->param('kid') == '' &&
                $tpl->get('thread')->acl_of('state') >= BEZ_PERMISSION_CHANGE &&
                ($tpl->get('thread')->can_be_closed() ||
                    $tpl->get('thread')->can_be_rejected() ||
                    $tpl->get('thread')->can_be_reopened())
            ): ?>

                <a class="bds_inline_button"
                    id="plugin__bez_thread_change_state_button"
                    href="<?php echo $tpl->url('thread', 'id', $tpl->get('thread')->id) ?>#k_">
                    <?php if ($tpl->get('thread')->can_be_closed()): ?>
                        ↬ <?php echo $tpl->getLang('js')['close_issue' . $tpl->get('lang_suffix')] ?>
                    <?php elseif ($tpl->get('thread')->can_be_rejected()): ?>
                        ↛ <?php echo $tpl->getLang('js')['reject_issue' . $tpl->get('lang_suffix')] ?>
                    <?php elseif ($tpl->get('thread')->can_be_reopened()): ?>
                        ↻ <?php echo $tpl->getLang('js')['reopen_issue' . $tpl->get('lang_suffix')]  ?>
                    <?php endif ?>
                </a>
            <?php endif ?>

            <?php if (count($tpl->get('thread')->changable_fields(array('label_id', 'title', 'content', 'coordinator'))) > 0): ?>
                <a href="<?php echo $tpl->url('thread_report', 'action', 'edit', 'id', $tpl->get('thread')->id) ?>" class="bds_inline_button">
                    ✎ <?php echo $tpl->getLang('edit') ?>
                </a>
            <?php endif ?>

            <?php if ($tpl->get('thread')->acl_of('id') >= BEZ_PERMISSION_DELETE && $tpl->get('thread')->can_be_removed()): ?>
                <a class="bds_inline_button bez_commcause_delete_prompt"
                    href="<?php echo $tpl->url('thread', 'id', $tpl->get('thread')->id, 'action', 'delete');
                            ?>">
                    ✕ <?php echo $tpl->getLang('delete') ?>
                </a>
            <?php endif ?>

            <a class="bds_inline_button" href="
            <?php echo $tpl->mailto(
                $tpl->user_email($tpl->get('thread')->coordinator),
                '#' . $tpl->get('thread')->id . ' ' . $tpl->get('thread')->title,
                $tpl->url('thread', 'id', $tpl->get('thread')->id)
            ) ?>">
                ✉ <?php echo $tpl->getLang('send_mail') ?>
            </a>

            <?php
            // Verificar permisos: director/manager/sie O manager virtual — sysadmin NO
            $isAdminRecalculo = in_array($_bez_adm_grp, $_user_grps) || in_array('manager', $_user_grps);
            $isVirtualManager = action_plugin_managerprotect::shouldHaveManagerGroup($_SERVER['REMOTE_USER'] ?? '');
            if ($INFO['perm'] >= AUTH_EDIT && ($isAdminRecalculo || $isVirtualManager) && !$esSysadmin) :
            ?>
            <a class="bds_inline_button" href="javascript:void(0);" onclick="recalcularCodigoProyecto(<?php echo $tpl->get('thread')->id ?>);">
                ↻ Recálculo
            </a>
            <?php endif; ?>

            <?php
            // Botón Ajustar Avance: director/manager/sie, manager virtual, editarproyecto o coordinador — sysadmin NO
            $isAdminAA = in_array($_bez_adm_grp, $_user_grps) || in_array('manager', $_user_grps);
            $isVirtualManagerAA = action_plugin_managerprotect::shouldHaveManagerGroup($_SERVER['REMOTE_USER'] ?? '');
            $isEditorProyecto = $esEditor;
            $isCoordinador = ($_SERVER['REMOTE_USER'] ?? '') === $tpl->get('thread')->coordinator;
            if ($INFO['perm'] >= AUTH_EDIT && !$esSysadmin && ($isAdminAA || $isVirtualManagerAA || $isEditorProyecto || $isCoordinador)) :
            ?>
            <a class="bds_inline_button" href="javascript:void(0);" onclick="ajustarAvance(<?php echo $tpl->get('thread')->id ?>);" style="margin-left: 5px;">
                ↻ Ajustar Avance
            </a>
            <?php endif; ?>

            <?php if ($tpl->get('thread')->type == 'issue'): ?>
                <a href="<?php echo $tpl->url('8d', 'id', $tpl->get('thread')->id) ?>" class="bds_inline_button bds_report_button">
                    ⎙ <?php echo $tpl->getLang('8d_report') ?>
                </a>
            <?php else: ?>
                <a href="<?php echo $tpl->url('kp', 'id', $tpl->get('thread')->id) ?>" class="bds_inline_button bds_report_button">
                    ⎙ <?php echo $tpl->getLang('kp_report') ?>
                </a>
            <?php endif ?>
        </div>
    <?php endif ?>

</div>

<!-- Loader con fondo opaco -->
<div id="loader-overlay">
  <div id="loader"></div>
</div>

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
    // Token CSRF de DokuWiki para llamadas AJAX seguras
    var SECTOK = '<?php echo getSecurityToken(); ?>';

    // Motor IA local: procesa archivos directamente en el servidor (sin proxy externo).
    const IA_ENGINE_URL = '<?php echo DOKU_BASE; ?>lib/plugins/bez/meta/ia_engine.php';

    /**
     * Convierte encabezados Markdown (## Titulo, ### Titulo, etc.) a formato DokuWiki.
     * La IA a veces responde con formato Markdown en vez de DokuWiki.
     * Mapeo: # → ====== (h1), ## → ===== (h2), ### → ==== (h3), #### → === (h4), ##### y ###### → **negrita**
     */
    function transformarMarkdownADokuWiki(texto) {
        if (!texto) return texto;
        return texto.split('\n').map(function(linea) {
            var trimmed = linea.trim();
            var match = trimmed.match(/^(#{1,6})\s+(.+)$/);
            if (match) {
                var nivel = match[1].length;
                var titulo = match[2].trim();
                if (nivel <= 4) {
                    var signos = 7 - nivel; // # →6, ## →5, ### →4, #### →3
                    var eq = '';
                    for (var i = 0; i < signos; i++) eq += '=';
                    return eq + ' ' + titulo + ' ' + eq;
                } else {
                    return '**' + titulo + '**';
                }
            }
            return linea;
        }).join('\n');
    }

    /**
     * Transforma tablas de verificación SI/NO en la respuesta de IA.
     * Reemplaza "SI" por "X" y "NO" por " " (vacío) en celdas de tablas DokuWiki.
     * Solo afecta celdas cuyo valor EXACTO sea "SI" o "NO" (no texto parcial).
     */
    function transformarTablaSINO(texto) {
        if (!texto) return texto;
        return texto.split('\n').map(function(linea) {
            var trimmed = linea.trim();
            // Solo procesar líneas de datos de tabla (empiezan con |, no con ^)
            if (trimmed.charAt(0) !== '|') return linea;
            // Dividir por | y transformar celdas exactas SI/NO
            var partes = linea.split('|');
            for (var i = 0; i < partes.length; i++) {
                var valor = partes[i].trim();
                if (valor === 'SI' || valor === 'Si' || valor === 'si' || valor === 'Sí' || valor === 'sí' || valor === 'SÍ') {
                    partes[i] = ' X ';
                } else if (valor === 'NO' || valor === 'No' || valor === 'no') {
                    partes[i] = '   ';
                }
            }
            return partes.join('|');
        }).join('\n');
    }

    /**
     * Convierte sintaxis DokuWiki a HTML para vista en vivo.
     * Solo convierte los elementos básicos que usa la IA.
     */
    function dokuwikiToHtml(text) {
        if (!text) return '';
        let html = text;
        // Escapar HTML existente
        html = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
        // Restaurar <del> que es válido en DokuWiki
        html = html.replace(/&lt;del&gt;(.*?)&lt;\/del&gt;/g, '<del>$1</del>');
        // Títulos (procesar de mayor a menor)
        html = html.replace(/^={6}\s*(.+?)\s*={6}\s*$/gm, '<h1>$1</h1>');
        html = html.replace(/^={5}\s*(.+?)\s*={5}\s*$/gm, '<h2>$1</h2>');
        html = html.replace(/^={4}\s*(.+?)\s*={4}\s*$/gm, '<h3>$1</h3>');
        html = html.replace(/^={3}\s*(.+?)\s*={3}\s*$/gm, '<h4>$1</h4>');
        html = html.replace(/^={2}\s*(.+?)\s*={2}\s*$/gm, '<h5>$1</h5>');
        // Negrilla y cursiva
        html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
        html = html.replace(/\/\/(.+?)\/\//g, '<em>$1</em>');
        // Línea horizontal
        html = html.replace(/^-{4,}\s*$/gm, '<hr>');
        // Tablas DokuWiki
        html = html.replace(/^(\^.+)$/gm, function(match) {
            const cells = match.split('^').filter(c => c.trim() !== '' || c === '');
            const ths = cells.slice(1, -1).map(c => '<th>' + c.trim() + '</th>').join('');
            return '<table class="inline"><tr>' + ths + '</tr>';
        });
        html = html.replace(/^(\|.+)$/gm, function(match) {
            const cells = match.split('|').filter(c => c.trim() !== '' || c === '');
            const tds = cells.slice(1, -1).map(c => '<td>' + c.trim() + '</td>').join('');
            return '<tr>' + tds + '</tr>';
        });
        // Cerrar tablas (después de la última fila antes de una línea no-tabla)
        html = html.replace(/(<\/tr>)\n(?!<tr|<\/table)/g, '$1</table>\n');
        // Si la última línea es una tabla, cerrarla
        if (html.match(/<\/tr>$/)) html += '</table>';
        // Listas con viñetas (  * item)
        html = html.replace(/^  \* (.+)$/gm, '<li>$1</li>');
        html = html.replace(/(<li>.*<\/li>\n?)+/g, '<ul>$&</ul>');
        // Listas numeradas (  - item)
        html = html.replace(/^  - (.+)$/gm, '<li>$1</li>');
        html = html.replace(/(<li>.*<\/li>\n?)+/g, function(match) {
            return match.includes('<ul>') ? match : '<ol>' + match + '</ol>';
        });
        // Saltos de línea
        html = html.replace(/\n/g, '<br>\n');
        // Limpiar <br> dentro de tags de bloque
        html = html.replace(/<br>\n(<\/?(?:h[1-5]|hr|table|tr|th|td|ul|ol|li))/g, '\n$1');
        html = html.replace(/(<\/(?:h[1-5]|hr|table|tr|ul|ol|li)>)<br>/g, '$1');
        return html;
    }

    // Funcion para agregar nuevas actividades.
    function agregarActividad(proyectoId){
        Swal.fire({
            title: "Creación Modulo",
            html: `<p style='margin-bottom: 10;'>
                        Ingrese la información del nuevo modulo.
                    </p>
                    <small>
                        <b>Ej:</b> [[{}proyectos:control:2:13_otros:registro|13. TITULO ]] 
                    </small>
                `,
            input: "text",
            inputAttributes: {
                autocapitalize: "off"
            },
            showCancelButton: true,
            confirmButtonText: "Crear Modulo",
            cancelButtonText: "Cancelar",
            showLoaderOnConfirm: true,
            customClass: {
                confirmButton: "btn-confirm", // Clase personalizada para el botón de confirmación
                cancelButton: "btn-cancel"    // Clase personalizada para el botón de cancelar (opcional)
            },
            preConfirm: (nuevoTexto) => {
                return new Promise((resolve, reject) => {
                    jQuery.ajax({
                        url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                        type: "POST",
                        data: {
                            accion: "agregarActividadProyecto",
                            id_proyecto: proyectoId,
                            nombre_modulo: nuevoTexto,
                            sectok: SECTOK
                        },
                        dataType: "json",
                        success: function (response) {
                            if (response.status === "success") {
                                resolve(response.mensaje);
                            } else {
                                Swal.fire({
                                    icon: "error",
                                    title: "Error",
                                    text: `${response.mensaje}`,
                                    customClass: {
                                        confirmButton: "btn-confirm",
                                    },
                                });
                            }
                        },
                        error: function () {
                            Swal.showValidationMessage("Error en la petición AJAX.");
                            reject();
                        }
                    });
                });
            },
            allowOutsideClick: () => !Swal.isLoading()
        }).then((result) => {
            if (result.isConfirmed) {
                Swal.fire({
                    title: "¡Modulo Creado!",
                    text: "El modulo se creo correctamente.",
                    icon: "success",
                    confirmButtonText: "OK",
                    customClass: {
                        confirmButton: "btn-confirm",
                    },
                }).then(() => {
                    location.reload();
                });
            }
        });
    }

    // Validamos la edicion de los nombres de acciones.
    function actualizarActividad(id, nombre){
        Swal.fire({
            title: "Actualización Titulo.",
            text: `${nombre}`,
            input: "text",
            inputAttributes: {
                autocapitalize: "off"
            },
            showCancelButton: true,
            confirmButtonText: "Actualizar",
            cancelButtonText: "Cancelar",
            showLoaderOnConfirm: true,
            customClass: {
                confirmButton: "btn-confirm", // Clase personalizada para el botón de confirmación
                cancelButton: "btn-cancel"    // Clase personalizada para el botón de cancelar (opcional)
            },
            preConfirm: (nuevoTexto) => {
                return new Promise((resolve, reject) => {
                    jQuery.ajax({
                        url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                        type: "POST",
                        data: {
                            accion: "updateNombreActividadProyecto",
                            id_proyecto: id,
                            nombre_actividad: nuevoTexto.toUpperCase(),
                            sectok: SECTOK
                        },
                        dataType: "json",
                        success: function (response) {
                            if (response.status === "success") {
                                resolve(response.mensaje);
                            } else {
                                Swal.fire({
                                    icon: "error",
                                    title: "Error",
                                    text: `${response.mensaje}`,
                                    customClass: {
                                        confirmButton: "btn-confirm",
                                    },
                                });
                            }
                        },
                        error: function () {
                            Swal.showValidationMessage("Error en la petición AJAX.");
                            reject();
                        }
                    });
                });
            },
            allowOutsideClick: () => !Swal.isLoading()
        }).then((result) => {
            if (result.isConfirmed) {
                Swal.fire({
                    title: "¡Actualizado!",
                    text: "La actividad se actualizó correctamente.",
                    icon: "success",
                    confirmButtonText: "OK",
                    customClass: {
                        confirmButton: "btn-confirm",
                    },
                }).then(() => {
                    location.reload();
                });
            }
        });
    }

    // Eliminamos el modulo a solicitud.
    function eliminarActividad(id){
        Swal.fire({
            title: "Estas Seguro?",
            text: "¡No podrás revertir esto!",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "Si, Eliminar!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "eliminarActividadProyecto",
                        id_proyecto: id,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Eliminado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: `Error al eliminar Modulo.`,
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    }
                });
            }
        });
    }

    // actualizarmos la visualizacion el modulo a solicitud.
    function visualizarActividad(id, estado){
        Swal.fire({
            title: "¿Estas Seguro?",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "Si, Actualizar!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "visualizarActividadProyecto",
                        id_proyecto: id,
                        estado,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "Actualizado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: `Error al actualizar Modulo.`,
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    }
                });
            }
        });
    }

    // Eliminamos el modulo a solicitud.
    function activarEjecucion(id, estado){
        let mensaje = "¡Se activará como proceso de ejecución!";
        let mensajeBoton = "Activar";
        if(estado == 0){
            mensaje = "¡Se desactivará el proceso de ejecución!";
            mensajeBoton = "Desactivar";
        }
        Swal.fire({
            title: "Estas Seguro?",
            text: mensaje,
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: `Si, ${mensajeBoton}!`,
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "activarEjecucionProyecto",
                        id_proyecto: id,
                        estado,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "Actualizado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: `Error al activar Modulo.`,
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    }
                });
            }
        });
    }

    // Recalculamos el contenido del proyecto (regenera desde cero con el ID correcto).
    function recalcularCodigoProyecto(id){
        if (!confirm('¿Recalcular el proyecto ' + id + '? Se regenerará completamente el contenido.')) return;
        // Mostrar loader
        var overlay = document.createElement('div');
        overlay.id = 'recalculo-overlay';
        overlay.innerHTML = '<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:99999;display:flex;align-items:center;justify-content:center;">' +
            '<div style="background:#fff;padding:40px;border-radius:12px;text-align:center;"><h2>Procesando...</h2><p>Regenerando contenido del proyecto ' + id + '...</p></div></div>';
        document.body.appendChild(overlay);
        fetch(DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php', {
            method: 'POST',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: 'accion=recalcularCodigoProyecto&id_proyecto=' + id + '&sectok=' + SECTOK
        })
        .then(function(r) { return r.json(); })
        .then(function(data) {
            var el = document.getElementById('recalculo-overlay');
            if (el) el.remove();
            setTimeout(function() {
                if (data.status === 'success') {
                    alert(data.mensaje);
                    location.reload();
                } else {
                    alert('Error: ' + (data.mensaje || 'Error desconocido'));
                }
            }, 50);
        })
        .catch(function(err) {
            var el = document.getElementById('recalculo-overlay');
            if (el) el.remove();
            setTimeout(function() { alert('Error de conexión: ' + err.message); }, 50);
        });
    }

    // Recargamos todos los modulos del proyecto.
    function recargarModulos(id){
        Swal.fire({
            title: "¿Estas Seguro?",
            text: "¡Se Procesara nuevamente la estructura de Modulos!",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: `Si, deseo continuar!`,
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "recargarModulosProyecto",
                        id_proyecto: id,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "Modulos Actualizados!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || response.error || "Error al activar Modulo.",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    },
                    error: function (xhr) {
                        var msg = "Error de conexión con el servidor.";
                        try { var r = JSON.parse(xhr.responseText); msg = r.mensaje || r.error || msg; } catch(e) {}
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: msg,
                            customClass: { confirmButton: "btn-confirm" },
                        });
                    }
                });
            }
        });
    }

    // Funcion encargada de ajustar el avance real del proyecto. R**G
    function ajustarAvance(id){
        Swal.fire({
            title: "¿Ajustar Avance?",
            text: "Se recalculará el progreso real de todos los módulos del proyecto.",
            icon: "question",
            showCancelButton: true,
            confirmButtonText: "Si, Ajustar!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "ajustarAvanceProyecto",
                        id_proyecto: id,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Avance Ajustado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || response.error || "Error al ajustar avance.",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    },
                    error: function (xhr) {
                        var msg = "Error de conexión con el servidor.";
                        try { var r = JSON.parse(xhr.responseText); msg = r.mensaje || r.error || msg; } catch(e) {}
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: msg,
                            customClass: { confirmButton: "btn-confirm" },
                        });
                    }
                });
            }
        });
    }

    // Funcion encargada de historicos IA (motor local).
    async function historicosIA(data) {
        data.append('accion', 'consulta-historico');

        const uploadResponse = await fetch(IA_ENGINE_URL, {
            method: "POST",
            body: data
        });

        return uploadResponse.json();
    }

    // Enviamos comentario de IA en actividad.
    function guardarResumenComentario(comentario, ruta_actividad){
        const data_comentario = {
            user: {
                id: "",
                name: "",
                mail: "",
                address: "",
                url: ""
            },
            subscribe: false,
            date: {
                created: ""
            },
            raw: comentario,
            show: true
        };
        jQuery.ajax({
            url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
            type: "POST",
            data: {
                accion: "guardarResumenIAarchivo",
                comentario: data_comentario,
                id: ruta_actividad,
                sectok: SECTOK
            },
            dataType: "json",
            success: function (response) {
                if (response.status === "success") {
                    Swal.fire({
                        title: "¡Perfecto!",
                        text: `${response.mensaje}`,
                        icon: "success",
                        customClass: {
                            confirmButton: "btn-confirm",
                        }
                    }).then(() => {
                        // Recargar página para que DokuWiki renderice el comentario correctamente
                        location.reload();
                    });
                } else {
                    Swal.fire({
                        title: "Error",
                        text: `${response.mensaje}`,
                        icon: "error",
                        customClass: {
                            confirmButton: "btn-confirm",
                        }
                    });
                }
            },
            error: function (xhr, status, error) {
                Swal.fire({
                    title: "Error de conexion",
                    text: "No se pudo guardar el resumen. Intente nuevamente.",
                    icon: "error",
                    customClass: {
                        confirmButton: "btn-confirm",
                    }
                });
            }
        });
    }

    // Funcion encargada de consultar archivos y generar resumen con IA (motor local).
    async function consultarArchivosProyecto(ruta_modulo, submodulo, titulo){
        let mensajeAlerta = '<p>Generar Resumen SIEinteligente!</p>';
        const formData = new FormData();
        formData.append("ruta_actividad", ruta_modulo);
        const result = await historicosIA(formData);

        if (result.length > 0){
            mensajeAlerta = `<h5>Previamente se ha generado un <b>RESUMEN de IA</b> para esta actividad.</h5> <small><b>Revisa en el icono<b>
            <svg style='margin-left: 0px !important;' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' class='svg-acciones'>
                <path fill='#dddf42c2' d='M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z' />
            </svg>
            el resumen!.</small>`;
        }

        Swal.fire({
            title: "Estas Seguro?",
            html: mensajeAlerta,
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "Deseo Generar!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then(async (swalResult) => {
            if (swalResult.isConfirmed) {
                document.getElementById('tituloIA').style.display = 'none';
                document.querySelector('.cajon-ia').style.display = 'none';
                document.getElementById('loader-overlay').style.display = 'flex';

                try {
                    // Llamar al motor IA local: el servidor lee archivos directamente del filesystem
                    var fd = new FormData();
                    fd.append('accion', 'resumen-sie');
                    fd.append('ruta_modulo', ruta_modulo);
                    fd.append('submodulo', submodulo);
                    fd.append('titulo', titulo);

                    var response = await fetch(IA_ENGINE_URL, { method: "POST", body: fd });
                    var res = await response.json();

                    if (response.ok && res.status === 'success') {
                        document.getElementById('tituloIA').style.display = 'block';
                        document.getElementById('tituloIA').innerHTML = submodulo + ' | Resumen SIEinteligente';
                        document.querySelector('.cajon-ia').style.display = 'block';
                        // Pipeline de transformacion: 1) Markdown->DokuWiki, 2) SI/NO->X/vacio
                        var resumenTransformado = transformarTablaSINO(transformarMarkdownADokuWiki(res.resumen_sie_ia));
                        // Convertir DokuWiki syntax a HTML para vista en vivo
                        var html = dokuwikiToHtml(resumenTransformado);
                        document.getElementById('campoIA').innerHTML = html;

                        // Guardamos el texto transformado en DokuWiki syntax (no HTML)
                        guardarResumenComentario(resumenTransformado, ruta_modulo);
                    } else {
                        Swal.fire({
                            icon: "error",
                            title: "Error",
                            text: res.error || res.mensaje || "Error al generar resumen.",
                            customClass: { confirmButton: "btn-confirm" },
                        });
                    }
                } catch (error) {
                    Swal.fire({
                        icon: "error",
                        title: "Error de conexion",
                        text: "Error: " + error,
                        customClass: { confirmButton: "btn-confirm" },
                    });
                }

                document.getElementById('loader-overlay').style.display = 'none';
            }
        });
    }

    // Funcion encargada de consultar el historico.
    async function consultarHistoricoIA(ruta_actividad, submodulo){
        document.getElementById('tituloIA').style.display = 'none';
        document.querySelector('.cajon-ia').style.display = 'none';
        document.getElementById('loader-overlay').style.display = 'flex';

        const formData = new FormData();
        formData.append("ruta_actividad", ruta_actividad);

        try {
            const result = await historicosIA(formData);

            if (result.length > 0){
                document.getElementById('tituloIA').style.display = 'block';
                document.getElementById('tituloIA').innerHTML = `🔎 ${submodulo} | Resumen SIEinteligente 💡`;
                document.querySelector('.cajon-ia').style.display = 'block';

                let html = "<div>";
                result.forEach((resumen, index) => {
                    const resumen_historico = dokuwikiToHtml(resumen.resumen_ia);
                    const fecha_historico = resumen.fecha_resumen.replace("T", " ");
                    html += `<h4 style="text-align:center;">🔎 Resumen ${index + 1} | ${fecha_historico}💡</h4> ${resumen_historico} <hr>`;
                });
                html += "</div>";
                document.getElementById('campoIA').innerHTML = html;

            } else {
                Swal.fire({
                    icon: "error",
                    title: "Error",
                    text: `❌ Error. No cuenta con histórico de resumen para este módulo.`,
                    customClass: {
                        confirmButton: "btn-confirm",
                    },
                });
            }

        } catch (error) {
            Swal.fire({
                icon: "error",
                title: "Error",
                text: `❌ Error al procesar: ${error}`,
                customClass: {
                    confirmButton: "btn-confirm",
                },
            });
        }

        document.getElementById('loader-overlay').style.display = 'none';

    }

    // Funcion para Finalizar actividad (Opción B: marca checks pendientes + actualiza progreso).
    function finalizarActividad(id){
        const requerimientosTotales = document.getElementById(`requerimientos_totales_${id}`).value;

        if (requerimientosTotales == 'N/A'){
            Swal.fire({
                icon: "error",
                title: "Antes...",
                text: `Se solicita ingresar al módulo y revisar las actividades correspondientes.`,
                customClass: {
                    confirmButton: "btn-confirm",
                },
            });
            return;
        }

        Swal.fire({
            title: "¿Estas Seguro?",
            html: "Se marcarán como <b>completadas</b> todas las tareas pendientes del módulo y se actualizará el progreso al 100%.",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "¡Sí, Finalizar!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                // Mostrar loading mientras se procesan los checks.
                Swal.fire({
                    title: "Finalizando...",
                    text: "Marcando tareas pendientes como completadas.",
                    allowOutsideClick: false,
                    allowEscapeKey: false,
                    didOpen: () => { Swal.showLoading(); }
                });

                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "finalizarActividadProyecto",
                        id_proyecto: id,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Finalizado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else if (response.status === "sin_visitar") {
                            Swal.fire({
                                icon: "info",
                                title: "Módulo no visitado",
                                text: `${response.mensaje}`,
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || "Error al Finalizar Módulo.",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    },
                    error: function () {
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: "No se pudo conectar con el servidor. Intente nuevamente.",
                            customClass: {
                                confirmButton: "btn-confirm",
                            },
                        });
                    }
                });
            }
        });
    }

    // Funcion para Finalizar TODO el proyecto (marca checks de todos los módulos).
    function finalizarTodoProyecto(proyectoId){
        Swal.fire({
            title: "¿Finalizar Todo el Proyecto?",
            html: "Se marcarán como <b>completadas</b> todas las tareas pendientes de <b>todos los módulos</b> del proyecto.<br><br><small>Los módulos que no hayan sido visitados serán omitidos y se le informará cuáles son.</small>",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "¡Sí, Finalizar Todo!",
            cancelButtonText: "Cancelar",
            customClass: {
                confirmButton: "btn-confirm",
                cancelButton: "btn-cancel"
            }
        }).then((result) => {
            if (result.isConfirmed) {
                Swal.fire({
                    title: "Finalizando Proyecto...",
                    text: "Marcando tareas pendientes de todos los módulos como completadas.",
                    allowOutsideClick: false,
                    allowEscapeKey: false,
                    didOpen: () => { Swal.showLoading(); }
                });

                jQuery.ajax({
                    url: DOKU_BASE + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "finalizarTodoProyecto",
                        id_proyecto: proyectoId,
                        sectok: SECTOK
                    },
                    dataType: "json",
                    success: function (response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Proyecto Finalizado!",
                                text: `${response.mensaje}`,
                                icon: "success",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else if (response.status === "parcial") {
                            Swal.fire({
                                title: "Proyecto Finalizado Parcialmente",
                                html: `${response.mensaje}<br><br><b>${response.cantidad_saltados} módulo(s) no visitado(s):</b><br><small style="color:#f0a32f;">${response.saltados}</small><br><br><small>Debe ingresar a estos módulos al menos una vez para poder finalizarlos.</small>`,
                                icon: "info",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                }
                            }).then(() => {
                                location.reload();
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || "Error al finalizar el proyecto.",
                                customClass: {
                                    confirmButton: "btn-confirm",
                                },
                            });
                        }
                    },
                    error: function () {
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: "No se pudo conectar con el servidor. Intente nuevamente.",
                            customClass: {
                                confirmButton: "btn-confirm",
                            },
                        });
                    }
                });
            }
        });
    }

    let elementos = document.getElementsByClassName('plugin_button_text');

    // Acceder al primer elemento y obtener su texto
    if (elementos.length > 0) {
        let subModulo = elementos[0].textContent; // O .innerText si prefieres
        console.log(subModulo);
    } else {
        console.log("No se encontraron elementos con la clase 'plugin_button_text'.");
    }

    // === FUNCIÓN TOGGLE PARA SECCIÓN DE PROGRESO R**G ===
    function toggleProgressSection() {
        const wrapper = document.getElementById('progressSectionWrapper');
        const btn = document.getElementById('toggleProgressBtn');
        const text = document.getElementById('toggleProgressText');
        
        if (wrapper.classList.contains('expanded')) {
            wrapper.classList.remove('expanded');
            btn.classList.remove('active');
            text.textContent = 'Ver Resumen de Cumplimiento';
        } else {
            wrapper.classList.add('expanded');
            btn.classList.add('active');
            text.textContent = 'Ocultar Resumen de Cumplimiento';
        }
    }

    // Opcional: Abrir automáticamente si hay módulos cargados
    document.addEventListener('DOMContentLoaded', function() {
        // Si quieres que se abra automáticamente, descomenta la siguiente línea:
        // toggleProgressSection();
    });
</script>