Files
whatsapp/modules/soporte/docs/operacion/20-configuraciones-criticas.md
T
Lizandro GuarnizoandClaude Opus 5 018fb13332 Módulo Soporte: visor de documentación con renderizado Markdown y buscador
Nuevo módulo `soporte` con la documentación del proyecto en cuatro secciones:
manual de usuario (visible para todos), y documentación técnica, arquitectura
y operación (solo administradores).

- Markdown.php: renderizador propio del subconjunto que usa la documentación
  (encabezados, listas anidadas, tablas, código, citas). Escapa todo el texto
  antes de aplicar formato, así que los .md no pueden inyectar HTML. Se
  prefirió un archivo auditable a incorporar una dependencia externa.
- DocIndex.php: descubre los .md, arma el árbol, resuelve acceso por sección
  y construye el índice del buscador.
- Generadores.php: expande marcadores {{modulos}}, {{endpoints}}, {{tablas}},
  {{roles}} y {{servicios}} leyendo el código y la base en cada carga, para
  que los inventarios no puedan quedar desactualizados.

Se registra en SYSTEM_MODULES y se concede a los 12 roles con permission=read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 10:07:06 -05:00

3.6 KiB

Configuraciones críticas

Dónde vive cada cosa que se configura. La pregunta que más tiempo hace perder es «¿esto dónde se cambia?», sobre todo porque no todo está en la base de datos.

Las tres tablas de configuración

Tabla Contenido Se edita desde
system_config Credenciales de WhatsApp, webhook, mensaje de términos Base de datos
lab_config Datos de la empresa, encabezados de documentos, clave y consumo de LIA Configuración del laboratorio
turnero_* Lugares, prioridades, dispositivos, playlist de TV Configuración del turnero

Lo que NO está en la base de datos

Esto es lo que más confunde:

Configuración Dónde vive de verdad
URL del botón de consentimiento Plantilla en el WhatsApp Manager de Meta
Texto y formato de las plantillas Meta (message_templates es solo una copia)
Dominio del sistema Se deduce del HTTP_HOST de cada petición

Cambiar el código no cambia la URL que reciben los pacientes en el botón de una plantilla. Eso se edita en Meta y requiere reaprobación.

Datos de la empresa

En lab_config, salen impresos en el encabezado de todos los documentos:

Clave Ejemplo
empresa_nombre XIMENA CAICEDO G. E.U
empresa_subtitulo Laboratorio Hematológico
empresa_direccion Calle 21 #0A-26, Barrio Blanco
empresa_ciudad Cúcuta, Norte de Santander
empresa_telefono +57 305 337 0116
empresa_email servicioalcliente@laboratorioximenacaicedo.com
doc_logo_base64 Logo embebido
doc_color Color de encabezados

Se editan desde Configuración del laboratorio, sin tocar código.

Dominio del sistema

APP_URL y BASE_URL se calculan en cada petición a partir del host (config/config.php):

$__host = $_SERVER['HTTP_HOST'] ?? 'localhost';
define('APP_URL', $__proto . '://' . $__host);

Detecta HTTPS detrás de proxy reverso mediante X-Forwarded-Proto.

Consecuencia: si alguien entra por una IP o un dominio alternativo, los enlaces que se generen en esa sesión llevarán esa dirección — y quedan guardados así en el mensaje que recibe el paciente. Si eso importa, conviene fijar APP_URL explícitamente.

Turnero

Qué Dónde
Escritorios y estaciones turnero_lugares
Formularios obligatorios por estación turnero_lugar_consentimientos
Formularios obligatorios por examen exam_tipo_consentimientos
Equipos fijos por IP o token turnero_dispositivos
Prioridades de la cola turnero_prioridades
Playlist de la pantalla de TV turnero_tv_media

Las estaciones de toma de muestras exigen el formulario Datos Toma de Muestras (F-LAB-08), incluso en visitas marcadas como solo entrega de muestras.

LIA

Clave Qué es
lab_config.gemini_api_key Clave de la API de Google Gemini
lab_config.lia_tokens_usados Consumo acumulado (tope: 1.000.000)

El tope está en el código como LIA_TOKENS_MAX.

Términos y condiciones

En dos lugares que hay que mantener sincronizados:

  • terms_versions — versión activa, URL del documento, mensajes de aceptación y rechazo
  • system_config.terms_message — el texto de bienvenida, que repite la URL dentro

Cambios de esquema

Van en migrations/, con nombre AAAAMMDD_descripcion.sql e idempotentes (IF NOT EXISTS, guardas en UPDATE/INSERT).

Si aplicás un cambio directo en producción, dejá también la migración: sin ella, un entorno nuevo no tendrá ese cambio y nadie se va a enterar hasta que falle.