Présentation du Planificateur
Ce guide vous montre comment configurer et utiliser l’application Planificateur de Cirrus Shield pour planifier efficacement vos missions vis-à-vis de vos ressources et vos lieux.
Le mapping et les boutons à ajouter sont expliqués ici.
Configuration Initiale du Planificateur
- Allez dans Configuration, puis dans l’onglet Applications connectées et assurez-vous que l’application planificateur y figure.
- Allez dans l’onglet Extensions et vérifiez que l’extension planificateur est présente.
- Si l’extension n’est pas présente, téléchargez-la en cliquant sur l’icône plus, puis en la sélectionnant dans la liste.
- Cliquez sur Détails de cette extension depuis la liste
- Une page de présentation du Planificateur s’ouvre.
- Cliquez sur le bouton Configurer le planificateur pour passer à l’étape suivante.
Configuration des Horaires et Jours de Fermeture
- Indiquez les horaires de travail de votre entreprise pour chaque jour de la semaine.
- Ajoutez les jours de fermeture. Ceux-ci peuvent être valables pour une seule année ou répétitifs chaque année.

- Cliquez ensuite sur Enregistrer.
Mappage des Objets et Champs
- Faites correspondre les objets et les champs avec le planificateur.
- Si votre secteur d’activité figure dans le modèle de mappage, sélectionnez-le pour un mappage automatique, à condition que vous disposiez des objets et champs correspondants.

Cartographie des Rôles Génériques Cirrus Shield
Le moteur de planification ne code en dur aucun nom d’objet ni de champ. Chaque rôle générique ci-dessous est mappé une fois, par organisation, dans l’étape Mapping de l’assistant /config. Ce document décrit le vocabulaire générique — jamais les noms réels d’une organisation en particulier.
Comment lire une fiche :
- Objet Cirrus Shield — toujours choisi à la main pour chaque organisation ; aucune valeur par défaut, jamais un champ.
- Champ fixe — nom d’API supposé identique pour toutes les organisations. N’apparaît pas dans l’assistant ; une correction se fait directement en base de données si l’organisation diffère.
- Champ à mapper — proposé comme liste déroulante dans l’assistant ; l’administrateur choisit le champ réel de son organisation.
01 — Service (GenericRole.Service)
L’offre ou le produit auquel une Mission est rattachée — sert à filtrer quelles Ressources sont qualifiées via une Compétence.
Objet Cirrus Shield à choisir — obligatoire.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom affiché du Service. |
| CodeProduit | Product_Code | Code interne du produit/offre, à titre d’identifiant lisible. |
Champs à mapper
| Champ générique | Description |
|---|---|
| (aucun) | — |
02 — Ressource (GenericRole.Resource)
La personne, la salle ou l’équipement que l’on planifie — celui qui occupe un Créneau.
Objet Cirrus Shield à choisir — obligatoire.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom affiché de la Ressource dans le calendrier et les sélecteurs. |
Champs à mapper
| Champ générique | Description |
|---|---|
| (aucun) | — |
03 — Compétence (GenericRole.Skill) — Optionnel
Le lien N:N Ressource↔︎Service — quelles Ressources sont qualifiées pour quel Service. Si non mappé, aucune restriction de compétence n’est appliquée.
Objet Cirrus Shield à choisir — objet de jonction (ex. Competence).
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom du lien lui-même (rarement affiché). |
Champs à mapper
| Champ générique | Description |
|---|---|
| ResourceId | Lookup vers la Ressource qui détient la compétence. |
| ServiceId | Lookup vers le Service couvert par cette compétence. |
04 — Mission (GenericRole.Mission)
L’élément sur lequel on planifie — un chantier, une session de formation, un événement… selon le métier de l’organisation. Porte ses propres bornes de dates et son iframe de planification dans Cirrus Shield.
Objet Cirrus Shield à choisir — obligatoire.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom affiché de la Mission. |
| DateDebut | Date_de_debut | Première journée de validité pour un Créneau de cette Mission. |
| DateFin | Date_de_fin | Dernière journée de validité — comparée au fuseau local de l’organisation, jamais à l’instant UTC brut. |
Champs à mapper
| Champ générique | Description |
|---|---|
| ServiceId | Lookup vers le Service de la Mission (peut nécessiter un second saut si le Lookup ne pointe pas directement dessus). |
| LocationId | Lieu par défaut de la Mission. Règle : au moins un des deux — Mission.LocationId ou Créneau.LocationId — doit être mappé. |
05 — Créneau (GenericRole.Unit)
Le créneau horaire lui-même — une intervention planifiée d’une Ressource, sur un Lieu, dans le cadre d’une Mission. Le même objet représente aussi une Absence (voir le champ Type).
Objet Cirrus Shield à choisir — obligatoire.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom du Créneau — généré automatiquement si laissé vide. |
| Date | Date | Jour du Créneau. Sur certaines organisations ce champ reflète l’horodatage complet plutôt qu’un minuit normalisé — toujours re-normaliser avant comparaison. |
| HeureDebut | Date_de_debut | Horodatage UTC de début. |
| HeureFin | Date_de_fin | Horodatage UTC de fin. |
| Type | Type | Distingue Travail / Absence — remplace l’ancien rôle générique séparé Unavailability (obsolète). |
| SerieId | Serie_Id | Champ hérité du volet natif CS. Non lu par le code actuel — l’appartenance à une série est désormais gérée uniquement côté application (table locale SeriesUnit). |
| DetacheDeLaSerie | Detache_de_la_serie | Champ hérité, conservé uniquement pour compatibilité. Jamais lu par le code actuel, pour quelque usage que ce soit. |
Champs à mapper
| Champ générique | Description |
|---|---|
| ResourceId | Lookup vers la Ressource assignée à ce Créneau. |
| MissionId | Lookup vers la Mission de ce Créneau. |
| LocationId (optionnel) | Lieu explicite de ce Créneau, s’il diffère du Lieu par défaut de la Mission. |
Non exposé dans l’assistant :
Les champs « mode formation » — PauseDebut, PauseFin, Matin, ApresMidi (demi-journées) — existent dans le modèle générique du Créneau mais ne sont pas encore proposés dans l’étape Mapping. Pour une organisation qui en a besoin aujourd’hui, ils doivent être insérés directement dans la table FieldMapping — une limitation connue de l’assistant, pas un choix délibéré comme pour un champ fixe.
06 — Ressources de la mission (GenericRole.MissionResource) — Optionnel
Jonction Mission↔︎Ressource, pour les organisations qui possèdent déjà un objet de ce type (ex. un objet « Cours » liant Session et Formateur). Quand ce rôle est mappé, il remplace entièrement la synchronisation automatique par défaut.
Objet Cirrus Shield à choisir — laisser non mappé si l’organisation n’a pas d’objet de jonction dédié.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| (aucun) | — | — |
Champs à mapper
| Champ générique | Description |
|---|---|
| MissionId | Lookup vers la Mission concernée. |
| ResourceId | Lookup vers la Ressource rattachée à la Mission. |
07 — Ressources autorisées sur le lieu (GenericRole.LocationResource) — Optionnel
Jonction Lieu↔︎Ressource — restreint quelles Ressources peuvent être planifiées sur quel Lieu. Si non mappé, cette restriction est simplement désactivée pour l’organisation, sans repli sur un autre mécanisme.
Objet Cirrus Shield à choisir — laisser non mappé si l’organisation ne restreint pas les Ressources par Lieu.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| (aucun) | — | — |
Champs à mapper
| Champ générique | Description |
|---|---|
| LocationId | Lookup vers le Lieu concerné par la restriction. |
| ResourceId | Lookup vers la Ressource autorisée sur ce Lieu. |
08 — Lieu (GenericRole.Location)
L’endroit où se déroule un Créneau — une salle, un chantier, une adresse.
Objet Cirrus Shield à choisir — obligatoire.
Champs fixes
| Champ générique | API Cirrus Shield | Description |
|---|---|---|
| Nom | Name | Nom affiché du Lieu. |
| AllowConflict | Allow_Conflict | Case à cocher : place ce Lieu hors du contrôle de planification de l’application — supprime uniquement l’alerte de double réservation du Lieu jamais les autres règles. Format de câblage CS réel non encore confirmé sur une organisation en production. |
Champs à mapper
| Champ générique | Description |
|---|---|
| DescriptionFields (optionnel) | Liste de champs CS à concaténer comme description dans le sélecteur de Lieu (ex. Ville, Code postal, Adresse). Multi-sélection — stockée comme une liste de noms d’API séparés par des virgules, pas un simple Lookup. |
Ajouter les boutons dans les pages des ressources et des missions
Ressource
- Allez dans Configuration → Objets.
- Cliquez sur l’objet qui représente les ressources dans votre organisation.
- Cliquez sur Détails de l’objet, puis ouvrez l’onglet Boutons personnalisés.
- Cliquez sur le bouton de création pour ajouter un nouveau bouton.
- Configurez le bouton selon les paramètres suivants :

Copiez et collez le code JavaScript suivant dans la section du code :
function OpenPlan() {
var RecordID = GetRecordGUID();
var modelName = window.location.search.slice(1).split("&")[0].split("=")[1];
var userinfo = GetCurrentloggedInUserInfo();
var orgInfo = GetOrganizationIDForAllUsers();
openPopup();
function openPopup() {
var popup = createPopup();
document.body.appendChild(popup);
var popupContent = createPopupContent();
popup.appendChild(popupContent);
var closeBtn = createCloseButton(popup);
popupContent.appendChild(closeBtn);
var loadingSpinner = createLoadingSpinner();
popupContent.appendChild(loadingSpinner);
var iframe = createIframe(RecordID, modelName, userinfo, loadingSpinner, orgInfo);
popupContent.appendChild(iframe);
}
function createPopup() {
var popup = document.createElement("div");
popup.id = "myPopupPlanificateur";
popup.style.cssText = "position: fixed; z-index: 9999999; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; overflow: auto; background-color: rgba(0,0,0,0.4); display: flex; justify-content: center; align-items: center;";
return popup;
}
function createPopupContent() {
var popupContent = document.createElement("div");
popupContent.id = "popupContentPlanificateur";
popupContent.style.cssText = "background-color: white; padding: 0px; border: 1px solid #888; border-radius: 16px; width: 95%; height: 100%; position: relative; box-shadow: 0 8px 30px rgba(0,0,0,0.25); overflow: hidden;";
return popupContent;
}
function createCloseButton(popup) {
var closeBtn = document.createElement("span");
closeBtn.innerHTML = "×";
closeBtn.style.cssText = "position: absolute; top: 8px; right: 16px; font-size: 28px; font-weight: bold; cursor: pointer; z-index: 10;";
closeBtn.onclick = function () {
popup.style.display = "none";
location.reload(true);
};
return closeBtn;
}
function createLoadingSpinner() {
var loadingSpinner = document.createElement("div");
loadingSpinner.id = "loadingSpinnerPlanificateur";
loadingSpinner.style.cssText = "position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);";
loadingSpinner.innerHTML = '';
var style = document.createElement("style");
style.textContent = `
#loadingSpinnerPlanificateur .spinner {
border: 4px solid rgba(0, 0, 0, 0.1);
border-left: 4px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
loadingSpinner.appendChild(style);
return loadingSpinner;
}
function createIframe(RecordID, modelName, userinfo, loadingSpinner, orgInfo) {
var iframe = document.createElement("iframe");
loadingSpinner.style.display = "block";
iframe.addEventListener("load", function () {
loadingSpinner.style.display = "none";
});
iframe.src = `https://planificateur.cirrus-shield.net/${userinfo["Language"]}/planificateur-ressource?orgId=${orgInfo}&resourceId=${RecordID}&TimeZoneSidKey=${userinfo["TimeZoneSidKey"]}&LocaleSidKey=${userinfo["LocaleSidKey"]}`;
iframe.style.cssText = "width: 100%; height: 100%; border: none; border-radius: 0 0 12px 12px;";
return iframe;
}
}
N’oubliez pas de renseigner les profils qui ont accès à ce bouton : cliquez sur l’onglet Profils, puis sur le bouton de modification (crayon bleu).
Mission
Faites la même chose pour l’objet qui représente la mission dans votre environnement, avec ce code JavaScript :
function OpenPlan() {
var RecordID = GetRecordGUID();
var modelName = window.location.search.slice(1).split("&")[0].split("=")[1];
var userinfo = GetCurrentloggedInUserInfo();
var orgInfo = GetOrganizationIDForAllUsers();
openPopup();
function openPopup() {
var popup = createPopup();
document.body.appendChild(popup);
var popupContent = createPopupContent();
popup.appendChild(popupContent);
var closeBtn = createCloseButton(popup);
popupContent.appendChild(closeBtn);
var loadingSpinner = createLoadingSpinner();
popupContent.appendChild(loadingSpinner);
var iframe = createIframe(RecordID, modelName, userinfo, loadingSpinner, orgInfo);
popupContent.appendChild(iframe);
}
function createPopup() {
var popup = document.createElement("div");
popup.id = "myPopupPlanificateur";
popup.style.cssText = "position: fixed; z-index: 9999999; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; overflow: auto; background-color: rgba(0,0,0,0.4); display: flex; justify-content: center; align-items: center;";
return popup;
}
function createPopupContent() {
var popupContent = document.createElement("div");
popupContent.id = "popupContentPlanificateur";
popupContent.style.cssText = "background-color: white; padding: 0px; border: 1px solid #888; border-radius: 16px; width: 95%; height: 100%; position: relative; box-shadow: 0 8px 30px rgba(0,0,0,0.25); overflow: hidden;";
return popupContent;
}
function createCloseButton(popup) {
var closeBtn = document.createElement("span");
closeBtn.innerHTML = "×";
closeBtn.style.cssText = "position: absolute; top: 8px; right: 16px; font-size: 28px; font-weight: bold; cursor: pointer; z-index: 10;";
closeBtn.onclick = function () {
popup.style.display = "none";
location.reload(true);
};
return closeBtn;
}
function createLoadingSpinner() {
var loadingSpinner = document.createElement("div");
loadingSpinner.id = "loadingSpinnerPlanificateur";
loadingSpinner.style.cssText = "position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);";
loadingSpinner.innerHTML = '';
var style = document.createElement("style");
style.textContent = `
#loadingSpinnerPlanificateur .spinner {
border: 4px solid rgba(0, 0, 0, 0.1);
border-left: 4px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
loadingSpinner.appendChild(style);
return loadingSpinner;
}
function createIframe(RecordID, modelName, userinfo, loadingSpinner, orgInfo) {
var iframe = document.createElement("iframe");
loadingSpinner.style.display = "block";
iframe.addEventListener("load", function () {
loadingSpinner.style.display = "none";
});
iframe.src = `https://planificateur.cirrus-shield.net/${userinfo["Language"]}/planificateur?orgId=${orgInfo}&missionId=${RecordID}&TimeZoneSidKey=${userinfo["TimeZoneSidKey"]}&LocaleSidKey=${userinfo["LocaleSidKey"]}`;
iframe.style.cssText = "width: 100%; height: 100%; border: none; border-radius: 0 0 12px 12px;";
return iframe;
}
}