# Usando variables

En Hablla, al configurar un flujo de automatización, puedes utilizar **variables** para recuperar datos de componentes anteriores y expresiones **lógicas y condicionales** para hacer tus automatizaciones más dinámicas e inteligentes.

Esto permite que la información se reutilice automáticamente, sin necesidad de completarla manualmente, haciendo el proceso más eficiente y sin errores.

### 🎯 **¿Qué son las Variables en Hablla?**

Cada componente dentro de un flujo tiene un **código único** y puede generar **datos de salida** que pueden ser usados por otros componentes en el mismo flujo.

<figure><img src="https://4006966930-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrmxWrIrMauHcIrsuqfGq%2Fuploads%2FWpztEh7gCvaKUGA9aENC%2Fimage.png?alt=media&#x26;token=f7845359-1265-4bad-91a6-7b747e789e21" alt=""><figcaption></figcaption></figure>

Puedes acceder a esos datos usando la siguiente sintaxis:

```plaintext
{{$data?.codigoDelComponente?.rutaVariable}}
```

➡ **Ejemplo real:**\
Si un componente llamado `whatsappReceptive_tmy0de` identificó a una persona, y su ID está almacenado dentro del campo `person.id`, podemos acceder a ese valor así:

```plaintext
{{$data?.whatsappReceptive_tmy0de?.person?.id}}
```

Si ese componente no devuelve un valor válido, podemos intentar con un segundo componente llamado `whatsappReceptive_r2b7wr`:

```plaintext
{{$data?.whatsappReceptive_tmy0de?.person?.id ?? $data?.whatsappReceptive_r2b7wr?.person?.id}}
```

📌 Aquí, `??` significa: **si el primer valor es nulo o indefinido, usa el segundo.**

***

### 🔥 **Operadores y Expresiones en Hablla**

Además de acceder a variables, puedes usar **operadores lógicos** para crear reglas y condiciones dentro de tus flujos.

#### 🛠 Operadores Lógicos y Condicionales

| Operador                                           | Significado                                                                           | Ejemplo                                                      |
| -------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| `??` (Nullish Coalescing - "Si nulo o indefinido") | Si el primer valor es nulo o indefinido, usa el segundo                               | `{{$data?.componente1?.valor ?? $data?.componente2?.valor}}` |
| \|\| (Logical OR - "O")                            | Si el primer valor es falso (`false`, `null`, `undefined`, `0`, `""`), usa el segundo | {{$data?.status \|\| "Pendiente"}}                           |
| `:` (Operador ternario - "Si... entonces... sino") | Funciona como un operador ternario (if/else)                                          | `{{$data?.idade > 18 ? "Mayor de edad" : "Menor de edad"}}`  |
| `&&` (Logical AND - "Y")                           | Devuelve el segundo valor si el primero es verdadero                                  | `{{$data?.temDesconto && "Descuento Aplicado"}}`             |

***

| Operador             | Significado                       | Ejemplo            |
| -------------------- | --------------------------------- | ------------------ |
| `+` (Adición)        | Suma dos valores.                 | `{{5 + 3}}` → `8`  |
| `-` (Sustracción)    | Resta dos valores.                | `{{10 - 4}}` → `6` |
| `*` (Multiplicación) | Multiplica dos valores.           | `{{3 * 4}}` → `12` |
| `/` (División)       | Divide dos valores.               | `{{10 / 2}}` → `5` |
| `%` (Módulo)         | Devuelve el resto de la división. | `{{10 % 3}}` → `1` |

***

#### 🔍 **Operadores de Comparación**

| Operador                        | Significado                                                         | Ejemplo                   |
| ------------------------------- | ------------------------------------------------------------------- | ------------------------- |
| `==` (Igualdad)                 | Compara valores sin verificar el tipo.                              | `{{5 == "5"}}` → `true`   |
| `===` (Estrictamente igual)     | Compara valores y el tipo de dato.                                  | `{{5 === "5"}}` → `false` |
| `!=` (Diferente)                | Comprueba si los valores son diferentes.                            | `{{5 != "5"}}` → `false`  |
| `!==` (Estrictamente diferente) | Comprueba si los valores y los tipos son diferentes.                | `{{5 !== "5"}}` → `true`  |
| `>` (Mayor que)                 | Devuelve `true` si el primer valor es mayor que el segundo.         | `{{10 > 5}}` → `true`     |
| `<` (Menor que)                 | Devuelve `true` si el primer valor es menor que el segundo.         | `{{3 < 7}}` → `true`      |
| `>=` (Mayor o igual)            | Devuelve `true` si el primer valor es mayor o igual que el segundo. | `{{8 >= 8}}` → `true`     |
| `<=` (Menor o igual)            | Devuelve `true` si el primer valor es menor o igual que el segundo. | `{{6 <= 5}}` → `false`    |

***

#### 🔄 **Operadores de Cadena**

| Operador            | Significado      | Ejemplo                                       |
| ------------------- | ---------------- | --------------------------------------------- |
| `+` (Concatenación) | Une dos strings. | `{{"Hola, " + "mundo!"}}` → `"¡Hola, mundo!"` |

***

#### 🔀 **Operadores de Arrays**

| Operador      | Significado                                    | Ejemplo                                     |
| ------------- | ---------------------------------------------- | ------------------------------------------- |
| `.length`     | Devuelve el tamaño de un array.                | `{{$data?.nombres.length}}`                 |
| `.includes()` | Verifica si un valor existe en el array.       | `{{$data?.ciudades.includes("São Paulo")}}` |
| `.map()`      | Itera sobre los elementos y modifica el array. | `{{$data?.numeros.map(n => n * 2)}}`        |
| `.filter()`   | Filtra elementos del array.                    | `{{$data?.numeros.filter(n => n > 5)}}`     |

### 🔍 **Cómo Usar Condiciones IF/ELSE**

En Hablla, puedes crear **reglas condicionales** dentro de los flujos. Mira cómo funciona:

#### ✅ **Ejemplo 1: Verificar si un cliente está calificado**

```plaintext
{{$data?.lead?.score > 50 ? "Lead Calificado" : "Lead No Calificado"}}
```

Si el score del lead es **mayor que 50**, el resultado será `"Lead Calificado"`, de lo contrario, `"Lead No Calificado"`.

#### ✅ **Ejemplo 2: Definir un estado por defecto**

```plaintext
{{$data?.pedido?.status ?? "En proceso"}}
```

Si el estado del pedido existe, se utilizará. De lo contrario, el estado por defecto `"En proceso"` será aplicado.

#### ✅ **Ejemplo 3: Combinar múltiples condiciones**

```plaintext
{{$data?.usuario?.idade >= 18 ? "Mayor de edad" : $data?.usuario?.idade > 0 ? "Menor de edad" : "Edad no informada"}}
```

🔹 Si la edad es mayor o igual a **18**, el resultado será `"Mayor de edad"`.\
🔹 Si la edad es mayor que **0**, pero menor que **18**, el resultado será `"Menor de edad"`.\
🔹 Si la edad no está informada, el resultado será `"Edad no informada"`.

***

### 🎯 **Cómo Utilizar Estas Expresiones en la Configuración de un Componente**

Siempre que estés configurando un componente en Hablla, puedes usar estas expresiones en los campos donde deseas insertar valores dinámicos.

📌 **Ejemplo práctico:**\
Supongamos que estamos creando una nueva tarjeta en el flujo y queremos asociarle una persona identificada en un componente anterior. Podemos hacerlo así:

```plaintext
{{$data?.whatsappReceptive_tmy0de?.person?.id ?? $data?.whatsappReceptive_r2b7wr?.person?.id}}
```

Esto garantiza que, si un componente no encuentra a la persona, se usará automáticamente el otro.

***

### 🔥 **Resumen: Cómo Usar Variables y Expresiones en Hablla**

✅ **Use `{{$data?.codigoDelComponente?.rutaVariable}}`** para acceder a datos de componentes anteriores.\
✅ **Use `??` para definir un valor alternativo en caso de que el primero sea nulo o indefinido.**\
✅ **Use `||` para definir un valor alternativo en caso de que el primero sea falso.**\
✅ **Use `:` para crear reglas `if/else` dentro de los campos.**\
✅ **Use `&&` para definir un valor solo si la condición es verdadera.**

🚀 **Con estas técnicas, puedes crear flujos inteligentes y personalizados sin necesidad de programar!**
