Afficher les absents du jour dans Slack

Avant de commencer

Nous allons utiliser Zapier pour créer un déclencheur qui va appeler l’API de Timmi Absences tous les matins à 7h et qui va poster la liste des absents du jour dans Slack.

Note : Certains de nos clients utilisent un code similaire avec Google Cloud Engine.

Zapier est un service en ligne permettant d'automatiser des actions sur le web. Le principe est très simple, on peut le résumer comme cela "Si il se passe l'action X dans l'application A, alors fait l'action Y dans l'application B"

zapier-how-to

Nous allons créer la recette suivant  "Si il est 7h du matin, alors demande à Timmi Absences les absents du jour et poste le message dans Slack"

Connexion à Zapier

Vous pourrez vous y connecter ici : https://zapier.com.

Créez vous un compte ou utiliser un compte déjà existant.

Configuration du zap

 

Vous devez configurer la première étape. Le bouton « Choose App » vous proposera une liste d’outils disponibles. Dans l’onglet « Built-in apps » vous pourrez alors choisir l’horloge.

Il vous sera alors demandé de configurer votre horloge. Tout d’abord en vous demandant à quelle récurrence vous voulez que le script soit lancé, par exemple tous les jours.

 Vous pourrez ensuite choisir à quelle heure de la journée le script sera lancé et si vous voulez qu’il se lance le week-end.

Une fois cette étape validée, vous pourrez la tester avec le dernier onglet « Test this Step ». Pour la deuxième étape, celle de l’action, nous allons choisir l'application "code".

 Choisir Javascript

Dans la prochaine étape vous pourrez copier ce script dans la partie « Code » en laissant vide la partie « Input ».

var urlBase = "https://xxxxxxxxxxx.ilucca.net/api/v3/leavesOfDay"
var appToken = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
fetch(urlBase, {
"headers": { "Authorization": "lucca application=" + appToken } }) .then(function (res) {
return res.json();
}).then(function (data) {
  var entries = data.data.items;
var result = [];
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
var res = {
name: entry.user.displayName,
};
if(entry.startsAM && (!entry.endsAM || entry.endsOn != entry.startsOn)) {
res.detail = "toute la journée";
} else if(entry.startsAM && entry.endsAM && entry.endsOn == entry.startsOn) {
res.detail = "ce matin";
} else {
res.detail = "cet après-midi";
}

if (entry.endsOn !== entry.startsOn) {
var endSp = entry.endsOn.split("T")[0].split("-");
res.detail += " et jusqu'au " + endSp[2] + "/" + endSp[1] + "/" + endSp[0] + " inclus";
}
result.push(res);
}
if (result.length === 0) {
result.push({
name: "Personne n'",
detail: "aujourd'hui"
});
}
callback(null, result);
}).catch(function (error) {
console.log(error);
});

Pour pouvoir utiliser ce script vous allez devoir remplacer xxxxxxxxxxx dans la variable urlBase avec le nom de votre instance Lucca et vous devrez remplacer la variable appToken xxxxxxxxxxx-xxxxxx-xxxxxxxx par le vôtre, vous pourrez obtenir ce token depuis l'interface dédiée ou en contactant le support Lucca.

Il faut (parfois) un compte Zapier payant pour réaliser ce type de zap sinon le test peut afficher une Erreur.

Vous n'avez plus qu’à configurer la dernière action qui permettra d’envoyer les résultats sur l’un de vos channels Slack.

Choisissez l'option "envoyer un message à un channel"

Pour la prochaine étape, connectez-vous avec les identifiants de votre compte Slack. Puis complétez les options, en commençant par le nom du channel :

Une fois le nom du channel rentré vous aurez à rentrer le message que vous voulez afficher, vous pouvez prendre le texte de l’exemple ci-dessous.

Vous n’avez plus qu’à valider cette étape et lancer les tests pour finir la configuration.

Lancement du zap

Vous pouvez lancer le zap en appuyant sur le bouton « OFF » pour qu’il passe à « ON ».

Tout les matins à 7h Slack vous donnera la liste des absents du jour.

Advanced zap (pour les experts)

Il est possible de paramétrer un zap en 5 étapes qui notifiera l'équipe dans un channel dédié quelques jours avant l'absence.

 

Dans l'étape 2

il faut ajouter 4 input Data 

url : https://lucca.ilucca.net/api/v3/leaves?leavePeriod.ownerId=greaterthan,0

appToken :  votre token

offsetDays : 2 (= être prévenu 2 jours avant)

numberDayMinimum: 0 (= être prévenu si il y a un minimum de 0 jour de congés consécutifs)

Dans la partie code il faut ajouter le code suivant : 

// Fonction qui permet de traiter le resultat recuperer avec la requête pour pouvoir envoyer le résultats

var getCleanChannelName = function (channelName) {
channelName = channelName.replace(/\s+/g, '');
channelName = 'absence_' + channelName.toLocaleLowerCase();
return channelName;
}

var sendResult = function (results) {
var res = {};

res.list = [];
res.zapierLimitSize = 25;
if (input.validDepartment) {
res.validDepartmentList = input.validDepartment.toLocaleLowerCase().split(',');
for (var i = 0; i < res.validDepartmentList.length; i++) {
res.validDepartmentList[i] = getCleanChannelName(res.validDepartmentList[i]);
}
console.log(res.validDepartmentList);
}

res.channelExist = function (channelName) {
channelName = channelName.toLocaleLowerCase();
for (var index = 0; index < this.list.length; index++) {
if (channelName && this.list[index].channel && channelName === this.list[index].channel) {
return true;
}
}
return false;
}

res.channelAdd = function (channelName) {
channelName = channelName.toLocaleLowerCase();
if (channelName && this.list.length < this.zapierLimitSize && !this.channelExist(channelName)) {
var newElem = {};
newElem.channel = channelName;
newElem.message = '';

this.list.push(newElem);
}
}

res.listAddMessage = function (channelName, message) {
channelName = channelName.toLocaleLowerCase();
if (this.list.length < this.zapierLimitSize) {
this.channelAdd(channelName);

for (var index = 0; index < this.list.length; index++) {
if (channelName && this.list[index].channel === channelName) {
this.list[index].message += message;
break;
}
}
}
}

res.listAddMessageFilter = function (channelName, message) {
channelName = channelName.toLocaleLowerCase();
if (this.validDepartmentList === undefined || this.validDepartmentList === "") {
this.listAddMessage(channelName, message);
}
else {
for (var index = 0; index < this.validDepartmentList.length; index++) {
if (this.validDepartmentList[index] === channelName) {
this.listAddMessage(channelName, message);
}
}
}
}

if (results !== undefined) {
for (var i = 0; i < results.length; i++) {
if (results[i].numberDay >= input.numberDayMinimum) {
if (results[i].numberDay >= 2) {
var messageTmp = results[i].name + ' : à partir de ' + results[i].detail + '\n';
}
else {
var messageTmp = results[i].name + ' : ' + results[i].detail + '\n';
}
var channelName = getCleanChannelName(results[i].departmentName)

res.listAddMessageFilter(channelName, messageTmp);
}
}
}

callback(null, res.list);
}
var dayDiff = function (d1, d2) {
d1 = d1.getTime() / 86400000;
d2 = d2.getTime() / 86400000;
return new Number(d2 - d1).toFixed(0);
};
var checkIsIn = function (result, name) {
for (var i = 0; i < result.length; i++) {
if (result[i] === name) {
return true;
}
}
return false;
};
// Fichier de demande de requêtes

var request = function (thisDay) {

var results = [];
fetch(input.url + '&date=' + thisDay.todayS + '&fields=isAM,leavePeriod[owner.name,owner.department,endsOn,endsAM,startsOn]', {
'headers': {
'Authorization': 'lucca application=' + input.appToken
}
}).then(function (res) {
return res.json();
}).then(function (data) {
console.log(data);
var leaves = data.data.items;
var hash = {};

// Liste tous les absents à J+input.offsetDays

leaves.map(function (leave) {
var username = leave.leavePeriod.owner.name;
var userleave = hash[username];
if (!userleave) {
userleave = {
morning: false,
afternoon: false,
end: leave.leavePeriod.endsOn.split('T')[0]
};
hash[username] = userleave;
console.log(leave.leavePeriod.startsOn.split('T')[0]);
if (leave.leavePeriod.startsOn.split('T')[0] === thisDay.todayS) {
results.push({
name: username,
leave: userleave,
departmentName: leave.leavePeriod.owner.department.name,
departmentId: leave.leavePeriod.owner.department.id
});
}
}
if (leave.isAM) {
userleave.morning = true;
} else {
userleave.afternoon = true;
}
});

// Créé les messages de sortie pour chacun des absents

results.map(function (curRes) {
var endSp = curRes.leave.end.split('-');
var endSpDate = new Date(endSp[0], endSp[1] - 1, endSp[2]);
var numberDay = parseInt(dayDiff(thisDay.date, endSpDate)) + 1;

if (curRes.leave.morning && curRes.leave.afternoon) {
curRes.detail = thisDay.formatString;
} else if (curRes.leave.morning) {
curRes.detail = thisDay.formatString + ' matin';
} else {
curRes.detail = thisDay.formatString + ' après-midi';
}

if (curRes.leave.end !== curRes.todayS && numberDay >= 2) {
if (numberDay < 7) {
curRes.detail += ' pendant ' + numberDay;
curRes.detail += numberDay > 1 ? ' jours' : ' jour';
}
else {
var nbrWeek = (numberDay / 7) >> 0;
if ((numberDay / 7 - nbrWeek) > 0.5) {
nbrWeek += 1;
}

curRes.detail += ' pendant ' + nbrWeek;
curRes.detail += nbrWeek > 1 ? ' semaines' : ' semaine';
}
curRes.numberDay = numberDay;
}
else {
curRes.numberDay = 0;
}
});

sendResult(results);
}).catch(function (error) {
console.log(error);
});
}
// Fichier d'initialisation des variables de date.

var getNextWorkingDate = function (offsetDays) {

// Création de toutes les variables pour la date.

if (!offsetDays) {
return null;
}

var day = new Date();
var nextDay = {};

for (var i = 0; i < offsetDays; i++) {
day.setDate(day.getDate() + 1);
if (day.toDateString().split(' ')[0] === 'Sat' || day.toDateString().split(' ')[0] === 'Sun') {
day.setDate(day.getDate() + 2);
}
}

var weekDays = {
'Mon': 'lundi',
'Tue': 'mardi',
'Wed': 'mercredi',
'Thu': 'jeudi',
'Fri': 'vendredi',
'Sat': 'samedi',
'Sun': 'dimanche'
};

nextDay.date = day;
nextDay.yearS = '' + day.getFullYear();
nextDay.month = day.getMonth() + 1;
nextDay.monthS = nextDay.month > 9 ? '' + nextDay.month : '0' + nextDay.month;
nextDay.dayS = day.getDate() > 9 ? '' + day.getDate() : '0' + day.getDate();
nextDay.todayS = nextDay.yearS + '-' + nextDay.monthS + '-' + nextDay.dayS;
nextDay.formatString = weekDays[day.toDateString().split(' ')[0]];
return nextDay;
};

// Si la variable input existe vérifie les valeur de offsetDays et la valeur de numberDayMinimum

if (input) {
if (input.offsetDays === undefined || input.offsetDays < 0) {
input.offsetDays = 0;
}

if (input.numberDayMinimum === undefined || input.numberDayMinimum < 0) {
input.numberDayMinimum = 0;
}

// Puis initialise la variable nextDay avec la prochainne date prise en compte
var nextDay = getNextWorkingDate(input.offsetDays);

// Et enfin lance la requête
request(nextDay);
}

L'étape 3 consiste en la création d'un channel Slack

On ajoute un Filtre pour l'étape 4

L'étape 5 permet d'ajouter le message sur le bon channel.

Contenu de la page

Cet article vous a-t-il été utile ?
Utilisateurs qui ont trouvé cela utile : 0 sur 1