Prérequis côté Cirrus Shield :
Les modèles d’emails utilisés doivent exister dans l’objet « Modèles d’emails ».
- Vérifier les éléments suivants :
- Le groupe Support Group existe.S’il n’existe pas:
Cliquer sur configuration

Puis cliquer sur gestion des utilisateurs

Ensuite cliquer sur groupes puis sur nouveau :

Remplir les informations comme dans l’image ci-dessous

Vérifier que les utilisateurs nécessaires sont bien assignés à ce groupe.

2 .Le profil Support client est bien créé.

3. Le bouton Activer le portail client est ajouté sur l’objet Contact.

Si le bouton n’existe pas :
- Partir dans configuration, puis cliquer sur objets, trouver l’objet contact et cliquer sur détails

Cliquer sur bouton personnalisées puis sur nouveau :

Remplir les informations comme l’image ci-dessous:

Le code la fonction:
ar script = document.createElement("script");
script.src = "https://apps.cirrus-shield.net/resources/sweetalert2/sweetalert2.min.js";
document.head.appendChild(script);
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = "https://apps.cirrus-shield.net/resources/sweetalert2/sweetalert2.min.css";
document.head.appendChild(link);
function ActivateContactUser() {
debugger; // Removes this line if you want to stop the code from pausing in the inspector
let OrganizationId = btoa(GetOrganizationInfo().Id);
let currentUserGuid = GetLoggedInUserGUID();
let objUser = GetDataByID(currentUserGuid, "User", "Language");
let UserLanguage = objUser.Language;
let thisGuid = GetRecordGUID();
let Contact = GetDataByID(thisGuid,"Contact","Id,Account, Name,Email,First_Name,Last_Name,PortalUser");
let userContact = GetData(`Select Id, Name from User Where Email = ${Contact.Email}`)
let password = GenPassword();
let user = "ACP_" + Contact.Email;
let MailModel = GetData("Select Body,CC,BCC,Subject,To From Email_Template Where Name = 'Activation portail support'").Email_Template[0]
MailModel.Body=MailModel.Body.replace("{!UserPlaceholder}",user)
MailModel.Body=MailModel.Body.replace("{!PasswordPlaceholder}",password)
// 4. Run Error Handling
if (!ErrorHandling()) {
return;
}
// 5. Get Account and Position Data
let Account = GetDataByID(Contact.Account,"Account","Id,Name");
let position = GetData(`Select Id, Name from UserPosition Where Name = ${Account.Name}`)
var parentPositionId = "3779523246987151657";
let positionId = "";
positionCheck();
var createdUser = CreateUser();
if (createdUser == false) { return; }
createdUser = createdUser.RecordGUID
UpdateContactAndUser(createdUser)
SendMailToContact()
successMessage()
// --- Helper Functions ---
function SendMailToContact() {
var jsonString = [];
try {
jsonString.push({
"objectName": "Contact",
"recordId": thisGuid,
"from": "Org",
"subject": MailModel.Subject,
"to": Contact.Email,
"cc": "ali.mansour5@aliston.fr",
"bcc": "",
"replyTo": "",
"CurrentUserId": GetLoggedInUserGUID(),
"OrganizationId": GetOrganizationInfo().Id,
"body": {
"emailBody": MailModel.Body,
"attachments": [],
"Templates": []
}
});
} catch (e) {
console.error(e);
}
return generateDocsAndSendEmail("https://beta.cirrus-shield.net", jsonString);
}
function UpdateContactAndUser(userGUID) {
ObjectMap = [{
"Id": thisGuid,
"PortalUser": userGUID,
}];
docContact = fillDocMapArray(ObjectMap, "Contact");
RecordShortcutV2("Update", "Contact", "Contact", docContact);
}
function CreateUser() {
debugger;
ObjectMap = [{
"FirstName": Contact.First_Name,
"Username": user,
"LastName": Contact.Last_Name,
"Email": Contact.Email,
"ProfileId": "3779364767659985837",
"PositionId":positionId,
"Language": UserLanguage,
"Password": password
// "Formateur":GetRecordGUID()
}];
docUser = fillDocMapArray(ObjectMap, "User");
return RecordShortcutV2("Create", "Utilisateur", "User", docUser);
}
function GenPassword() {
const chars = "0123456789abcdefghijklmnopqrstuvwxyz!@ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const passwordLength = 12;
let password = "";
for (var i = 0; i <= passwordLength; i++) {
var randomNumber = Math.floor(Math.random() * chars.length);
password += chars.substring(randomNumber, randomNumber + 1);
}
return password;
}
function ErrorHandling() {
if (Contact.PortalUser != null && Contact.PortalUser != undefined) {
alert("Il existe déjà un utilisateur associé à ce contact.");
return false;
}
// FIX: Better check for existing user (checking .User array length)
if (userContact && userContact.User && userContact.User.length > 0) {
alert("Un utilisateur avec le même email que ce contact existe déjà.");
return false;
}
if (Contact.Account == null || Contact.Account == undefined) {
alert("Veuillez indiquer le compte");
return false;
}
if (!confirm("Etes-vous sûr(e) de vouloir activer le portail de ce contact ?")) {
return false;
}
return true;
}
function successMessage(){
var urlRecord = "https://beta.cirrus-shield.net/Data/Details/" + thisGuid+ "?objectName="+"Contact"
setTimeout(() => {
Swal.fire({
icon: 'success',
title: `L'utilisateur de ce contact a été créé avec succès`,
text: `L'utilisateur de ce contact a été créé avec succès et un mail lui a été envoyé !`,
confirmButtonText: `<a href='${urlRecord}' onclick='location=location;'>Rafraichir le contact</a>`,
});
}, 1000);
}
function generateDocsAndSendEmail(cssServerURL, data) {
var url = `https://docxtopdf.cirrus-shield.net/DocxToPDF/GenerateDocsAndSendEmails?CSServerURL=${encodeURIComponent(cssServerURL)}`;
var token = GetTokenID();
return new Promise((resolve, reject) => {
$.ajax({
url: url,
type: "POST",
contentType: "application/json",
headers: {
"Authorization": `Bearer ${token}`
},
data: JSON.stringify(data),
success: function(response) {
resolve(true);
},
error: function(xhr, status, error) {
console.error(`Error: ${xhr.status} - ${xhr.statusText}`);
resolve(false);
}
});
});
}
function positionCheck(){
debugger
if(position == null){
var doc = fillDocMapArray([{Name:Account.Name,ShareDataWithPeers:1,ParentPositionId:parentPositionId}],"UserPosition")
positionId = RecordShortcutV2("Create","UserPosition","UserPosition",doc).RecordGUID
}else{
positionId = position.UserPosition[0].Id
}
}
}
Adapter les GUIDs de la position et du profiles dans le code selon votre environnement (CTRL F “PositionId” et “ProfileId”).

Afin de savoir votre profileId et votre positionId, suivez les étapes suivantes :
- Partir vers gestion des utilisateurs, cliquer sur profils (comme précédemment fait) , puis cliquer sur support client

Le profileId se trouve dans l’URL aprés avoir cliqué sur Support Client . Par exemple : https://beta.cirrus-shield.net/Data/Details/3779364767659985837?objectName=Profile&retAction=Index
4. Vérifier que vous possédez assez des licences utilisateur portails restantes
- Partir vers configuration , cliquer sur organisation , puis licenses

- Vérifier que certains champs sont présents pour l’objet tickets :
- Description (texte)
- Compte (Relation de recherche)
- Contact (Relation de recherche )
- Contrat de support (Relation de recherche)
- Propriétaire du ticket (Multi Relation de Recherche)
- Status (Listes de sélections)
- Sujet (Liste de sélections)
- Type (Liste de sélections)
Configuration du portail (Administrateur)
Accès à l’interface de configuration : https://clientportalapi.cirrus-shield.net/fr/config/{OrgId}
Étapes :
- Entrer le nom d’utilisateur et le mot de passe.
Cliquer sur « Suivant ».

3. Sélectionner les éléments à afficher sur le portail selon le besoin :

- Configurer les notifications automatiques envoyées aux utilisateurs du groupe Support_group :
- Lorsqu’un ticket est créé
- Lorsqu’une action est détectée sur un ticket
- Lorsqu’une note est ajoutée à un ticket
- Lorsqu’un document est ajouté à un ticket

Cliquer sur Enregistrer la configuration pour sauvegarder.