# 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`):

```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 aplica un cambio directo en producción, **deje también la migración**: sin ella, un entorno nuevo no tendrá ese cambio y nadie se va a enterar hasta que falle.
