(function() { function timeDiff(start, end) { var diff = end - start; var units = [ 1000 * 60 * 60 *24, 1000 * 60 * 60, 1000 * 60, 1000 ]; var rv = []; // h, m, s array for (var i = 0; i < units.length; ++i) { rv.push(Math.floor(diff / units[i])); diff = diff % units[i]; } var thisFullYear = end.getFullYear(); var daysInLastMonth = new Date(thisFullYear, end.getMonth(), 0).getDate(); var thisMonth = end.getMonth(); thisFullYear = thisFullYear - start.getFullYear(); thisMonth = thisMonth - start.getMonth(); subAddDays = daysInLastMonth - start.getDate(); thisDay = end.getDate(); thisMonth = thisMonth - 1; if(thisMonth < 0){ thisFullYear = thisFullYear - 1; thisMonth = 12 + thisMonth; } subAddDays = daysInLastMonth - start.getDate(); subAddDays = thisDay + subAddDays; if(subAddDays >= daysInLastMonth){ subAddDays = subAddDays - daysInLastMonth; thisMonth++; if (thisMonth > 11){ thisFullYear++; thisMonth = 0; } } return { hours: rv[1], minutes: rv[2], }; } function createDate(a) { const [hour, minute] = a.split(':') return new Date(`2020-01-01 ${hour}:${minute}:00`) } function split(arr, n) { n = n != null ? n : arr.length; var len = arr.length; var groups = []; for (var i = 0; i < len; i += n) { groups.push(arr.slice(i, i + n)); } return groups; } function sumHours(a, b) { const hours = a.hours + b.hours const minutes = a.minutes + b.minutes const h = hours + Math.floor(minutes / 60); const m = minutes % 60; return { hours: h, minutes: m } } function extractHoursFromDOM() { const array = []; const trs = document.querySelectorAll('.dataTable tbody tr') const len = trs.length const values = []; for (let index = 0; index < len; index++) { const element = trs[index]; const len2 = element.children.length values[index] = []; for (let index2 = 0; index2 < len2; index2++) { const el = element.children[index2]; if (el.className.match('is_justification') && el.childNodes[1] && el.childNodes[1].innerHTML) { const value = el.childNodes[1].innerHTML if (value) { values[index].push({ el, next: el.nextSibling.nextElementSibling, value, date: createDate(value), }) array.push(el.childNodes[1].innerHTML) } } } } return values.filter(x => x.length === 4) } function getTotalByDay(i) { const [a, b, c, d] = i const morning = timeDiff(a.date, b.date) const evening = timeDiff(c.date, d.date) const total = sumHours(morning, evening) return total } function getTotal(hours) { const total = hours.map(getTotalByDay).reduce((acc, i) => (sumHours(acc, i)), { hours: 0, minutes: 0 }) return total } function showTotal(array, total) { const last = array[array.length - 1] const [,,,d] = last d.el.nextSibling.nextSibling.nextElementSibling.innerHTML = `<strong style="color: purple;">${total.hours}h ${total.minutes}m</strong>` } const hours = extractHoursFromDOM() hours.forEach(i => { const [,,,last] = i const total = getTotalByDay(i) if (last.el && last.el.nextSibling && last.el.nextSibling.nextElementSibling.innerHTML) { last.el.nextSibling.nextElementSibling.innerHTML = `<spam style="color: blue;">${total.hours}h ${total.minutes}m</span>` } }) showTotal(hours, getTotal(hours)) })()