Funcionalidad: Custo-manifest (Rainbow Extensions) — eventos de Telefonía
Licencia: Todas las licencias — Cloud PBX · OmniPCX Enterprise · OXO Connect
Detalles de la licencia: Las extensiones de eventos de PBX son la única familia de extensiones de Custo-manifest disponibles con una licencia Essential.
Puede utilizar este artículo para configurar acciones automáticas activadas por eventos de llamadas de PBX. Podrá ver cuándo se activa cada evento, qué campos son obligatorios y cómo pasar el contexto de la llamada de Rainbow a su punto final REST o a su script local.
Descripción general
Los eventos de llamada de PBX le permiten activar acciones automáticas cuando una llamada empieza a sonar, se responde o finaliza, sin necesidad de intervención manual. Esta función es disponible para todas las licencias de Rainbow destinadas a Empresas conectadas a un Cloud PBX o a una centralita de Alcatel-Lucent Enterprise (OmniPCX Enterprise u OXO Connect).
Qué puede hacer con los eventos de llamada de la centralita:
- Abrir una aplicación CRM (aplicación de escritorio o página web) automáticamente cuando llega o finaliza una llamada
- Enviar la información de la persona que llama a una API REST (visualización automática en pantalla, registro de llamadas, enriquecimiento de datos)
- Ejecutar una acción de seguimiento cuando se conteste o se cuelgue la llamada
- Reaccionar ante las llamadas salientes para registrarlas o activar un flujo de trabajo
Tipos de eventos de llamada del PBX
| Punto de extensión | Cuándo se activa |
|---|---|
| on-incoming-pbx-call-actions | La llamada entrante comienza a sonar |
| on-answering-incoming-pbx-call-actions | El usuario responde a una llamada entrante |
| on-releasing-incoming-pbx-call-actions | Finaliza una llamada entrante o saliente |
| acciones-al-realizar-una-llamada-saliente-a-la-centralita | El usuario realiza una llamada saliente |
| on-makecall-insert-correlator | Cada vez que se realiza una llamada: inserta un correlador (solo OXE) |
Configuración de una acción de evento de PBX
El «custo-manifest» es un objeto JSON con la siguiente estructura:
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"<EXTENSION-POINT-KEY>": [
{
"name": "...",
"command": {
"url": "...",
"params": "...",
"commandType": "rest",
"method": "GET"
},
"icon": "...",
}
]
}
}Normas generales:
- la versión debe ser «2».
- jsonType debe ser «Rainbow-custo-manifest». Dentro de un archivo ZIP, este campo identifica qué archivo JSON es el manifiesto.
- Cada clave bajo «extension-points» es una matriz: un máximo de 3 acciones por punto de extensión.
- Cada acción contiene, como mínimo, un nombre (opcional en el caso de los eventos) y un objeto de comando válido.
Campos de la acción
| Campo | Posición | Descripción |
|---|---|---|
| nombre | raíz | Texto que se muestra (título del botón o del widget, etiqueta del menú). Obligatorio en función del EP. |
| icono / iconId | root | Icono del botón (URL, ${custo.path}\... o sprite integrado). Obligatorio para los botones con icono. |
| tooltip | raíz | Texto de la información sobre herramientas. Opcional. |
| comando | raíz | Objeto de comando (véase el apartado 3.2). Siempre obligatorio. |
El objeto de comando
El objeto de comando es siempre obligatorio y debe contener, como mínimo, una URL. Dependiendo del `commandType` elegido, pueden ser válidos campos secundarios adicionales.
«command»: {
«url»: «{{server}}/your-endpoint»,
«params»: «user=${localUser.email}»,
«commandType»: «rest»,
«method»: «GET»,
"header": ["Authorization: Bearer TOKEN"],
"bodyParameters": { "key": "value" }
}| Campo | Cuándo utilizarlo |
|---|---|
| url | Obligatorio. Ruta de la aplicación, URL web, archivo o API REST. |
| params | Opcional. Se añaden después de «?» para GET, o como parámetros de URL. Se admiten variables. |
| commandType | Opcional. Por defecto «rest». Valores: «rest», «file» (dependiendo del EP). |
| método | Opcional (solo si commandType: «rest»). Valores: «GET», «POST». |
| encabezado | Opcional (si se trata de REST). Matriz de cadenas del tipo «Nombre-del-encabezado: valor» que se insertan como encabezados HTTP. |
| parámetros del cuerpo | Obligatorio si el método es «POST». Objeto JSON enviado como cuerpo. Se admiten variables. |
Variables de Rainbow
Las variables $ se sustituyen en tiempo de ejecución por su valor real. Pueden aparecer en command.url, command.params, command.bodyParameters y en el contenido devuelto a la extensión para su visualización.
Sintaxis
${object.attribute}
${object.attribute.regex(pattern)}
${object.attribute.regex(pattern, replacement)}Objetos y atributos disponibles
Usuario de Rainbow (ME)
${localUser.firstName} ${localUser.lastName}
${localUser.email} ${localUser.canonicalNumber}
${localUser.phoneNumber} ${localUser.internalNumber}
${localUser.phonePbx} ${localUser.nickname}
${localUser.correoDeInicioDeSesión} ${localUser.id}Llamante
${caller.firstName} ${caller.lastName} ${caller.phoneNumber}Llamado
${called.phoneNumber}Contexto de la llamada
${call.callId}
${call.globalCallId} (solo OXE)
${call.correlator}Contacto (si se ha identificado)
${contact.firstName} ${contact.lastName}
${contact.phoneNumber} ${contact.email}
${contact.company} ${contact.workNumber}
${contact.mobileNumber} ${contact.personalNumber}
${contact.personalMobile}
${contact.tags} (concatenadas, separadas por comas)Compatibilidad: eventos de llamadas de PBX
| Punto de extensión | Objetos variables permitidos |
|---|---|
| Eventos de llamadas salientes | localUser, called, call, Contacto |
| Eventos de llamadas entrantes (entrante / respuesta / finalización) | localUser, llamante, llamado, llamada, Contacto |
Modificador de expresiones regulares
Aplica una expresión regular al valor de la variable antes de la sustitución:
// Normalizar un número: sustituir +33 o +1 por 0
"params": "pbx=${localUser.phonePbx.regex(^\+33|^\+1, 0)}"
// Sustituya el dominio del correo electrónico
"params": "byEmail=${localUser.email.regex(alcatel.com, al-enterprise.com)}"
// Extraiga los últimos 9 dígitos (sin sustitución = extracción)
"params": "${called.phoneNumber.regex(.{0,9}$)}"Variable ${time}
Disponible en todos los puntos de extensión; se sustituye en el momento en que se ejecuta la acción.
| Variable | Valor |
|---|---|
| ${time} | Fecha y hora completas (ISO 8601, p. ej., 2026-05-18T15:30:45.123Z) |
| ${time.year} | Año — 4 dígitos |
| ${time.month} | Mes: del 01 al 12 |
| ${time.day} | Día — 01-31 |
| ${time.hour} | Hora — 00-23 |
| ${time.minute} | Minuto — 00-59 |
| ${time.second} | Segundo — 00-59 |
| ${time.millisec} | Milisegundos — 000-999 |
// Generar un identificador de registro
"params": "logId=${time.year}-${time.month}-${time.day}_${time.hour}${time.minute}${time.second}"Recursos locales — ${custo.path}
Para distribuir un manifiesto con archivos locales (iconos o archivos de visualización):
- Haga referencia a cada recurso como ${custo.path}\\nombre-del-archivo.ext
- Empaquete el archivo `custo-manifest.json` y los archivos de recursos en un ZIP (con el manifiesto en la raíz)
{
"icon": "${custo.path}\\basketball.png",
"command": {
"commandType": "file",
"url": "${custo.path}\\FileDisplay.txt"
},
"responseType": "markdown"
}Campos específicos del evento
| Campo | Descripción |
|---|---|
| «filter» | «NoShortNumber»: no se activa si el número de la persona que llama es un número corto (interno) |
| «RaiseChangeCall» | false = solo llamadas directas · true = llamadas directas y transferidas · «only» = solo llamadas transferidas |
Inclusión de recursos locales (archivo ZIP)
Si la acción hace referencia a archivos locales (iconos o archivos de visualización), incluya el archivo custo-manifest.json junto con dichos archivos en un archivo .zip antes de importarlos.
Estructura ZIP requerida: el manifiesto debe encontrarse en la raíz:
my-manifest.zip
├── custo-manifest.json
├── icon.png
└── display-content.txtImplementación del manifiesto
Una vez configurado el manifiesto, impleméntelo a través de la consola de administración de Rainbow o de forma local. Consulte «Implementación de un custo-manifest en Rainbow».
Ejemplos de configuración
Ejecutar una aplicación o un script con parámetros
Solo compatible con Rainbow Desktop.
Ejemplo 1: «on-incoming-pbx-call-actions» ejecuta una aplicación de escritorio (por ejemplo, MicroCRM) con un parámetro de «params» (sin retorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Exec CRM",
"command": {
"url": "C:\\MyApp\\CustoApp\\MicroCRM.exe",
"params": "-number ${caller.phoneNumber}"
}
}
]
}
}Ejemplo 2: «on-incoming-pbx-call-actions» ejecuta un script (.bat) con varios parámetros procedentes de «params» (sin retorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "BatScript",
"command": {
"url": "C:\\MyApp\\MyApp.bat",
"params": "IN-COMING canNr:${localUser.canonicalNumber} userIntNr:${localUser.internalNumber}
callerNr:${caller.phoneNumber} FN:${caller.firstName} LN:${caller.lastName}
CorData:${call.correlatorData} Hex:${call.hexCorrelatorData}"
}
}
]
}
}Abrir una página web con parámetros
Compatible con Rainbow Desktop y Rainbow Web.
Ejemplo 1: «on-incoming-pbx-call-actions» abre una página web con el número de la persona que llama como parámetro de consulta (sin respuesta):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Páginas Amarillas",
"command": {
"url": "https://www.pagesjaunes.fr/annuaireinverse/recherche",
"params": "quoiqui=${caller.phoneNumber}&proximite=0"
}
}
]
}
}Ejemplo 2: «on-incoming-pbx-call-actions» abre una página web con el número de la persona que llama integrado directamente en la URL (sin retorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Ventana emergente de contacto",
"command": {
"url": "http://localhost:3000/contactShow?phone=${caller.phoneNumber}"
}
}
]
}
}Realizar una llamada a la API REST con parámetros
Compatible con Rainbow Desktop y Rainbow Web; requiere que el servidor de la API responda a solicitudes CORS.
Ejemplo 1: cuando finaliza la llamada entrante, «on-releasing-incoming-pbx-call-actions» crea un registro de llamadas mediante una solicitud REST GET con los parámetros especificados en «params» (sin retorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-releasing-incoming-pbx-call-actions": [
{
"name": "GetRestApi",
"command": {
"commandType": "rest",
"method": "GET",
"url": "http://localhost:3000/IncidentManager/CreateCallLog",
"params": "byEmail=${localUser.email}&CustomerContact=${caller.phoneNumber}"
}
}
]
}
}Ejemplo 2 — Cuando finaliza la llamada entrante, «on-releasing-incoming-pbx-call-actions» crea un registro de llamadas mediante un método POST de REST con un cuerpo JSON (sin respuesta):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-releasing-incoming-pbx-call-actions": [
{
"name": "PostRestApi",
"command": {
"commandType": "rest",
"method": "POST",
"url": "http://localhost:3000/IncidentManager/EndCallLog",
"bodyParameters": {
"caller": "${contact.phoneNumber}",
"user": "${localUser.email}"
}
}
}
]
}
}