Fonctionnalité: Custo-manifest (Rainbow Extensions) — événements de Téléphonie
Licence: toutes les licences — Cloud PBX · OmniPCX Enterprise · OXO Connect
Détails de la licence: les extensions d’événements PBX constituent la seule famille d’extensions « custo-manifest » disponible avec une licence Essential.
Cet article vous permettra de configurer des actions automatiques déclenchées par des événements d’appel PBX. Vous découvrirez à quel moment chaque événement se produit, quels champs sont obligatoires et comment transmettre le contexte d’appel Rainbow à votre point de terminaison REST ou à votre script local.
Présentation
Les événements d’appel PBX vous permettent de déclencher des actions automatiques lorsqu’un appel commence à sonner, est pris ou prend fin — sans intervention manuelle. Cette fonctionnalité est disponible pour toutes les licences Rainbow destinées aux compagnies connectées à un Cloud PBX ou à un PBX Alcatel-Lucent Enterprise (OmniPCX Enterprise ou OXO Connect).
Ce que vous pouvez faire avec les événements d’appel PBX :
- Ouvrir automatiquement une application CRM (application de bureau ou page Web) lorsqu’un appel arrive ou prend fin
- Transmettre les informations sur l’appelant à une API REST (affichage contextuel, journalisation des appels, enrichissement des données)
- Exécuter une action de suivi lorsque l’appel est pris ou raccroché
- Réagir aux appels sortants pour les enregistrer ou déclencher un workflow
Types d’événements d’appel PBX
| Point d’extension | Quand il se déclenche |
|---|---|
| on-incoming-pbx-call-actions | L'appel entrant commence à sonner |
| on-answering-incoming-pbx-call-actions | L'utilisateur répond à un appel entrant |
| actions-lors-de-la-fin-d’un-appel-entrant-via-le-PBX | L'appel entrant ou sortant prend fin |
| actions-lors-d’un-appel-sortant-via-le-PBX | L'utilisateur passe un appel sortant |
| on-makecall-insert-correlator | À chaque établissement d’appel — insertion d’un corrélateur (OXE uniquement) |
Configuration d’une action d’événement PBX
Le « custo-manifest » est un objet JSON présentant la structure suivante :
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"<EXTENSION-POINT-KEY>": [
{
"name": "...",
"command": {
"url": "...",
"params": "...",
"commandType": "rest",
"method": "GET"
},
"icon": "...",
}
]
}
}Règles générales :
- la version doit être « 2 ».
- jsonType doit être « Rainbow-custo-manifest ». Dans un fichier ZIP, ce champ identifie le fichier JSON qui sert de manifeste.
- Chaque clé sous « extension-points » est un tableau — avec un maximum de 3 actions par point d’extension.
- Chaque action contient au moins un nom (facultatif pour les événements) et un objet de commande valide.
Champs de l’action
| Champ | Position | Description |
|---|---|---|
| nom | racine | Texte affiché (titre d'un bouton ou d'un widget, libellé de menu). Obligatoire selon l'EP. |
| icône / iconId | racine | Icône du bouton (URL, ${custo.path}\... ou sprite intégré). Obligatoire pour les boutons avec icône. |
| tooltip | racine | Texte de l'info-bulle. Facultatif. |
| commande | racine | Objet « commande » (voir §3.2). Toujours obligatoire. |
L'objet « command »
L’objet « command » est toujours obligatoire et contient au moins une URL. En fonction du « commandType » choisi, des sous-champs supplémentaires sont autorisés.
"command": {
"url": "{{server}}/your-endpoint",
"params": "user=${localUser.email}",
"commandType": "rest",
"method": "GET",
"header": ["Authorization: Bearer TOKEN"],
"bodyParameters": { "key": "value" }
}| Champ | Quand l’utiliser |
|---|---|
| url | Obligatoire. Chemin d’accès à l’application, URL Web, fichier ou API REST. |
| params | Facultatif. Ajouté après le signe « ? » pour les requêtes GET, ou sous forme de paramètres d’URL. Variables autorisées. |
| commandType | Facultatif. Valeur par défaut : « rest ». Valeurs : « rest », « file » (selon l’EP). |
| method | Facultatif (uniquement si commandType : « rest »). Valeurs : « GET », « POST ». |
| header | Facultatif (si REST). Tableau de chaînes de caractères « Nom-d’en-tête : valeur » insérées en tant qu’en-têtes HTTP. |
| paramètres du corps | Obligatoire si la méthode est « POST ». Objet JSON envoyé en corps de requête. Les variables sont autorisées. |
Variables Rainbow
Les variables $ sont remplacées lors de l’exécution par leur valeur réelle. Elles peuvent apparaître dans command.url, command.params, command.bodyParameters, ainsi que dans le contenu renvoyé à l’extension pour affichage.
Syntaxe
${object.attribute}
${object.attribute.regex(pattern)}
${object.attribute.regex(pattern, replacement)}Objets et attributs disponibles
Utilisateur Rainbow (ME)
${localUser.firstName} ${localUser.lastName}
${localUser.email} ${localUser.canonicalNumber}
${localUser.phoneNumber} ${localUser.internalNumber}
${localUser.phonePbx} ${localUser.nickname}
${localUser.loginEmail} ${localUser.id}Appelant
${caller.firstName} ${caller.lastName} ${caller.phoneNumber}Appelé
${called.phoneNumber}Contexte de l'appel
${call.callId}
${call.globalCallId} (OXE uniquement)
${call.correlator}Contact (si identifié)
${contact.prénom} ${contact.nom}
${contact.numéroDeTéléphone} ${contact.e-mail}
${contact.compagnie} ${contact.numéroprofi}
${contact.numéromobile} ${contact.numéroperso}
${contact.mobileresso}
${contact.tags} (concaténés, séparés par des virgules)Compatibilité — Événements d’appel PBX
| Point d’extension | Objets variables autorisés |
|---|---|
| Événements d’appels sortants | localUser, called, call, Contact |
| Événements d'appels entrants (appel entrant / prise d'appel / fin d'appel) | localUser, appelant, appelé, appel, Contact |
Modificateur regex
Applique une expression régulière à la valeur de la variable avant la substitution:
// Normaliser un numéro — remplacer +33 ou +1 par 0
"params": "pbx=${localUser.phonePbx.regex(^\+33|^\+1, 0)}"
// Remplacer le domaine de l'adresse e-mail
"params": "byEmail=${localUser.email.regex(alcatel.com, al-enterprise.com)}"
// Extraire les 9 derniers chiffres (pas de remplacement = extraction)
"params": "${called.phoneNumber.regex(.{0,9}$)}"Variable ${time}
Disponible sur tous les points d’extension — remplacée au moment où l’action est exécutée.
| Variable | Valeur |
|---|---|
| ${time} | Date et heure complètes (ISO 8601, par exemple 2026-05-18T15:30:45.123Z) |
| ${time.year} | Année — 4 chiffres |
| ${time.month} | Mois — 01-12 |
| ${time.day} | Jour — 01-31 |
| ${time.hour} | Heure — 00-23 |
| ${time.minute} | Minute — 00-59 |
| ${time.second} | Seconde — 00-59 |
| ${time.millisec} | Millisecondes — 000-999 |
// Créer un identifiant de journal
"params": "logId=${time.year}-${time.month}-${time.day}_${time.hour}${time.minute}${time.second}"Ressources locales — ${custo.path}
Pour distribuer un manifeste contenant des fichiers locaux (icônes ou fichiers d'affichage) :
- Référencez chaque ressource sous la forme ${custo.path}\\nom-du-fichier.ext
- Compressez le fichier custo-manifest.json et les fichiers de ressources dans un fichier ZIP (le manifeste à la racine)
{
"icon": "${custo.path}\\basketball.png",
"command": {
"commandType": "file",
"url": "${custo.path}\\FileDisplay.txt"
},
"responseType": "markdown"
}Champs spécifiques à l’événement
| Champ | Description |
|---|---|
| « filter » | « NoShortNumber » — ne se déclenche pas si le numéro de l’appelant est un numéro court (interne) |
| « RaiseChangeCall » | false = appels directs uniquement · true = appels directs + appels transférés · « only » = appels transférés uniquement |
Inclusion des ressources locales (archive ZIP)
Si l’action fait référence à des fichiers locaux (icônes ou fichiers d’affichage), regroupez le fichier custo-manifest.json avec ces fichiers dans une archive .zip avant l’importation.
Structure ZIP requise — le manifeste doit se trouver à la racine :
my-manifest.zip
├── custo-manifest.json
├── icon.png
└── display-content.txtDéploiement du manifeste
Une fois le manifeste configuré, déployez-le via la console d’administration Rainbow ou localement. Consultez la section « Déploiement d’un custo-manifest dans Rainbow ».
Exemples de configuration
Exécuter une application ou un script avec des paramètres
Fonctionnalité prise en charge uniquement par Rainbow Desktop.
Exemple 1 — « on-incoming-pbx-call-actions » exécute une application de bureau (par exemple, MicroCRM) avec un paramètre issu de « params » (sans retour) :
{
"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}"
}
}
]
}
}Exemple 2 — « on-incoming-pbx-call-actions » exécute un script (.bat) avec plusieurs paramètres issus de « params » (sans retour) :
{
"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}"
}
}
]
}
}Ouvrir une page Web avec des paramètres
Prise en charge par Rainbow Desktop et Rainbow Web.
Exemple 1 — « on-incoming-pbx-call-actions » ouvre une page Web avec le numéro de l’appelant comme paramètre de requête (sans retour) :
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Pages Jaunes",
"command": {
"url": "https://www.pagesjaunes.fr/annuaireinverse/recherche",
"params": "quoiqui=${caller.phoneNumber}&proximite=0"
}
}
]
}
}Exemple 2 — « on-incoming-pbx-call-actions » ouvre une page Web avec le numéro de l’appelant directement intégré dans l’URL (sans retour) :
{
"version" : "2",
"jsonType" : "Rainbow-custo-manifest",
"extension-points" : {
"on-incoming-pbx-call-actions" : [
{
"name": "Fenêtre contextuelle de contact",
"command": {
"url": "http://localhost:3000/contactShow?phone=${caller.phoneNumber}"
}
}
]
}
}Effectuer un appel API REST avec des paramètres
Pris en charge par Rainbow Desktop et Rainbow Web — nécessite que le serveur API réponde aux requêtes CORS.
Exemple 1 — À la fin de l’appel entrant, « on-releasing-incoming-pbx-call-actions » crée un journal d’appels via une requête REST GET avec les paramètres définis dans « params » (sans retour) :
{
"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}"
}
}
]
}
}Exemple 2 — À la fin de l’appel entrant, « on-releasing-incoming-pbx-call-actions » crée un journal d’appels via une requête REST POST avec un corps JSON (sans réponse) :
{
"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}"
}
}
}
]
}
}