# Variables

Las variables del contacto guardan los datos de una persona: la ciudad, el ramo elegido, el total del pedido. Las variables globales las comparte todo el bot: la dirección de la tienda, un tipo de cambio, un contador de pedidos. Dónde se muestran y cómo insertarlas en un mensaje se describe en [Datos que puedes insertar](https://support.cleverapp.pro/es/chatbots/templates/data).

Lo que escriben las funciones se guarda cuando el código termina sin error. Dentro del código, la lectura ya ve lo escrito.

## getContactVariable

```js
getContactVariable(name)
```

Devuelve el valor de una variable del contacto.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable, como en la ficha del contacto. Se admiten espacios y letras no latinas |

**Devuelve** el valor como cadena, o `undefined` si el contacto no tiene esa variable. Envuelve el valor en `Number()` para hacer cálculos.

```js
var count = Number(getContactVariable('roses_count') || 0);

if (count >= 11) {
    setContactVariable('discount', 10);
}
```

Si la variable la escribió este mismo código, la función devuelve el valor en la forma en que se escribió: un número sigue siendo un número.

## setContactVariable

```js
setContactVariable(name, value)
```

Escribe una variable del contacto. Si la variable no existe, se crea.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable |
| `value` | Cadena, número, `true` o `false` | El valor |

**No devuelve nada.**

Un objeto, un array, `null` y `undefined` no se guardan tal cual: la variable recibe un valor vacío. Para guardar un objeto o un array, conviértelo en cadena y vuelve a interpretarlo al leerlo:

```js
setContactVariable('cart', JSON.stringify(['Rosas', 'Tulipanes']));

var cart = JSON.parse(getContactVariable('cart') || '[]');
```

Es mejor guardar los booleanos como cadenas, como `'sí'` y `'no'`: `true` y `false` vuelven como las cadenas `'1'` y `''` la próxima vez que otro bloque los lee.

## deleteContactVariable

```js
deleteContactVariable(name)
```

Elimina una variable del contacto.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable |

**No devuelve nada.** Después de eliminarla, `getContactVariable` con ese nombre devuelve `undefined`.

```js
deleteContactVariable('promo_code');
```

## getGlobalVariable

```js
getGlobalVariable(name)
```

Devuelve el valor de una variable global del bot.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable global |

**Devuelve** el valor como cadena, o `undefined` si no existe esa variable.

```js
var freeDelivery = Number(getGlobalVariable('free_delivery_from') || 0);
var sum = Number(getContactVariable('order_total') || 0);

if (sum >= freeDelivery) {
    sendMessage('Para ti, el envío es gratis.');
}
```

## setGlobalVariable

```js
setGlobalVariable(name, value)
```

Escribe una variable global del bot. Si la variable no existe, se crea. El valor es visible de inmediato para todos los contactos del bot.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable global |
| `value` | Cualquiera | El valor. Se guarda como cadena: el número `5` pasa a ser `'5'`, y un objeto, `'[object Object]'`, así que convierte los objetos en cadena con `JSON.stringify` |

**No devuelve nada.**

```js
var orders = Number(getGlobalVariable('orders_today') || 0);
setGlobalVariable('orders_today', orders + 1);
```

> [!WARNING]
> Si un código con una escritura así se ejecuta para varios contactos a la vez, cada uno lee el mismo valor antiguo y parte de los incrementos se pierde. Un contador así no sirve para contar con exactitud.

## deleteGlobalVariable

```js
deleteGlobalVariable(name)
```

Elimina una variable global del bot.

| Parámetro | Tipo | Qué pasar |
|---|---|---|
| `name` | Cadena | El nombre de la variable global |

**No devuelve nada.**

```js
deleteGlobalVariable('deal_of_the_day');
```
