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 haz la acción Y 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, pide a Timmi Ausencias las ausencias del día y publica el mensaje en Slack».

Conexión a Zapier

Puede conectarse 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.

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

Una vez validado 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 = "todo el día";
} else if(entry.startsAM && entry.endsAM && entry.endsOn == entry.startsOn) {
res.detail = "esta mañana";
} else {
res.detail = "esta tarde";
}

if (entry.endsOn !== entry.startsOn) {
var endSp = entry.endsOn.split("T")[0].split("-");
res.detail += " y hasta el " + endSp[2] + "/" + endSp[1] + "/" + endSp[0] + " incluidos";
}
result.push(res);
}
if (result.length === 0) {
result.push({
name: "Persona n'",
detail: "hoy"
});
}
callback(null, result);
}).catch(function (error) {
console.log(error);
});

Para poder utilizar este script, deberá reemplazar xxxxxxxxxxx en la variable urlBase por el nombre de su instancia Lucca y reemplazar la variable appToken xxxxxxxxxxx-xxxxxx-xxxxxxxx con la suya. Puede obtener ese token en la interfaz correspondiente o contactando con el servicio de soporte de Lucca.

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

Ya solamente 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:

Una vez introducido el nombre del canal, tendrá que introducir el mensaje que quiera mostrar. Puede usar el texto de ejemplo que aparece a continuación.

Luego solamente tendrá que validar este paso y ejecutar las pruebas para terminar 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 agregar 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 agregar el código siguiente: 

// Función que permite procesar el resultado. Se debe recuperar 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 + ' : a 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;
};
// Archivo de petición de solicitudes

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 D+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 + ' mañana';
} else {
curRes.detail = thisDay.formatString + ' tarde';
}

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

curRes.detail += ' durante ' + nbrWeek;
curRes.detail += nbrWeek > 1 ? ' semanas' : ' semana';
}
curRes.numberDay = numberDay;
}
else {
curRes.numberDay = 0;
}
});

sendResult(results);
}).catch(function (error) {
console.log(error);
});
}
// Archivo de inicio de las variables de fecha.

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': 'lunes',
'Tue': 'martes',
'Wed': 'miércoles',
'Thu': 'jueves',
'Fri': 'viernes',
'Sat': 'sábado',
'Sun': 'domingo'
};

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, inicie la variable nextDay con la siguiente fecha tenida en cuenta
var nextDay = getNextWorkingDate(input.offsetDays);

// Y, por último, ejecute la solicitud
request(nextDay);
}

El paso 3 consiste en crear un canal Slack.

En el paso 4 se agrega un filtro.

El paso 5 permite agregar 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