# 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.