/* Author : Enrique Blasco BLanquer Date: 29 de mayo de 2019 */ module.exports = Self => { Self.remoteMethodCtx('getWorkedWeek', { description: 'get worked week info', accessType: 'WRITE', returns: [{ type: 'Object', root: true }], http: { path: `/getWorkedWeek`, verb: 'GET' } }); Self.getWorkedWeek = async(ctx, data) => { const myUserId = ctx.req.accessToken.userId; // user id let lastDate = new Date('1986-09-24'); // reference date let diff = 0; // difference of value between two dates let total = 0; // total hours // 1 Get days of week let week = []; // 2 Starting Monday not Sunday let current = new Date(); current.setDate((current.getDate() - current.getDay() + 1)); for (let i = 0; i < 7; i++) { week.push( new Date(current) ); current.setDate(current.getDate() + 1); } let fromDate = week[0].getFullYear() + '-' + (week[0].getMonth() + 1) + '-' + week[0].getDate(); let toDate = week[week.length - 1].getFullYear() + '-' + (week[week.length - 1].getMonth() + 1) + '-' + week[week.length - 1].getDate(); // 3 hours worked in a current week let hoursWeek = await Self.rawSql(`SELECT wtc.timed ,wtc.order FROM vn.workerTimeControl wtc WHERE userFk = ? AND DATE(timed) BETWEEN ? AND ? ORDER BY timed DESC;`, [myUserId, fromDate, toDate]); // 4 treat data let isFirst = true; for (let i = hoursWeek.length - 1; i >= 0; i--) { let d = new Date(hoursWeek[i].timed); if (isFirst) { lastDate = d; isFirst = false; } else { if (lastDate.getDate() === d.getDate()) { diff += Math.abs(d.getTime() - lastDate.getTime()); lastDate = d; } else { total += diff; diff = 0; lastDate = d; } } } total += diff; // 5 calculate hours and minutes let decimalTime = total / 1000 / 3600; decimalTime = decimalTime * 60 * 60; let hours = Math.floor((decimalTime / (60 * 60))); decimalTime = decimalTime - (hours * 60 * 60); let minutes = Math.floor((decimalTime / 60)); return {'timeds': hoursWeek, 'totalWorked': hours + ':' + minutes}; }; };