# Menús y respuestas automáticas del bot

Buena parte de lo que responde el bot **no está en el código**: es contenido configurable en la base. Cambiar lo que contesta no requiere tocar PHP ni desplegar.

## Respuestas automáticas

`autoresponses` — dispara una respuesta según lo que escriba el paciente.

| Columna | Para qué |
|---|---|
| `trigger_type` | Cómo se dispara: `welcome`, `keyword`, `contains` |
| `trigger_value` | Las palabras que la activan, separadas por coma |
| `response_text` | Lo que responde |
| `response_type` | `text` o plantilla |
| `template_name` | Plantilla de Meta, si aplica |
| `menu_id` | Si en vez de texto debe mostrar un menú |
| `priority` | Cuál gana si varias coinciden |
| `is_active` | Permite desactivar sin borrar |

### Tipos de disparo

| Tipo | Cuándo actúa |
|---|---|
| `welcome` | Primer contacto |
| `keyword` | El mensaje **es** una de las palabras listadas |
| `contains` | El mensaje **contiene** el texto |

`keyword` es más estricto que `contains`. Para *«hola»* conviene `keyword` — si fuera `contains` se dispararía dentro de cualquier frase que la incluya.

### Las que están activas

Cubren saludo, precios, horarios, indicaciones previas, cotización y preparación para frotis. Son las preguntas que más se repiten, resueltas sin intervención humana.

## Menús interactivos

`menu_options` — el árbol de opciones numeradas que el paciente recorre respondiendo con un número.

| Columna | Para qué |
|---|---|
| `menu_id` | A qué menú pertenece la opción |
| `option_number` | El número que marca el paciente |
| `text` | Lo que se muestra |
| `action_type` | Qué pasa al elegirla |
| `action_value` | El destino o el texto de respuesta |
| `is_active` | Permite ocultar sin borrar |

### Acciones

| `action_type` | Efecto |
|---|---|
| `menu` | Abre otro menú — `action_value` es su identificador |
| `end` | Responde con `action_value` y cierra |
| `message` | Envía el texto y sigue en el mismo menú |

### La estructura actual

```
  main_menu (1)
   ├─ 1  Agendar toma a domicilio        end
   ├─ 2  Consultar resultados            end
   ├─ 3  Información sobre exámenes ─────► menu informacion_examenes (10)
   │                                        ├─ 1  Pruebas de embarazo      end
   │                                        ├─ 2  Prueba de paternidad     message
   │                                        ├─ 3  Pruebas de aliento       end
   │                                        ├─ 4  Orina de 24 horas        end
   │                                        ├─ 5  Solicitar cotización     end
   │                                        └─ 6  Volver ──────────────────► main_menu
   ├─ 4  Ubicación y horarios             end
   ├─ 5  Ver portafolio                   end
   ├─ 6  Convenios                        end
   └─ 7  Salir                            end
```

> Un menú se apunta por su **identificador** (`main_menu`, `informacion_examenes`), no por su número de fila. Cambiar el orden no rompe los enlaces.

## Estado de la conversación

`user_states` recuerda en qué punto quedó cada paciente: en qué menú está, si espera un dato, o si lo tomó un operador. Es lo que permite que responder «3» signifique algo.

Es la tabla más voluminosa del bot — una fila por contacto activo.

## Envíos masivos

`broadcast_history` registra los envíos a varios destinatarios a la vez.

> Fuera de la ventana de 24 horas hay que usar plantilla aprobada. Un envío masivo a contactos que no escribieron recientemente **solo puede hacerse con plantilla**.

## Encuestas

`survey_responses` guarda las respuestas de satisfacción. La encuesta se envía desde el historial del turnero con la plantilla `encuesta_turnero`.

## Al modificar el bot

- **Primero mire si alcanza con la base.** Muchos cambios de comportamiento son una fila en `autoresponses` o `menu_options`, sin desplegar nada.
- **Use `is_active` en vez de borrar.** Permite volver atrás y conserva el historial.
- **Cuide `priority`.** Si dos respuestas coinciden, gana la de mayor prioridad; sin ella el resultado depende del orden de la consulta.
- **Verifique el árbol completo** después de tocar un menú: una opción que apunta a un menú inexistente deja al paciente sin salida.
