> ## Documentation Index
> Fetch the complete documentation index at: https://omniloy.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Reglas condicionales y variables

> Cómo ramificar el flujo con reglas, comparadores y variables

Las **reglas condicionales** deciden el camino del flujo: comparan un valor (una respuesta o una variable) y, si la condición se cumple, dirigen hacia el siguiente nodo o hacia una acción.

<img src="https://mintcdn.com/omniloy/Q9jZm4-SeFtgd8-M/images/olivia/conditional-rule.png?fit=max&auto=format&n=Q9jZm4-SeFtgd8-M&q=85&s=5e8531942c3769f4dffa624a9a8160a0" alt="Editor de regla condicional" width="1687" height="1080" data-path="images/olivia/conditional-rule.png" />

## Comparadores por tipo

No todos los comparadores aplican a todos los tipos. El comparador `always` (siempre) sirve como rama por defecto y aplica a cualquier tipo.

| Tipo            | Comparadores                                                                                        |
| --------------- | --------------------------------------------------------------------------------------------------- |
| Texto           | `equals`, `not_equals`, `contains`, `starts_with`, `ends_with`, `any_of`                            |
| Numérico        | `equals`, `not_equals`, `greater_than`, `less_than`, `greater_or_equal`, `less_or_equal`, `between` |
| Fecha           | `equals`, `not_equals`, `before`, `after`, `between`                                                |
| Booleano        | `equals`, `not_equals`                                                                              |
| Opción múltiple | `equals`, `not_equals`, `any_of`                                                                    |

`between` toma un par de valores (dos números o dos fechas); `any_of` toma una lista.

## Valor literal o variable

El lado derecho de una regla puede ser un **valor literal** o **otra variable** (comparación variable-a-variable). Los dos lados deben resolverse al mismo tipo. La comparación contra variable está permitida para: `equals`, `not_equals`, `contains`, `starts_with`, `ends_with`, y los comparadores de orden (`greater_than`, `less_than`, `before`, `after`, etc.); no para `between`, `any_of` ni `always`. La opción múltiple no se compara contra variable.

## Variables

**Variables integradas:**

| Variable                                                | Tipo                                   |
| ------------------------------------------------------- | -------------------------------------- |
| `patient.first_name`, `patient.last_name`               | texto                                  |
| `protocol.title`, `protocol.description`                | texto                                  |
| `run.sequence_number`, `run.previous_score`             | número                                 |
| `date.today`, `date.next_call`                          | fecha                                  |
| `date.now_hour`                                         | número (0–23, en la zona de la sesión) |
| `question.<clave>.answer`                               | según la pregunta                      |
| `webhook.<clave>.success` / `.http_status` / `.result…` | booleano / número / dato del webhook   |

**Variables personalizadas:** se declaran por versión (nombre en minúsculas, tipo texto/número/fecha/booleano, obligatoria o no, con valor por defecto opcional) y se referencian como `custom.<nombre>` o `{{ nombre }}` en las plantillas. Sus valores se toman de la inscripción o del run.

## Dónde pueden vivir las reglas

* En una **pregunta** o un **webhook**, la regla solo puede leer el propio valor de ese nodo.
* Cualquier condición que cruce ítems (otra pregunta, una variable, otro webhook, o comparación variable-a-variable) debe vivir en un [nodo de decisión](/olivia/es/decisiones).
* Una **frase de flujo** admite como mucho una regla, y debe ser `always`.
