Funzionalità: Custo-manifest (Rainbow Extensions) — eventi di Telefonia
Licenza: Tutte le licenze — Cloud PBX · OmniPCX Enterprise · OXO Connect
Dettagli sulla licenza: le estensioni per gli eventi PBX costituiscono l’unica famiglia di estensioni Custo-manifest disponibile con una licenza Essential.
È possibile utilizzare questo articolo per configurare azioni automatiche attivate dagli eventi di chiamata del PBX. Verrà indicato quando si verifica ciascun evento, quali campi sono obbligatori e come trasmettere il contesto di chiamata di Rainbow al proprio endpoint REST o allo script locale.
Panoramica
Gli eventi di chiamata PBX consentono di attivare azioni automatiche quando una chiamata inizia a squillare, viene risposta o termina, senza alcun intervento manuale. Questa funzionalità è disponibile per tutte le licenze Rainbow destinate alle aziende collegate a un Cloud PBX o a un PBX Alcatel-Lucent Enterprise (OmniPCX Enterprise o OXO Connect).
Cosa è possibile fare con gli eventi di chiamata PBX:
- Aprire automaticamente un’applicazione CRM (app desktop o pagina web) all’arrivo o al termine di una chiamata
- Inviare le informazioni sul chiamante a un’API REST (screen pop, registrazione delle chiamate, arricchimento dei dati)
- Eseguire un’azione di follow-up quando la chiamata viene risposta o terminata
- Reagire alle chiamate in uscita per registrarle o attivare un flusso di lavoro
Tipi di eventi di chiamata del PBX
| Punto di estensione | Quando si attiva |
|---|---|
| on-incoming-pbx-call-actions | La chiamata in entrata inizia a squillare |
| on-answering-incoming-pbx-call-actions | L'utente risponde a una chiamata in arrivo |
| on-releasing-incoming-pbx-call-actions | La chiamata in entrata o in uscita termina |
| azioni-al-termine-di-una-chiamata-in-uscita-dal-PBX | L'utente effettua una chiamata in uscita |
| on-makecall-insert-correlator | Ad ogni avvio di chiamata — inserisce un correlatore (solo OXE) |
Configurazione di un’azione per un evento PBX
Il custo-manifest è un oggetto JSON con la seguente struttura:
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"<EXTENSION-POINT-KEY>": [
{
"name": "...",
"command": {
"url": "...",
"params": "...",
"commandType": "rest",
"method": "GET"
},
"icon": "...",
}
]
}
}Regole generali:
- la versione deve essere "2".
- jsonType deve essere "Rainbow-custo-manifest". All’interno di un file ZIP, questo campo identifica quale file JSON costituisce il manifesto.
- Ogni chiave presente in `extension-points` è un array — con un massimo di 3 azioni per ogni punto di estensione.
- Ogni azione contiene almeno un nome (facoltativo per gli eventi) e un oggetto comando valido.
Campi dell’azione
| Campo | Posizione | Descrizione |
|---|---|---|
| nome | radice | Testo visualizzato (titolo del pulsante/widget, etichetta del menu). Obbligatorio a seconda dell’EP. |
| icona / iconId | root | Icona del pulsante (URL, ${custo.path}\... o sprite integrato). Obbligatorio per i pulsanti con icona. |
| tooltip | root | Testo del tooltip. Facoltativo. |
| comando | root | Oggetto comando (vedere §3.2). Sempre obbligatorio. |
L'oggetto comando
L’oggetto comando è sempre obbligatorio e contiene almeno un URL. A seconda del commandType scelto, sono validi ulteriori sottocampi.
"command": {
"url": "{{server}}/your-endpoint",
"params": "user=${localUser.email}",
"commandType": "rest",
"method": "GET",
"header": ["Authorization: Bearer TOKEN"],
"bodyParameters": { "key": "value" }
}| Campo | Quando utilizzarlo |
|---|---|
| url | Obbligatorio. Percorso dell’applicazione, URL Web, file o API REST. |
| params | Facoltativo. Aggiunti dopo il simbolo “?” per i richieste GET, oppure come parametri URL. Sono ammesse variabili. |
| commandType | Facoltativo. Impostazione predefinita "rest". Valori: "rest", "file" (a seconda dell’EP). |
| method | Facoltativo (solo se commandType: "rest"). Valori: "GET", "POST". |
| header | Opzionale (se REST). Array di stringhe del tipo "Nome-intestazione: valore" inserite come intestazioni HTTP. |
| parametri del corpo | Obbligatorio se method: "POST". Oggetto JSON inviato come corpo della richiesta. Sono consentite le variabili. |
Variabili Rainbow
Le variabili $ vengono sostituite in fase di esecuzione con il loro valore effettivo. Possono comparire in command.url, command.params, command.bodyParameters e nel contenuto restituito all’estensione per la visualizzazione.
Sintassi
${object.attribute}
${object.attribute.regex(pattern)}
${object.attribute.regex(pattern, replacement)}Oggetti e attributi disponibili
Utente Rainbow (ME)
${localUser.firstName} ${localUser.lastName}
${localUser.email} ${localUser.canonicalNumber}
${localUser.phoneNumber} ${localUser.internalNumber}
${localUser.phonePbx} ${localUser.nickname}
${localUser.loginEmail} ${localUser.id}Chiamante
${caller.firstName} ${caller.lastName} ${caller.phoneNumber}Chiamato
${called.phoneNumber}Contesto della chiamata
${call.callId}
${call.globalCallId} (solo OXE)
${call.correlator}Contatto (se identificato)
${contact.firstName} ${contact.lastName}
${contact.phoneNumber} ${contact.email}
${contact.company} ${contact.workNumber}
${contact.mobileNumber} ${contact.personalNumber}
${contact.personalMobile}
${contact.tags} (concatenati, separati da virgola)Compatibilità — Eventi di chiamata PBX
| Punto di estensione | Oggetti variabili consentiti |
|---|---|
| Eventi relativi alle chiamate in uscita | localUser, called, call, Contatto |
| Eventi relativi alle chiamate in entrata (in entrata / risposta / terminazione) | localUser, chiamante, chiamato, chiamata, Contatto |
modificatore regex
Applica un'espressione regolare al valore della variabile prima della sostituzione:
// Normalizza un numero — sostituisca +33 o +1 con 0
"params": "pbx=${localUser.phonePbx.regex(^\+33|^\+1, 0)}"
// Sostituisca il dominio dell’indirizzo e-mail
"params": "byEmail=${localUser.email.regex(alcatel.com, al-enterprise.com)}"
// Estragga le ultime 9 cifre (nessuna sostituzione = estrazione)
"params": "${called.phoneNumber.regex(.{0,9}$)}"Variabile ${time}
Disponibile su tutti i punti di estensione — sostituita nel momento in cui l’azione viene eseguita.
| Variabile | Valore |
|---|---|
| ${time} | Data e ora complete (ISO 8601, ad es. 2026-05-18T15:30:45.123Z) |
| ${time.year} | Anno — 4 cifre |
| ${time.month} | Mese — da 01 a 12 |
| ${time.day} | Giorno — 01-31 |
| ${time.hour} | Ora — 00-23 |
| ${time.minute} | Minuto — 00-59 |
| ${time.second} | Secondo — 00-59 |
| ${time.millisec} | Millisecondi — 000-999 |
// Creazione di un identificatore di log
"params": "logId=${time.year}-${time.month}-${time.day}_${time.hour}${time.minute}${time.second}"Risorse locali — ${custo.path}
Per distribuire un manifesto con file locali (icone o file di visualizzazione):
- Fare riferimento a ciascuna risorsa come ${custo.path}\\nome-file.ext
- Comprimere il file custo-manifest.json e i file delle risorse in un archivio ZIP (con il manifesto nella directory principale)
{
"icon": "${custo.path}\\basketball.png",
"command": {
"commandType": "file",
"url": "${custo.path}\\FileDisplay.txt"
},
"responseType": "markdown"
}Campi specifici dell’evento
| Campo | Descrizione |
|---|---|
| "filter" | "NoShortNumber" — non si attiva se il numero del chiamante è un numero breve (interno) |
| "RaiseChangeCall" | false = solo chiamate dirette · true = chiamate dirette + trasferite · "only" = solo chiamate trasferite |
Inclusione delle risorse locali (archivio ZIP)
Se l’azione fa riferimento a file locali (icone o file di visualizzazione), si prega di raggruppare il file custo-manifest.json con tali file in un archivio .zip prima dell’importazione.
Struttura ZIP richiesta — il manifesto deve trovarsi nella directory principale:
my-manifest.zip
├── custo-manifest.json
├── icon.png
└── display-content.txtDistribuzione del manifesto
Una volta configurato il manifesto, lo si distribuisce tramite la console di amministrazione di Rainbow o localmente. Si veda Distribuzione di un custo-manifest in Rainbow.
Esempi di configurazione
Esecuzione di un’applicazione o di uno script con parametri
Supportato solo da Rainbow Desktop.
Esempio 1 — on-incoming-pbx-call-actions esegue un’applicazione desktop (ad es. MicroCRM) con un parametro proveniente da params (senza ritorno):
{
"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}"
}
}
]
}
}Esempio 2 — on-incoming-pbx-call-actions esegue uno script (.bat) con più parametri provenienti da params (senza ritorno):
{
"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}"
}
}
]
}
}Aprire una pagina web con i parametri
Supportato da Rainbow Desktop e Rainbow Web.
Esempio 1 — on-incoming-pbx-call-actions apre una pagina web con il numero del chiamante come parametro di query (senza ritorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Pagine Gialle",
"command": {
"url": "https://www.pagesjaunes.fr/annuaireinverse/recherche",
"params": "quoiqui=${caller.phoneNumber}&proximite=0"
}
}
]
}
}Esempio 2 — on-incoming-pbx-call-actions apre una pagina web con il numero del chiamante incorporato direttamente nell’URL (senza ritorno):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Popup dei contatti",
"command": {
"url": "http://localhost:3000/contactShow?phone=${caller.phoneNumber}"
}
}
]
}
}Eseguire una chiamata all’API REST con parametri
Supportato da Rainbow Desktop e Rainbow Web — richiede che il server API risponda alle richieste CORS.
Esempio 1 — Al termine della chiamata in entrata, on-releasing-incoming-pbx-call-actions crea un registro delle chiamate tramite REST GET con i parametri in params (senza ritorno):
{
"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}"
}
}
]
}
}Esempio 2 — Al termine della chiamata in entrata, "on-releasing-incoming-pbx-call-actions" crea un registro delle chiamate tramite POST REST con un corpo JSON (senza risposta):
{
"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}"
}
}
}
]
}
}