59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
const moment = require('moment');
|
|
const durationToHumanReadable = require("./durationToHumanReadable");
|
|
/**
|
|
* Calculate the duration of each status of a job
|
|
* @param transitions
|
|
* @returns {{}}
|
|
*/
|
|
const calculateStatusDuration = (transitions) => {
|
|
let statusDuration = {};
|
|
let totalDuration = 0;
|
|
let summations = [];
|
|
|
|
transitions.forEach((transition, index) => {
|
|
let duration = transition.duration;
|
|
totalDuration += duration;
|
|
|
|
if (!transition.prev_value) {
|
|
statusDuration[transition.value] = {
|
|
value: duration,
|
|
humanReadable: transition.duration_readable
|
|
};
|
|
} else if (!transition.next_value) {
|
|
if (statusDuration[transition.value]) {
|
|
statusDuration[transition.value].value += duration;
|
|
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
|
} else {
|
|
statusDuration[transition.value] = {
|
|
value: duration,
|
|
humanReadable: transition.duration_readable
|
|
};
|
|
}
|
|
} else {
|
|
if (statusDuration[transition.value]) {
|
|
statusDuration[transition.value].value += duration;
|
|
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
|
} else {
|
|
statusDuration[transition.value] = {
|
|
value: duration,
|
|
humanReadable: transition.duration_readable
|
|
};
|
|
}
|
|
}
|
|
});
|
|
|
|
for (let [status, {value, humanReadable}] of Object.entries(statusDuration)) {
|
|
if (status !== 'total') {
|
|
summations.push({status, value, humanReadable});
|
|
}
|
|
}
|
|
|
|
const humanReadableTotal = durationToHumanReadable(moment.duration(totalDuration));
|
|
|
|
return {
|
|
summations,
|
|
total: totalDuration,
|
|
humanReadableTotal
|
|
};
|
|
}
|
|
module.exports = calculateStatusDuration; |