# Guía completa de Deluge — Lenguaje de scripting de Zoho

## Qué es Deluge

**Deluge** (Data Enriched Language for the Universal Grid of Execution) es el lenguaje de scripting propietario de **Zoho Corporation**. Se usa dentro de Zoho Creator, Zoho CRM, Zoho Flow y otras apps de Zoho para automatizar lógica de negocio, manipular datos y conectar servicios.

Es un lenguaje relativamente simple, diseñado para no-programadores, pero lo suficientemente potente para automatizaciones complejas.

---

## Estructura básica

### Variables

```javascript
nombre = "Isaí";
edad = 28;
activo = true;
```

No se declara tipo. Deluge infiere el tipo.

### Tipos de datos principales

| Tipo | Ejemplo |
|------|---------|
| String | `"hola"` |
| Number | `28`, `3.14` |
| Boolean | `true`, `false` |
| Date | `zoho.currentdate` |
| DateTime | `zoho.currenttime` |
| List | `[1, 2, 3]` |
| Map/JSON | `{"nombre": "Isaí"}` |
| Collection | `row` (registro de Zoho) |

---

## Operaciones comunes

### Asignación

```javascript
nombre = "Isaí";
edad = 28;
```

### Aritmética

```javascript
total = subtotal + impuesto;
precio = precio * 1.19;
```

### Condicionales

```javascript
if (estadio == " Cerrado") {
    // acción
} else if (estadio == "Abierto") {
    // otra acción
} else {
    // acción por defecto
}
```

### Ciclos

```javascript
for each item in lista {
    info "Item: " + item;
}
```

---

## Manipulación de registros en Zoho CRM

### Obtener un registro

```javascript
respuesta = zoho.crm.getRecordById("Contacts", 123456789);
nombre = respuesta.get("Full_Name");
```

### Crear un registro

```javascript
nuevoContacto = map();
nuevoContacto.put("Last_Name", "Pérez");
nuevoContacto.put("Email", "perez@ejemplo.com");
nuevoContacto.put("Phone", "3001234567");

respuesta = zoho.crm.createRecord("Contacts", nuevoContacto);
info "ID creado: " + respuesta.get("id");
```

### Actualizar un registro

```javascript
datos = map();
datos.put("Phone", "3009876543");

respuesta = zoho.crm.updateRecord("Contacts", 123456789, datos);
```

### Buscar registros

```javascript
respuesta = zoho.crm.searchRecords("Contacts", "(Email:equals:prueba@test.com)");
if (respuesta.size() > 0) {
    contacto = respuesta.get(0);
}
```

### Eliminar un registro

```javascript
zoho.crm.deleteRecord("Contacts", 123456789);
```

---

## Deluge en Zoho Creator (Forms + Actions)

### Sobre un Form

```javascript
onSubmit() {
    // Cuando se envía el formulario
    nombre = input.NombreCompleto;
    email = input.CorreoElectronico;
}
```

### Validación de campo

```javascript
onFieldUpdate() {
    if (input.Edad < 18) {
        alert "Debes ser mayor de edad";
    }
}
```

### Enviar datos a otra aplicación Zoho

```javascript
datos = map();
datos.put("name", input.Nombre);
datos.put("email", input.Email);

respuesta = zoho.creator.createRecord(
    "mi-cuenta",
    "Mi-App",
    "Reporte",
    datos
);
```

---

## Integración externa (con HTTP)

### GET request

```javascript
headers = map();
headers.put("Authorization", "Bearer TOKEN");

respuesta = invokeURL [
    url: "https://api.ejemplo.com/data"
    type: GET
    headers: headers
];

info respuesta;
```

### POST request (con JSON)

```javascript
headers = map();
headers.put("Content-Type", "application/json");
headers.put("Authorization", "Bearer TOKEN");

payload = map();
payload.put("nombre", "Isaí");
payload.put("edad", 28);

respuesta = invokeURL [
    url: "https://api.ejemplo.com/crear"
    type: POST
    parameters: payload
    headers: headers
];

info respuesta;
```

---

## Funciones personalizadas

Se definen con `function` y se pueden reusable:

```javascript
function calcularIVA(monto) {
    iva = monto * 0.19;
    return monto + iva;
}

total = calcularIVA(100000);
info total; // 119000
```

---

## Tasks / Tareas programadas

En Zoho Creator podés programar tareas:

```javascript
onTimeTask() {
    // Se ejecuta automáticamente según laschedule
    contactos = zoho.crm.getRecords("Contacts");
    for each c in contactos {
        // lógica
    }
}
```

---

## Diferencias importantes con otros lenguajes

| Aspecto | Deluge | Python/JS |
|---------|--------|-----------|
| Tipado | Dinámico | Dinámico |
| Declaración variables | No se usa `var/let/const` | Se usa |
| Índices | 1-based (listas) | 0-based |
| Keys en mapas | String (sin comillas en some cases) | String |
| Nulos | `null` | `null` / `None` |
| Punto y coma | Opcional | Requerido en JS |
| Interpolación strings | Concatenación con `+` | Template literals `` `...` `` |

---

## Recursos de aprendizaje

### Documentación oficial
- **Zoho Creator Help**: https://www.zoho.com/creator/help/scripting/deluge.html
- **Zoho CRM Deluge Reference**: busca en https://help.zoho.com/ → CRM → Developer Guide → Deluge
- **Zoho Flow Deluge**: en la documentación de Zoho Flow

### YouTube (buscar estos términos)
- `zoho creator deluge tutorial español`
- `deluge scripting zoho creator beginners`
- `zoho crm deluge automation`
- `deluge zoho creator forms`

### Tips prácticos
1. Empezá con Zoho Creator — es donde Deluge es más accesible para practicar
2. El IDE de Zoho Creator tiene autocompletado y te muestra los campos disponibles
3. Usá `info "variable: " + variable` para hacer debug
4. El módulo de Zoho CRM es donde más trabajo vas a tener en un contexto corporativo

---

## Ejemplo rápido de automatización CRM

Imaginate que cada vez que llega un Lead nuevo, querés:
1. Asignarle un propietario
2. Crear una tarea de seguimiento
3. Enviar un email de bienvenida

Con Deluge quedaría algo así:

```javascript
onLeadCreate(lead) {
    // 1. Actualizar el Lead
    datos = map();
    datos.put("Owner", "usuario@empresa.com");
    zoho.crm.updateRecord("Leads", lead.get("id"), datos);

    // 2. Crear tarea
    tarea = map();
    tarea.put("Subject", "Seguimiento - " + lead.get("Last_Name"));
    tarea.put("Due_Date", zoho.currentdate.addDay(3));
    tarea.put("Status", "Not Started");
    zoho.crm.createRecord("Tasks", tarea);

    // 3. Enviar email (requiere configuración de email automation en Zoho)
    sendMail(
        lead.get("Email"),
        "Bienvenido",
        "Hola " + lead.get("First_Name") + ", gracias por contactarnos."
    );
}
```

---

Guardado en: `/home/claw/.openclaw/workspace/memory/deluge-guia-completa.md`