# Reformix — Flujos de estado por canal

El lío viene de mezclar varias "estados" que en realidad son 4 dimensiones independientes. Aquí están separadas y el flujo de cada canal sobre ellas. DB única; el lead se crea siempre en el form web.

## 1 · Las 4 dimensiones de estado (ortogonales)

### pipeline_stage

Avance TÉCNICO en el funnel. Lo comparten los 3 canales y es lo que ve el panel. Lo gestiona la app/EP, no el bot.

form_completadofotos_subidasprellamada_enviadallamada_completadarender_generadopresupuesto_generadowhatsapp_entregado

### lead_estado

Estado COMERCIAL / CRM. Lo lleva el reformista (y algún automatismo). Independiente del canal.

nuevocontactadovisita_agendadapresupuesto_enviadoganadoperdido

### estado_wa

SOLO entrega del último mensaje de WhatsApp (técnico, por-mensaje). No es "en qué punto va la conversación".

sin_enviarenviadoentregadoleidofallido

### estado_conversacion (NO existe aún)

En qué paso va Luisa en la cualificación. Hoy vive solo dentro del bot. La decisión es si lo persistimos.

aperturaespaciotamañoestilourgenciapresupuestopide_fotoscompletado

## 2 · Flujo de cada canal sobre esas dimensiones

📝 Formulario web
Cliente deja datos (crearLead)
nombre · tel · email · opt-ins
form_completadonuevo
↓
Rellena por zonas + sube fotos
guardarDetallesYFotos → lead_fotos (antes) + lead_notas
fotos_subidas
↓
Presupuesto orientativo al instante
motor de presupuesto + señal perfilCompleto
presupuesto_generado
↓
Converge en calificación →
contactado
No usa
estado_wa · estado_conversacion (no hay chat)
💬 WhatsApp — Luisa
Lead ya existe (del form) → elige WhatsApp
app emite WHATSAPP_START con leadId
form_completadonuevo
↓
Bot escribe el 1er mensaje
entrega del mensaje (no la conversación)
sin_enviar→enviado→entregado→leido
↓
Luisa cualifica (conversación)
guarda cada turno en conversacion_whatsapp + extrae a leads
estado_conversacion (bot)
apertura → espacio → tamaño → estilo → urgencia → presupuesto
↓
¿Viable? (≥ 5000€)
No → perdido (no_viable, descartado)
Sí → pide fotos por WA
pide_fotos
↓
Fotos recibidas → EP ingesta
lead_fotos (antes) + worker analiza
fotos_subidascompletado
↓
Converge en calificación →
contactado
📞 Llamada
Lead ya existe (del form) → pide llamada
ahora / programar
prellamada_enviadanuevo
↓
Bot de llamada (externo)
registra intento en intentos_contacto
llamada_completada
resultado_contacto
exitosono_contestaocupadorechaza
↓
Pide fotos por WA o email→formulario
leads.fotos_solicitadas_at
enviado
↓
Fotos recibidas → EP ingesta
lead_fotos (antes) + worker
fotos_subidas
↓
Converge en calificación →
contactado

## 3 · Convergencia (los 3 canales acaban igual)

Calificaciónlead_calificacion (score + A/B/C/D) → visita_agendada → render_generadopresupuesto_generado → whatsapp_entregadopresupuesto_enviado → ganado / perdido → testimonio

## 4 · La decisión a tomar

### ¿WhatsApp necesita "otros estados"? Sí, pero ojo a CUÁL:

- estado_wa (ya lo tenemos): es solo si el mensaje llegó/se leyó. Útil pero de bajo nivel.
- estado_conversacion (Luisa): esto es lo que de verdad falta si queremos saber "por qué paso va el chat" y poder retomarlo si se corta. Hoy NO está en la DB.
- El diagrama del compañero ponía `estado_wa = nuevo` → mezcla los dos conceptos. `nuevo` no es entrega de mensaje, es "conversación sin empezar".

### Mi recomendación

- pipeline_stage = única fuente del avance del lead (lo pinta el panel). Lo escribe la app/EP. El bot NO lo toca.
- lead_estado = comercial, lo lleva el reformista.
- estado_wa = déjalo solo para entrega de mensaje (sin_enviar…leido). No metas "nuevo" ahí.
- estado_conversacion del bot: 2 opciones —
  (a) vive SOLO dentro del bot/n8n (no lo persistimos en nuestra DB) → más simple, suficiente para la demo;
  (b) lo persistimos como columna nueva `leads.bot_step` (o tabla) si queremos verlo en el panel / retomar conversaciones. ← esto es lo que hay que decidir.