# Expresiones

Dentro de `{{ ... }}` puedes hacer algo más que insertar un valor: calcular, comparar o elegir un texto según una condición:

```
{{ $edad >= 18 ? "¡Bienvenido!" : "Acceso a partir de los 18 años" }}
10 % de descuento: {{ $precio * 0.9 }} €
{{ upper(first_name) ~ ", ¡hola!" }}
```

## De qué se compone una expresión

| Qué | Cómo se escribe | Ejemplo |
|---|---|---|
| Variable del contacto | `$nombre` | `$ciudad` |
| Variable con espacios en el nombre | `var("nombre")` | `var("Nombre del cliente")` |
| Datos del contacto | nombre sin `$` | `first_name`, `phone` |
| Variable global | `global("nombre")` | `global("Tasa (USD)")` |
| Texto | entre comillas `"..."` o `'...'` | `"Buenas tardes"` |
| Número | dígitos, la parte decimal después de un punto | `10`, `0.9` |
| Booleano | `true`, `false` | |
| Valor vacío | `null` | |
| Función | `nombre(argumentos)` | `round($precio, 2)` |

Dentro de las comillas no se sustituye nada: `{{ "precio $a" }}` muestra `precio $a`.

## Aritmética

| Operador | Operación | Ejemplo | Resultado |
|---|---|---|---|
| `+` | suma | `{{ 2 + 3 }}` | `5` |
| `-` | resta | `{{ 10 - 4 }}` | `6` |
| `*` | multiplicación | `{{ 3 * 4 }}` | `12` |
| `/` | división | `{{ 10 / 4 }}` | `2.5` |
| `%` | resto | `{{ 10 % 3 }}` | `1` |
| `**` | potencia | `{{ 2 ** 10 }}` | `1024` |

Los paréntesis cambian el orden de las operaciones: `{{ ($precio + $envio) * 2 }}`.

Los decimales se muestran sin dígitos de más: `{{ 0.1 + 0.2 }}` da `0.3`. Para redondear, usa [`round`](03-functions.md#matemáticas); para dar formato con separadores, usa [`number_format`](03-functions.md#texto).

## Comparaciones

| Operador | Significado |
|---|---|
| `==` | igual |
| `!=` | distinto |
| `>`, `>=` | mayor que, mayor o igual que |
| `<`, `<=` | menor que, menor o igual que |

Si los dos lados son números, aunque estén escritos como texto (como los valores de las variables), se comparan como números: `"10" > 9` es verdadero.

Una comparación sola muestra `true` o `false`: `{{ $edad >= 18 }}`.

## Lógica

| Operador | Significado |
|---|---|
| `and` o `&&` | y |
| `or` o `\|\|` | o |
| `not` o `!` | no |

```
{{ $edad >= 18 and $ciudad == "Madrid" ? "Visita nuestra oficina" : "Trabajamos online" }}
```

## Condición

`condición ? si_sí : si_no` elige una de dos opciones:

```
{{ $puntos >= 100 ? "Has ganado un regalo" : "Te faltan " ~ (100 - $puntos) ~ " puntos para el regalo" }}
```

La forma corta `valor ?: alternativa` muestra el valor si no está vacío y, si lo está, la alternativa:

```
¡Hola, {{ first_name ?: "amigo" }}!
```

## Alternativa para datos que faltan

`valor ?? alternativa`: si no hay ningún valor (el contacto no tiene teléfono, la variable no está definida), se inserta la alternativa:

```
Teléfono: {{ phone ?? "no indicado" }}
```

## Trabajar con texto

| Operador | Operación | Ejemplo |
|---|---|---|
| `~` | unir texto | `{{ first_name ~ " " ~ last_name }}` |
| `contains` | contiene | `{{ $respuesta contains "sí" ? "¡Genial!" : "Qué pena" }}` |
| `starts with` | empieza por | `{{ phone starts with "+34" ? "España" : "Otro país" }}` |
| `ends with` | termina en | `{{ email ends with "@gmail.com" }}` |
| `in` | está en una lista | `{{ $ciudad in ["Madrid", "Barcelona"] ? "Hay envío a domicilio" : "Solo recogida" }}` |
| `not in` | no está en una lista | `{{ $plan not in ["pro", "business"] }}` |

`contains`, `starts with` y `ends with` distinguen entre mayúsculas y minúsculas. Para ignorarlas, convierte el texto a un mismo tipo de letra: `{{ lower($respuesta) contains "sí" }}`.

## Funciones dentro de las expresiones

Las funciones se pueden anidar y combinar con operadores:

```
{{ capitalize(lower(var("Nombre del cliente"))) }}
{{ round(($precio + $envio) * 0.9, 2) }}
{{ number_format(global("Tasa (USD)") * $total, 2) }} $
```

Consulta la lista completa en la [referencia de funciones](https://support.cleverapp.pro/es/chatbots/templates/functions).

## Qué no se puede hacer

Las expresiones no tienen bucles, ni asignaciones, ni acceso a los datos internos de la plataforma: solo los operadores y las funciones de la referencia. Más detalles en [Errores y límites](https://support.cleverapp.pro/es/chatbots/templates/errors).
