Visualizar las ausencias del día en Slack

Antes de empezar

Vamos a utilizar Zapier para crear un activador que llamará a la API de Timmi Ausencias todas las mañanas a las 7:00 horas y publicará la lista de ausencias del día en Slack.

Nota: Algunos de nuestros clientes utilizan un código similar con Google Cloud Engine.

Zapier es un servicio en línea que permite automatizar acciones en la web. El principio es muy simple y se puede resumir así: «Si ocurre la acción X en la aplicación A, entonces la acción Y se realiza en la aplicación B»

zapier-how-to

Vamos a crear la fórmula siguiente: «Si son las 7:00 horas de la mañana, se pide a Timmi Ausencias las ausencias del día y se publica el mensaje en Slack»

Conexión a Zapier

Se podrá conectar aquí: https://zapier.com.

Cree una cuenta o utilice una cuenta ya existente.

Configuración del zap

 

Debe configurar el primer paso. El botón «Choose App» presenta una lista de las herramientas disponibles. Luego, en la pestaña «Built-in apps», podrá seleccionar el reloj.

A continuación, se le pedirá que configure su reloj. En primer lugar, se le preguntará con qué recurrencia quiere que se ejecute el script, por ejemplo, todos los días.

 Seguidamente, podrá elegir a qué hora del día se ejecutará el script y si quiere o no quiere que se ejecute en el fin de semana.

Una vez confirmado este paso, podrá comprobarlo con la última pestaña: «Test this Step». Para el segundo paso, el de la acción, puede seleccionar la aplicación «code».

 Seleccione Javascript.

En el siguiente paso, podrá copiar este script en la parte «Code», dejando en blanco la parte «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);
});

Para utilizar este script, deberá sustituir xxxxxxxxxxx en la variable urlBase con el nombre de su instancia de Lucca y reemplazar la variable appToken xxxxxxxxxxx-xxxxxx-xxxxxxxx por el suyo, puede obtener este token de la interfaz correspondiente o poniéndose en contacto con el servicio de soporte de Lucca.

Debe (a veces) tener una cuenta Zapier de pago para realizar este tipo de zap; de lo contrario, la prueba puede generar un error.

Ya solo tiene que configurar la última acción, que permitirá enviar los resultados en uno de sus canales Slack.

Seleccione la opción «enviar un mensaje a un canal»

En el paso siguiente, conéctese con los datos de identificación de su cuenta Slack. A continuación, complete las opciones, empezando con el nombre del canal:

Tras introducir el nombre del canal, deberá introducir el mensaje que quiera mostrar. Puede usar el texto de ejemplo que aparece a continuación.

Después, solo deberá confirmar este paso y ejecutar las pruebas para finalizar la configuración.

Ejecución del zap

Puede ejecutar el zap pulsando el botón «OFF» para que cambie a «ON».

Cada mañana, a las 7:00 horas, Slack le dará la lista de ausencias del día.

Zap avanzado (para expertos)

Se puede configurar un zap en cinco pasos, que envíe una notificación al equipo, en un canal concreto, varios días antes de la ausencia.

 

En el paso 2

hay que añadir cuatro datos input 

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

appToken: su token

offsetDays: 2 (= avisar 2 días antes)

numberDayMinimum: 0 (= avisar si hay un mínimo de 0 días de vacaciones consecutivos)

En la parte del código hay que añadir el siguiente código: 

// Función que permite procesar el resultado recuperado con la solicitud para poder enviar los resultados

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 = {};

// Lista con todas las ausencias el 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;
}
});

// Se han creado los mensajes de salida para cada uno de los ausentes

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) {

// Creación de todas las variables para la fecha.

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, verificar el valor de offsetDays y el valor de numberDayMinimum

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

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

// A continuación, inicialice la variable nextDay teniendo en cuenta la próxima fecha
var nextDay = getNextWorkingDate(input.offsetDays);

// Por último, ejecute la consulta
request(nextDay);
}

El paso 3 consiste en crear un canal Slack.

En el paso 4 se añade un filtro.

El paso 5 permite añadir el mensaje al canal correcto.

Contenido de la página

¿Fue útil este artículo?
Usuarios a los que les pareció útil: 0 de 1