# Manual de Usuario — Lliria Properties Scraper

> **Última actualización:** febrero 2026

---

## 1. Inicio automático con Windows

La aplicación está configurada para **arrancar automáticamente** cuando inicias sesión en Windows, sin que tengas que hacer nada.

### Cómo funciona

Al iniciar sesión, Windows ejecuta automáticamente la entrada `PM2` en el registro:

```
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
```

Esto lanza en silencio (sin ventana) el comando:
```
wscript.exe "...\pm2-windows-startup\invisible.vbs" "...\pm2_resurrect.cmd"
```

Que internamente ejecuta `pm2 resurrect`, restaurando todos los procesos guardados, incluida la app.

### Verificar que funciona

Abre **PowerShell** y ejecuta:

```powershell
pm2 list
```

Debes ver algo así:

```
┌────┬────────────────────┬──────────┬───────────┐
│ id │ name               │ mode     │ status    │
├────┼────────────────────┼──────────┼───────────┤
│ 0  │ lliria-properties  │ cluster  │ online    │
└────┴────────────────────┴──────────┴───────────┘
```

Si `status` es `online`, la app está corriendo correctamente.

### Si la app no arranca sola

Ocurre si el dump de PM2 no está guardado. Solución:

```powershell
cd C:\xampp\htdocs\captajaus\lliria-properties-scraper
pm2 start ecosystem.config.js
pm2 save --force
```

Con `pm2 save` quedan grabados los procesos actuales y se restaurarán en el próximo arranque.

---

## 2. Acceso al dashboard

Una vez iniciada sesión en Windows, abre el navegador en:

```
http://localhost:3000
```

Credenciales:

| Campo      | Valor    |
| ---------- | -------- |
| Usuario    | `george` |
| Contraseña | `4213`   |

---

## 3. Gestión de la app (comandos PM2)

Abre **PowerShell** en cualquier carpeta:

| Acción                    | Comando                                                                      |
| ------------------------- | ---------------------------------------------------------------------------- |
| Ver estado                | `pm2 list`                                                                   |
| Ver logs en directo       | `pm2 logs 0`                                                                 |
| Reiniciar                 | `pm2 restart 0`                                                              |
| Detener                   | `pm2 stop 0`                                                                 |
| Arrancar (si está parada) | `cd C:\xampp\...\lliria-properties-scraper && pm2 start ecosystem.config.js` |
| Guardar estado actual     | `pm2 save --force`                                                           |

> El número `0` es el ID de la app. Puedes usar también `pm2 restart lliria-properties`.

---

## 4. Dashboard principal

### Estadísticas superiores

Cuatro tarjetas muestran en tiempo real (cargadas desde la BD, sin límite de filas):

- **Total propiedades** activas
- **Precio medio**
- **Precio mínimo**
- **Nº de portales** con datos

### Tabla de propiedades

La tabla carga los datos **por páginas via AJAX** (100 filas por defecto). Puedes cambiar a 50 o 250 con el selector de la esquina superior izquierda.

#### Columnas

| Columna   | Descripción                                 |
| --------- | ------------------------------------------- |
| Imagen    | Miniatura del anuncio                       |
| Título    | Nombre con enlace al portal original        |
| Precio    | Precio en €, ordenable                      |
| €/m²      | Precio por metro cuadrado                   |
| Score     | Puntuación 0–10 (precio, tamaño, ubicación) |
| Municipio | Municipio detectado                         |
| Tipo      | Tipo de propiedad (piso, chalet, casa…)     |
| Hab.      | Número de habitaciones                      |
| m²        | Superficie útil                             |
| Portal    | Fuente/portal del anuncio                   |
| Acción    | Botones de acción                           |

#### Botones de acción por fila

| Icono | Función                                               |
| ----- | ----------------------------------------------------- |
| ℹ️     | Ver detalle completo (modal con historial de precios) |
| ♥     | Marcar/desmarcar como favorito                        |
| ↗     | Abrir anuncio original en nueva pestaña               |
| 🗑     | Archivar anuncio (soft-delete, recuperable 30 días)   |

### Filtros rápidos

Usa la barra de filtros para acotar resultados:

- **Municipio** — selector con zonas activas
- **Tipo** — casa, piso, chalet, terreno, local
- **Precio min / max**
- **Hab. mínimas**
- **Portal** — filtrar por fuente

Pulsa **Filtrar** para aplicar o **Limpiar** para resetear. Los filtros se envían al servidor y la tabla se recarga automáticamente.

### Búsqueda rápida

El cuadro de búsqueda en la esquina superior derecha de la tabla filtra por título, localización y municipio directamente en el servidor.

### Exportar CSV

Botón **CSV** junto al buscador: descarga todos los resultados actualmente filtrados (no solo los de la página visible).

---

## 5. Archivo de anuncios eliminados

**Menú → Archivo** (`/dashboard/archive`)

Los anuncios eliminados (tanto manualmente como por el scraping automático al detectar que ya no están publicados) se mueven aquí en lugar de borrarse definitivamente.

### Columnas del archivo

| Columna                   | Descripción                           |
| ------------------------- | ------------------------------------- |
| Imagen / Título           | Datos del anuncio                     |
| Precio                    | Último precio registrado              |
| Municipio / Tipo / Portal | Metadatos                             |
| Eliminado                 | Fecha en que fue archivado            |
| Días restantes            | Días hasta purga automática (máx. 30) |
| Acciones                  | Restaurar o eliminar definitivamente  |

### Acciones disponibles

- **Restaurar** — el anuncio vuelve al listado principal activo
- **Eliminar definitivamente** — borrado permanente e irrecuperable

### Purga automática

Cada día a las 3:00 AM se eliminan definitivamente todos los anuncios que llevan **más de 30 días** en el archivo. No requiere intervención manual.

---

## 6. Cómo se detectan anuncios "caducados"

Durante cada ejecución del scraping, al terminar de procesar un portal:

1. Se marcan con la hora de inicio del scraping (`scrapeStartedAt`)
2. Todo anuncio de ese portal con `updated_at` anterior a esa hora = **ya no está publicado**
3. Se archiva automáticamente (soft-delete)

> Si un portal falla y devuelve 0 resultados, no se archiva nada para evitar falsos positivos.

---

## 7. Mapa interactivo

**Menú → Mapa**

- Muestra propiedades geocodificadas sobre el mapa de la comarca
- Marcadores codificados por color según tipo de propiedad
- Clic en marcador → resumen de la propiedad
- Panel lateral con filtros para reducir marcadores

---

## 8. Filtros guardados y alertas

**Menú → Filtros**

Puedes guardar combinaciones de filtros como plantillas y configurar **alertas por email** cuando aparezcan nuevas coincidencias.

### Crear un filtro

1. Haz clic en **"Nuevo filtro"**
2. Configura los criterios (precio, tipo, habitaciones…)
3. Activa **"Alertas por email"** si quieres notificaciones automáticas
4. Guarda

Los filtros se comprueban automáticamente tras cada scraping.

---

## 9. Portales activos

**Menú → Portales**

Lista de los portales disponibles. Para cada uno puedes:

- **Activar/desactivar** el scraping con el toggle
- Ver número de propiedades obtenidas
- Lanzar el scraping solo de ese portal

---

## 10. Zonas / Municipios

**Menú → Zonas**

Añade o edita los municipios que los scrapers incluyen en sus búsquedas.

### Añadir una zona

1. Clic en **"Nueva zona"**
2. Rellena: nombre, slug, latitud, longitud, radio (km), slug para pisos.com
3. Activa el toggle **"Activa"**
4. Guarda

---

## 11. Scraping manual

Desde el dashboard, botón **"Escanear Ahora"** (barra superior):

1. Clic en el botón
2. El scraping se ejecuta en segundo plano (no bloquea el navegador)
3. Espera ~2–5 minutos según los portales activos
4. La tabla se recarga automáticamente con los nuevos resultados

El scraping también se ejecuta **automáticamente** según el cron configurado (por defecto: cada 2 horas).

---

## 12. Instalar como app (PWA)

**En Chrome/Edge escritorio:**
1. Icono de instalación (⊕) en la barra de direcciones → Instalar

**En iPhone/iPad (Safari):**
1. Botón compartir (□↑) → "Añadir a pantalla de inicio"

La app funciona sin conexión mostrando los últimos datos cargados.

---

## 13. Analytics

**Menú → Analytics** (icono 📊)

- Distribución por tipo (gráfico de tarta)
- Distribución por portal (barras)
- Evolución de precios (línea temporal)
- Precio medio por municipio
- Estadísticas de bajadas de precio

---

## 14. Recompilar tras cambios de código

Si se modifica el código fuente, ejecuta en PowerShell:

```powershell
cd C:\xampp\htdocs\captajaus\lliria-properties-scraper
node .\node_modules\typescript\bin\tsc
pm2 restart 0
pm2 save --force
```

---

*Manual generado automáticamente para uso interno.*
