# Variables

## Cómo usar variables

Vamos a explorar qué son las variables y cómo usarlas de forma eficaz al crear chatbots en MaviBot.

{% hint style="danger" %}
**Ten en cuenta los siguientes límites del sistema para variables y constantes dentro de un solo proyecto:**

**Variables de plantilla:**

* **Cantidad máxima:** 100 variables
* **Longitud máxima del nombre:** 100 caracteres

**Constantes del proyecto:**

* **Cantidad máxima:** 50 constantes
* **Longitud máxima del nombre:** 100 caracteres
* **Longitud máxima del valor:** 5.000 caracteres
  {% endhint %}

Una variable es una ubicación de almacenamiento con nombre para datos, identificada por una etiqueta de texto única.

<div data-with-frame="true"><figure><img src="/files/7ae51dd0b544048d37a864e319548d10798bbcfa" alt=""><figcaption></figcaption></figure></div>

&#x20;                                          *Fig. 1: Una variable llamada `total`, que almacena un importe de pago*.

MaviBot proporciona varios tipos de variables:

1. [Variables integradas ](#built-in-variables)
2. [Variables del sistema](#system-variables)&#x20;
3. Variables definidas por el usuario: estas son las que creas tú mismo dentro del proyecto.

**Declarar una variable** significa asignar un valor a un contenedor con nombre. En otras palabras, una instrucción como ***a=0*** es la declaración de la variable ***a***. Acabamos de decirle al constructor que almacenaremos un número en la variable ***a***, y por ahora, ese valor es ***0***.

**Asignar un valor a una variable** tiene el mismo significado.

Las expresiones **"asignar a una variable el valor de una función"** o **"establecer una variable igual a una función"** también se usan comúnmente. El principio es el mismo: en lugar de asignar un valor específico, asignas el resultado de una función. Por ejemplo: **s\_id = tg\_send\_message(platform\_id, "¡Hola!")** En este caso, el resultado de la función se almacenará en la variable.

**Restablecer una variable** significa asignarle el valor **0**.

[**Funciones y métodos**](/doc/es/chatbot/functions/variables.md#functions-for-working-with-variables)  son conjuntos predefinidos de comandos que MaviBot configura de antemano. La mayoría de las funciones requieren parámetros: valores que la función o el método puede entender. Una vez que el bot recibe los parámetros necesarios, ejecuta un comando específico.

**`tg_send_message(platform_id, "¡Hola!")` —** esta función envía el mensaje "¡Hola!" en Telegram.

<div data-with-frame="true"><figure><img src="/files/80d0d744b6751feb095227d62688b015b3a18304" alt=""><figcaption></figcaption></figure></div>

<p align="center"><em>Fig. 2. Ejemplo de una variable llamada text1 asignada a una función.</em></p>

### <mark style="color:rojo;">**REGLAS PARA TRABAJAR CON VARIABLES:**</mark>

1. El nombre de una variable solo puede empezar con **una letra**; no puede comenzar con un número.

   **Age1 - ✅ correcto**  &#x20;

   1Age - ❌ <mark style="color:rojo;">incorrecto</mark>

   **age1 -** **✅ correcto**   <mark style="color:azul;">- opción recomendada</mark> <br>
2. Una variable no puede contener espacios ni caracteres especiales, excepto el guion bajo (\_).

   **Name\_Surname - ✅ correcto** &#x20;

   Name Surname - ❌ <mark style="color:rojo;">incorrecto</mark>

   **nameSurname** **- ✅ correcto**   <mark style="color:azul;">- opción recomendada</mark><br>

   Las palabras reservadas de los lenguajes de programación no se pueden usar como nombres de variables, por ejemplo: print, true, false, count, sum, etc.<br>
3. <mark style="color:$primary;">Está</mark> <mark style="color:rojo;">**estrictamente prohibido**</mark> <mark style="color:$primary;">usar</mark> usar los nombres de las variables integradas y del sistema para variables definidas por el usuario. Puedes encontrar la lista de estas variables aquí. <mark style="color:rojo;">**ссылка**</mark>
4. <mark style="color:azul;">**Recomendamos:**</mark>
   * Usa nombres latinos (inglés) para las variables.
   * Usa nombres de variables cortos pero significativos, por ejemplo: totalSum, pay\_name, <mark style="color:rojo;">**ns**</mark>, name\_client, etc.

### Cómo obtener el valor de una variable

Coloca el nombre de la variable entre llaves **#{}**. Puedes referenciar su valor en el campo de texto del mensaje de esta manera. Sin embargo, en el campo "Calculadora", debes referirte al valor de la variable simplemente por su nombre, sin ninguna sintaxis adicional.

{% hint style="danger" %}
El **#{}** la construcción te permite recuperar el valor de una variable. Se usa en el campo "Texto del mensaje" para insertar el valor de la variable en el texto.
{% endhint %}

Ejemplo:

<div data-with-frame="true"><figure><img src="/files/f7045c4ee9acb475ea7e3dd85ca696d0301ba0ba" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="success" %}
El sistema admite variables anidadas, donde el valor de una variable forma parte del nombre de otra variable. Por ejemplo: **#{q#{test#{i}}}**
{% endhint %}

En el campo "Calculadora", haz referencia a las variables por sus nombres sin usar la notación #{}.&#x20;Por ejemplo, si tenemos dos variables: price (sum) y quantity (num).

`num = 10`

`sum = 1500`

<div data-with-frame="true"><figure><img src="/files/4b3343f4fbd1aa615f5745e37960863a3431c3b0" alt=""><figcaption></figcaption></figure></div>

### Cómo mostrar la suma total&#xD;

Introduce lo siguiente en la calculadora:

`total_sum = sum1 * num2` **✅ correcto**

<div data-with-frame="true"><figure><img src="/files/8bfdffb4a6ef90542ddaf46ecef4e8deea5c93b4" alt=""><figcaption></figcaption></figure></div>

**Cómo&#x20;*****no*****&#x20;hacerlo:**

`total_sum = #{sum1} * #{num2}` - ❌ <mark style="color:rojo;">incorrecto</mark>

### Cómo eliminar una variable del bot

Para eliminar (borrar) una variable, introduce una de las siguientes opciones en el campo "Calculadora":\
YourVariableName =\
o\
YourVariableName = ""

Después del signo igual, deja un espacio o usa comillas dobles (o simples).

{% hint style="warning" %} <mark style="color:rojo;">**¡Ten en cuenta!**</mark> Es importante usar el prefijo correcto para indicar a qué pertenece la variable.

Para variables a nivel de proyecto (almacenadas en la configuración del proyecto), usa el prefijo **project:**\
Ejemplo:&#x20;*project.YourVariableName =*&#x20;o&#x20;*project.YourVariableName = ""*

Para variables a nivel de cliente, usa el prefijo **client**:\
Ejemplo:&#x20;*client.YourVariableName =* o&#x20;*client.YourVariableName = ""*

Para variables a nivel de trato, no se necesita prefijo.
{% endhint %}

## Variables integradas

Aquí está la lista de variables integradas:

**#{none}** - ignorar el mensaje

**#{api\_key}** - token de API usado en llamadas a la API de Salebot

**#{attachment\_url}** - contiene el enlace al archivo adjunto

**#{attachments}** - una matriz JSON de URL de archivos adjuntos del mensaje del usuario

**#{avatar}** - enlace al avatar del usuario (se muestra en la sección "Clientes")

**#{client\_id}** - ID del cliente en el constructor, también usado en solicitudes API

**#{client\_type}** - el tipo de mensajero del que provino el cliente (valores descritos \[aquí])

**#{current\_date}** - fecha actual en formato dd.mm.aaaa, según la zona horaria del proyecto

**#{current\_time}** - hora actual en formato hh:mm, según la zona horaria del proyecto

**#{custom\_answer}** - la respuesta recibida del servidor especificado en el campo "URL de respuesta del servidor"

**#{message\_from\_outside}** - tipo de mensaje entrante. Valores posibles:\
\&#xNAN;*mensaje normal = 0*\
*mensaje enviado vía API = 1*\
*notificación de callback (fondo amarillo en el diálogo) = 3*\
*notificación de telefonía (fondo azul claro en el diálogo) = 5* \
*Esta variable se genera con cada mensaje entrante, pero no aparece en la tarjeta del cliente.*\
*Puedes usarla en el campo "Variable para comparación" para configurar condiciones para disparadores y conexiones de bloques.*

**#{date\_of\_creation}** - fecha en que el usuario fue añadido al bot o le escribió por primera vez

**#{full\_name}** - nombre completo del usuario (nombre y apellido)

**#{group}** - bot al que está vinculado el cliente (se muestra como "Vinculado al bot" en la tarjeta del cliente)

**#{main\_client\_id}** - ID del cliente principal entre un grupo de tarjetas de cliente vinculadas

**#{message\_id}** - ID del estado actual de la conversación con el cliente (por defecto, NONE)

**#{messenger}** - nombre del mensajero del que provino el cliente

\#{name} - nombre del usuario

\#{next\_day} - fecha de mañana en formato dd.mm.aaaa (útil para programar mensajes)

**#{order\_id}** - identificador del pedido (ID del cliente e ID interno del pedido separados por un guion)

**#{order}** - contenido del pedido enviado por el usuario

**#{platform\_id}** - ID del cliente en la plataforma de mensajería

**#{question}** - mensaje enviado por el usuario

**#{timestamp}** - marca de tiempo actual, incluidos los milisegundos

**#{time\_of\_creation}** - hora en que el usuario fue añadido al bot o le escribió por primera vez

**#{wa\_bot}** - número de WhatsApp al que el usuario escribió (útil para pasar a campos de CRM y distribuir leads entre managers)

**#{weekday}** - día de la semana como número (lunes = 1, martes = 2, etc.)

#### **valores de client\_type**

<table><thead><tr><th width="195.3359375">Valor</th><th width="211.8125">Mensajero</th></tr></thead><tbody><tr><td>1  </td><td>para Telegram </td></tr><tr><td>2  </td><td>para Viber</td></tr><tr><td>3  </td><td>para Facebook</td></tr><tr><td>5  </td><td>para chat en línea</td></tr><tr><td>10</td><td>para Instagram</td></tr><tr><td>14 </td><td>correo electrónico </td></tr><tr><td>16</td><td>Cuenta empresarial de Telegram </td></tr><tr><td>21</td><td>Cuenta de Telegram</td></tr><tr><td>22</td><td>TikTok</td></tr></tbody></table>

## Variables del sistema

El sistema genera automáticamente varias variables en tiempo de ejecución durante la operación de un bot. Puedes usar estas variables al crear tu bot. Aquí tienes una lista de las que podrían serte útiles.

{% hint style="info" %}
Puedes encontrar variables adicionales del sistema en la documentación. Están ubicadas dentro de las secciones relevantes para su uso.
{% endhint %}

**phone** - número de teléfono

**notSubscribed** - si la variable es igual a 1, el cliente se ha dado de baja de los mensajes y no recibirá ninguno

**clientBlocked** - el cliente está bloqueado y el bot no funciona para él

**story\_url** - identificador de la historia de Instagram a la que respondió el cliente

**viewed\_page** - página desde la que el usuario escribe en el chat en línea

**wa\_bot** - número de teléfono del bot de WhatsApp

{% hint style="info" %}
Para saber qué variables se pueden crear durante el pago, consulta las guías de integración de los servicios de pago en la sección "[Sistema de pago](/doc/es/pago.md)".
{% endhint %}

## Variables personalizadas

Las variables personalizadas se dividen en:

* Variables del proyecto (también llamadas variables comunes)
* [Variables de cliente](#custom-variables)&#x20;
* [Variables de trato](#key-deal-variables) (también llamadas variables regulares)
* [Constantes](#how-to-set-constant-variables)&#x20;

Cada tipo de variable se explicará a continuación.

{% hint style="info" %}
Evita usar los mismos nombres para distintos tipos de variables para prevenir confusiones cuando el Builder muestre o use un valor distinto del esperado.
{% endhint %}

{% hint style="info" %}
Al asignar un valor a una variable, es importante especificar su tipo usando el prefijo adecuado:

**client.** (para variables de cliente) y **project.** (para variables de proyecto). No se usa prefijo para las variables de trato.

El prefijo se omite al recuperar el valor de una variable.

Ejemplo:&#x20;Imaginemos que quieres crear una variable de proyecto llamada like para servir como contador de likes de tus clientes.

**project.like = 0 - declaración, hecha una vez**

En el bloque donde necesites contar los likes, escribe:&#x20;**project.like = like + 1**
{% endhint %}

{% hint style="info" %}
Orden de prioridad de las variables:&#x20;las variables de trato tienen la máxima prioridad, seguidas de las variables de cliente y luego las variables de proyecto.
{% endhint %}

#### **ID del mensajero (platform\_id)**

**ID del mensajero (platform\_id)** es el identificador del usuario/chat/canal dentro del mensajero. Para encontrarlo, abre la conversación con el cliente deseado en la sección "Clientes". En el lado derecho de la ventana de chat, ve a la pestaña "**Acerca del cliente** - **Variables del sistema"** o a la pestaña "**Todo"** .

El **`platform_id`** es una variable permanente generada por el sistema que representa el ID único del mensajero del usuario.

* **Persistencia:** Este ID permanece constante para un usuario. Incluso si eliminas su registro del constructor, su `platform_id` será el mismo al volver a registrarse.
* **Origen:** El ID lo asigna la plataforma de mensajería (por ejemplo, Telegram, WhatsApp) cuando el usuario interactúa por primera vez con el bot.

El siguiente ejemplo muestra cómo aparece el `platform_id` en una tarjeta de cliente.

<div data-with-frame="true"><figure><img src="/files/d57e1a41fd1537673ab120e07eafa86697b726ec" alt="" width="563"><figcaption></figcaption></figure></div>

La variable platform\_id existe tanto para usuarios normales como para comunidades, canales y chats.

Para obtener la **platform\_id** (ID de mensajero) de un canal de Telegram en el que el bot es administrador, simplemente envía un mensaje al canal desde tu cuenta personal. Esto creará automáticamente un diálogo entre el bot y el canal.

Puedes copiar el **platform\_id** valor del canal en la sección "Acerca del cliente".

En Telegram, el ID de mensajero de los canales siempre comienza con un signo menos (-). Al usar funciones, asegúrate de incluir el valor completo, incluido el signo menos.&#x20;

## Cómo usar variables

Las variables pueden usarse en disparadores, pedidos, respuestas de usuario, bloques y más. Veamos un ejemplo concreto al crear un embudo para una agencia inmobiliaria.

Así que vamos a crear un bloque de Inicio:

<div data-with-frame="true"><figure><img src="/files/ac0d5e2e218fcc190d0cd2cca563e3454764173b" alt=""><figcaption></figcaption></figure></div>

**Paso 1: Crea el bloque "Gracias"**

Crea un nuevo bloque con un mensaje agradeciendo al usuario por su información.

**Paso 2: Configura la transición**

En la conexión que lleva a este bloque, configura el siguiente disparador:

1. Activa el interruptor de **"El usuario introduce datos"** .
2. En la **"Campo de entrada de datos"** introduce el nombre de la variable: **`name`**.

<div data-with-frame="true"><figure><img src="/files/4c813e3543f9a0baf81b7ef26874ee2c4e32378d" alt=""><figcaption></figcaption></figure></div>

La entrada del usuario se almacena en la variable **`Name`** . Este valor puede reutilizarse en cualquier bloque posterior invocando la variable con la sintaxis `#{Name}` , como por ejemplo: `¡Bienvenido, #{Name}!`.

<div data-with-frame="true"><figure><img src="/files/6e63ff29c760b6d3805fa6044bf0d329674f8d5f" alt=""><figcaption></figcaption></figure></div>

El bot funcionará de la siguiente manera:

<div data-with-frame="true"><figure><img src="/files/6de72a772e032df121a730b4b9647e22e4371dd1" alt="" width="563"><figcaption></figcaption></figure></div>

Ahora vamos a complicar un poco más la tarea.&#x20;

En este mismo bloque, preguntaremos al usuario si está interesado en vivienda primaria (nueva) o secundaria (de reventa):

<div data-with-frame="true"><figure><img src="/files/d070f2bb942eace40bbc28fd6c4a29596fdd9830" alt=""><figcaption></figcaption></figure></div>

A continuación, crea conexiones desde los botones "Vivienda primaria" y "Vivienda secundaria" en el bloque "Chat".

<div data-with-frame="true"><figure><img src="/files/aa7d84b8a75ca3cf4d81259bd0cc207d79261ab3" alt=""><figcaption></figcaption></figure></div>

Ahora veamos la segunda forma de usar variables dentro de los bloques.

Selecciona el bloque de la derecha e introduce el siguiente texto en el campo "Calculadora":&#x20;**client\_interest = Vivienda primaria**. En el bloque de la izquierda, introduce:&#x20;**client\_interest = Vivienda secundaria**.

<div data-with-frame="true"><figure><img src="/files/7ae70cc98dd2f0eb6d5d16f4fa563cd613fb4173" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/839f0ed41a6f9ddc7a3bc08a8f35556e15abffde" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
Se asigna una variable al usuario cuando pasa a cualquiera de estos bloques. Podemos usarla más tarde al crear un pedido.
{% endhint %}

A continuación, preguntaremos al cliente sobre su presupuesto para comprar bienes inmuebles en estos bloques, y crearemos dos bloques más con flechas que conduzcan a ellos basadas en los disparadores de respuesta del cliente.

<div data-with-frame="true"><figure><img src="/files/cb69510e5ef3a3e32d24d4541d536c62bd360151" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/4f3ddcecace4883f5f6582bb1c68dcf30e231c4d" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/7758e0dc462737a28a028739a92f1ed9e9f9d4f6" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/fec7b551f76ecc3bb01aa9d843dfb63a02138ba2" alt=""><figcaption></figcaption></figure></div>

Desde el bloque **"¿Cuál es tu presupuesto?"**, crea una conexión y establece una condición de disparador para segmentar a los usuarios según su entrada.

1. En la configuración de la conexión, activa la casilla de verificación para **"El usuario introduce datos"**.
2. Asigna un nombre de variable (por ejemplo, `budget`) para almacenar la respuesta del cliente.
3. En la **"Variable"** campo, usa la variable integrada `#{question}` (que contiene el último mensaje del usuario) para crear una condición.
   * **Ejemplo:** `#{question} <= 1000000`

<div data-with-frame="true"><figure><img src="/files/e767825eda8463b98209afc78cece9c9f2fb64f8" alt=""><figcaption></figcaption></figure></div>

{% hint style="warning" %}
Para todas las conexiones a bloques de **"Leads"** activa **"El usuario introduce datos"** y define la variable.
{% endhint %}

También puedes definir una variable adicional directamente en el bloque **"Leads"** para proporcionar información más completa del trato.

<div data-with-frame="true"><figure><img src="/files/218d6587e0b20b774046472d4fda5800686f5b27" alt=""><figcaption></figcaption></figure></div>

Ahora cambia el tipo de los dos últimos bloques a "Leads" y mira los resultados:

Probemos el flujo en acción:

<div data-with-frame="true"><figure><img src="/files/06df5e4a7483db8ce14f606006757196fdda7f91" alt="" width="375"><figcaption></figcaption></figure></div>

Puedes revisar el trato creado y los datos almacenados del cliente yendo a la sección **"Clientes"** y abriendo la conversación correspondiente. Las variables del trato serán visibles allí.

<div data-with-frame="true"><figure><img src="/files/5d3e3becfc6043e3cd8d059e73c2d5bf938d480a" alt=""><figcaption></figcaption></figure></div>

Ahora ya sabes cómo usar variables de al menos tres maneras diferentes:

1. Asignar nombres de variables a los datos de entrada del usuario (por ejemplo, “Name”, “Budget”)
2. Asignar un valor a una variable al pasar a un bloque (por ejemplo, client\_interest = Vivienda primaria)

## Cómo ver variables

Para ver las variables de un cliente, ve a la sección **"Clientes"** y abre su tarjeta de cliente.

<div data-with-frame="true"><figure><img src="/files/ca3ebe71f76250331c6cadacd9137a50ea52dd5f" alt=""><figcaption></figcaption></figure></div>

Las variables se muestran en formato de lista dentro de la tarjeta del cliente:

* Cada variable ocupa su propia línea.
* El **el nombre de la variable** se muestra a la izquierda.
* Su correspondiente **value** se muestra a la derecha.

**Para modificar una variable:**

Pasa el cursor sobre su línea en la lista para mostrar un botón de acción. Al hacer clic en este botón, puedes:

* Editar el nombre de la variable.
* Editar el valor de la variable.
* Eliminar la variable por completo.

<div data-with-frame="true"><figure><img src="/files/10037a16391aa70806cb7d6fddfe06240bbee23a" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/dd140fc97b936b74fe157b41853d3c19bb327f40" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
¡Las variables del sistema no se pueden editar!
{% endhint %}

## Cómo configurar variables de cliente

{% hint style="info" %}
Las variables de cliente no se eliminan, restablecen ni pierden al usar el bloque "Fin de la recopilación de datos" (bloque rojo).
{% endhint %}

Una variable de cliente se puede establecer de dos maneras: explícita e implícitamente.\
Una forma explícita de definir una variable es establecerla en el campo "Calculadora" de uno de los bloques del embudo.&#x20;

Ejemplo: `client.age = 28` o `client.age = 28:`

<div data-with-frame="true"><figure><img src="/files/d98fcc21f7e08ae460a91bb5393b903f19d49c98" alt="" width="563"><figcaption></figcaption></figure></div>

La forma implícita es establecer una variable en el campo de entrada de datos de la flecha.

Ejemplo:

Vamos a crear un bloque donde pedimos el nombre del cliente, y también crear un bloque debajo:

<div data-with-frame="true"><figure><img src="/files/00350b5fa79043626f923b297560e68474c50e41" alt="" width="563"><figcaption></figcaption></figure></div>

A continuación, ve a la configuración de la conexión y activa la opción "El usuario introduce datos".

<div data-with-frame="true"><figure><img src="/files/e5c754e14bcb1a6e4ef40bd925ceff597b3a1bb1" alt="" width="563"><figcaption></figcaption></figure></div>

Usa la `client.` prefijo al nombrar tu variable (por ejemplo, `client.name`) para almacenar la entrada del usuario. Luego, esta variable puede referenciarse en mensajes posteriores como `#{client.name}`.

<div data-with-frame="true"><figure><img src="/files/48d9a82dd2f154dc876fbf67019276803a7f8bff" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="success" %}
Las variables de cliente se usan exactamente igual que las variables normales en el constructor, pero sin el **client** prefijo.
{% endhint %}

## Cómo configurar variables de proyecto

{% hint style="info" %}
Las variables globales no se eliminan, restablecen ni pierden al usar el bloque "Leads" (bloque rojo).
{% endhint %}

Las variables globales están disponibles para todos los usuarios del bot. Son ideales para controlar el comportamiento del bot o facilitar interacciones entre distintos usuarios.

**Ejemplo de caso de uso:**\
Un usuario puede publicar un artículo en un canal de marketplace estableciendo una variable (por ejemplo, `project.latest_listing`), y todos los demás usuarios pueden verlo y responder.

#### **Sintaxis para la asignación**

Para crear o actualizar una variable global, usa el `project.` prefijo en la Calculadora:

**Ejemplos:**

* `project.product_shop = 28`
* `project.age = 28`

<div data-with-frame="true"><figure><img src="/files/00329958f6f671d2f91b941ca5ebc6005a7ac20a" alt=""><figcaption></figcaption></figure></div>

Pueden usarse sin ningún prefijo.

Veamos cómo se muestran los datos en la tabla.

<div data-with-frame="true"><figure><img src="/files/94fe8e2c3803b2768288810c3cda42d0f589376a" alt=""><figcaption></figcaption></figure></div>

Ahora, ejecuta el bloque "Inicio" en modo de prueba.

<div data-with-frame="true"><figure><img src="/files/f0de88d7c9e4886684cff920ec678b5c087ce0dc" alt="" width="375"><figcaption></figcaption></figure></div>

Podemos ver los datos que se escribieron en la variable desde la tabla en el mensaje enviado por el bot. Como referenciamos la variable en el mensaje usando la `#{}` sintaxis, los datos almacenados en ella se mostraron en el chat del bot.

{% hint style="info" %}
Más detalles sobre cómo trabajar con la función get\_records\_from\_table() se explican en el artículo "[Asistente de IA con tabla de MaviBot](/doc/es/chatbot/ai/tables.md)".
{% endhint %}

El `project.` prefijo permitió que la función escribiera los datos de la tabla directamente en las variables globales del proyecto, accesibles en la **"Variables"** sección.

<div data-with-frame="true"><figure><img src="/files/11d0d22e716a881b987d532bac2541e752a34f63" alt=""><figcaption></figcaption></figure></div>

Puedes editar las variables del proyecto en la configuración del proyecto.

### Ejemplo: uso de variables del proyecto

Crea un sistema que asigne un número secuencial a cada nuevo cliente que entra en el bot.

**Implementación:**

1. Ve a tus **Configuración del proyecto**.
2. Crea una nueva variable de proyecto (por ejemplo, `project.client_counter`).

<div data-with-frame="true"><figure><img src="/files/d97ea3ee66bfb9476faa2633596e8a42e7f7d4db" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/b5e65101404946a8744f5f1f41e1a551efaf4a8e" alt=""><figcaption></figcaption></figure></div>

3. Establece su valor inicial (por ejemplo, `0`) lo que significa **"No hay clientes en el bot"**:

<div data-with-frame="true"><figure><img src="/files/9e367f7c5002ebbba2e0c2a18d86bc65863c9ca3" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/ce0c7f1224e64420f64f261c641c2a3deca4a0e6" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/4fa5b900def5ea990108b5c8db33a7763caff58d" alt="" width="563"><figcaption></figcaption></figure></div>

En el bloque de inicio del bot, añade una lógica que:

1. Incremente el valor de la variable del proyecto en 1.
2. Asigne el nuevo valor a una variable específica del cliente para el usuario actual.

<div data-with-frame="true"><figure><img src="/files/8d35f4fa599aa1f4f841794ee032e9a02edb143c" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
No olvides establecer una restricción para que el contador no pueda incrementarse dos veces para el mismo cliente.
{% endhint %}

<div data-with-frame="true"><figure><img src="/files/2c30b2fdf1b85c0db897522a5a3952e04ee0a85a" alt="" width="563"><figcaption></figcaption></figure></div>

## Cómo configurar variables constantes

Las constantes son valores fijos que permanecen sin cambios (o cambian raramente) durante el ciclo de vida de un proyecto.

**Diferencia clave con las variables globales:**

A diferencia de las variables globales, las constantes son **específicas del cliente**. Si se modifica el valor de una constante, el cambio solo se aplica a la sesión de ese cliente en particular.

**Casos de uso comunes:**

Las constantes son ideales para almacenar datos estáticos como:

* Precios de productos y descuentos para clientes
* Tokens de integración y claves API
* Información de contacto del vendedor o soporte
* Cualquier otro valor de configuración fijo

### Ejemplo: uso de variables constantes

Por ejemplo, el descuento de un cliente podría ser del 10% por defecto, pero cambiar al 25% al introducir un código promocional.

En "Configuración del proyecto" → "Constantes", introduce: Discount : 10

<div data-with-frame="true"><figure><img src="/files/ad026dc8fb30b03985852d022261d98e51849e9c" alt=""><figcaption></figcaption></figure></div>

Para introducir un código promocional, añade un bloque "Disparador", donde asignamos la variable **discount** el valor de 25.

<div data-with-frame="true"><figure><img src="/files/823ff5533330857a2a0a0205dc12bbaea2bdaf66" alt=""><figcaption></figcaption></figure></div>

Muestra la variable que indica el importe del descuento en el bloque verde:

<div data-with-frame="true"><figure><img src="/files/8a467fa4fc62b7f2937b9a0771c37e2b569a4459" alt=""><figcaption></figcaption></figure></div>

**Paso 1: Configura la transición automática**\
Crea una conexión con un **temporizador de cero segundos** desde el bloque gris. Esto garantiza que el descuento se aplique de inmediato y que el cliente pase al mensaje en el bloque de inicio.

**Paso 2: Prueba el flujo**\
Ahora, escribe un mensaje al bot para activar y probar toda la secuencia.

<div data-with-frame="true"><figure><img src="/files/c99c4ce4529ef2a74dde019fa1a0a99bf5108e7d" alt="" width="563"><figcaption></figcaption></figure></div>

El descuento estándar es del 10% sin código promocional. Sin embargo, introducir un código promocional válido cambia la situación.

<div data-with-frame="true"><figure><img src="/files/a49bd980ccfa1c09535071cc62572276c0bd60fa" alt="" width="563"><figcaption></figcaption></figure></div>

Así, después de introducir el código promocional, la variable "descuento" para este cliente pasó a ser 25. <br>

Esto ocurrió porque una asignación como discount = 25 estableció el valor para la variable de trato, en lugar de cambiar el valor de la constante con el mismo nombre.

## Variables clave del trato

**name** - nombre del trato. El término **Name** se usa para la versión internacional del proyecto.

**description** - descripción del trato. **Descripción** se usa en la versión internacional del proyecto

**budget** - importe del trato (número).

Para editar variables usando la solicitud API /set\_order\_vars, debes usar los nombres de t[esta guía exactamente como se muestran](#how-to-set-client-variables), incluyendo la sensibilidad a mayúsculas y minúsculas y la versión del proyecto.

## Límites

{% hint style="warning" %}
Longitud máxima del nombre de la variable: 500 caracteres

Longitud máxima del valor de la variable: 100.000 caracteres

Número máximo de variables por cliente o trato: 1.000 caracteres.
{% endhint %}

## Cómo trabajar correctamente con variables

### *¿Cuándo debes encerrar el valor de una variable entre comillas?*

*Por ejemplo, <mark style="color:amarillo;">**client\_id = 1202020202**</mark> o <mark style="color:verde;">**client\_id = '1202020202'**</mark>?*

Ambas opciones de sintaxis son funcionalmente correctas. Usar comillas alrededor de un valor solo afecta a su resaltado visual en el editor de la calculadora.

Sin embargo, seguir convenciones de codificación coherentes mejora la legibilidad y el mantenimiento:

* **Omitir comillas** para **valores** numéricos `discount = 25`).
* **Usar comillas** para **de cadena** numéricos `status = "active"`).

<div data-with-frame="true"><figure><img src="/files/56f5f91002556532aab73ce5e1117bb0c6ec2e9e" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/18291d48c61d4050ac0488c2a65e5054458de874" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/7dc72151bd6ee3b70760839f22228c1c7f2bc94d" alt=""><figcaption></figcaption></figure></div>

*¿Cuál es la sintaxis correcta para pasar identificadores como ID de cliente, ID de sitio, ID de bloque o ID de certificado a las funciones? ¿Deben ir entre comillas?*

<div data-with-frame="true"><figure><img src="/files/ff8a5e51844fad1e90cb200956c5e04d0514cf7e" alt="" width="563"><figcaption></figcaption></figure></div>

Un ID no debe ir entre comillas cuando se pasa a un método o función:

<div data-with-frame="true"><figure><img src="/files/5b8282cea0b9d742aaeef69d11e875cd7e59bf5b" alt=""><figcaption></figcaption></figure></div>

### ¿Cuál debe usarse: comillas dobles o comillas simples?

No hay diferencia entre usar comillas simples o dobles, pero recomendamos usar comillas dobles. De esta manera, por ejemplo, al insertar una variable dentro de una cadena, la variable se resaltará con un color diferente, lo que facilitará notarla.

<div data-with-frame="true"><figure><img src="/files/cf3417b6560d0ef6f0a3ab161388e832f5537128" alt=""><figcaption></figcaption></figure></div>

### ¿Cómo deben colocarse los espacios?&#x20;

¿Funciona igual si hay un espacio entre la variable y el signo igual (por ejemplo, *<mark style="color:azul;">ans="yes"</mark>, <mark style="color:morado;">ans = "yes"</mark>, <mark style="color:naranja;">ans= "yes"</mark>, <mark style="color:rojo;">ans ="yes"</mark>?*

<div data-with-frame="true"><figure><img src="/files/67bd04d354bb08b694b4712373ca617c003d73dc" alt=""><figcaption></figcaption></figure></div>

El espaciado no afecta el funcionamiento de métodos, variables o funciones. Sin embargo, se recomienda usar espacios en el código para mejorar la legibilidad.

### Cómo escribir correctamente los comentarios en la calculadora

{% hint style="success" %}
**Para más detalles sobre cómo escribir comentarios en la Calculadora, consulte** [**este artículo**](/doc/es/chatbot/functions/calculadora.md)**.**
{% endhint %}

## Cómo comparar variables

Puedes controlar el flujo del chatbot comparando valores de variables. Esto te permite crear lógica condicional, como verificar la edad de un usuario para el cumplimiento legal o enrutar interacciones según la plataforma de mensajería del usuario.

{% hint style="info" %}
Así es como se divide el embudo [por diferentes mensajeros o por diferentes cuentas del mismo mensajero, explicado aquí.](/doc/es/faq/faq.md#how-can-i-split-a-funnel-by-messengers)
{% endhint %}

#### **Operadores compatibles:**

"**+**": suma \
"**-**"': resta \
"**\***" *multiplicación* \
"**/**": *división*\
"**%**'"*: resto de la división* \
"**^**" "**\*\***": potenciación \
"**y**" "**Y**" "**&&**": Y lógico \
"**o**" "**O**" "**||**": O lógico

Operadores de comparación:\
"**==**" — igual a\
"**!=**" — distinto de\
"**>**" — mayor que\
"**<**" — menor que \
"**>=**" — mayor o igual que\
"**<=**" — menor o igual que

{% hint style="warning" %}
**¡IMPORTANTE!** \
Para comprobar que **la etiqueta de variable integrada** (la etiqueta de inicio del bot) no está presente en la tarjeta del cliente, usa el siguiente método de comparación:\
\
`tag == "NONE"`
{% endhint %}

Las variables deben compararse en la condición dentro del campo "Variable" (tanto en la configuración de la conexión como en la configuración del bloque):

**Ejemplo de comparación de variables en el campo "Variable" de un bloque desencadenador.**

<div data-with-frame="true"><figure><img src="/files/0dd7cdadff8217390061dfbb4d258d39a108b65e" alt=""><figcaption></figcaption></figure></div>

**Ejemplo de comparación de variables en el campo "Variable" de una conexión de bloque.**

<div data-with-frame="true"><figure><img src="/files/b55303c49db7d5848b1aef1e7ac73d3e3998809d" alt=""><figcaption></figcaption></figure></div>

#### **Cómo funcionan juntas las variables y los desencadenadores**

Para que se active una conexión, **deben cumplirse ambos desencadenadores**:

1. La condición en el **"Disparador"** campo.
2. La lógica de comparación en el **"Variable"** campo.

#### **Entendiendo el campo "Variable"**

Si introduces solo un nombre de variable (por ejemplo, `client_type`) en el **"Variable"** campo sin una expresión, el sistema comprueba la *existencia* o *verdad* del valor de la variable. No **no** lo compara con la entrada sin procesar del usuario.

**Ejemplo:**\
La configuración siguiente comprueba si el cliente es de WhatsApp verificando que la `client_type` variable sea igual a `6` (donde `6` representa WhatsApp).

`client_type == 6`

<div data-with-frame="true"><figure><img src="/files/46329639e2757b52f85e08e83a62915d4a07f8cb" alt="" width="563"><figcaption></figcaption></figure></div>

El siguiente ejemplo funciona de la misma manera:

<div data-with-frame="true"><figure><img src="/files/77a3cd484961b118d31c6521eae57708ea996c19" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="warning" %}
¡Ten en cuenta! \
No puedes especificar varios valores para la comparación de variables en el campo "Disparador".

<img src="/files/6da0c54eb052805c15b467a6a00467302b8e08c9" alt="" data-size="original">

¡Esto es incorrecto!

Si necesitas comparar varias variables, especifica sus valores en el campo "Variable".

Estas opciones son correctas.

<img src="/files/d3e90878c9a7a260e420d4051ca781bbad0e5b83" alt="" data-size="original">
{% endhint %}

{% hint style="info" %}
client\_type == 3 transición si el valor de la variable es igual a **3**\
attachments != None transición si la variable contiene cualquier valor\
attachments == None transición si la variable no está configurada\
product\_quantity >= 100 transición si la cantidad del producto es mayor o igual que **100**\
product\_quantity <= 100 transición si la cantidad del producto es menor o igual que **100**\
name == "John" transición si el nombre de la variable es John

Para comprobar si una variable está vacía o no, usa las expresiones:\
\&#xNAN;**"#{value}" == ""**  \
**"#{value}" != ""** <br>

(donde **value** es el nombre de la variable).

El resultado de la operación de comparación devuelve un valor booleano: **True** o **Falso**.
{% endhint %}

{% hint style="warning" %}
Longitud máxima de la expresión: 1000 caracteres
{% endhint %}

{% hint style="warning" %}
El valor predeterminado se devolverá como resultado al intentar comparar valores de diferentes tipos.

"==" - Falso                       "<" - Falso\
"!=" - Verdadero                          ">=" - Falso \
">" - Falso                          "<=" - Falso
{% endhint %}

{% hint style="warning" %}
**¡IMPORTANTE!** \
Para comprobar que **la etiqueta de variable integrada** (la etiqueta de inicio del bot) no está presente en la tarjeta del cliente, usa el siguiente método de comparación:\
\
`tag == "NONE"`
{% endhint %}

**Ejemplo:** un bot que verifica la edad de un usuario (`edad`).

* Si `age < 18`, envía un mensaje para menores.
* Si `age >= 18`, envía un mensaje para adultos.

<div data-with-frame="true"><figure><img src="/files/b4d2f053c77289976b925bbd1c801ff444ce4764" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/46f9303f888da5b1da2e00936a1b9408ef3d23b4" alt=""><figcaption></figcaption></figure></div>

Ten en cuenta que el flujo incluye un bloque sin desencadenador, con conexiones temporizadas que salen de él.&#x20;

Este bloque está diseñado intencionalmente para demostrar cómo construir flujos en los que el bot reacciona no a las acciones del usuario, sino a los resultados de un cálculo. En el primer paso, la respuesta se guarda en una variable y luego se realiza la comparación. El retraso en las flechas está configurado en 0 para una respuesta instantánea.

La comparación **"Age >= 18"** también puede expresarse como **"mayor o igual que 18."**

<div data-with-frame="true"><figure><img src="/files/99074b4b822de010c756f67f83c72a18e586679f" alt=""><figcaption></figcaption></figure></div>

{% hint style="danger" %}
Ten en cuenta los errores en los desencadenadores:

<img src="/files/1b74bca86cbc10d8812fb1765b03896a58c0afd5" alt="" data-size="original">

<img src="/files/2a143b640bb99804af716c0fa8297e1d8bd1065e" alt="" data-size="original">

<img src="/files/27fe07aac1e10a820b508422e415c071bf9db158" alt="" data-size="original">

**¡Un número no puede ser simultáneamente mayor, menor y igual a 18!**

Estos desencadenadores no tienen sentido. Todo número es menor que 18, mayor que 18 o igual a 18.
{% endhint %}

{% hint style="warning" %} <mark style="color:rojo;">**¡Importante!**</mark>&#x20;

Los desencadenadores lógicos con variables deben escribirse en el <mark style="color:rojo;">**"Variable"**</mark> campo, no en el campo "Disparador"!
{% endhint %}

Por ejemplo, en la imagen de abajo, el bloque se activará si <mark style="color:verde;">**la variable phone está заполнена**</mark> (es decir, no es igual a **None**):

<div data-with-frame="true"><figure><img src="/files/cdd7a4ee57d67a11cfb50a4fdcc3c653cf30bf16" alt="" width="563"><figcaption></figcaption></figure></div>

El siguiente ejemplo muestra cómo combinar operadores:

<div data-with-frame="true"><figure><img src="/files/40f9b7ba2ab1c3ef88173028ffffb2016b764a15" alt=""><figcaption></figcaption></figure></div>

Si el cliente tiene una variable de edad con un valor entre 18 y 99, el bloque se activará. Si la variable falta, o la edad es menor que 18 o mayor que 99, el bloque no se activará.

{% hint style="warning" %}
¡Nota!&#x20;

Si comparas una variable con un valor entre comillas, asegúrate de que no haya espacios entre las comillas y el valor; de lo contrario, ¡el bloque podría no activarse o comportarse incorrectamente!

<mark style="color:verde;">**Correcto**</mark> (sin espacio <mark style="color:rojo;">**antes de la comilla**</mark> o <mark style="color:rojo;">**después del valor my\_new\_bot**</mark>):

<img src="/files/dd9de245ae38f38d98cff02d3e13cca0ff1f40f8" alt="" data-size="original">

<mark style="color:rojo;">**Incorrecto**</mark> (con un espacio antes de la comilla):

<img src="/files/8fbccce47d6a8a4dd83e2c72c144f6f0d20324d0" alt="" data-size="original">
{% endhint %}


---

# 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/chatbot/functions/variables.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.
