# Reformix Luisa Bot 🤖

Agente de WhatsApp **Luisa** para **Reformix** — cualifica leads de reforma de forma conversacional, recoge 5 datos clave y cierra el flujo según el flag viable/no_viable.

## Stack

- **NestJS** — framework principal
- **Baileys** — conexión con WhatsApp (sin API oficial)
- **PostgreSQL** — base de datos via TypeORM
- **Claude 4.5** via **OpenRouter** — LLM con soporte de texto, audio e imagen

## Estructura del proyecto

```
/src
  /whatsapp       ← Módulo Baileys: conexión, QR, recepción y envío
  /leads          ← Módulo de leads: CRUD y lógica de estados
  /conversacion   ← Módulo de historial de mensajes por lead
  /scheduler      ← Cron cada 5 min: dispara apertura a leads nuevos
  /claude         ← Construye el contexto y llama a Claude 4.5
  /media          ← Procesa audio e imagen antes de pasar a Claude

/prompts
  luisa_core.md   ← Identidad y personalidad de Luisa ← RELLENAR
  luisa_flujo.md  ← Flujo de cualificación paso a paso  ← RELLENAR
  luisa_casos.md  ← Casos edge y ejemplos              ← RELLENAR
```

## Configuración rápida

### 1. Variables de entorno

```bash
cp .env.example .env
```

Edita `.env`:

```env
OPENROUTER_API_KEY=sk-or-...
MODEL=anthropic/claude-sonnet-4-5
DATABASE_URL=postgresql://user:password@localhost:5432/reformix_luisa
```

### 2. Base de datos

El proyecto usa `synchronize: true` en modo desarrollo, TypeORM creará las tablas automáticamente al arrancar.

En producción, desactiva `synchronize` y usa migrations:

```bash
npm run migration:generate
npm run migration:run
```

### 3. Prompts de Luisa

Rellena los 3 archivos en `/prompts` antes de arrancar:

- `luisa_core.md` — identidad, tono, límites
- `luisa_flujo.md` — estados, preguntas por estado, condiciones de avance  
- `luisa_casos.md` — casos edge, fallbacks, ejemplos de conversación

### 4. Arrancar

```bash
npm install
npm run start:dev
```

Escanea el **QR** que aparece en la terminal con WhatsApp.

Luisa queda conectada y lista.

## Flujo de mensajes

```
Mensaje entrante (texto / audio / imagen)
        ↓
Identificar lead por teléfono (crear si no existe)
        ↓
Si audio  → Claude 4.5 transcripción
Si imagen → Claude 4.5 Vision (prompt según estado)
Si texto  → directo
        ↓
Guardar mensaje usuario en DB
        ↓
Construir contexto: estado, datos del lead, historial, prompts MD
        ↓
Llamar Claude 4.5 via OpenRouter
        ↓
Extraer entidades del turno → actualizar lead en DB
        ↓
Evaluar flag viable → cambiar estado si aplica
        ↓
Guardar respuesta de Claude en DB
        ↓
Enviar respuesta por Baileys
```

## Scheduler (cron cada 5 min)

- Busca leads con `estado_actual = 'nuevo'`
- Marca como `en_proceso` antes de actuar
- Genera y envía el mensaje de APERTURA de Luisa
- Ignora leads en `completado`, `no_viable`, `perdido`
- Marca como `perdido` leads en `en_proceso` sin actividad > 48h

## Estados del lead

| Estado | Descripción |
|--------|-------------|
| `nuevo` | Lead creado, aún no contactado |
| `en_proceso` | Luisa le ha enviado el primer mensaje |
| `recopilando_datos` | Conversación activa |
| `completado` | Todos los datos recogidos, viable=true |
| `no_viable` | Lead descartado, viable=false |
| `perdido` | Sin actividad > 48h |

## Qué NO hace este servicio

- No genera el presupuesto (lo hace otro worker)
- No renderiza el PDF
- No envía la URL (la inserta el worker en `url_presupuesto`)
- No tiene panel del reformista

---

Desarrollado para Reformix © 2025
