Bevor Sie beginnen
Wir werden mithilfe von Zapier einen Auslöser erstellen, der jeden Morgen um 7 Uhr die API von Timmi Abwesenheiten aufruft und die Liste der Abwesenden des Tages in Slack postet.
Anmerkung: Einige unserer Kunden:innen verwenden einen ähnlichen Code mit Google Cloud Engine.
Zapier ist ein Online-Dienst zur Automatisierung von Aktionen im Web. Das Prinzip ist sehr einfach, wir können es so zusammenfassen: „Wenn Aktion X in Anwendung A passiert, dann führe Aktion Y in Anwendung B aus.“
Wir werden das folgende Rezept erstellen: „Wenn es 7 Uhr morgens ist, dann fragen Sie Timmi Abwesenheiten nach den Abwesenheiten des Tages und posten Sie die Nachricht in Slack.“
Anmeldung bei Zapier
Sie können sich hier verbinden: https://zapier.com.
Erstellen Sie ein Konto oder verwenden Sie ein bereits bestehendes Konto.
Parametrierung von Zap
Sie müssen den ersten Schritt konfigurieren. Über die Schaltfläche „Choose App“ erhalten Sie eine Liste der verfügbaren Tools. Im Tab „Built-in apps“ können Sie dann die Uhr auswählen.
Anschließend werden Sie aufgefordert, Ihre Uhr zu konfigurieren. Stellen Sie sich zunächst die Frage, wie oft das Skript ausgeführt werden soll, beispielsweise jeden Tag.
Sie können dann auswählen, zu welcher Tageszeit das Skript ausgeführt werden soll und ob es am Wochenende ausgeführt werden soll.
Sobald Sie diesen Schritt bestätigt haben, können Sie das Ergebnis im letzten Tab „Test this Step“ überprüfen. Für den zweiten Schritt, den der Aktion, wählen wir die Anwendung „Code“.
Javascript auswählen
Im nächsten Schritt können Sie dieses Skript in den Bereich „Code“ kopieren und dabei den Teil „Input“ leer lassen.
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);
});
Um dieses Skript verwenden zu können, müssen xxxxxxxxxxxxin derurlBase-Variablen durch den Namen Ihrer Lucca-Instanz ersetzen und Sie müssen die appToken-Variable xxxxxxxxxxx-xxxxxx-xxxxxxxx durch Ihre eigene ersetzen. Sie können dieses Token über die dedizierte Schnittstelle erhalten oder indem Sie den Lucca-Helpdesk kontaktieren.
Sie benötigen (manchmal) ein kostenpflichtiges Zapier-Konto, um diese Art von Zap durchzuführen, sonst könnte der Test einen Fehler anzeigen.
Sie müssen jetzt nur noch die letzte Aktion parametrieren, mit der die Ergebnisse an einen Ihrer Slack-Channels gesendet werden.
Wählen Sie die Option „Eine Nachricht an einen Kanal senden“.
Melden Sie sich im nächsten Schritt mit den Anmeldedaten Ihres Slack-Kontos an. Vervollständigen Sie dann die Optionen, beginnend mit dem Kanalnamen:
Sobald der Name des Kanals eingegeben wurde, müssen Sie die Nachricht eingeben, die Sie anzeigen möchten. Den Text können Sie dem Beispiel unten entnehmen.
Jetzt müssen Sie diesen Schritt nur noch bestätigen und die Tests starten, um die Parametrierung abzuschließen.
Starten des Zap
Sie können den Zap starten, indem Sie auf die Schaltfläche „OFF“ klicken, damit sie auf „ON“ umschaltet.
Jeden Morgen um 7 Uhr erhalten Sie von Slack die Liste der an diesem Tag abwesenden Personen.
Advanced Zap (für Experten)
Es ist möglich, einen Zap in fünf Schritten einzustellen, der das Team in einem eigenen Channel einige Tage vor der Abwesenheit benachrichtigt.
Im zweiten Schritt
müssen 4 Input Data hinzugefügt werden
url: https://lucca.ilucca.net/api/v3/leaves?leavePeriod.ownerId=greaterthan,0
appToken: Ihr Token
offsetDays: 2 (= 2 Tage vorher benachrichtigt werden)
numberDayMinimum: 0 (= benachrichtigt werden, wenn es mindestens 0 aufeinanderfolgende Urlaubstage gibt)
Im Code-Teil muss folgender Code hinzugefügt werden:
// Funktion, die das abgerufenen Ergebnis mit der Abfrage verarbeitet, um das Ergebnis übermitteln zu können
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 aller Abwesenheiten an T+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;
}
});
// Erstellt die Abgangsnachrichten für jede:n Abwesende:n
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) {
// Erstellung aller Variablen für das Datum.
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;
};
// Wenn die Eingabevariable existiert, überprüft sie den Wert von offsetDays und den Wert von numberDayMinimum
if (input) {
if (input.offsetDays === undefined || input.offsetDays < 0) {
input.offsetDays = 0;
}
if (input.numberDayMinimum === undefined || input.numberDayMinimum < 0) {
input.numberDayMinimum = 0;
}
// Anschließend die Variable „next Day“ mit dem nächsten berücksichtigten Datum initialisieren
var nextDay = getNextWorkingDate(input.offsetDays);
// Und schließlich die Anfrage starten
request(nextDay);
}
Der dritte Schritt ist die Erstellung eines Slack-Channels
Im vierten Schritt fügen wir einen Filter hinzu
Im fünften Schritt wird die Nachricht für den korrekten Channel hinzugefügt.