# Chatbot para reservas en línea

## Información general

Un chatbot para reservas en línea es un conjunto de funciones del generador de embudos que le permiten automatizar el proceso de programación de servicios para su empresa.

El flujo de trabajo del bot se basa en la ejecución secuencial de funciones: recibir datos para mostrarlos al cliente y luego pasar estos datos para activar nuevas funciones y obtener nuevos resultados.

A medida que el cliente avanza por el embudo, debe pasar a cada bloque siguiente solo los datos que correspondan a la elección del cliente; use estos datos para configurar las siguientes llamadas a funciones.

Gracias a la posibilidad de recuperar datos intermedios (por ejemplo, puestos de empleados y categorías de servicios) y pasarlos para filtrar empleados y servicios, puede configurar su embudo de forma flexible y darle al cliente control sobre los pasos de su avance.

{% hint style="info" %}
Todos los métodos descritos en este artículo devuelven un array de diccionarios.

Para trabajar cómodamente con ellos, recomendamos revisar las secciones [Arrays](broken://pages/519cb926225e241bd09829eb543c55d5bfc25ee9) y [Diccionarios](broken://pages/f5c8fc55f623754170741a8e2ed8319801be817e).&#x20;

Además, para usar la función de generación de acciones del usuario (selección de servicio, fecha, reserva), sugerimos considerar el método [tools\_make\_button\_str\_checker](/doc/es/chatbot/functions/calculadora/arrays.md).&#x20;
{% endhint %}

A continuación se muestra un diagrama del flujo de trabajo del bot, donde cada bloque del diagrama representa una llamada de función específica y las flechas indican el flujo de datos que se pasan de un bloque a otro. La información transmitida en estos flujos le permite filtrar los datos solicitados, así como crear, cancelar o modificar una hora de reserva.

<figure><img src="/files/2e007a2705b3345443f1d8e53ff9a46a2946dfe7" alt="" width="563"><figcaption><p>diagrama del chatbot</p></figcaption></figure>

{% hint style="info" %}
Para ver un diagrama detallado de la configuración del chatbot de reservas en línea con las funciones en uso, consulte la sección [Ejemplo de implementación del bot](#example-of-bot-implementation) de este artículo.&#x20;
{% endhint %}

## Obtención de información de las sucursales

Para crear un embudo de reservas en línea y obtener información sobre las sucursales del proyecto, use la función get\_companies\_for\_booking.

La función devuelve una lista que contiene datos de cada sucursal (embudo) que tiene habilitado “Reserva en línea” en su configuración.

Los datos se proporcionan como pares clave-valor e incluyen el identificador de la sucursal (id), el nombre (name) y la dirección (address).

La función no toma ningún parámetro.

### Ejemplo de uso:

Llamada a la función dentro de un bloque:

<figure><img src="/files/cb48ab2b10d20ce21b401e9ad0fc495d39cb870c" alt="" width="375"><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="/files/8de5cd1ffc5441895a645e8b97aa3ddad1ad4023" alt="" width="375"><figcaption></figcaption></figure>

## Obtención de información sobre puestos o categorías de servicios

La función get\_categories\_for\_booking(company\_id) le permite obtener una lista de todos los tipos de especialistas o categorías de servicios de una sucursal.

Cada elemento de la lista devuelta contiene un identificador (id), un nombre (name) y una descripción (description) del puesto o categoría de servicio. Los datos se representan como pares “clave-valor”:

#### Parámetros:

<table><thead><tr><th width="310">Parámetro</th><th>Descripción</th></tr></thead><tbody><tr><td>company_id (obligatorio) </td><td>Identificador de la sucursal, formato esperado — entero.</td></tr></tbody></table>

### Ejemplo de uso:

Ejemplo de llamada de función en un bloque de código:

<figure><img src="/files/03e7ac4ec78545ee20dbe7f997128cb18ca94ef2" alt="" width="375"><figcaption></figcaption></figure>

## Obtención de información sobre empleados

Si necesita proporcionar información sobre los empleados de la sucursal, use la función get\_employees\_for\_booking.

La llamada devolverá una lista de datos que contiene el identificador del empleado (id), el nombre (name), la información (information) y el puesto (job\_title).

También puede filtrar los empleados por lista de servicios, puesto o categoría de servicio. Para ello, pase un parámetro adicional en la llamada a la función: service\_ids, job\_title\_id o service\_category\_id.

#### Orden de los parámetros:

company\_id -> service\_ids -> job\_title\_id -> service\_category\_id

#### **Parámetros:**

<table><thead><tr><th width="287"></th><th></th></tr></thead><tbody><tr><td>company_id (obligatorio)</td><td>Identificador de la sucursal, formato esperado — entero;</td></tr><tr><td>service_ids (opcional)</td><td>ID del servicio o una lista de IDs de servicios, formato esperado — un entero o una lista de enteros entre corchetes separados por comas, por ejemplo, [844, 845]</td></tr><tr><td>job_title_id (opcional)</td><td>ID del puesto, formato esperado — entero;</td></tr><tr><td>service_category_id (opcional) </td><td>Identificador de la categoría de servicio, formato esperado — entero;</td></tr></tbody></table>

**Nota:**

Si desea obtener todos los empleados de una sucursal, deje vacíos los valores de service\_ids, job\_title\_id y service\_category\_id.

* Ejemplo de llamada: get\_employees\_for\_booking(14275391)

Para filtrar empleados por una lista de IDs de servicios, pase la lista como segundo parámetro y deje vacíos job\_title\_id y service\_category\_id.

* Ejemplo de llamada: get\_employees\_for\_booking(14275391, \[844, 845])

Para filtrar empleados por puesto, pase el ID al parámetro job\_title\_id y deje vacíos service\_ids y service\_category\_id.

* Ejemplo de llamada: get\_employees\_for\_booking(14275391, “”, 1021)

Para obtener empleados que prestan servicios de una categoría específica, deje service\_ids y job\_title\_id como cadenas vacías y pase el ID de la categoría seleccionada a service\_category\_id.

* Ejemplo de llamada: get\_employees\_for\_booking(14275391, “”, “”, 1019)

### Ejemplo de uso:

Llamada de la función en un bloque de código:

<figure><img src="/files/92f0e8591c4fd7dd5aa1c925ae6f159d02e73fd2" alt=""><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="/files/ee4a59a5c070e062e53a0d7e3d12012c0c7dbaa2" alt="" width="375"><figcaption></figcaption></figure>

## Obtención de información sobre los servicios

Para obtener información sobre los servicios prestados por la sucursal, use la **get\_services\_for\_booking** función.

Como resultado de la llamada, el bot devolverá una lista que contiene datos de los servicios. Cada elemento del servicio incluye un identificador (**id**), un nombre (**title**), una descripción (**description**), un precio (**price**) y la duración del servicio en minutos (**duration**).

Puede filtrar la lista resultante por categoría de servicio, por empleado o por ambos, categoría de servicio y empleado, simultáneamente. Para ello, pase los parámetros adicionales **service\_category\_id** y/o **employee\_id** al llamar a la función.

#### Orden de los parámetros:

company\_id -> service\_category\_id -> employee\_id

**Parámetros:**

<table><thead><tr><th width="310"></th><th></th></tr></thead><tbody><tr><td>company_id (obligatorio) </td><td>Identificador de la sucursal, formato esperado – entero;</td></tr><tr><td>service_category_id (opcional) </td><td>Identificador de la categoría de servicio, formato esperado – entero;</td></tr><tr><td>employee_id (opcional) </td><td>Identificador del empleado, formato esperado – entero;</td></tr></tbody></table>

#### Nota para la sección “Parámetros”:

Si desea obtener todos los servicios de una sucursal, deje **service\_category\_id** y **employee\_id** los valores vacíos.

* Ejemplo de llamada: get\_services\_for\_booking(14275391)

Si desea filtrar los servicios por categoría y/o empleado, introduzca los identificadores correspondientes en los **service\_category\_id** y **employee\_id** parámetros. Para filtrar por un solo parámetro, proporcione una cadena vacía para el otro.

Ejemplos de llamadas:

* get\_services\_for\_booking(14275391, 1018) - filtro por categoría de servicio;
* get\_services\_for\_booking(14275391, “”, 512978) - filtro por empleado;
* get\_services\_for\_booking(14275391, 1018, 463665) - filtrado por ambos parámetros;

### &#x20;Ejemplo de uso:

Llamada de la función dentro de un bloque:

<figure><img src="/files/7aaae96b8b5b115acdd233df3aa5aee7d7081fed" alt=""><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="/files/2f15b21b9c4f193aabe3786db91a91290c42f543" alt="" width="375"><figcaption></figcaption></figure>

## Obtención de fechas de reserva disponibles

Después de que el cliente haya seleccionado los servicios para la reserva, necesita obtener una lista de fechas de reserva disponibles.

Para generar esta lista, use la **get\_dates\_for\_booking** función.

La función comprobará los intervalos de tiempo disponibles y devolverá una lista de fechas adecuadas en el formato “día.mes.año”.

#### El orden de los parámetros es el siguiente:

company\_id -> service\_ids -> employee\_id -> days\_limit

#### Parámetros:

<table><thead><tr><th width="309.33941650390625"></th><th></th></tr></thead><tbody><tr><td>company_id (obligatorio) </td><td>identificador de la sucursal, formato esperado – entero;</td></tr><tr><td>service_ids (opcional)</td><td>lista de identificadores de servicios para la reserva, formato esperado – entero o una lista de enteros entre corchetes separados por comas (por ejemplo, 842 o [842, 843]);</td></tr><tr><td>employee_id (opcional)</td><td>identificador del empleado, formato esperado – entero. Si el valor del parámetro se deja vacío o se pasa como una cadena vacía “” – la función buscará fechas disponibles entre todos los empleados que presten el conjunto completo de servicios de la lista service_ids;</td></tr><tr><td>days_limit (opcional)</td><td>número de días a partir de la fecha actual dentro de los cuales se realiza la búsqueda de fechas disponibles, formato esperado – entero, valor predeterminado – 14 (días);</td></tr></tbody></table>

### Ejemplo de uso:

Llamada de la función dentro de un bloque:

<figure><img src="/files/1835a33bb11dc2031a9831717d53f0b7f022a59b" alt=""><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="/files/856d6ddd15f5cbf62782afe9ab71a861c93f9619" alt="" width="375"><figcaption></figcaption></figure>

## Obtención de franjas horarias de reserva disponibles

Para obtener una lista de franjas horarias de reserva disponibles, use la **get\_slots\_for\_booking** función.

La función comprobará el tiempo disponible en la fecha seleccionada y devolverá una lista de franjas libres en el formato “horas:minutos”, por ejemplo \[“09:00”, “11:00”, “14:30”, “16:00”].

#### El orden de los parámetros es el siguiente:

company\_id -> service\_ids -> employee\_id -> slot\_interval

#### Parámetros:

<table><thead><tr><th width="284"></th><th></th></tr></thead><tbody><tr><td>company_id (obligatorio)</td><td>identificador de la sucursal, formato esperado – entero;</td></tr><tr><td>service_ids (opcional) - </td><td>lista de identificadores de servicios para la reserva, formato esperado – entero o una lista de enteros (por ejemplo, 842 o [842, 843]);</td></tr><tr><td>date (opcional) - </td><td>fecha para la comprobación de franjas, formato esperado – cadena en la forma “día.mes.año”, por ejemplo “01.01.2024”;</td></tr><tr><td>employee_id (opcional)</td><td>identificador del empleado, formato esperado – entero. Si el valor del parámetro se deja vacío o se pasa como una cadena vacía, la función buscará franjas libres en los horarios de todos los empleados que trabajen en la fecha seleccionada y que presten el conjunto completo de servicios de la lista service_ids;</td></tr><tr><td>slot_interval (opcional) </td><td>intervalo en minutos entre las franjas disponibles, formato esperado – entero, valor predeterminado – 30 (minutos);</td></tr></tbody></table>

### Ejemplo de uso:

Llamada de la función en el bloque:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXc7GJ9EjdCro_idrF14dVYscslN653oUESQaAFjHBWZrSO8q4joGD95kXjFfaX-E2oRT_nLCdKNrGdN9j5wBVJFKOgiyG2ZGDJNjR-l3OAhvP2E0pPTA0dOiYD3WxGdxdD57bRO-UC3CoGVVO4XV3Cq5BNpc8cZ1S6S0lsnlw?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe6V_i1iPe4C6A6CDJPu6GNK4fFLzUzq4ktYRRf01jRRgvRl87Ir3hWs2GbWRsYatbz0o8srDyE6pHklrvZ129tilNr5fuR9C_lhQP75MO-_Mfi9JVgcTvHoldK6Y8dcZ_cQamJp2JDxBfA8OU3a9cDgPavncaz-9aU_p31qg?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

## Creación de una reserva

Para crear una reserva en línea, use la **create\_booking** función.

Si la reserva se realiza correctamente, la función devolverá información sobre el estado de la operación (status) con el valor True y los detalles de la reserva (booking) en formato “clave: valor”.

Los datos de la nueva reserva incluyen:

* identificador (id),&#x20;
* fecha (booking\_date),&#x20;
* hora (booking\_time),&#x20;
* nombres de los servicios (services),&#x20;
* duración de la reserva (service\_duration),&#x20;
* coste total (total\_cost),&#x20;
* nombre del empleado asignado (employee\_name) y su puesto (job\_title),&#x20;
* nombre de la sucursal (company\_name) y dirección de la sucursal (company\_address)&#x20;

en formato “clave: valor”.

#### Orden de los parámetros:&#x20;

company\_id -> service\_ids -> booking\_date -> booking\_time -> employee\_id

Parámetros:

<table><thead><tr><th width="288"></th><th></th></tr></thead><tbody><tr><td>company_id (obligatorio)</td><td>identificador de la sucursal, formato esperado – entero;</td></tr><tr><td>service_ids (obligatorio)</td><td>lista de identificadores de servicios para la reserva, formato esperado – entero o una lista de enteros (por ejemplo, 5 o [5, 10, 15]);</td></tr><tr><td>booking_date (obligatorio)</td><td>fecha de la reserva, formato esperado – cadena en la forma “día.mes.año”, por ejemplo “15.01.2024”;</td></tr><tr><td>booking_time (obligatorio) </td><td>hora de la reserva, formato esperado – cadena en la forma “horas:minutos”, por ejemplo “12:30”;</td></tr><tr><td>employee_id (opcional)</td><td>identificador del empleado, formato esperado – entero. Si el valor del parámetro se deja vacío o se pasa como una cadena vacía “”, la función reservará con un empleado aleatorio que preste el conjunto completo de servicios de la lista service_ids, si están disponibles en la fecha y hora especificadas;</td></tr></tbody></table>

### &#x20;Ejemplo de uso:

Llamada de la función en el bloque:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdb3Fq2gqGtJ-QK342Hr12Ckv-krW_04_uAeJsCcnKpCq_iTC8mAxXjXvc_UqOVAOfm7WGcHYlfcvZjImoZXoNuPYCctsZOPB35toHI4zWMmK-sr3GoEdujlh8YQRxXsF_qN-I836wsU3AKhMvP8t0KiF0h6syWhECIxsynkQ?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Ejemplo de una respuesta de reserva exitosa:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfsZPfW9v1VoJqC3nNqtnlLQJS-KhAaEi3uUzhz26vYmcxajMRMwd7NnZVZB2LpmavglbNibSpAAJIlo0mbge1_K6rguZTf1tE4NxkBPmKQ1GCy0x47vzfkIV5DTN-R-RlYpMZ-bfAQ-vrZ_tEM6mugSbn0E5BAjHCVN2Gdmw?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Al crear reservas y posteriormente solicitar nuevamente las franjas disponibles, notará que las listas se han acortado. Por ejemplo, el 05.02.2024 la franja de las 18:00 ya no está disponible (solo estaba libre en el horario de Victoria), y para Paul Thompson, las reservas para un corte de pelo masculino y arreglo de barba ahora pueden hacerse de 9:00 a 14:00, ya que la duración total de los servicios es de 1 hora y 45 minutos, y Pavel ya tiene otra reserva a las 16:00.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfglzV1DHx8clVfshVMInDi9MOS6sAlPGG8Axr6FYKBAeINwRaj2gvJMRYNcec7ZmDCnFKYCkU64AQqz2mgMWxCnp4G4YPRPb6C9D9g9KLKFM2e2bCVpBA2refY_fChq-W1uNy196r5d8dNZUudGRg-2qgN9NX20lCteL8AZw?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

## Obtención de información sobre las próximas reservas de un cliente

Puede ver las reservas actuales de un cliente llamando a la **get\_bookings\_info** función.

La respuesta devolverá una lista de reservas activas, junto con información detallada de cada reserva.

La información de la reserva se proporciona en formato “clave: valor” e incluye:

* identificador de la reserva (booking\_id),&#x20;
* fecha (booking\_date),&#x20;
* hora (booking\_time),&#x20;
* identificadores (service\_ids) y nombres (service\_names) de los servicios seleccionados,&#x20;
* duración de la reserva (booking\_duration),&#x20;
* coste total de los servicios (total\_cost),&#x20;
* identificador (employee\_id) y nombre (employee\_name) del empleado asignado, y su puesto (job\_title),&#x20;
* identificador de la sucursal (company\_id)&#x20;
* nombre de la sucursal (company\_name) y dirección (company\_address).

#### Parámetros:

<table><thead><tr><th width="253"></th><th></th></tr></thead><tbody><tr><td>client_id (opcional)</td><td>ID del cliente, req – Este parámetro es obligatorio si desea obtener las reservas de un cliente específico; de forma predeterminada, se utiliza el ID del cliente del chat con el bot.</td></tr></tbody></table>

### Ejemplo de uso:

Llamada de la función en el bloque:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeKlJcFxIx3cc_3vb8g0MARiqu6iNE4eW8BEmVY21MjT74GxS2U7JKFaAn6Sia99v4kQ4O8HuHFYkQJs8jCNmtpZHIkKq1SZ3_3BCBSA7mCs_iXVk6Ucu8hWTOHN7mPa0J5LGG5QSRK8TSP9BEZracVVNQBZKuZkLJx36r_TA?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Ejemplo de datos devueltos:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcHzfzRWdUXAmr-iwrHhcdpHYraOD--i4jjI5ftsc-KRzzEOOFArT3hKZE--WucI4m3_b2v0DK99dV4EL2BQ9d0U2q-2fGHM6RiCHX_YUl7kgI-SA4zJIHs4zFte6GhgQAMfUY9Qim4THusxMhKielEnXQuHzapLqmh_oZm?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

## Cambio de fecha y hora de la reserva

Un cliente puede cambiar de forma independiente la fecha y hora de la reserva. Para ello, debe acceder al bloque del embudo donde se llama a la función **modify\_booking\_time** .

Si la operación se realiza correctamente, la función devolverá el estado de la operación (status) con el valor True y un mensaje (message) “Booking time modified” en formato “clave: valor”.

#### Orden de los parámetros:&#x20;

order\_id -> new\_date -> new\_time

#### Parámetros:

<table><thead><tr><th width="300"></th><th></th></tr></thead><tbody><tr><td>order_id (obligatorio) </td><td>identificador de la reserva, valor esperado – entero;</td></tr><tr><td>new_date (obligatorio)</td><td>nueva fecha de la reserva, formato esperado – cadena en la forma “día.mes.año”, por ejemplo “16.01.2024”;</td></tr><tr><td>new_time (obligatorio)</td><td>nueva hora de la reserva, formato esperado – cadena en la forma “horas:minutos”, por ejemplo “14:30”;</td></tr></tbody></table>

### Ejemplo de uso:

Llamada de la función en el bloque:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcDyllYwQDcuLOWIAFTCHb4A765baTgyFrir86V0h3ja3OQpECP2D5TszmK-M_PbKmQRVbp1LFLUMc_JIU4m9562kGnWz9WILVhjpMhf1jZw5bOUXCuBbUasMKWeaTo0pATOPujX4QK6laEk2TlXPU6Qycc7xlih1KbEBxK?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Respuesta del bot para una operación exitosa:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdKqYrp28WS18aq3-_0I_3iDJUc2FmzwsilP1-5do9jmVjjVJ3Igfflo9rMnU_KEWWdAUYSZtjp6B0bVxwBcc7P21RvWVIeCOEAq0pNEh1KYDxJATu71S1Fiil4gicJeFuq5MAcp7bnQdUqRf8kjrWMXuA2_Fl09tjKwEPI?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

La franja ocupada anteriormente de las 16:00 ahora está disponible para reservar, y crear una nueva reserva para los mismos servicios ahora solo puede hacerse desde las 11:00

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeM-8-vu5dfYf4DlMnzlWTk08tQm80ne-qTBJleANK0Mjn-TuZWyMbO13Hex4FzdwvCgQspNeErgWwQkTZIejzDWK1BItCGxrLpAi9D0XFx75rqFvUF9UChQ_LoZqUNozZzKwubmGkx7XSgsTm-_1CBORCt5Nidh5X4ohbx?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

En la información de reserva del cliente, también verá la hora de reserva actualizada:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeCyMMrRSlqAdCpmu0-HWsS6iKxW6xHjdtcnZ2NjxLTaRy7W_w3mhyLZQ2PjZgpvbmHRnRML-5A6hTwHpgpLaTerklX-opM8_UTQAeuT-ev2bd7AvC6N1ynPf50EUVRs6m4hZU4YIKnWQRamRcGbror5uJ7ElZ2v2KPtX1NxQ?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

## Cancelación de una reserva

Un cliente puede cancelar de forma independiente una reserva existente. Para ello, debe acceder al bloque donde se llama a la **cancel\_booking** .

Una cancelación exitosa devolverá el estado de la operación (status) con el valor True y un mensaje (message) “Booking deleted” en formato “clave: valor”.

Orden de los parámetros:

pipeline\_id -> order\_id

Parámetros:

<table><thead><tr><th width="321"></th><th></th></tr></thead><tbody><tr><td>pipeline_id (obligatorio)</td><td>identificador de la sucursal, valor esperado – entero;</td></tr><tr><td>order_id (obligatorio)</td><td>identificador de la reserva, valor esperado – entero;</td></tr></tbody></table>

### Ejemplo de uso:

Llamada de la función en el bloque:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdWFqf619l5j1eQoe4p6QCPqGGsqcyEefKLs5PJxPwecillJaxUnQSC5eHFcT2olsrM62PHJDVGyxeD6Tl2xg3id27f-p51spmVZFjlDhSwzw3TwMx-CbQT9n3fnjYLPCO4wlqtKdB0cd1W36dp9wXYg4gEVJh6eketyDUQ?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Respuesta del bot para una cancelación exitosa:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe7FcrjKQxzoEgo3wfMuUt0a9zkPVkb02ojx5pZ3KYWU5NfLazmLhgCaNxvigreYXXfzYFEhd5KyF7D3808VLBGl5Cte7YRXI0cWQK3J9ZV05G5y5XUIXGq1Arcac2KrPmHnCCakarcTFXd_9X5_4yYsI6j4rpMySaZr3lA?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

Después de la cancelación, las franjas “09:00” y “10:00” vuelven a estar disponibles para reservar:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcRLLDJ0un8QPUj11yC8VDy2TlbbgUHuDd13YSQ3AZU3ey4Cg00SMEke5LFPKWGHR8em7BWHiH8l-bSqGICNAU5CP9ORBGI9CFMKziB0JQLZA0QUvYJ8q-SXXQGQsPCnEWdNrDZ1G7bZupR4zOLgGpJt9TgZBxG_R1MPf9f?key=KyjJFgzVYb53MOCGur8CUg" alt=""><figcaption></figcaption></figure>

## Ejemplo de implementación del bot

### Configuración del chatbot

**Bloque nº 1.** Inicio. No se requieren acciones especiales

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcXoXRmydVuSiBv9lAWBG-5rDy8cIcNbk2zjsJ7o5kxShJEExU13A9O2v9pFuqG6oTndOvrnRft3jHQaZFf-7RGYiFM09FPzpQdrdS47_ttQcgLvbDExj9xIBEjJ80qVPHSAFzfth5zcO_rCvqk66FaK-Nx?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption><p>Bloque 1.</p></figcaption></figure>

**Bloque nº 2**. En este bloque, obtenemos los datos que se proporcionarán al cliente.

Descripción del contenido de la calculadora:

* comp\_id - identificador del bloque de servicios, que se puede encontrar en la sección “Servicios”;
* data - información sobre los servicios proporcionados
* res - diccionario con los datos necesarios para generar botones y establecer condiciones
* numbered\_list - puede ser útil si la lista de servicios necesita duplicarse en forma de texto
* buttons - array de botones generados a partir de los datos del servicio
* checker - array de nombres de servicios, usado para establecer condiciones para pasar al siguiente bloque

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdLGPcvhDRumGklk525zCB4VEqziavYPoNoqJiC3XD036d1R_jcSF2yeDhFZvrTOTxFrALYNF9_ezfdbKxgn6fSuIkTyCzHb9Cxaw3cW9ywtyUbvf3Bezb3ukuZC3fFuM5e0Jb8tNCyWRqUv-8aev2MHeo?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption><p>Bloque nº 2</p></figcaption></figure>

**Bloque nº 3**. Obtener y mostrar datos sobre el servicio seleccionado.

title - en el array de diccionarios **data**, encuentre el diccionario donde la clave **title** sea igual a **question**. De ese diccionario, obtenga el valor de la misma clave **title**

description - de manera similar, obtenga el valor de la clave **description**

price - de manera similar, obtenga el valor de la clave **price**

serv\_id - de manera similar, obtenga el valor de la clave **id**

b - cree un array de cadenas que se mostrarán como botones debajo del mensaje

res - a partir del array **b**, cree un array de diccionarios como en el bloque anterior

buttons - obtenga el array para mostrar los botones

Ahora tenemos variables que contienen el nombre, la descripción y el precio del servicio seleccionado por el cliente

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfoMVt3v-buSCBlpe9hKGoFoemSKQW0oeLLZ7LZwZ24vR507mCOTzuewDhUsfCangNsex0sKbdc9k-HeJXQ-ermTNsf_p3O4xtlpygOhFmzyWZ2cjCDxHUUdZq0gCsiSGJmSWIkN04n4XOkpX2t6nHVORhb?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption><p>Bloque nº 3</p></figcaption></figure>

**Bloque nº 4.** Mostrar las fechas de reserva disponibles

print\_dates - use la función para obtener las fechas de reserva disponibles para el servicio seleccionado

print\_dates - añada la cadena “Volver a la lista de servicios” al array de fechas si desea que este botón aparezca junto con las fechas.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeNbqnf6RHcvKlt8ECsxm7uUQpLClSJ2kVgW9HPi35Pmq5XtsAR_yXWCxHr_0CYwJ4whUQfdof71uxnPt8BHxobfYJdxGeDhmf3BXd5NHAPyC12RT6cRIzn8g_Kda70WRAhjYhJ85Vfhi9i40aqUu-Kvg8E?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

Para la flecha que vuelve al paso anterior, establezca una prioridad más alta que la flecha con #{checker}, porque #{checker} también contiene la condición “Volver a la lista de servicios”.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcuUIlqDrtiEGIX7Dk8d1YILa_s9F2bRzrgcgQ_eytukzhEe2IDatqW7VPPgyQeLfzOYqtY-vL2rdCaGYSf3PSRpe4JSXlHD68TJHrOHec6tBRvMOp_sIMs3bqWAQKX9jWPDsWjY-CGQnZEc8QPr2ZGikXQ?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 5.**\
En el bloque nº 5 guardamos la fecha seleccionada por el cliente. Esto debe hacerse en un bloque aparte porque en las siguientes etapas, al regresar al Bloque 6, la variable question ya no contendrá la fecha seleccionada por el cliente.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfBnoXAoC-hwhm7MJk242wb1qbGz4qwZr-L180d271_eNanul0suKBZUdiYAy95nTZD7rVZv5bYgnB8dZ3u0pW75yMtdz2mQ6bzqTTAxEhVZAihD-VCj-45M9jldb6Ic_JuyDEWsvlodPlxY-2150k62HuW?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 6.** Selección y visualización de las franjas disponibles para la reserva.

data - obtenemos las franjas disponibles.

La lógica es la misma que en el Bloque nº 4 con la salida de fechas disponibles. También es importante no olvidar configurar una prioridad mayor para la flecha “Volver a la selección de fecha”

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdO4UUM3CyFvJN5lNulwUwHbEWQhng6kaW_YVmOrbkP-2VoQHB3Sg09TkpPv5joYo3EV_9iaFI68B4dfgzL49RveaMzZHQIOs7mKyzFgsA6PKrwrKM0oMKZVGMZjbyz2rxIi0kpaOZFZIStEzUvASiyunli?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 7.** Guardado de la hora seleccionada en una variable e intento de reservar al cliente.&#x20;

choosed\_time - guardamos la hora

a - intento de reservar al cliente

booking\_result - obtenemos el resultado de la ejecución de la función.&#x20;

Es necesario obtener el resultado, ya que varias personas pueden intentar reservar a la misma hora al mismo tiempo.&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXczzYBOEvinNi3ixDewD_V6XrrfAwjChrujdPmo7MK1m1qV-8depW4IV8_-VxA6_u2RKwTBYifAi4q5kxN1OEG_6m9exNS-hAvtB2VH49kP-X5uuAboxpgb--ugGdit-JI6inwRHXMQtbPbqSy-oe3ZvLi_?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 7.1.** No se pudo reservar al cliente.

Este bloque solo se necesita para mostrar el mensaje de error. Después de enviar el mensaje, devolvemos al cliente a la selección de hora para la reserva

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXflFxwu5IdfEsIzK1dpt4STbIc6GY2HDz-NvpW6vmG12aBRj5TWgaN2O_YWlLaCSN3B52bMDf8EIMo2kKofNkTzD_TqRWu7F5rEL1NiFrlPiJwLntEG9DgdSKYocFtNQMADKTMJFHADE4fPUgeFJJ5crM3y?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 8.** La reserva se ha realizado con éxito.

Informamos al cliente que está reservado para el servicio y mostramos el botón para el pago.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXebWZ4RSKanJHHLwJmqRzx_sQAwEqpnz7hMmMOqJziY9J4IpSAPevmApHRz_oR3GEIuceV_IOAi1XdpUMqNtgC5nI-vB75hIq_9NDudNSGzYESotA-rl-WCFjLtcVQA6kiFvcDvij0koA2ttg4NVvwwiQI?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

Ejemplo de configuración de botones.&#x20;

Para la configuración usamos las variables que obtuvimos en el bloque nº 3:

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcuWNRouJXZN4GcbOP_g5b2cBGtzMjW3t20fJDYvPqy02QHr_Mx7seJfSJSjnieOxRiuZ2eQ8F8iJEcBkllOYNYR4cXYGFfuK69jsVhnLUuq-3a2a5Lts8UXEJyP1m0DvNoEmyDiMcXXpLQX8srFEgvnSo?key=Gdkru5ZyRiCm0ujtl74quw" alt="" width="375"><figcaption></figcaption></figure>

**Bloque nº 8.1.**

En este bloque confirmamos el pago exitoso. Configuramos la transición al bloque de acuerdo con el sistema de pago utilizado

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcKwiimzQWaWQdY87DhVF0EHgXGIN1am1ybhpQIN2ZjubanvoORX4nF86oxQfeDUH0rSfPPLQp4BVRDYJh0wMWQRp-ko-Dm8PmWeBPyA9KvPiSwDt6GkzUrsFw9ITDDjH7-JsG97mxgwZ_8OtCMFVVkhPza?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

**Bloque nº 8.2.** El cliente no pagó el servicio. Cancelación de la reserva

Si el cliente no paga el servicio a tiempo, podemos cancelar la reserva si es necesario.

or\_id - obtenemos el id del pedido

cancel\_status - después de ejecutar la función obtenemos la respuesta de si la cancelación se realizó correctamente.&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe0S7A8roVZ-cqy20A7SABHlZEH561HeUudCIFcTEmV19DibNgEWLoEqZ45pWtukMuEdaxuJ1KjsvAiR7hFeGCrNLIMBghZIglifArlGWnBA1O6uKfGoeHRyfYihmIH1EalHVrqOKJKW6AsvOraqTIM2k6j?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

En este ejemplo, el cliente pasará al bloque de cancelación 5 segundos después de recibir el enlace de pago; en una situación real, puede establecer la cantidad de tiempo necesaria, solo no olvide activar el interruptor “Cancelar si salió del bloque”.

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf4JnYF9gJdYh1IeHnh0KIP8TBthzNABp_TjejLyQXugQBBb_Xvz4yfoedExR9VJy6koxfpNqGkYe38fioTFrzuuioJjVVVp2HLB9w8gRt5LqMcFX5samcaj30aBLV69MVTCNrg2bEbnVaoxv5IuUidtB3Y?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

Esquema completo:<br>

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXelLMX7_UQ0Op_QDn8S-GKMp68O-cJDYMFviZLju8TUjMMYKIMwyv9AePru93ccedeKajHSx4kP5e4t1XFfAtabSJBfluvE7q-VsZkx1rO3ICGBm0dvVUtEriaro8UXixY6XratDgILrSOMHfXIpfaHb8Y?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

### Demostración<br>

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcgQC7kI1xOkzZOYyijAdDELqmlgit1O615fU0RQjYF-g-ztgkNayFf2gaPupplvgiAoE1T_bOdSh-dLO4Oaqu2AVnmh-5uooWhCc3BOqqdIzgQh6gV4r3l86VJHRgXEOZTmKD3HqbXoTuRrpZ8qYJOj4Ol?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcMs9Sg7IOqKfcvVdL5ud1odnPrlHg0Acfa71bnpFAfmQ_7GP4AsKI7JI2GVzAQZV9a2d0jMGmFamGiuD_mMG00SsfAQZvje_aPGybcmsKBU0F2VpTbv5H9qPPA5gszFwQyZaaG3TH9HDutSZE19JzNo5nV?key=Gdkru5ZyRiCm0ujtl74quw" alt=""><figcaption></figcaption></figure>

## Callback de reserva

En el diálogo con el cliente, después de la reserva, llegará un callback —notificación de reserva— del siguiente tipo:

<figure><img src="/files/ab12c3c1d2aa4aadf08b3fb05e66c39cc9cfae1a" alt="" width="464"><figcaption></figcaption></figure>

<mark style="color:orange;">**new\_order\_in\_calendar**</mark> - parte inmutable del callback&#x20;

&#x20;<mark style="color:yellow;">**\[489046159]**</mark> - order\_id identificador de la solicitud&#x20;

<mark style="color:red;">**Se añadió la reserva fecha\_y\_hora\_de\_la\_reserva**</mark>

<mark style="color:purple;">**durante 30 minutos**</mark> - duración del servicio&#x20;

<mark style="color:red;">**Al objeto: Test 30**</mark> - a qué objeto exactamente se añadió la reserva

Aspecto del callback:

***`new_order_in_calendar: [489046159] Se añadió una reserva del 2025-06-01 14:00 al 2025-06-01 14:30 durante 30 minutos. Al objeto: Test 30`***

Puede configurar la reacción al callback escribiendo el valor en la condición del bloque:

<figure><img src="/files/9e4456194a8824270361eaea0391c931f5be06b1" alt=""><figcaption></figcaption></figure>

En el bloque se puede escribir el mensaje de respuesta necesario para el cliente.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/es/booking/chatbot.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
