# SELN Asistente Virtual
**Software En La Nube S.A.S.** — Soporte inteligente para tus apps

---

## Estructura del proyecto

```
seln-assistant/
├── config/
│   ├── config.php        ← Credenciales (DB, Claude API, GLPI)
│   └── db.php            ← Conexión PDO singleton
├── api/
│   ├── chat.php          ← Controlador principal (endpoint del widget)
│   ├── knowledge.php     ← CRUD base de conocimiento
│   ├── claude.php        ← Integración Claude API
│   └── ticket.php        ← Integración GLPI REST API
├── admin/
│   ├── index.html        ← Panel de administración
│   └── admin_api.php     ← API del panel admin
├── assets/
│   └── js/
│       └── widget.js     ← Widget embebible para tus apps
└── sql/
    └── schema.sql        ← Esquema completo MySQL
```

---

## Instalación

### 1. Base de datos

```sql
mysql -u root -p < sql/schema.sql
```

### 2. Configuración

Edita `config/config.php`:

```php
// Credenciales MySQL
define('DB_HOST', 'localhost');
define('DB_USER', 'tu_usuario');
define('DB_PASS', 'tu_password');

// Claude API — obtén tu key en https://console.anthropic.com
define('CLAUDE_API_KEY', 'sk-ant-...');

// GLPI — habilita la API en: GLPI → Configuración → General → API
define('GLPI_BASE_URL',   'http://soporte.softwareenlanube.co/apirest.php');
define('GLPI_APP_TOKEN',  '...');
define('GLPI_USER_TOKEN', '...');

// Clave compartida entre tus apps y el asistente
define('WIDGET_SECRET', 'tu_clave_secreta');
```

### 3. Configurar GLPI

1. En GLPI ve a: **Configuración → General → API**
2. Activa **"Habilitar API REST"**
3. Crea un **App Token** (para tu asistente)
4. Genera un **User Token** desde tu perfil de usuario GLPI
5. Copia ambos tokens en `config.php`

### 4. Subir al servidor

Sube la carpeta `seln-assistant/` a tu servidor PHP.
Recomendado: `/var/www/html/asistente/` o subdominio `asistente.softwareenlanube.co`

---

## Integración en tus apps PHP

Agrega una sola línea antes del `</body>` de cada app:

```html
<script
  src="https://asistente.softwareenlanube.co/assets/js/widget.js"
  data-app="herp_cardio"
  data-module="pacientes/registro"
  data-module-name="Registro de Pacientes"
  data-user="<?= $_SESSION['user_id'] ?>"
  data-api="https://asistente.softwareenlanube.co/api/chat.php"
  data-token="tu_clave_secreta"
></script>
```

### Parámetros del widget

| Atributo | Descripción | Ejemplo |
|---|---|---|
| `data-app` | Clave de la app (debe existir en tabla `apps`) | `herp_cardio` |
| `data-module` | ID del módulo/pantalla actual | `pacientes/registro` |
| `data-module-name` | Nombre legible del módulo | `Registro de Pacientes` |
| `data-user` | ID del usuario logueado | `user_123` |
| `data-api` | URL del endpoint chat.php | `https://…/api/chat.php` |
| `data-token` | Clave secreta (igual a `WIDGET_SECRET`) | `tu_clave` |

### Tip: módulo dinámico

Puedes pasar el módulo activo dinámicamente desde PHP:

```php
<script
  src="…/widget.js"
  data-app="herp_cardio"
  data-module="<?= htmlspecialchars($modulo_actual) ?>"
  data-module-name="<?= htmlspecialchars($nombre_modulo) ?>"
  data-user="<?= $_SESSION['user_id'] ?>"
  data-api="https://asistente.softwareenlanube.co/api/chat.php"
  data-token="<?= WIDGET_SECRET ?>"
></script>
```

---

## Flujo de decisión del asistente

```
Usuario pregunta
       ↓
¿Hay respuesta en KB? (MySQL FULLTEXT)
       ├── SÍ → Devuelve respuesta + botones de feedback
       └── NO → Llama a Claude API
                   ↓
              Genera respuesta
                   ↓
         Guarda como "pendiente de revisión"
                   ↓
         Muestra al usuario + botón "Crear ticket"
```

---

## Panel de administración

Accede en: `https://asistente.softwareenlanube.co/admin/`

**Funcionalidades:**
- 📊 Dashboard con estadísticas en tiempo real
- 🧠 Revisar y aprobar/rechazar aprendizajes de la IA
- 📚 Gestionar artículos de la base de conocimiento
- 📋 Historial completo de conversaciones
- 🎫 Tickets creados desde el asistente

> **Importante:** Protege el directorio `/admin/` con autenticación antes de
> desplegar en producción (`.htpasswd` o integrar con tu sistema de login).

---

## Agregar conocimiento inicial a la KB

Usa el panel admin → "Agregar artículo", o directamente con SQL:

```sql
INSERT INTO knowledge_base (app_key, module_id, module_name, keywords, question, answer, approved)
VALUES (
  'herp_cardio',
  'pacientes/registro',
  'Registro de Pacientes',
  'paciente, nuevo, crear, registrar, historia, clínica',
  '¿Cómo registro un nuevo paciente?',
  '## Registro de nuevo paciente\n\n1. Ve al menú **Pacientes → Nuevo paciente**\n2. Completa los datos básicos: nombre, documento, fecha de nacimiento\n3. Asigna el médico tratante\n4. Haz clic en **Guardar**\n\nEl sistema asignará automáticamente un número de historia clínica.',
  1
);
```

---

## Modelos de Claude recomendados

| Modelo | Uso recomendado | Costo aprox |
|---|---|---|
| `claude-haiku-4-5-20251001` | **Pruebas y producción básica** (recomendado) | Muy bajo |
| `claude-sonnet-4-6` | Producción con respuestas más elaboradas | Medio |
| `claude-opus-4-6` | Solo para casos muy complejos | Alto |

Cambia el modelo en `config/config.php` → `CLAUDE_MODEL`.

---

## Seguridad en producción

1. **Cambia `WIDGET_SECRET`** por una clave aleatoria larga
2. **Protege `/admin/`** con autenticación
3. **Restringe `ALLOWED_ORIGINS`** a tus dominios reales
4. **Usa HTTPS** en todos los endpoints
5. **Limita permisos MySQL** del usuario de la app
6. **No expongas `config.php`** fuera del webroot
