Seguimiento detallado de todas las actualizaciones y mejoras del proyecto
cliente.php: KPIs cruzados (84 IPS, 69 con procesos, 44 con solicitudes, 39 con informes), gráficos Chart.js (Naturaleza Jurídica doughnut + Top 10 Departamentos bar), DataTable server-sideComercial/clientes_bd.php: Server-side real (antes client-side con 12,000 registros), filtro por departamento/NIT, KPIs contextuales, parámetro origen para navegación correctaComercial/consulta.php: Card centrado GPA, selectpicker estilizado, corregir_utf8() en departamentosComercial/consulta_nit.php: Card GPA con input numérico de 84pxLitigios/clientes.php: DataTables server-side POST, KPIs y botones de acciónComercial/clientes_black_list.php: Tema GPA navy/gold, KPIs por tipo persona, badges y accionesLitigios/crear_cliente.php: Formulario modernizado con tema GPAserversideClientesIPS.php, serversideClientesBD.php, serversideClientesSS.php (Litigios)vista_clientes_ss usaba INNER JOIN excluyendo 4,866 clientes sin departamento/municipio. Corregido a LEFT JOIN (77,337 clientes visibles)v_clientes_activos filtraba estado IN (1,2,4) excluyendo 57,594 clientes con estado NULL o 0. Removido filtro restrictivoutf8_encode() reemplazado por corregir_utf8() para departamento, municipio y nombre<script> literal en contenido Markdown no se escapaba dentro de <code>, causando SyntaxError: Unexpected token '<'vista_clientes_ss_full corregida con LEFT JOIN para reportes Excel/CSVaplicarFiltros() not defined — mover definición antes del HTML de filtrosdoc_juridico y estado_tutela ahora usan $where_base con filtros completoscreated_at TIMESTAMP NOT NULL sin default → DEFAULT CURRENT_TIMESTAMPlocale.class.php count(false) error en PHP 8.3maintainAspectRatiomodelos_ia.php)ia_agentes con chat modaltimeout_test)/api/embed)num_predict 100→300 + prompt en inglés/api/chat + thinking fallback + timeout 45slegalhealthmanagement.net → .com en todas las exportacionesia_validacion_modelos.php → redirige a modelos_ia.phpia_analisis_tutelas.php → redirige a dashboard_tutelas_clienteia_dashboard.php → redirige a modelos_ia.phpia_verificar_agentes.php → redirige a modelos_ia.phpllenar_satelites_ia: mapeo ENUMs + cron cada 2h + batch continuoid_demandante e id_cliente vinculadossubsanar_demandantes: Fase 4 Drive PDF + gemma3:27b-cloudj.nombre_juzgado no existechartDiario null + espaciado footermax_completion_tokens para modelos reasoning (GPT-5.4)index.php reescrito: KPIs dinámicos, charts, export, interpretación IAocr_radicados.php renovado: Pipeline 4 niveles, charts, export, interpretacióndashboard_pipeline.php: Radar chart satélites + export + interpretaciónfecha_consulta + stats synccrear_procesos_faltantes.py: Crea procesos para radicados sin BDsubsanar_demandantes.py: Corrige nombres PENDIENTE desde XLSXcarga_bd.php reescrito: Pipeline FTP→BD completo con todos los procesosllenar_satelites_ia.py: Llenado automático de tablas satélite con IA + fixes calidad BDsync_ftp_drive carpetas_count: DISTINCT /Registros/ only/JULIO — guard en sync_ftp_drive + filtro sync_tagsid_proceso ya vinculadototalExpaoa_to_sheet: concat([],[STRING]) → concat([[],[STRING]])gemma3:27b-cloud para extracción radicadosFTP_Tutelas/ usaban plantillas locales (head_ftp.php, navbar.php, footer_ftp.php) que no cargaban el mismo CSS/JS del sistema. Se eliminaron esas plantillas locales y todas las páginas ahora usan ../head.php, ../navbar.php, ../footer.php.head.php y footer.php usaban rutas relativas (css/custom.css, include('funciones.php')) que se resolvían incorrectamente desde /FTP_Tutelas/. Corregido con rutas absolutas (/css/custom.css) y __DIR__ para includes PHP. navbar.php convertido a href absolutos.footer.php hacía peticiones AJAX a fetch.php y guardar_encuesta_nps.php con URLs relativas que desde /FTP_Tutelas/ generaban cadenas de redirects. Corregido a /fetch.php y /guardar_encuesta_nps.php.ajax/ejecutar_fase.php: El script usaba proc_open() que está en la lista disable_functions de PHP 8.3-FPM. Reemplazado por exec().jQuery is not defined en 6 páginas: Los bloques <script> con jQuery aparecían antes del include("../footer.php") que carga jQuery. Corregido moviendo el include del footer antes de los scripts en 6 archivos.obtener_pendientes() en Python consultaba WHERE id_demandante IS NULL pero todos los 5,722 procesos SOS ya tienen demandante; (2) ejecutar_fase.php llamaba el script sin argumentos → modo test → 0 pendientes; (3) la interfaz PHP mostraba sin_demandante=0 como métrica principal. Corrección: obtener_pendientes(limite, tipo) usa queries correctas por tipo (sin_metadata=3,627, sin_actuaciones=5,611); ejecutar_fase.php pasa batch N --tipo <tipo> con whitelist de validación; subsanacion_rj.php reescrito con métricas reales, barras de progreso, log de sync y UI mejorada.generateCicloIA() en VisorIA.php trataba silenciosamente cualquier fallo de la IA (error de proveedor o JSON malformado) como pipeline vacío [], guardaba ese resultado vacío en cache, y devolvía éxito al frontend. El frontend re-renderizaba la sección mostrando el botón "Generar" de nuevo, sin ningún mensaje de error. Correcciones: (1) Si la IA responde con exito=false, se lanza excepción con el mensaje real del proveedor. (2) Si el pipeline parseado está vacío, se lanza excepción y se loguea la respuesta cruda en el error log para diagnóstico. (3) saveCicloCache() solo se llama cuando el pipeline tiene entradas — nunca sobreescribe con arrays vacíos. (4) La condición de archivado en historial ahora decodifica el JSON antes de verificar si hay pasos, evitando que el string '[]' se archive como versión válida. (5) En el frontend, tras una generación exitosa, se llama switchCicloSection('pipeline') en lugar de renderCicloSection() para navegar automáticamente al sub-tab con los resultados.beforeprint no podía funcionar porque los inline styles style.display='none' del fix de sub-tabs tienen prioridad absoluta sobre cualquier CSS !important, incluyendo @media print. Solución: exportCicloPDF() ahora replica el patrón de exportCicloMD() — lee cicloData/cicloIaData directamente, construye un documento HTML limpio y autocontenido (sin Bootstrap, sin FontAwesome, sin dependencias externas) con las 7 secciones, lo abre en una nueva ventana y dispara window.print(). El botón "Imprimir" también usa la misma función en lugar de window.print() directo.display:none (añadidos para corregir el apilamiento de sub-tabs) impedían que el CSS @media print { display: block !important } mostrase las secciones. Solución: listeners window.beforeprint/afterprint que muestran todas las secciones con contenido renderizado justo antes de imprimir y restauran el estado activo al terminar. El botón PDF simplifica a un simple window.print() delegando la preparación al listener.classList.remove('active') no era suficiente ante conflictos CSS (Bootstrap 3 u otras reglas). Solución: switchCicloSection ahora controla display directamente vía style.display = 'none'/'block' en todas las secciones .ciclo-section, independientemente del CSS de terceros. También se aplica el mismo tratamiento en la inicialización de loadCicloDatos.get_ciclo_historial: La acción estaba declarada en el mensaje de error como válida pero nunca implementada en el switch de visor_api.php. Se implementó el case usando un nuevo método público getCicloHistorial() en VisorIA.php que usa pdoWriter para consultar visor_ia_ciclo_historial. Soporta dos modos: listar historial por tabla (?table=X) y cargar versión específica (?id=N).legacy/IA/VisorIA.php): getTables() ejecuta COUNT(*) real como fallback cuando TABLE_ROWS de information_schema es null o 0 (estimación desactualizada de MariaDB).
2. Frontend (legacy/visor_ia.php): Condición JS table.TABLE_ROWS ? ... : '?' trataba 0 como falsy, mostrando ? para tablas vacías. Corregida a comparación explícita (!== null && !== undefined && !== '') para mostrar 0 correctamente.
---
aServerSide: true que causaba conflicto con datos localescorregir_utf8() a /Control/funciones.php para corregir caracteres doblemente codificados (Ã" → Ó, etc.)exportpdf que causaba error exportpdf-no-token-urlfiltrarPorLetra(letra) en JS: Filtrado dinámico de contratos por letra inicialdocs/Control/REDISENO_MODULO_CONTROL_TIPOS_2026-03-10.mdnew PDO() sin try/catch en conexion.php lanzaba Fatal Error ante cualquier fallo de conexión. Corregido con try/catch + guards isset($con) / isset($bdd).eliminar_clase_proceso.php (singular) en lugar de eliminar_clases_procesos.php (plural). El 404 caía en index.php → redirect relativo → loop infinito en Caddy.eliminar_clases_procesos.php no verificaba sesión; cualquier usuario podía eliminar registros por URL directa.AND en lugar de || permitía bypass de autenticación con sesión inválida.exit tras redirect de error; siempre ejecutaba redirect de éxito.login.php sin ../ redirigía a ruta inexistente.require_once sin try/catch; validación de descripción usaba límite incorrecto (255 en vez de 500).clases_procesos.php — gradiente header, form-card, botones personalizados, contador de caracteres, SweetAlert2, animación fadeIn.mysqli_prepare + bind_param), elimina SQL injection.funciones.php movido al bloque PHP inicial; eliminado ob_start/ob_end_flush innecesario.clase_procesos.descripcion ampliado de varchar(255) a varchar(500)./var/log/php8.3-gpa-error.log para capturar errores PHP que antes se silenciaban.docs/Correcciones/CORRECCION_CLASES_PROCESOS_2026-03-04.mdhtmlspecialchars() en todos los datosset_error_handler() silenciosodocs/Editar_Proceso_Redisenio/REDISENO_GESTIONAR_SOLICITUD_USUARIO_2026-02-26.mdJSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE en json_encode()json_last_error_msg()htmlspecialchars() con ENT_QUOTESstrip_tags() aplicado antes de htmlspecialchars()set_error_handler() para loguear sin mostrar en pantalladocs/Editar_Proceso_Redisenio/CORRECCION_GESTIONAR_SOLICITUDES_2026-02-26.mdget_row_safe() y manejo de errores para evitar fatal error cuando la tabla historial_autorizaciones no existeset_error_handler() y set_exception_handler() para silenciar errores y loguearlos sin mostrarlos en pantallahtmlspecialchars() a todos los datos mostrados en DataTabledocs/Editar_Proceso_Redisenio/REDISENO_SOLICITUDES_2026-02-26.mdeditar_proceso.phpdocs/Editar_Proceso_Redisenio/REDISENO_NUEVO_PROCESO_2026-02-24.md{$id}, {$nombre_apoderado}, etc.)background: #ffffff) para que el logo sea visible$link_proxima_audiencia con botón para unirse a la audiencialink_proxima_audiencia: En tabla procesos y formulario de edición para almacenar URL de reunión virtualcorregir_utf8(): Aplicada a nombres de demandante, demandado, apoderado y suplente para manejo correcto de caracteres especiales (María José, etc.)verificar_rate_limit_email() y registrar_envio_email() para prevenir bloqueos SMTP de Hostingersuplente en SELECT: Incluido abogado suplente en la query de edición de procesolegacy/Litigios/funciones.php - Template de email con sintaxis de string PHP y fondo blanco en headerlegacy/Litigios/ajax/editar_proceso.php - Envío de $link_proxima_audiencia a función de emaillegacy/footer.php - Aplicado corregir_utf8() a userName y userFullNamedocs/CORRECCION_EMAIL_AUDIENCIA_VARIABLES_2026-02-23.mdconsultar_proceso_rj_tiempo_real.php consulta Rama Judicial v2 cuando no hay datos localessujetos_procesales: Almacena demandante/demandado desde API v2 en proceso_rj_metadataconsultarRamaJudicialTiempoReal(): JavaScript para consultar API en tiempo realguardarDatosRamaJudicial(): Permite guardar datos de API en BD con un clicfecha_ultima_actuacion: Script Python ahora usa proc.get("fechaUltimaActuacion") directamente (antes buscaba en actuaciones[] que no existe)sujetos_procesales: Script Python ahora guarda correctamente el campo en proceso_rj_metadataobtener_actuaciones_rj.php ahora calcula la mejor fecha disponible de múltiples fuentesconsultarRamaJudicialAPIv2() en lugar de abrir URL externa0 */4 * * * a 30 1,5,9,13,17,21 * * * (horario desfasado para evitar bloqueos API)sujetos_procesales y corregido fecha_ultima_actuacion en _guardar_metadata_proceso()docs/Rama_Judicial/MEJORAS_BOTON_RJ_API_TIEMPO_REAL_2026-02-20.mddocs/INDICE_MAESTRO_DOCUMENTACION.md con sección Rama Judicial<strong>asteriscos</strong> se convierte correctamente a <strong>backticks\ se convierte a <code>docs/CHANGELOG.mdincludes/changelog_viewer.php - Soporte para tablas Markdown, negrita, códigopages/changelog_content.php - Ruta corregida para docs/CHANGELOG.mdlegacy/Litigios/tutelas_serverside.php - Mapeo de columnas 3 y 4 corregidolegacy/Litigios/tutelas.php - Funciones Rama Judicial en scope global + 2 modales HTML.user.ini - Comentar mbstring.* y auto_detect_line_endings (deprecated)php.ini - Comentar mbstring.* y auto_detect_line_endings (deprecated)docs/CORRECCION_WARNINGS_PHP_8_3_2026-02-16.mddocs/Accion_Tutela/CORRECCION_ERROR_DATATABLES_TUTELAS_2026-02-16.mddocs/Accion_Tutela/MODAL_RAMA_JUDICIAL_TUTELAS_COMPLETO_2026-02-16.mdproceso_sync_log: Registro histórico de todos los intentos de sincronización con backoff exponencial (1d→7d→30d→90d)_registrar_sync_log(): Registra cada intento (exitoso, no_encontrado, error_api) con cálculo de próxima consulta_crear_comentario_actuacion(): Crea comentarios automáticos con user_id=0 para actuaciones nuevasUNION ALL con 3 niveles (activos con historial → activos nuevos → inactivos)id_comment → comment_id (SELECT duplicados)comment_type del INSERT en tabla commentssincronizar_rama_judicial.py - Query priorizada, sync_log, comentarios automáticos, fix columnas/opt/sincronizar_rama_judicial.sh - Límite 25→50, comentario 6h→4hdocs/Rama_Judicial/OPTIMIZACION_CRON_JOB_SYNC_LOG_2026-02-16.mdlegacy/ajax/sincronizar_proceso_rj.php - Traducción de errores técnicos a mensajes en español/opt/FTP_TUTELAS/docs/rama_judicial/rj_api_client.py - Handler 403 con retry + handler genérico 4xx/opt/FTP_TUTELAS/scripts/sincronizar_un_proceso.py - Catch RJApiError específico/opt/FTP_TUTELAS/scripts/sincronizar_rama_judicial.py - Catch RJApiError en batch con estadísticasdocs/Rama_Judicial/MEJORA_MANEJO_ERRORES_API_2026-02-16.mdid_proceso_rj cambiado de INT a BIGINT en tablas proceso_actuaciones y proceso_rj_metadata/opt/sincronizar_rama_judicial.sh mejorado con timeout de 2 horas y auto-kill de procesos zombielegacy/ajax/obtener_actuaciones_rj.php - Conversión UTC -> America/Bogota, formato 12h/opt/FTP_TUTELAS/scripts/sincronizar_un_proceso.py - Catch específico para error MySQL 1264/opt/sincronizar_rama_judicial.sh - Timeout global + auto-kill procesos anterioresdocs/Rama_Judicial/CORRECCION_ERROR_1264_BIGINT_2026-02-16.mdlegacy/Litigios/login.php - Corregida lógica de redirecciónlegacy/Litigios/exportar_tutelas_excel.php - Nueva exportación Excellegacy/Litigios/dashboard_tutelas.php - Gráficos de evolución diaria y distribución de riesgolegacy/navbar.php - Contador dinámico de tutelas en menúlegacy/head.php - SheetJS local con fallback a CDNincludes/header.php - CSP actualizada con cdn.sheetjs.comdocs/CORRECCION_FALLBACK_SHEETJS_2026-02-12.mdlegacy/funciones.php - mb_strtoupper_corregido(), nuevos patrones UTF-8legacy/Litigios/ver_tutela.php - Eliminada función duplicadalegacy/clientes.php - Eliminado utf8_encode() obsoletolegacy/Litigios/editar_proceso.php - Mejor manejo de erroreslegacy/Litigios/procesos_ss.php - Validación defensiva juzgado, consulta optimizadalegacy/pdf/documentos/ver_informe_preliminar.php - Múltiples correcciones UTF-8 y división por cerolegacy/vendor/html2pdf/locale.class.php - Fix TypeError count()legacy/gestion_talento_humano/*.php - Corregidas advertencias $_GETdocs/Gestion_TI/ - Documentos de contextodocs/Certificacion_Contractual/ - Documentos DOCXdocs/Rama_Judicial/MULTIPLES_GRUPOS_ACTUACIONES_2026-02-10.mdlegacy/ajax/obtener_actuaciones_rj.php - Soporte múltiples idConexion/opt/FTP_TUTELAS/scripts/sincronizar_rama_judicial.py - Sincronización de documentos.container estándar (1170px) para aprovechar espacio en monitores grandes<head>proceso_actuaciones - Actuaciones sincronizadas desde API RJproceso_documentos - Metadatos de documentosurl_proceso - URL oficial de Rama Judicialestado_actual_proceso - Resumen de última actuacióndetalle_actuaciones - Tabla HTML cronológicaobservaciones - Información adicional de RJfecha_ultima_revision - Control de actualizaciónsincronizar_un_proceso.py ejecutado desde GPA/etc/caddy/Caddyfile)legalhealthmanagement.com (→ App Legacy)new.legalhealthmanagement.com (→ App Nueva)monitor.legalhealthmanagement.com (→ Portal Landing)webhook/github.php)@, www, new, monitordocs/CONFIGURACION_DOMINIO_COM_2025-01-23.md - Documentación completa del dominio .com| Dominio | Aplicación | Root | Log |
|---|---|---|---|
| legalhealthmanagement.net | Legacy | /var/www/gpa/legacy | legalhealthmanagement.log |
| legalhealthmanagement.com | Legacy | /var/www/gpa/legacy | legalhealthmanagement-com.log |
| new.legalhealthmanagement.net | Nueva App | /var/www/gpa/legalhealthmanagement | new-legalhealthmanagement.log |
| new.legalhealthmanagement.com | Nueva App | /var/www/gpa/legalhealthmanagement | new-legalhealthmanagement-com.log |
| monitor.legalhealthmanagement.net | Portal | /var/www/gpa | monitor-legalhealthmanagement.log |
| monitor.legalhealthmanagement.com | Portal | /var/www/gpa | monitor-legalhealthmanagement-com.log |
datetime-local para selección visual de fecha y horalegacy/cambio_masivo_fechas.phpdatetime-local para fecha/horalegacy/ajax/procesar_cambio_masivo_fechas.phpcheckdate()legacy/navbar.phplegacy/menu_gestion_requerimientos_vigencia.php/usr/bin/node/root/docs/14-scripts-gpalegacy/cambio_masivo_fechas.php - Interfaz de cambio masivolegacy/ajax/procesar_cambio_masivo_fechas.php - API de procesamientodocs/Correcciones/CONFIGURACION_WEBHOOK_AUTODEPLOY_2025-01-17.md - Documentación del webhook/root/docs/14-scripts-gpa/ con comandos SystemDauditoria_cambios_solicitudes para registro de cambioslegacy/gestionar_solicitudes.phpmodalCambiarFecha(), cargarAuditoria(), procesarCambioFecha()legacy/ajax/cambiar_fecha_creacion_solicitud.php - API para cambiar fecha con auditoríalegacy/ajax/obtener_auditoria_solicitud.php - API para consultar historial de cambiosdocs/Correcciones/SISTEMA_AUDITORIA_CAMBIO_FECHA_SOLICITUD_2025-12-19.md - Documentación completacorregir_utf8() a todos los textos en notificaciones (títulos, contenido, nombres de usuarios)fetch.php, navbar.php y footer.php en Litigios, Comercial, Control y legacycorregir_utf8() en todos los puntos de salida de datoslegacy/funciones.phpdocs/Mejoras/MEJORAS_NOTIFICACIONES_2025-12-19.mdlegacy/litigios.phpconceptos_firma.php pero mejoradolegacy/modal/editar_usuarios.phpselectpicker show-tick y atributos data-show-subtext="true" data-live-search="true"consulta.php)legacy/consulta.phpacceso_cliente en la tabla users no podían ver ni gestionar esos clientes en la página de consultaacceso_cliente además de los asignados directamente en campos de la tabla clientesOR id_cliente IN (SELECT acceso_cliente FROM users WHERE user_id = $user_id AND acceso_cliente IS NOT NULL)corregir_utf8() a nombres de clientes para solucionar problemas de codificaciónlegacy/modal/editar_usuarios.php, legacy/usuarios.php, legacy/consulta.phpcorregir_utf8() a nombres y apellidos de apoderadoslegacy/procesos.php (líneas 311-314)legacy/diagnostico_litigios.phpcdn_config.phpLitigios/procesos_ss_litigios.phpdocs/CAMBIOS_SISTEMA_PERMISOS_USUARIOS_2025-10-25.md con detalle técnico completo de todas las versioneslegacy/litigios.phperror_litigios.log?debug=1)legacy/menu.php para que "Gestión de Litigios" apunte al nuevo sistemaprocesos.php?filtro= → litigios.php?filtro=docs/CAMBIOS_SISTEMA_PERMISOS_USUARIOS_2025-10-25.md con detalle técnico completo del problema, solución implementada, impacto y pruebas recomendadaslegacy/importar_tutelas.phpaccion=importar.accion=importar antes de hacer form.submit(), garantizando que el backend ejecute la rama de importación real.docs/CORRECCION_IMPORTAR_TUTELAS_2025-11-17.md con el detalle técnico del problema, causa raíz, solución y pasos para probar el flujo completo.consulta.marduk.pro y analisis.marduk.pro?embedded=true para modo de embeddingCONFIGURACION_EMBEDDING_AGENTES_IA_2025-10-26.mdagenteshttps://consulta.marduk.pro/embedded=true → https://consulta.marduk.pro/?embedded=truehttps://analisis.marduk.pro/embedded=true → https://analisis.marduk.pro/?embedded=trueframe-src 'self' https: → frame-src *; frame-ancestors *header_down -X-Frame-Options para eliminar headers conflictivos de Next.jsX-Frame-Options: ALLOWALLlegacy/IA/ a legacy/ia_validacion_modelos.php → legacy/ia_validacion_modelos.php
* ia_analisis_tutelas.php → legacy/ia_analisis_tutelas.php
* ia_dashboard.php → legacy/ia_dashboard.php
* verificar_agentes.php → legacy/ia_verificar_agentes.php
* test_agentes.php → legacy/ia_test_agentes.php
base.php del servidorERR_TOO_MANY_REDIRECTS
* Sin errores de menu_slider.php
* Rutas más simples (sin ../)
* Navbar y footer se muestran correctamente
* Mejor rendimiento
* Codificación UTF-8 correcta (sin caracteres extraños)
include("../head.php") → include("head.php")header("location: ../login.php") → header("location: login.php")require_once('IAProvider.php') → require_once('IA/IAProvider.php')fetch('validar_proveedor.php') → fetch('IA/validar_proveedor.php')legacy/navbar.php - Actualizadas URLs del módulo de IAIA/ia_*.php → ia_*.phpdocs/MIGRACION_IA_A_RAIZ_2025-10-24.md - Guía completa de migracióndocs/EXPLICACION_ERROR_MENU_SLIDER_2025-10-24.md - Explicación del problema de redireccioneslegacy/IA/MIGRACION_IA_A_RAIZ_2025-10-24.md - Copia en carpeta IAlegacy/IA/EXPLICACION_ERROR_MENU_SLIDER_2025-10-24.md - Copia en carpeta IAlegacy/IA/base_ia.php - Ya no es necesariolegacy/IA/ia_validacion_modelos.php - Movido a legacy/legacy/IA/ia_analisis_tutelas.php - Movido a legacy/legacy/IA/ia_dashboard.php - Movido a legacy/legacy/legacy/IA/ia_validacion_modelos.php - Actualizado a estructura de base.php
* legacy/IA/ia_analisis_tutelas.php - Actualizado a estructura de base.php
* legacy/IA/ia_dashboard.php - Actualizado a estructura de base.php
include("../Control/head.php") por include("../head.php")
* Reemplazado include("../Control/footer.php") por include("../footer.php")
* Eliminado require_once("../config/cdn_config.php") duplicado (ya está en head.php)
* Cambiado contenedor de <div class="container"> a <div class="container-xl">
* Agregada estructura de panel: <div class="panel panel-default">
* Agregado <div class="panel-heading"> con botones de acción
* Agregado <div class="panel-body"> para contenido
* Agregado espaciado <br><br><br> antes del footer
* Eliminados scripts duplicados de SweetAlert2 y Chart.js
legacy/IA/base_ia.php - Plantilla simplificada para nuevas páginas del módulo IA (47 líneas)docs/CORRECCION_NAVBAR_FOOTER_IA_2025-10-24.md - Documentación completa de la correccióndocs/GUIA_PLANTILLA_BASE_DESARROLLO_2025-10-24.md - Guía completa de desarrollodocs/ARCHIVOS_SUBIR_CORRECCION_NAVBAR_IA_2025-10-24.md - Instrucciones de desplieguedocs/CHANGELOG.md - Nueva versión 0.3.7legacy/IA/README.md - Versión 1.0.1 con historiallegacy/IA/IAProvider.phpmax_completion_tokens en lugar de max_tokens para modelos de razonamientotemperature en modelos GPT-5 (no soportado)legacy/IA/IAProvider.php (líneas 222-280)docs/Tablas-Vistas-BD/UPDATE_GPT5_CONFIG.sqlmax_completion_tokens en lugar de max_tokenstemperaturedocs/CORRECCION_GPT5_PARAMETROS_2025-10-23.mdlegacy/IA/IAProvider.phpprivate a public en método obtenerModelo() (línea 307)
legacy/IA/analizar_tutelas.php - Función obtenerBarreras() (líneas 322-334)
- Corregido ORDER BY: total_casos → cantidad
* legacy/IA/analizar_tutelas.php - Función construirPrompt() (líneas 172-190)
- Corregido nombre de columna: tipo_barrera → barrera
- Corregido nombre de columna: total_casos → cantidad
- Corregido nombre de columna: departamento → departamento_demandante
- Agregado operador null coalescing ?? para evitar errores de índice indefinido
legacy/IA/IAProvider.phplimpiarUTF8() para sanitizar strings (líneas 263-276)
* Aplicada limpieza en enviarPromptDeepSeek() antes de json_encode
* Aplicada limpieza en enviarPromptOpenAI() antes de json_encode
* Agregado flag JSON_UNESCAPED_UNICODE en todas las llamadas a json_encode
ia_registro_uso en legacy/IA/IAProvider.phpregistrarUso() (líneas 396-432)
- Corregido nombre de columna: tipo_operacion → tipo_peticion
- Corregido nombre de columna: tokens_usados → tokens_totales
- Corregido tipo de dato: exitoso INT → estado VARCHAR
- Corregido valor: $exitoso_int (0/1) → $estado ('exitoso'/'fallido')
- Corregido binding: "iisii" → "iisis"
- Agregado try-catch para manejo robusto de errores
- Agregadas validaciones de prepared statements
* Función obtenerEstadisticas() (líneas 433-451)
- Corregido: exitoso = 1 → estado = 'exitoso'
- Corregido: tokens_usados → tokens_totales (2 ocurrencias)
legacy/IA/test_check_api_key.php - Verificación de configuración de claves APIlegacy/IA/test_curl_debug.php - Prueba directa de cURL a DeepSeek APIlegacy/IA/test_api_direct.php - Prueba de análisis sin AJAXdocs/CORRECCION_SISTEMA_IA_TUTELAS_2025-10-23.md - Resumen ejecutivo de correccionesdocs/CAMBIOS_TECNICOS_IA_TUTELAS_2025-10-23.md - Detalles técnicos de cambiosdocs/LECCIONES_APRENDIDAS_IA_2025-10-23.md - Lecciones aprendidas del procesolegacy/IA/RESUMEN_IMPLEMENTACION.md con sección de correccioneslegacy/menu_gestion_requerimientos_vigencia.phpformulario_requerimientos.php?id=X
* Anteriormente redirigía a expediente_digitalizado_solicitudes.php?id_empleador=X&id=Y
* Agregado atributo target="_blank" para abrir en nueva pestaña
* Mejora la experiencia de usuario con la nueva versión del formulario de requerimientos
legacy/menu_gestion_requerimientos_vigencia.phpcomentar_solicitud(), informe_gestion() y mensaje() fuera del scope de $(document).ready()
* Las funciones ahora son globales y accesibles desde atributos onclick en el HTML
* Reorganizado código JavaScript para mejor mantenibilidad
legacy/expediente_digitalizado_solicitudes.phpis_dir() antes de scandir() para verificar existencia del directorio
* Uso de operador @ para suprimir warnings de permisos
* Validación de resultado de scandir() antes de procesar archivos
* Inicialización de $archivos como array vacío por defecto
* Agregado mensaje informativo cuando no hay archivos en el expediente
* Corregido error "count(): Parameter must be an array or an object that implements Countable"
legacy/editar_solicitud_usuario.phpisset() para parámetro $anio (línea 22)
* Agregado valor por defecto date('Y') cuando no se proporciona
legacy/gestionar_solicitud_usuario.phpisset() y empty() para campo url_proceso (línea 76)
from_gestionlegacy/menu_gestion_requerimientos_vigencia.php
- Agregado parámetro from_gestion=1 a enlaces de "Gestionar" y "Editar"
* Modificado legacy/editar_solicitud_usuario.php
- Agregada detección de origen con parámetro from_gestion
- Botón "Regresar" redirige a menu_gestion_requerimientos_vigencia.php cuando viene de gestión
- Actualizado formulario para pasar parámetro from_gestion al script AJAX
* Modificado legacy/gestionar_solicitud_usuario.php
- Agregada detección de origen con parámetro from_gestion
- Botón "Regresar" redirige a menu_gestion_requerimientos_vigencia.php cuando viene de gestión
- Actualizado formulario para pasar parámetro from_gestion al script AJAX
* Modificado legacy/ajax/editar_solicitud_usuario.php
- Agregada lógica de redirección condicional según origen
- Redirige a menu_gestion_requerimientos_vigencia.php cuando from_gestion=1
- Mantiene redirección original a solicitudes.php en otros casos
* Modificado legacy/ajax/editar_gestion_solicitud_usuario.php
- Agregada lógica de redirección condicional según origen
- Redirige a menu_gestion_requerimientos_vigencia.php cuando from_gestion=1
- Mantiene redirección original a gestionar_solicitudes.php en otros casos
menu_gestion_requerimientos_vigencia.php) ahora funciona como hub centrallegacy/pdf/documentos/ver_informe_gestion_requerimiento.phpob_start() / ob_end_clean())
* Deshabilitados errores de PHP antes de generar PDF
* Eliminadas salidas con echo antes de generar PDF
* Agregado manejo de errores con error_log() y redirección
* Limpieza de etiquetas específicas de HTML2PDF (<page>, <page_footer>, etc.)
* Creado backup: ver_informe_gestion_requerimiento_OLD_HTML2PDF.php
* Implementada clase personalizada MYPDF con header y footer institucionales
* Configurados márgenes apropiados (top: 45mm, bottom: 30mm) para header/footer
legacy/pdf/documentos/res/ver_informe_gestion_requerimiento_html.php.data-table con bordes y colores corporativos
* Campos de datos con .label-field (fondo gris) y .value-field (fondo blanco)
* Encabezados de sección con .section-title (fondo azul oscuro #2c3e50)
* Valores importantes destacados con .value-important (negrita)
* Indicadores de estado con colores semánticos (verde, naranja, rojo, azul)
* Mejorada presentación de días de vencimiento con colores condicionales
* Simplificada sección de firma del gestor
* Eliminado uso de utf8_encode() (deprecated en PHP 8.2)
legacy/Litigios/pdf/documentos/ver_informe_litigio.php
* Documentado en docs/FIX_TCPDF_ERROR_INFORME_LITIGIO.md
* Documentado en docs/FIX_TCPDF_ERROR_INFORME_GESTION_REQUERIMIENTO.md
* Documentado en docs/ACTUALIZACION_TCPDF_COMPLETADA.md
get_row() en legacy/funciones.phplegacy/solicitudes.phpis_dir() antes de scandir()
* Uso de operador @ para suprimir warnings de permisos
* Validación de resultado de scandir() antes de procesar archivos
legacy/Comercial/config/conexion.phpmysqli_error($con) por mysqli_connect_error() para manejo correcto de errores
* Actualizada conexión PDO para usar constantes en lugar de valores hardcodeados
legacy/Comercial/config/db.phpDB_HOST de 'localhost' a '190.8.178.74' (servidor remoto)
* Agregada verificación if (!defined()) para evitar redefinición de constantes
legacy/Comercial/menu_consulta.php: Validación de $_GET['filtro']
* legacy/Comercial/clientes_ss.php: Validación de $_GET['filtro'] y $_GET['id']
* legacy/Comercial/clientes_bd.php: Validación de $_GET['filtro'] y $_GET['id']
* legacy/Comercial/menu_consulta_old.php: Validación de $_GET['filtro']
* legacy/Comercial/editar_cliente.php: Validación de $_GET['origen'] y $row['url_proceso']
legacy/menu_requerimientos_vigencia.php: Validación de $_GET['filtro'] y $_GET['anio']
* legacy/solicitudes.php: Validación de $_GET['filtro'] y $_GET['anio']
* legacy/meses_vigencia_dashboard.php: Validación de $_GET['filtro'] y $_GET['anio']
* legacy/evaluar_solicitud_usuario.php: Validación de $_GET['id'] y $_GET['anio']
* legacy/expediente_digitalizado_solicitudes.php: Validación de $_GET['id_empleador'], $_GET['anio'] y $_GET['id']
* legacy/gestionar_solicitud_usuario.php: Validación de $_GET['id'], $_GET['anio'] y $_GET['mes']
include('config/db.php') y include('config/conexion.php')
* Agregados comentarios explicativos sobre la inclusión de constantes
encuesta_nps con campos completos de auditoríalegacy/sql/crear_tabla_encuesta_nps.sqlvista_analisis_nps y vista_nps_score
* Procedimientos almacenados: sp_debe_mostrar_encuesta_nps y sp_guardar_respuesta_nps
legacy/guardar_encuesta_nps.phplegacy/verificar_encuesta_nps.phpdebe_mostrar_encuesta_nps(): Lógica de cada 3 meses
* obtener_estadisticas_nps_usuario(): Estadísticas por usuario
* obtener_nps_score(): Cálculo de NPS Score general
legacy/footer.phpdocs/implementacion_encuesta_nps.mdlegacy/resultados_nps.phplegacy/exportar_nps.phpdocs/implementacion_mensaje_bienvenida.mdlegacy/js/ckeditor_custom_config.jsdocs/suprimir_advertencias_ckeditor.mdlegacy/test_ckeditor_version.phplegacy/consulta.php línea 77isset() antes de acceder a $_GET['alert']null antes de usar la variable en condicionaleslegacy/informes.php línea 147isset() antes de acceder a $_GET['alert']if ($alert !== null) para evitar procesamiento cuando no hay alertalegacy/menu.php línea 19$filtro antes de validarlaisset() para $_GET['filtro']legacy/informes.php línea 445isset() para los campos: url_informe_ejecutivo, url_informe, archivo_informe, fecha_fin y created_atlegacy/informes.phpstrftime() (deprecado) por función personalizada formatear_fecha_es()legacy/funciones.phpstrftime() (deprecado en PHP 8.1) por implementación nativaobtenerMesesEspanol() para traducción consistenteformatearFecha() para usar array de meses en españolsetlocale() que causaba problemas en diferentes servidoreslegacy/classes/Login.php línea 131isset() antes de acceder a $_SESSION['user_id'] en función doLogout()legacy/footer.php línea 39config/conexion.php define $con (mysqli) y $bdd (PDO), no $conexionfooter.php para usar $con en lugar de $conexionresultados_nps.php para usar $conguardar_encuesta_nps.php para usar $conexportar_nps.php para usar $conlegacy/guardar_encuesta_nps.phpconfig/conexion.php usa die() que imprime texto antes del JSONconfig/db.phplegacy/test_nps_connection.php para verificar tablalegacy/test_guardar_nps.php para simular guardadolegacy/footer.phpselectedScore movida fuera del scope de didOpen para acceso globalpreConfirm para usar directamente la variabledataset.selectedScorelegacy/exportar_nps.phpResultados_NPS_YYYY-MM-DD_HH-MM-SS.xlslegacy/js/ckeditor_custom_config.js con múltiples métodos de supresión:versionCheck: false en CKEditor
* Interceptación del sistema de notificaciones de CKEditor
* Observador de mutaciones para remover advertencias dinámicas
legacy/footer.php para cargar la configuración personalizadadocs/estructura_bd_solicitudes.mdlegacy/menu_gestion_requerimientos_vigencia.phplegacy/space_usuarios.php con sistema de embebido mediante iframelegacy/space_usuarios.php con diseño responsive que se adapta a diferentes tamaños de pantallalegacy/space_usuarios.php que permite cargar dinámicamente el contenido de formulario_usuarios.php manteniendo el navbar y footer consistentesadjustIframeHeight(), ensureMobileMenuCollapsed(), optimizeNavbarForDesktop() y setupMobileNavbar()docs/estructura_bd_*.sqldocs/estructura_bd_documentacion.mddocs/README_estructura_bd.mdlegacy/config/cdn_config.php.htaccess en el directorio legacy para mejorar la compatibilidadlegacy/consulta.phplegacy/head.php con sistema centralizado de CDNslegacy/footer.php con sistema centralizado de CDNs.htaccess para asegurar la correcta ejecución de archivos PHPdocs/propuesta-mejora-hooks-globales.mdhooks/pre-push-mejorado.githooksrc para el proyecto GPAhooks/install-global-hooks.sh.githooksrcdocs/hooks-globales.md--no-verify en diferentes contextosdocs/git-hooks-guide.mdhooks/pre-push: Implementación del hook de pre-pushhooks/install-hooks.bat: Script de instalación para Windowshooks/install-hooks.sh: Script de instalación para macOS/Linuxcommit-simple.ps1 para Windows (PowerShell)commit-simple.sh para macOS/Linux (Bash)--no-verify en comandos Git.user.ini en el directorio legacy para configurar PHP a nivel de directoriolegacy/login.php que se descargaba en lugar de ejecutarse en el servidor.htaccess para asegurar la correcta ejecución de archivos PHPlegacy/index.php hacia menu_slider.php.htaccess en el directorio legacy para garantizar la ejecución correcta de PHP.htaccess contra acceso directolegacy/login.php se descargaba como archivo en lugar de ejecutarse. Este problema ocurría porque el servidor no estaba configurado correctamente para procesar archivos PHP en el directorio legacy..htaccess para asegurar que los archivos PHP se ejecuten correctamente..user.ini para configurar PHP a nivel de directorio, desactivando la visualización de errores en producción..htaccess en la raíz del proyecto y en el directorio legalhealthmanagement para garantizar la compatibilidad y seguridad.