<?php
/**
 * crear_paginas_proyecto.php
 * Función ÚNICA para crear las páginas físicas (.txt) de un proyecto.
 * Fuente centralizada de contenido - usada tanto por thread.php (creación inicial)
 * como por ajax_handler.php (recálculo).
 *
 * Parámetros requeridos:
 *   $codigo      - ID del proyecto
 *   $proyecto    - Tipo (A-N)
 *   $auditado    - Nombre del cliente
 *   $rest        - Texto de operación (ej: "REVISORÍA FISCAL (Nuevo)")
 *   $coordinador - Nombre del coordinador (opcional, se muestra en encabezado)
 *   $sobreescribir - true para recálculo, false para creación inicial
 *
 * Se puede incluir desde ajax_handler.php o thread.php
 */

require_once(__DIR__ . '/esquema_proyecto.php');
require_once(__DIR__ . '/path_helper.php');

/**
 * Mapa centralizado de labels por tipo de proyecto.
 * Usado por thread.php y ajax_handler.php para obtener el texto de operación.
 */
function getRestLabels() {
    return array(
        'A' => 'REVISORÍA FISCAL (Nuevo)',
        'B' => 'REVISORÍA FISCAL (Recurrente)',
        'C' => 'REVISORÍA FISCAL (Nuevo)',
        'D' => 'REVISORÍA FISCAL (Recurrente)',
        'E' => 'REVISORÍA FISCAL /PEI -(Nuevo)',
        'F' => 'REVISORÍA FISCAL /PEI (Recurrente)',
        'G' => 'REVISORÍA FISCAL /PEI (Nuevo)',
        'H' => 'REVISORÍA FISCAL /PEI (Recurrente)',
        'I' => 'OUTSOURCING CONTABLE',
        'J' => 'ASESORÍA CONTABLE',
        'K' => 'PROYECTO',
        'L' => 'REPORTE DE GESTIÓN',
        'M' => 'OUTSOURCING /PEI',
        'N' => 'ASESORÍA CONTABLE /PEI'
    );
}

/**
 * Crea los permisos ACL para un proyecto nuevo.
 * Escribe las reglas de acceso en conf/acl.auth.php
 */
function crearAclProyecto($codigo, $base = "") {
    $archivoAcl = $base . "conf/acl.auth.php";
    if (!file_exists($archivoAcl)) return;

    $permiso = "boton:* @proyecto" . $codigo . "    1
boton2:*    @proyecto" . $codigo . "    1
imagenes:*  @proyecto" . $codigo . "    1
imagenes:presentacion2:*    @proyecto" . $codigo . "    1
inicio  @proyecto" . $codigo . "    1
menu    @proyecto" . $codigo . "    1
menu1   @proyecto" . $codigo . "    1
menu2   @proyecto" . $codigo . "    1
operativo:* @proyecto" . $codigo . "    1
playground:*    @proyecto" . $codigo . "    1
proyectos:control:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:28_efectivo:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:29_inversiones:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:31_cuentas_cobrar:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:32_activos_intangibles:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:33_gastos_anticipado:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:34_pasivos_provisiones:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:35_impuestos_ganancias:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:36_ingresos_operacionales:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:37_contingencias:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:38_patrimonio:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:39_gastos_operacionales:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:40_costo_ventas:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:41_propiedad:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:43_estimaciones:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:44_gastos_personales:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:45_inventarios:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:46_otros_asuntos:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:47_ica_bimestral:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:48_iva_bimestral:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:49_rete_fte:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:50_rte_ica:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:51_regimen_simple:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:auditoria_de_cierre:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:auditoria_de_cierre2:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:bancos:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:bonos:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:cartera:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:consolidado:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:cuentas_por_cobrar:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:cuentas_por_cobrar2:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:cuentas_por_pagar:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:diferidos:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:disponible:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:disponible2:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:general:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuesto_al_patrimonio:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos1:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos2:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos3:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos4:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos5:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos6:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos7:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos8:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos9:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos10:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos11:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:impuestos12:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:gasnomina:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:nomina:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:aportes:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:liquidacion:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:cumplimiento2:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:inventarios:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:inventarios2:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:inversiones:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:normatividad:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:obligaciones_financieras:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:otros_activos:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:pasivos_laborales:" . $codigo . ":*    @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:patrimonio:" . $codigo . ":*   @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:ppe:" . $codigo . ":*  @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:prestaciones:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:auditorias:programas_auditoria:reestructuracion:" . $codigo . ":* @proyecto" . $codigo . "    8
proyectos:generales:" . $codigo . ":*   @proyecto" . $codigo . "    8
subjectindex2   @proyecto" . $codigo . "    1
varios:*    @proyecto" . $codigo . "    1
manual_funciones:*  @proyecto" . $codigo . "    1
es:bez:*encargos:general    @proyecto" . $codigo . "    1
encargos:general    @proyecto" . $codigo . "    1
";
    $archivo = fopen($archivoAcl, 'a+');
    if ($archivo) {
        fwrite($archivo, $permiso);
        fclose($archivo);
    }
}

function crearPaginasProyecto($codigo, $proyecto, $auditado, $rest, $coordinador = "", $sobreescribir = false) {
    @set_time_limit(300);
    $ano = date("Y");
    $paginasCreadas = 0;

    // Base path: usar DOKU_INC si está disponible (llamado desde ajax_handler)
    $base = bez_doku_base();

    // Determinar $micarpeta según tipo de proyecto
    $micarpeta = "";
    $SERVICIO = "";
    switch ($proyecto) {
        case "A": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo; break;
        case "B": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/recurrente"; break;
        case "C": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo; break;
        case "D": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/recurrente"; break;
        case "E": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/pei"; break;
        case "F": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/pei/recurrente"; break;
        case "G": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/pei"; break;
        case "H": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/pei/recurrente"; break;
        case "I": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/outsourcing"; $SERVICIO = "outsourcing"; break;
        case "J": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/asesoria"; $SERVICIO = "asesoria"; break;
        case "K": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/otros"; break;
        case "L": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/reporte"; break;
        case "M": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/outsourcing/pei"; $SERVICIO = "outsourcing:pei"; break;
        case "N": $micarpeta = $base . "data/pages/proyectos/control/" . $codigo . "/asesoria/pei"; $SERVICIO = "asesoria:pei"; break;
        default: return 0;
    }

    // Variable PEI
    $pei = "";
    if (in_array($proyecto, array("E","F","G","H","M","N"))) {
        $pei = "1:";
    }

    // ==========================================
    // 1. CREACIÓN DE GABINETE (generales)
    // ==========================================
    $paginasCreadas += _crearGabinete($codigo, $auditado, $rest, $coordinador, $base, $sobreescribir);

    // ==========================================
    // 2. CREACIÓN DE PROGRAMA GENERAL DE AUDITORÍA
    // ==========================================
    $paginasCreadas += _crearProgramaGeneral($codigo, $auditado, $rest, $coordinador, $pei, $ano, $base, $sobreescribir);

    // ==========================================
    // 3. CREACIÓN DE PÁGINAS DE CONTROL (según tipo)
    // ==========================================
    $paginasCreadas += _crearPaginasControl($codigo, $proyecto, $auditado, $rest, $coordinador, $micarpeta, $SERVICIO, $pei, $ano, $sobreescribir);

    return $paginasCreadas;
}

/**
 * Función auxiliar para escribir archivo si no existe, o sobreescribir si existe
 */
function _escribirPagina($ruta, $contenido, $sobreescribir = false) {
    $dir = dirname($ruta);
    if (!file_exists($dir)) {
        mkdir($dir, 0755, true);
    }
    if (!file_exists($ruta) || $sobreescribir) {
        $archivo = fopen($ruta, 'w');
        if ($archivo) {
            fwrite($archivo, $contenido);
            fclose($archivo);
            return 1;
        }
    }
    return 0;
}

/**
 * GABINETE - Carpeta generales
 */
function _crearGabinete($codigo, $auditado, $rest, $coordinador = "", $base = "", $sobreescribir = false) {
    $creadas = 0;
    $micarpeta2 = $base . "data/pages/proyectos/generales/" . $codigo;

    // Crear subdirectorios
    $sitios = array(
        $micarpeta2 . "/cumplimiento/certificaciones",
        $micarpeta2 . "/cumplimiento/impuestos/distritales",
        $micarpeta2 . "/cumplimiento/impuestos/nacionales",
        $micarpeta2 . "/cumplimiento/informacion",
        $micarpeta2 . "/estados_financieros",
        $micarpeta2 . "/informes",
        $micarpeta2 . "/permanente",
        $micarpeta2 . "/calidad"
    );
    foreach ($sitios as $value) {
        if (!file_exists($value)) mkdir($value, 0755, true);
    }

    // Variables de presentación para gabinete
    $parte0 = "\n\n[[{:boton2:titulo8.png}es:bez:thread:id:" . $codigo . "|Regresar]]\n\n";
    $parte1 = "\n<WRAP lef round info 45%>\n\n**ID:** " . $codigo . "\n\n\n**CLIENTE:** " . $auditado . "\n\n\n**COORDINADOR:**  " . $coordinador . "\n\n\n**OPERACIÓN:**  " . $rest . "\n\n\n</WRAP>\n\n";
    $parte3 = "\n\n\n\n{{filelisting>...:generales}}\n\n</WRAP>\n\n\n----\n\n\n\n\n~~DISCUSSION~~";

    // Contenido especial para generales.txt
    $contenidoGenerales = esq_contenidoGenerales();

    // Mapeo de archivos del gabinete
    $gabinete = esq_gabineteItems($micarpeta2);

    foreach ($gabinete as $llave => $encabezado) {
        $contenido = "";
        if ($encabezado == "\xe2\x9c\x8e ARCHIVOS GENERALES") {
            $contenido = $contenidoGenerales;
        }
        $parte2 = "\n\n<WRAP lef round important 100%>\n\n**CARPETA:** <font 18px>" . $encabezado . "</font>\n\n</WRAP>\n\n<WRAP center round box 100%>\n\n";
        $contenidoFinal = $parte0 . $parte1 . $parte2 . $contenido . $parte3;
        // NO sobreescribir: gabinete contiene datos del usuario, solo recrear archivos faltantes
        $creadas += _escribirPagina($llave, $contenidoFinal, false);
    }

    return $creadas;
}

/**
 * PROGRAMA GENERAL DE AUDITORÍA
 */
function _crearProgramaGeneral($codigo, $auditado, $rest, $coordinador = "", $pei, $ano, $base = "", $sobreescribir = false) {
    $creadas = 0;
    $micarpeta3 = $base . "data/pages/proyectos/auditorias/programas_auditoria/general/" . $codigo;
    $misprogramas = "proyectos:auditorias:programas_auditoria:";

    // Crear subdirectorios
    $sitios3 = array(
        $micarpeta3 . "/conciliacion", $micarpeta3 . "/inversiones",
        $micarpeta3 . "/deudores", $micarpeta3 . "/propiedad",
        $micarpeta3 . "/diferidos", $micarpeta3 . "/proveedores",
        $micarpeta3 . "/laboral", $micarpeta3 . "/otros_pasivos",
        $micarpeta3 . "/patrimonio", $micarpeta3 . "/ingresos",
        $micarpeta3 . "/impuestos1", $micarpeta3 . "/impuestos2",
        $micarpeta3 . "/impuestos3", $micarpeta3 . "/impuestos4",
        $micarpeta3 . "/impuestos5", $micarpeta3 . "/impuestos6",
        $micarpeta3 . "/impuestos7", $micarpeta3 . "/impuestos8",
        $micarpeta3 . "/impuestos9", $micarpeta3 . "/impuestos10",
        $micarpeta3 . "/impuestos11", $micarpeta3 . "/impuestos12",
        $micarpeta3 . "/impuestos", $micarpeta3 . "/gasnomina",
        $micarpeta3 . "/nomina", $micarpeta3 . "/aportes",
        $micarpeta3 . "/liquidacion", $micarpeta3 . "/cumplimiento2"
    );
    foreach ($sitios3 as $valor) {
        if (!file_exists($valor)) mkdir($valor, 0755, true);
    }

    $parte0 = "\n\n[[{:boton2:titulo10.png}proyectos:auditorias:programas_auditoria:general:" . $codigo . ":registro|Regresar programa general]]\n\n\n";
    $parte1 = "\n<WRAP lef round info 45%>\n\n**ID:** " . $codigo . "\n\n\n**CLIENTE:** " . $auditado . "\n\n\n**COORDINADOR:**  " . $coordinador . "\n\n\n**OPERACIÓN:**  " . $rest . "\n\n\n</WRAP>\n\n";
    $parte3 = "\n\n\n----\n\n\n\n\n~~DISCUSSION~~";

    // 1. CONCILIACIÓN
    $conciliacionG = $parte0 . $parte1 . esq_conciliacion($ano) . $parte3;

    // 2. INVERSIONES
    $inversionesG = $parte0 . $parte1 . esq_inversiones($ano) . $parte3;

    // 3. DEUDORES
    $deudoresG = $parte0 . $parte1 . esq_deudores($ano) . $parte3;

    // 4. PROPIEDAD PLANTA Y EQUIPO
    $propiedadG = $parte0 . $parte1 . esq_propiedad($ano) . $parte3;

    // 5. DIFERIDOS
    $diferidosG = $parte0 . $parte1 . esq_diferidos($ano) . $parte3;

    // 6. PROVEEDORES
    $proveedoresG = $parte0 . $parte1 . esq_proveedores($ano) . $parte3;

    // 7. OBLIGACIONES LABORALES
    $laboralG = $parte0 . $parte1 . esq_laboral($ano) . $parte3;

    // 8. OTROS PASIVOS
    $otros_pasivosG = $parte0 . $parte1 . esq_otros_pasivos($ano) . $parte3;

    // 9. PATRIMONIO
    $patrimonioG = $parte0 . $parte1 . esq_patrimonio($ano) . $parte3;

    // 10. INGRESOS
    $ingresosG = $parte0 . $parte1 . esq_ingresos($ano) . $parte3;

    // 11. IMPUESTOS (principal)
    $impuestos = $parte0 . $parte1 . esq_impuestos($codigo, $ano) . $parte3;

    // Impuestos mensuales 1-12
    $parte2a = "\n\n\n<WRAP lef round important 100%>\n\n\n\n=== 11. IMPUESTOS ";
    $parte2 = " ===\n\n</WRAP>\n\n<WRAP center round box 100%>\n\n{{filelisting>...:impuestos:";
    $parte2c = "}}\n\n\n\n</WRAP>\n\n";
    $parte0c = "\n\n[[{:boton2:titulo8.png}proyectos:auditorias:programas_auditoria:general:" . $codigo . ":impuestos:registro|Regresar al programa 11 general de impuestos]]\n\n";

    $meses = array(
        1 => array("ENERO","enero"), 2 => array("FEBRERO","febrero"), 3 => array("MARZO","marzo"),
        4 => array("ABRIL","abril"), 5 => array("MAYO","mayo"), 6 => array("JUNIO","junio"),
        7 => array("JULIO","julio"), 8 => array("AGOSTO","agosto"), 9 => array("SEPTIEMBRE","septiembre"),
        10 => array("OCTUBRE","octubre"), 11 => array("NOVIEMBRE","noviembre"), 12 => array("DICIEMBRE","diciembre")
    );
    $impuestosMes = array();
    foreach ($meses as $num => $mes) {
        $impuestosMes[$num] = $parte0c . $parte2a . $mes[0] . $parte2 . $mes[1] . $parte2c . $parte3;
    }

    // 12. GASTOS DE PERSONAL
    $gasnomina = $parte0 . $parte1 . esq_gasnomina($codigo, $ano) . $parte3;

    // A. NÓMINA ELECTRÓNICA
    $nomina = $parte0 . $parte1 . esq_nomina($ano) . $parte3;

    // B. APORTES
    $aportes = $parte0 . $parte1 . esq_aportes($ano) . $parte3;

    // C. LIQUIDACIÓN
    $liquidacion = $parte0 . $parte1 . esq_liquidacion($ano) . $parte3;

    // 13. AUDITORÍA DE CUMPLIMIENTO
    $cumplimiento2 = $parte0 . $parte1 . esq_cumplimiento2($ano) . $parte3;

    // PÁGINA PRINCIPAL (registro.txt)
    $parte0B = "\n\n[[{:boton2:titulo9.png}es:bez:thread:id:" . $codigo . "|Regresar]]\n\n";
    $parte2B = esq_programaGeneralRegistro($codigo, $pei, $ano);

    $principalG = $parte0B . $parte1 . $parte2B . $parte3;

    // Mapeo de archivos
    $gabinete2 = array(
        $micarpeta3 . "/registro.txt" => $principalG,
        $micarpeta3 . "/conciliacion/registro.txt" => $conciliacionG,
        $micarpeta3 . "/inversiones/registro.txt" => $inversionesG,
        $micarpeta3 . "/deudores/registro.txt" => $deudoresG,
        $micarpeta3 . "/propiedad/registro.txt" => $propiedadG,
        $micarpeta3 . "/diferidos/registro.txt" => $diferidosG,
        $micarpeta3 . "/proveedores/registro.txt" => $proveedoresG,
        $micarpeta3 . "/laboral/registro.txt" => $laboralG,
        $micarpeta3 . "/otros_pasivos/registro.txt" => $otros_pasivosG,
        $micarpeta3 . "/patrimonio/registro.txt" => $patrimonioG,
        $micarpeta3 . "/ingresos/registro.txt" => $ingresosG,
        $micarpeta3 . "/impuestos/registro.txt" => $impuestos,
        $micarpeta3 . "/gasnomina/registro.txt" => $gasnomina,
        $micarpeta3 . "/nomina/registro.txt" => $nomina,
        $micarpeta3 . "/aportes/registro.txt" => $aportes,
        $micarpeta3 . "/liquidacion/registro.txt" => $liquidacion,
        $micarpeta3 . "/cumplimiento2/registro.txt" => $cumplimiento2
    );
    // Agregar impuestos mensuales
    for ($i = 1; $i <= 12; $i++) {
        $gabinete2[$micarpeta3 . "/impuestos" . $i . "/registro.txt"] = $impuestosMes[$i];
    }

    foreach ($gabinete2 as $llave => $contenido) {
        // SÍ sobreescribir: programa general es contenido de plantilla que debe regenerarse en recálculo
        $creadas += _escribirPagina($llave, $contenido, $sobreescribir);
    }

    return $creadas;
}

/**
 * PÁGINAS DE CONTROL - según tipo de proyecto A-N
 */
function _crearPaginasControl($codigo, $proyecto, $auditado, $rest, $coordinador, $micarpeta, $SERVICIO, $pei, $ano, $sobreescribir = false) {
    $creadas = 0;

    // Nota: no hacer early return si la carpeta existe — _escribirPagina()
    // ya maneja la lógica de "no sobreescribir" por archivo individual,
    // permitiendo completar creaciones parciales.

    $parte0 = "\n\n[[{:boton2:titulo8.png}es:bez:thread:id:" . $codigo . "|Regresar]]\n\n";
    $parte1 = "\n<WRAP lef round info 45%>\n\n**ID:** " . $codigo . "\n\n\n**CLIENTE:** " . $auditado . "\n\n\n**COORDINADOR:**  " . $coordinador . "\n\n\n**OPERACIÓN:**  " . $rest . "\n\n\n</WRAP>\n\n";
    $parte3 = "\n\n\n\n{{filelisting>...:generales}}\n\n</WRAP>\n\n\n----\n\n\n\n\n~~DISCUSSION~~";
    $misprogramas = "proyectos:auditorias:programas_auditoria:";

    // TIPOS A-H: REVISORÍA FISCAL
    if (in_array($proyecto, array("A","B","C","D","E","F","G","H"))) {
        $carpetas = _crearControlRevisoria($codigo, $proyecto, $auditado, $rest, $micarpeta, $pei, $ano, $parte0, $parte1, $parte3, $misprogramas);
    }
    // TIPOS I-N: OUTSOURCING / ASESORÍA / OTROS / REPORTE
    elseif (in_array($proyecto, array("I","J","K","L","M","N"))) {
        $carpetas = _crearControlOutsourcing($codigo, $proyecto, $auditado, $rest, $micarpeta, $SERVICIO, $pei, $ano, $parte0, $parte1, $parte3);
    }
    else {
        return 0;
    }

    foreach ($carpetas as $destino => $contenido) {
        $creadas += _escribirPagina($destino, $contenido, $sobreescribir);
    }

    return $creadas;
}

/**
 * Control para tipos A-H (Revisoría Fiscal)
 */
function _crearControlRevisoria($codigo, $proyecto, $auditado, $rest, $micarpeta, $pei, $ano, $parte0, $parte1, $parte3, $misprogramas) {
    // Variables de contenido de páginas
    $diagnostico = $parte0 . $parte1 . esq_diagnostico($ano, $pei) . $parte3;
    $diagnosticoR = $parte0 . $parte1 . esq_diagnosticoR($ano, $pei) . $parte3;
    $cliente = $parte0 . $parte1 . esq_cliente($ano, $pei) . $parte3;
    $clienteR = $parte0 . $parte1 . esq_clienteR($ano, $pei) . $parte3;
    $personal = $parte0 . $parte1 . esq_personal($ano, $pei) . $parte3;
    $personalPei = $parte0 . $parte1 . esq_personalPei($ano, $pei) . $parte3;
    $riesgos = $parte0 . $parte1 . esq_riesgos($ano, $pei) . $parte3;
    $materialidad = $parte0 . $parte1 . esq_materialidad($ano, $pei) . $parte3;
    $materialidad_Nagas = $parte0 . $parte1 . esq_materialidadNagas($ano, $pei) . $parte3;
    $planeacion = $parte0 . $parte1 . esq_planeacion($ano, $pei) . $parte3;
    $control_interno = $parte0 . $parte1 . esq_controlInterno($ano, $pei) . $parte3;
    $informes = $parte0 . $parte1 . esq_informes($ano, $pei) . $parte3;
    $manifestaciones = $parte0 . $parte1 . esq_manifestaciones($ano, $pei) . $parte3;
    $dictamen = $parte0 . $parte1 . esq_dictamen($ano, $pei) . $parte3;
    $dictamen_Nagas = $parte0 . $parte1 . esq_dictamenNagas($ano, $pei) . $parte3;
    $otros = $parte0 . $parte1 . esq_otros($ano) . $parte3;
    $otros_Nagas = $parte0 . $parte1 . esq_otrosNagas($ano) . $parte3;

    // Variables $con para consolidado - según tipo
    $con1=$con2=$con3=$con4=$con5=$con6=$con7=$con9=$con10=$con11="";
    $basePath = ":proyectos:control:" . $codigo;
    switch ($proyecto) {
        case "A":
            $con1 = "{{dolist>" . $basePath . ":1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":10_manifestaciones?manifestaciones=ID}}";
            $con11 = "{{dolist>" . $basePath . ":11_dictamen?dictamen=ID}}";
            break;
        case "B":
            $con1 = "{{dolist>" . $basePath . ":recurrente:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":recurrente:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":recurrente:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":recurrente:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":recurrente:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":recurrente:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":recurrente:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":recurrente:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":recurrente:10_manifestaciones?manifestaciones=ID}}";
            $con11 = "{{dolist>" . $basePath . ":recurrente:11_dictamen?dictamen=ID}}";
            break;
        case "C":
            $con1 = "{{dolist>" . $basePath . ":1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":10_dictamen?dictamen=ID}}";
            $con11 = "{{dolist>" . $basePath . ":11_dictamen?dictamen=ID}}";
            break;
        case "D":
            $con1 = "{{dolist>" . $basePath . ":recurrente:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":recurrente:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":recurrente:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":recurrente:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":recurrente:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":recurrente:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":recurrente:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":recurrente:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":recurrente:10_dictamen?dictamen=ID}}";
            $con11 = "{{dolist>" . $basePath . ":recurrente:11_dictamen?dictamen=ID}}";
            break;
        case "E":
            $con1 = "{{dolist>" . $basePath . ":pei:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":pei:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":pei:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":pei:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":pei:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":pei:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":pei:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":pei:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":pei:10_manifestaciones?manifestaciones=ID}}";
            $con11 = "{{dolist>" . $basePath . ":pei:11_dictamen?dictamen=ID}}";
            break;
        case "F":
            $con1 = "{{dolist>" . $basePath . ":pei:recurrente:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":pei:recurrente:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":pei:recurrente:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":pei:recurrente:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":pei:recurrente:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":pei:recurrente:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":pei:recurrente:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":pei:recurrente:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":pei:recurrente:10_manifestaciones?manifestaciones=ID}}";
            $con11 = "{{dolist>" . $basePath . ":pei:recurrente:11_dictamen?dictamen=ID}}";
            break;
        case "G":
            $con1 = "{{dolist>" . $basePath . ":pei:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":pei:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":pei:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":pei:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":pei:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":pei:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":pei:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":pei:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":pei:10_dictamen?dictamen=ID}}";
            $con11 = "{{dolist>" . $basePath . ":pei:11_dictamen?dictamen=ID}}";
            break;
        case "H":
            $con1 = "{{dolist>" . $basePath . ":pei:recurrente:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":pei:recurrente:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":pei:recurrente:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":pei:recurrente:4_riesgos?riesgos=ID}}";
            $con5 = "{{dolist>" . $basePath . ":pei:recurrente:5_materialidad?materialidad=ID}}";
            $con6 = "{{dolist>" . $basePath . ":pei:recurrente:6_planeacion?planeacion=ID}}";
            $con7 = "{{dolist>" . $basePath . ":pei:recurrente:7_control_interno?control_interno=ID}}";
            $con9 = "{{dolist>" . $basePath . ":pei:recurrente:9_informes?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":pei:recurrente:10_dictamen?dictamen=ID}}";
            $con11 = "{{dolist>" . $basePath . ":pei:recurrente:11_dictamen?dictamen=ID}}";
            break;
    }

    // Secciones del consolidado
    $informes1 = esq_consolidadoInformes($ano, $con9);
    $manifestaciones1 = esq_consolidadoManifestaciones($con10);
    $dictamen1 = esq_consolidadoDictamen($con11);

    // NAGAS: sin manifestaciones, renumerar dictamen
    if (in_array($proyecto, array("C","D","G","H"))) {
        $manifestaciones1 = "";
        $dictamen1 = esq_consolidadoDictamenNagas($con10);
    }

    // $programas1 y $programas2 para consolidado
    $programas1 = esq_consolidadoProgramas1($codigo);
    $programas2 = esq_consolidadoProgramas2($codigo, $misprogramas);

    // Consolidado
    $consolidado = $parte0 . $parte1 . esq_consolidadoBody($ano, $con1, $con2, $con3, $con4, $con5, $con6, $con7, $informes1, $manifestaciones1, $dictamen1, $programas1, $programas2);

    // Crear directorios y mapear archivos según tipo
    $sitios = array();
    $carpetas = array();

    if ($proyecto == "A") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_manifestaciones","11_dictamen","12_consolidado","13_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnostico, "2_cliente/registro.txt" => $cliente,
            "3_personal/registro.txt" => $personal, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_manifestaciones/registro.txt" => $manifestaciones, "11_dictamen/registro.txt" => $dictamen,
            "12_consolidado/registro.txt" => $consolidado, "13_otros/registro.txt" => $otros
        );
    } elseif ($proyecto == "B") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_manifestaciones","11_dictamen","12_consolidado","13_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnosticoR, "2_cliente/registro.txt" => $clienteR,
            "3_personal/registro.txt" => $personal, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_manifestaciones/registro.txt" => $manifestaciones, "11_dictamen/registro.txt" => $dictamen,
            "12_consolidado/registro.txt" => $consolidado, "13_otros/registro.txt" => $otros
        );
    } elseif ($proyecto == "C") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_dictamen","11_consolidado","12_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnostico, "2_cliente/registro.txt" => $cliente,
            "3_personal/registro.txt" => $personal, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad_Nagas, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_dictamen/registro.txt" => $dictamen_Nagas, "11_consolidado/registro.txt" => $consolidado,
            "12_otros/registro.txt" => $otros_Nagas
        );
    } elseif ($proyecto == "D") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_dictamen","11_consolidado","12_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnosticoR, "2_cliente/registro.txt" => $clienteR,
            "3_personal/registro.txt" => $personal, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad_Nagas, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_dictamen/registro.txt" => $dictamen_Nagas, "11_consolidado/registro.txt" => $consolidado,
            "12_otros/registro.txt" => $otros_Nagas
        );
    } elseif ($proyecto == "E") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_manifestaciones","11_dictamen","12_consolidado","13_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnostico, "2_cliente/registro.txt" => $cliente,
            "3_personal/registro.txt" => $personalPei, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_manifestaciones/registro.txt" => $manifestaciones, "11_dictamen/registro.txt" => $dictamen,
            "12_consolidado/registro.txt" => $consolidado, "13_otros/registro.txt" => $otros
        );
    } elseif ($proyecto == "F") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_manifestaciones","11_dictamen","12_consolidado","13_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnosticoR, "2_cliente/registro.txt" => $clienteR,
            "3_personal/registro.txt" => $personalPei, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_manifestaciones/registro.txt" => $manifestaciones, "11_dictamen/registro.txt" => $dictamen,
            "12_consolidado/registro.txt" => $consolidado, "13_otros/registro.txt" => $otros
        );
    } elseif ($proyecto == "G") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_dictamen","11_consolidado","12_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnostico, "2_cliente/registro.txt" => $cliente,
            "3_personal/registro.txt" => $personalPei, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad_Nagas, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_dictamen/registro.txt" => $dictamen_Nagas, "11_consolidado/registro.txt" => $consolidado,
            "12_otros/registro.txt" => $otros_Nagas
        );
    } elseif ($proyecto == "H") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_riesgos","5_materialidad","6_planeacion","7_control_interno","9_informes","10_dictamen","11_consolidado","12_otros");
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnosticoR, "2_cliente/registro.txt" => $clienteR,
            "3_personal/registro.txt" => $personalPei, "4_riesgos/registro.txt" => $riesgos,
            "5_materialidad/registro.txt" => $materialidad_Nagas, "6_planeacion/registro.txt" => $planeacion,
            "7_control_interno/registro.txt" => $control_interno, "9_informes/registro.txt" => $informes,
            "10_dictamen/registro.txt" => $dictamen_Nagas, "11_consolidado/registro.txt" => $consolidado,
            "12_otros/registro.txt" => $otros_Nagas
        );
    }

    // Crear directorios
    foreach ($sitios as $dir) {
        $fullPath = $micarpeta . "/" . $dir;
        if (!file_exists($fullPath)) mkdir($fullPath, 0755, true);
    }

    // Convertir rutas relativas a absolutas
    $resultado = array();
    foreach ($carpetas as $ruta => $contenido) {
        $resultado[$micarpeta . "/" . $ruta] = $contenido;
    }

    return $resultado;
}

/**
 * Control para tipos I-N (Outsourcing/Asesoría/Otros/Reporte)
 */
function _crearControlOutsourcing($codigo, $proyecto, $auditado, $rest, $micarpeta, $SERVICIO, $pei, $ano, $parte0, $parte1, $parte3) {
    $misprogramas = "proyectos:auditorias:programas_auditoria:";

    // Variables $con para consolidado
    $con1=$con2=$con3=$con4=$con6=$con7=$con8=$con9=$con10=$con11="";
    $basePath = ":proyectos:control:" . $codigo;

    switch ($proyecto) {
        case "I":
            $con1 = "{{dolist>" . $basePath . ":outsourcing:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":outsourcing:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":outsourcing:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":outsourcing:4_planeacion?planeacion=ID}}";
            $con6 = "{{dolist>" . $basePath . ":outsourcing:6_informes?informes=ID}}";
            $con7 = "{{dolist>" . $basePath . ":outsourcing:a_impuestos?informes=ID}}";
            $con8 = "{{dolist>" . $basePath . ":outsourcing:b_eeff?informes=ID}}";
            $con9 = "{{dolist>" . $basePath . ":outsourcing:c_nomina?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":outsourcing:d_rrhh?informes=ID}}";
            $con11 = "{{dolist>" . $basePath . ":outsourcing:e_otros?informes=ID}}";
            break;
        case "J":
            $con1 = "{{dolist>" . $basePath . ":asesoria:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":asesoria:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":asesoria:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":asesoria:4_planeacion?planeacion=ID}}";
            $con6 = "{{dolist>" . $basePath . ":asesoria:6_informes?informes=ID}}";
            $con7 = "{{dolist>" . $basePath . ":asesoria:a_impuestos?informes=ID}}";
            $con8 = "{{dolist>" . $basePath . ":asesoria:b_eeff?informes=ID}}";
            $con9 = "{{dolist>" . $basePath . ":asesoria:c_nomina?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":asesoria:d_rrhh?informes=ID}}";
            $con11 = "{{dolist>" . $basePath . ":asesoria:e_otros?informes=ID}}";
            break;
        case "K":
            $con1 = "{{dolist>" . $basePath . ":otros:1_planeacion?planeacion=ID}}";
            $con2 = "{{dolist>" . $basePath . ":otros:2_operacion?operaciones=ID}}";
            $con6 = "{{dolist>" . $basePath . ":otros:3_informes?informes=ID}}";
            break;
        case "L":
            $con1 = "{{dolist>" . $basePath . ":reporte:1_planeacion?planeacion=ID}}";
            $con2 = "{{dolist>" . $basePath . ":reporte:2_operacion?operaciones=ID}}";
            $con6 = "{{dolist>" . $basePath . ":reporte:3_informes?informes=ID}}";
            break;
        case "M":
            $con1 = "{{dolist>" . $basePath . ":outsourcing:pei:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":outsourcing:pei:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":outsourcing:pei:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":outsourcing:pei:4_planeacion?planeacion=ID}}";
            $con6 = "{{dolist>" . $basePath . ":outsourcing:pei:6_informes?informes=ID}}";
            $con7 = "{{dolist>" . $basePath . ":outsourcing:pei:a_impuestos?informes=ID}}";
            $con8 = "{{dolist>" . $basePath . ":outsourcing:pei:b_eeff?informes=ID}}";
            $con9 = "{{dolist>" . $basePath . ":outsourcing:pei:c_nomina?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":outsourcing:pei:d_rrhh?informes=ID}}";
            $con11 = "{{dolist>" . $basePath . ":outsourcing:pei:e_otros?informes=ID}}";
            break;
        case "N":
            $con1 = "{{dolist>" . $basePath . ":asesoria:pei:1_diagnostico?diagnostico=ID}}";
            $con2 = "{{dolist>" . $basePath . ":asesoria:pei:2_cliente?cliente=ID}}";
            $con3 = "{{dolist>" . $basePath . ":asesoria:pei:3_personal?personal=ID}}";
            $con4 = "{{dolist>" . $basePath . ":asesoria:pei:4_planeacion?planeacion=ID}}";
            $con6 = "{{dolist>" . $basePath . ":asesoria:pei:6_informes?informes=ID}}";
            $con7 = "{{dolist>" . $basePath . ":asesoria:pei:a_impuestos?informes=ID}}";
            $con8 = "{{dolist>" . $basePath . ":asesoria:pei:b_eeff?informes=ID}}";
            $con9 = "{{dolist>" . $basePath . ":asesoria:pei:c_nomina?informes=ID}}";
            $con10 = "{{dolist>" . $basePath . ":asesoria:pei:d_rrhh?informes=ID}}";
            $con11 = "{{dolist>" . $basePath . ":asesoria:pei:e_otros?informes=ID}}";
            break;
    }

    // Redefinir parte1 para outsourcing (usa boton diferente)
    $parte1out = "\n\n[[{:boton2:titulo8.png}es:bez:thread:id:" . $codigo . "|Regresar]]\n\n";
    $parte2out = "\n<WRAP lef round info 45%>\n\n**ID:** " . $codigo . "\n\n\n**CLIENTE:** " . $auditado . "\n\n\n**OPERACIÓN:**  " . $rest . "\n\n\n</WRAP>\n\n";

    // Diagnóstico outsourcing (con sección 1.2 ACTUALIZACIÓN ANUAL)
    $diagnosticout = $parte1out . $parte2out . esq_diagnosticoOut($ano, $pei);

    // Cliente outsourcing
    $clienteOut = $parte1out . $parte2out . esq_clienteOut($ano, $pei) . $parte3;

    // Personal (reutilizar de revisoría)
    $personal = $parte1out . $parte2out . esq_personalOut($ano, $pei) . $parte3;

    $personalPei = $parte1out . $parte2out . esq_personalPeiOut($ano, $pei) . $parte3;

    // Parte1 para subpáginas de planeación (regresar a planeación)
    $parte1sub = "\n\n[[{:boton2:titulo8.png}proyectos:control:" . $codigo . ":".$SERVICIO.":4_planeacion:registro|Regresar]]\n\n";

    // Contenido de impuestos outsourcing (simplificado - las 15 secciones)
    $impuestosOut = esq_generarImpuestosOut($parte1sub, $parte2out, $parte3, $ano);

    // Estados financieros outsourcing
    $eeffOut = esq_generarEeffOut($parte1sub, $parte2out, $parte3, $ano);

    // Nómina outsourcing
    $nominaOut = esq_generarNominaOut($parte1sub, $parte2out, $parte3, $ano);

    // RRHH outsourcing
    $rrhhOut = esq_generarRrhhOut($parte1sub, $parte2out, $parte3, $ano);

    // Otros controles outsourcing
    $otroscOut = esq_generarOtroscOut($parte1sub, $parte2out, $parte3, $ano);

    // Planeación outsourcing (incluye enlaces a sub-módulos)
    $parte1plan = "\n\n[[{:boton2:titulo8.png}es:bez:thread:id:" . $codigo . "|Regresar]]\n\n";
    $planeacionOut = $parte1plan . $parte2out . esq_planeacionOut($codigo, $SERVICIO, $pei, $ano) . $parte3;

    // Informes outsourcing
    $informesOut = $parte1plan . $parte2out . esq_informesOut($ano) . $parte3;

    // Otros outsourcing
    $otrosOut = $parte1plan . $parte2out . esq_otrosRegistrosOut($ano) . $parte3;

    // Planeación OP (otros proyectos K,L)
    $planeacionOP = $parte1plan . $parte2out . esq_planeacionOP($ano) . $parte3;

    $evaluacionOP = $parte1plan . $parte2out . esq_evaluacionOP($ano) . $parte3;

    // Consolidado outsourcing
    $programas1 = esq_consolidadoOutProgramas1($codigo);
    $programas2 = esq_consolidadoOutProgramas2($codigo, $misprogramas);

    $consolidadoOut = $parte1plan . $parte2out . esq_consolidadoOutBody($ano, $con1, $con2, $con3, $con4, $con6, $con7, $con8, $con9, $con10, $con11, $programas1, $programas2);

    // Crear directorios y mapear archivos según tipo
    $sitios = array();
    $carpetas = array();

    if ($proyecto == "I" || $proyecto == "J" || $proyecto == "M" || $proyecto == "N") {
        $sitios = array("1_diagnostico","2_cliente","3_personal","4_planeacion","6_informes","7_consolidado","8_otros","a_impuestos","b_eeff","c_nomina","d_rrhh","e_otros");
        $personalUsar = ($proyecto == "M" || $proyecto == "N") ? $personalPei : $personal;
        $carpetas = array(
            "1_diagnostico/registro.txt" => $diagnosticout,
            "2_cliente/registro.txt" => $clienteOut,
            "3_personal/registro.txt" => $personalUsar,
            "4_planeacion/registro.txt" => $planeacionOut,
            "6_informes/registro.txt" => $informesOut,
            "7_consolidado/registro.txt" => $consolidadoOut,
            "8_otros/registro.txt" => $otrosOut,
            "a_impuestos/registro.txt" => $impuestosOut,
            "b_eeff/registro.txt" => $eeffOut,
            "c_nomina/registro.txt" => $nominaOut,
            "d_rrhh/registro.txt" => $rrhhOut,
            "e_otros/registro.txt" => $otroscOut,
        );
    } elseif ($proyecto == "K" || $proyecto == "L") {
        $sitios = array("1_planeacion","2_operaciones","3_informes");
        $carpetas = array(
            "1_planeacion/registro.txt" => $planeacionOP,
            "2_operaciones/registro.txt" => $evaluacionOP,
            "3_informes/registro.txt" => $informesOut
        );
    }

    // Crear directorios
    foreach ($sitios as $dir) {
        $fullPath = $micarpeta . "/" . $dir;
        if (!file_exists($fullPath)) mkdir($fullPath, 0755, true);
    }

    // Convertir rutas relativas a absolutas
    $resultado = array();
    foreach ($carpetas as $ruta => $contenido) {
        $resultado[$micarpeta . "/" . $ruta] = $contenido;
    }

    return $resultado;
}
