# Вирази

Усередині `{{ ... }}` можна не лише вставити значення, а й порахувати, порівняти або вибрати текст за умовою:

```
{{ $вік >= 18 ? "Ласкаво просимо!" : "Доступ з 18 років" }}
Знижка 10%: {{ $ціна * 0.9 }} грн
{{ upper(first_name) ~ ", вітаємо!" }}
```

## З чого складається вираз

| Що | Як писати | Приклад |
|---|---|---|
| Змінна контакту | `$назва` | `$місто` |
| Змінна з пробілами в назві | `var("назва")` | `var("Ім'я клієнта")` |
| Дані контакту | назва без `$` | `first_name`, `phone` |
| Глобальна змінна | `global("назва")` | `global("Курс (USD)")` |
| Текст | у лапках `"..."` або `'...'` | `"Добрий день"` |
| Число | цифри, дробова частина через крапку | `10`, `0.9` |
| Логічне значення | `true`, `false` | |
| Порожнє значення | `null` | |
| Функція | `назва(аргументи)` | `round($ціна, 2)` |

Усередині лапок нічого не замінюється: `{{ "ціна $a" }}` виведе `ціна $a`.

## Арифметика

| Оператор | Дія | Приклад | Результат |
|---|---|---|---|
| `+` | додавання | `{{ 2 + 3 }}` | `5` |
| `-` | віднімання | `{{ 10 - 4 }}` | `6` |
| `*` | множення | `{{ 3 * 4 }}` | `12` |
| `/` | ділення | `{{ 10 / 4 }}` | `2.5` |
| `%` | остача від ділення | `{{ 10 % 3 }}` | `1` |
| `**` | степінь | `{{ 2 ** 10 }}` | `1024` |

Дужки змінюють порядок дій: `{{ ($ціна + $доставка) * 2 }}`.

Дробові числа виводяться без зайвих знаків: `{{ 0.1 + 0.2 }}` дасть `0.3`. Щоб округлити, використовуйте [`round`](03-functions.md#математика), для виведення з роздільниками — [`number_format`](03-functions.md#текст).

## Порівняння

| Оператор | Значення |
|---|---|
| `==` | дорівнює |
| `!=` | не дорівнює |
| `>`, `>=` | більше, більше або дорівнює |
| `<`, `<=` | менше, менше або дорівнює |

Якщо з обох боків числа — навіть записані текстом, як значення змінних, — порівнюються числа: `"10" > 9` істинне.

Результат порівняння, виведений сам по собі, — `true` або `false`: `{{ $вік >= 18 }}`.

## Логіка

| Оператор | Значення |
|---|---|
| `and` або `&&` | і |
| `or` або `\|\|` | або |
| `not` або `!` | не |

```
{{ $вік >= 18 and $місто == "Київ" ? "Запрошуємо в офіс" : "Працюємо онлайн" }}
```

## Умова

`умова ? якщо_так : якщо_ні` — вибирає один із двох варіантів:

```
{{ $бали >= 100 ? "Вам доступний подарунок" : "До подарунка " ~ (100 - $бали) ~ " балів" }}
```

Коротка форма `значення ?: запасне` виведе значення, якщо воно не порожнє, інакше — запасне:

```
Вітаємо, {{ first_name ?: "друже" }}!
```

## Запасне значення для порожніх даних

`значення ?? запасне` — якщо значення немає зовсім (у контакту не вказано телефон, змінну не заповнено), підставиться запасне:

```
Телефон: {{ phone ?? "не вказано" }}
```

## Робота з текстом

| Оператор | Дія | Приклад |
|---|---|---|
| `~` | склеїти текст | `{{ first_name ~ " " ~ last_name }}` |
| `contains` | містить | `{{ $відповідь contains "так" ? "Чудово!" : "Шкода" }}` |
| `starts with` | починається з | `{{ phone starts with "+380" ? "Україна" : "Інша країна" }}` |
| `ends with` | закінчується на | `{{ email ends with "@gmail.com" }}` |
| `in` | є у списку | `{{ $місто in ["Київ", "Львів"] ? "Є доставка" : "Самовивіз" }}` |
| `not in` | немає у списку | `{{ $тариф not in ["pro", "business"] }}` |

`contains`, `starts with` і `ends with` розрізняють великі й малі літери. Щоб не розрізняти, зведіть текст до одного регістру: `{{ lower($відповідь) contains "так" }}`.

## Функції всередині виразів

Функції можна вкладати одна в одну й поєднувати з операторами:

```
{{ capitalize(lower(var("Ім'я клієнта"))) }}
{{ round(($ціна + $доставка) * 0.9, 2) }}
{{ number_format(global("Курс (USD)") * $сума, 2) }} грн
```

Перелік функцій — у [довіднику](https://support.watbot.org/uk/chatbots/templates/functions).

## Чого не можна

У виразах немає циклів, присвоєнь і звернень до внутрішніх даних платформи — лише оператори та функції з довідника. Докладніше про обмеження — у розділі [Помилки та обмеження](https://support.watbot.org/uk/chatbots/templates/errors).
