# Dashboard v2 · Métricas (MySQL)

Dashboard de métricas configurable, con estética tipo OpenAI: menú lateral, contenido principal y gráficos. Los datos se leen desde MySQL (conexión canal13 en ruta externa).

## Estructura

- **config/** — Configuración: `db.php` carga la conexión desde otra ruta (`bd_s3_backup/config.php` o `metrics/v2/config/config.php`). `app.php` define la base URL.
- **sql/schema.sql** — Tablas: `dashboard_menu`, `dashboard_pages`, `dashboard_charts`.
- **lib/Db.php** — Conexión PDO.
- **bootstrap.php** — Carga config y helpers JSON.
- **api/** — Endpoints usados por el backend (también copiados en `public/api/` para servir por web).
- **public/** — Punto de entrada web:
   - `index.php` — Login del dashboard de métricas.
   - `dashboard.php` — Dashboard de métricas (sidebar + charts).
   - `dashboard_admin.php` — Login + entrada del dashboard de configuración (ruta pública `/dashboard_admin`).
   - `admin.php` — Shell interno del administrador, usado por la ruta canónica `/dashboard_admin`.
  - `api/` — API: `menu.php`, `pages.php`, `charts.php`, `query.php`, `admin/*.php`.
   - **Nuevo:** pestaña "Datos + IA" para explorar bases/tablas, gestionar datasets y pedir SQL a la IA.

## Instalación

1. **Conexión BD**  
   La conexión a canal13 se toma de una ruta externa. Asegúrate de tener en el servidor uno de estos archivos con `DB_HOST`, `DB_USER`, `DB_PASS`, `DB_NAME` (o `DB_DSN`):
   - `site13/bd_s3_backup/config.php`
   - `site13/metrics/v2/config/config.php`

2. **Crear tablas**  
   Desde la raíz del proyecto (carpeta `v2`):
   ```bash
   php install.php
   ```
   O ejecutar manualmente el contenido de `sql/schema.sql` en la base canal13.

3. **Document root**  
   Apuntar el servidor web a `dashboard/v2/public`.

## Uso

- **Dashboard de métricas:** abre `/` o `index.php` para autenticarte y luego entrar a `dashboard.php`.
- **Dashboard de configuración:** abre `/dashboard_admin` para autenticarte y administrar el proyecto. Ahí puedes:
  - Crear/editar/eliminar ítems de **Menú** (título, slug, icono, orden).
  - Crear/editar/eliminar **Páginas** por menú (título, slug, layout 1col/2col, orden).
  - Crear/editar/eliminar **Gráficos** por página: título, tipo (line, bar, area, pie, doughnut), SQL, campo X, campo Y, color, orden. Botón "Probar query" ejecuta el SELECT y muestra vista previa.
   - **Datos + IA:** ver bases y tablas (solo lectura), registrar datasets del dashboard (tabla `dashboard_tablas`), generar SQL con IA y aplicar al formulario de gráficos.

Ambos accesos quedan separados y sin navegación cruzada entre productos.

## IA (OpenAI)

Configura variables de entorno en el servidor web:

```bash
export AI_API_KEY="..."
export AI_MODEL="gpt-4.1-mini"
export AI_BASE_URL="https://api.openai.com/v1"
```

- `AI_MODEL` y `AI_BASE_URL` son opcionales.
- La respuesta de la IA se espera en JSON con: `title`, `chart_type`, `sql`, `x_field`, `y_field`, `notes`.

## Regla de datos

Usa **vistas** en MySQL para las consultas de los gráficos (no tablas crudas). En el admin pegas el SQL de la vista (o un SELECT sobre la vista). Ejemplo:

```sql
CREATE VIEW vw_ventas_diarias AS
SELECT DATE(fecha) AS dia, SUM(monto) AS total
FROM ventas
GROUP BY dia;
```

En el gráfico: query `SELECT * FROM vw_ventas_diarias`, x_field `dia`, y_field `total`.

## Recursos

- Todo corre con recursos dentro de esta carpeta (v2), salvo la configuración de la BD (canal13), que está en otra ruta como se indica arriba.
- Frontend: Tailwind (CDN), Chart.js (CDN), Alpine.js (CDN). Sin build.

## Alertas + Slack (donde configurar secretos)

En el administrador web entra a:

- `admin.php` -> pestaña **Alertas** -> bloque **Módulo de alertas**.

Campos relevantes:

- **Enviar notificaciones**: permite silenciar temporalmente todos los envíos de alertas sin desactivar el módulo.
- **Signing secret**: se usa para validar requests entrantes de Slack (slash commands/events) en `public/api/slack/bot.php`.
- **Client secret (opcional)**: se guarda para escenarios OAuth o integraciones futuras; no es obligatorio para el flujo actual de alertas/bot.
- **Slack bot token** (`xoxb-...`): para enviar mensajes vía `chat.postMessage`.
- **Slack webhook URL**: alternativa de envío cuando no usas bot token.

Nota operativa:

- Si configuras bot con slash command, activa **Habilitar módulo** y **Habilitar bot Slack**, define `Signing secret`, y apunta Slack Request URL a `.../public/api/slack/bot.php`.

## Zona horaria y Ejecución de Alertas

**Zona horaria:** El dashboard está configurado para usar la zona horaria **America/Santiago** (UTC-3/UTC-4). Esto se aplica tanto en PHP como en MySQL, asegurando que todas las horas de ejecución sean consistentes con la zona horaria de Chile.

**Ejecución a minutos :00:** Cuando una alerta tiene `cooldown_minutes = 60`, se ejecuta especialmente en el minuto **:00 de cada hora** (ej: 14:00, 15:00, etc.), en lugar de cada 60 minutos desde su creación. Esto asegura:
- Ejecuciones previsibles y alineadas con la hora.
- Una sola ejecución por hora (no múltiples disparo en la misma hora).
- Horarios consistentes independientemente de cuándo se creó la alerta.

Para usar este comportamiento:
1. Crea una alerta en el admin con `Cooldown: 60` minutos.
2. El cron ejecuta `scripts/alerting_worker.php` cada minuto.
3. En el minuto :00, si se cruza el umbral, se envía la notificación a Slack.
