# Inbox Reader — enriquecer reservas con datos del email

## Qué resuelve

El iCal de Booking trae **solo fechas y bloqueos** (sin nombre del huésped, sin email, sin teléfono, sin monto). El de Airbnb trae el nombre genérico ("Reservado por John D.") pero tampoco email ni teléfono.

Booking y Airbnb **sí mandan toda esa información por email** al hotelero cada vez que hay una reserva nueva. Este servicio lee tu inbox vía IMAP, parsea esos emails, y enriquece las reservas que ya tenés en Lemu (importadas vía iCal) con los datos completos.

**Resultado**: las reservas en Lemu pasan de mostrar "Huésped OTA" + checkin/checkout → a mostrar nombre real, email, teléfono y monto.

## ¿Es legal? ¿Viola ToS?

Sí, es legal. Son TUS emails entrando a TU inbox vía IMAP (un protocolo estándar que tu email provider expone explícitamente para esto). No estamos scrapeando ningún sitio. Booking/Airbnb mandan los emails con la intención de que vos los uses.

Diferencia con scraping: el scraping del extranet de Booking violaría sus ToS (sección 8). El email parser NO toca booking.com, solo tu inbox.

## Setup paso a paso

### 1. Activar IMAP en tu email

#### Si usás **Gmail**:
1. Ir a https://mail.google.com → ⚙ → Settings → "Forwarding and POP/IMAP"
2. Habilitar IMAP, guardar
3. **Generar App Password** (no podés usar tu password normal con 2FA activado):
   - https://myaccount.google.com/apppasswords
   - Nombre: "Lemu Inbox Reader"
   - Copiar los 16 caracteres que da Google

Host: `imap.gmail.com` · Puerto: `993` · SSL: sí

#### Si usás **Outlook / Office 365**:
1. Outlook ya tiene IMAP habilitado por defecto
2. Si tu cuenta tiene 2FA, también generar app password en https://account.microsoft.com/security

Host: `outlook.office365.com` · Puerto: `993` · SSL: sí

#### Si usás **iCloud, Yahoo, ProtonMail**:
Cada uno tiene su host. Buscar en docs del proveedor: "IMAP settings".

### 2. Instalar dependencias en el server

```bash
cd /path/to/lemu
npm install imap-simple mailparser
```

Estas son las únicas dependencias nuevas. El servicio se mantiene **dormant** si no están instaladas (el server no rompe).

### 3. Configurar desde admin

1. Login en `/admin.html`
2. Sidebar → **Sincronización**
3. Scroll abajo hasta **📧 Inbox Reader**
4. Click **⚙ Config IMAP**
5. Llenar:
   - Host IMAP: `imap.gmail.com` (o lo que corresponda)
   - Puerto: `993`
   - SSL/TLS: SSL/TLS (993)
   - Email login: `tu-email@gmail.com`
   - App password: pegar el password generado
   - Mailbox: `INBOX` (default; si tenés un folder específico para Booking/Airbnb, ponelo)
   - Habilitado: ✓
6. Click **📨 Test conexión** — debe decir "✓ Conexión IMAP OK"
7. Click **💾 Guardar**

### 4. Primera corrida manual

Click **▶ Procesar ahora**. El servicio:
- Busca emails de los últimos 7 días que vengan de `booking.com` o `airbnb.com`
- Parsea cada uno
- Para cada uno: busca la reserva en Lemu por `channel_reservation_id` (lo que el iCal trajo)
- Si encuentra la reserva → enriquece con nombre/email/phone/monto
- Si no encuentra → marca como "huérfana" (no creamos reservas a ciegas)

Después de la primera corrida, el cron automático corre cada 5 min y procesa emails nuevos.

### 5. Verificar

- En `Sincronización → Inbox Reader` ver:
  - Counter **Enriquecidas**: > 0 si funcionó
  - Tabla con los últimos emails procesados
- En `Huéspedes`: los huéspedes "Huésped OTA" deberían pasar a tener nombre real, email y phone

## Cómo funciona técnicamente

```
┌─────────────────────────────────┐
│  Booking.com / Airbnb.com       │
│  manda email cuando hay reserva │
└──────────┬──────────────────────┘
           │
           ▼ (vía SMTP, llega a tu inbox)
┌─────────────────────────────────┐
│  Tu inbox (Gmail/Outlook)       │
│  contiene email con datos       │
│  completos del huésped          │
└──────────┬──────────────────────┘
           │
           ▼ (vía IMAP, cron 5 min)
┌─────────────────────────────────┐
│  Lemu inbox-reader.js           │
│  1. Conecta IMAP                │
│  2. Busca emails desde-booking  │
│     en últimos 7 días           │
│  3. Por cada email:             │
│     a) Parse con regex/template │
│     b) Extrae: reservation_id,  │
│        guest_name, email,       │
│        phone, total, fechas     │
│     c) Match con reservation    │
│        en Lemu (channel_reservation_id) │
│     d) Update guest + total     │
│  4. Marca email como procesado  │
│     (tabla inbox_processed,     │
│     por UID, no reprocesa)      │
└──────────┬──────────────────────┘
           │
           ▼
┌─────────────────────────────────┐
│  Reservation en Lemu pasa de:   │
│  "Huésped OTA" + fechas         │
│  → "Juan Pérez" +               │
│     juan@gmail.com +            │
│     +56912345678 +              │
│     monto real                  │
└─────────────────────────────────┘
```

## Tabla `inbox_processed`

Lemu guarda un registro por cada email leído (procesado o no) en `inbox_processed`:

| columna | descripción |
|---|---|
| `uid` | UID IMAP del email — UNIQUE, asegura que no se reprocesa |
| `message_id` | Message-ID estándar del email |
| `from_address` | quién mandó |
| `subject` | asunto |
| `detected_source` | `booking` / `airbnb` / `null` |
| `matched_reservation_id` | si matcheó, el ID de la reserva en Lemu |
| `status` | `enriched` / `matched` / `skipped` / `error` |
| `raw_excerpt` | primeros 1000 chars del email (para debug) |

## Limitaciones conocidas

- Los parsers son **regex sobre el body del email**. Booking/Airbnb cambian templates ocasionalmente (1-2 veces/año). Si dejan de matchear, hay que actualizar las regex en `inbox-reader.js` → `parseBookingEmail()` / `parseAirbnbEmail()`.
- Airbnb **oculta email y teléfono** del huésped en los emails hasta el día del check-in (política de privacidad de Airbnb). Solo trae nombre + fechas.
- Booking trae todo (email, teléfono, monto, número de reserva).
- El UID resetea si cambias de mailbox o el provider hace reset. En ese caso: borrar la fila `inbox_config.last_uid` y volver a correr.

## Tunear los parsers

Si Booking cambia el template del email y los datos no aparecen:

1. Login en `/admin.html` → Sincronización
2. En la tabla de emails procesados, mirar uno con `status='skipped'`
3. El campo `raw_excerpt` muestra los primeros 1000 chars del email
4. Ajustar las regex en `server/services/inbox-reader.js`:
   ```js
   function parseBookingEmail(parsed) {
     // ...
     const bookingNumMatch = text.match(/AJUSTAR ACÁ/);
     // ...
   }
   ```
5. Reiniciar el server y volver a correr `Procesar ahora`

## Seguridad

- El **password se almacena en plaintext en la DB** hoy. Para producción a escala (clientes SaaS), conviene encriptar con una master key del server.
- El password **nunca se loguea**. Se devuelve masked (`••••••••`) en `/api/inbox/config` GET.
- El IMAP se conecta con TLS (SSL 993) por defecto. STARTTLS (143) también soportado.
- `tlsOptions.rejectUnauthorized: false` está activo para tolerar certs self-signed en servers de email caseros. En producción con Gmail/Outlook esto es seguro.

## Próximos pasos (futuro)

- **Encriptar password en DB** con app secret
- **Multi-tenant** (cada cliente SaaS configura su propio inbox)
- **Parsers para Expedia/Despegar** cuando agreguemos esos canales
- **Webhook directo de Booking via Partner program** (cuando reabra) — reemplazaría este servicio
- **Browser extension** complementaria: lee admin.booking.com en vivo y manda DOM a Lemu (otra capa, no excluye email parser)
