diff --git a/src/base/facets.js b/src/base/facets.js index 0b5f8b3..0da5e87 100644 --- a/src/base/facets.js +++ b/src/base/facets.js @@ -59,6 +59,12 @@ export const TIME_FACET = { maximumResolveTime: { $max: '$resolveTime' }, minimumResolveTime: { $min: '$resolveTime' }, averageResolveTime: { $avg: '$resolveTime' }, + maximumLateTime: { $max: '$lateTime' }, + minimumLateTime: { $min: '$lateTime' }, + averageLateTime: { $avg: '$lateTime' }, + maximumConfirmTime: { $max: '$confirmTime' }, + minimumConfirmTime: { $min: '$confirmTime' }, + averageConfirmTime: { $avg: '$confirmTime' }, }, }, ], diff --git a/src/base/servicerequest.base.js b/src/base/servicerequest.base.js index 5d20814..07cc8d8 100644 --- a/src/base/servicerequest.base.js +++ b/src/base/servicerequest.base.js @@ -242,9 +242,20 @@ const getBaseAggregation = criteria => { }, }) .addFields({ + /** + * Time difference between when service request was reported and when it was + * confirmed by an operator or responsible party. + * + * This metric calculate how much time does it take for an organization + * to confirm/respond to issues which have been reported via channels + * which doesn't involve operator intervention. i.e USSD, Mobile App, Bot + * and e.t.c + */ + confirmTime: { $subtract: ['$confirmedAt', '$createdAt'] }, + /** * Time difference between expected time to resolve the service request - * and today. + * and current date if not resolved or resolvedAt if resolved pass it SLA. * * This time will indicate if the service request is late or not base on * the SLA(Service Level Agreement) time set per service request nature diff --git a/src/reports/overview.js b/src/reports/overview.js index 101acb3..b39109d 100644 --- a/src/reports/overview.js +++ b/src/reports/overview.js @@ -23,6 +23,7 @@ import getBaseAggregation from '../base/servicerequest.base'; import { OVERALL_FACET, + TIME_FACET, JURISDICTION_FACET, STATUS_FACET, PRIORITY_FACET, @@ -36,6 +37,7 @@ import { const OVERVIEW_FACET = { ...OVERALL_FACET, + ...TIME_FACET, ...JURISDICTION_FACET, ...STATUS_FACET, ...PRIORITY_FACET, diff --git a/src/util.js b/src/util.js index 06b3a29..74c6103 100644 --- a/src/util.js +++ b/src/util.js @@ -1,4 +1,4 @@ -import { head, map, isNumber } from 'lodash'; +import { head, map, merge, isNumber, upperFirst } from 'lodash'; import parseMs from 'parse-ms'; /** @@ -52,7 +52,7 @@ export const normalizeObjectTimes = item => { * @param {object} results Aggregation results * @returns {object} Normalized response object * - * @version 0.1.0 + * @version 0.2.0 * @since 0.2.0 */ export const prepareReportResponse = results => { @@ -64,10 +64,37 @@ export const prepareReportResponse = results => { data.overall = head(data.overall); + data.time = head(data.time); + if (data.overall) { data.overall = normalizeObjectTimes(data.overall); } + if (data.time) { + // const times = {}; + + const keys = [ + 'confirmTime', + 'assignTime', + 'attendTime', + 'completeTime', + 'verifyTime', + 'approveTime', + 'resolveTime', + 'lateTime', + ]; + + const times = map(keys, key => ({ + [key]: { + minimum: normalizeTime(data.time[`minimum${upperFirst(key)}`]), + maximum: normalizeTime(data.time[`maximum${upperFirst(key)}`]), + average: normalizeTime(data.time[`average${upperFirst(key)}`]), + }, + })); + + data.overall = merge({}, data.overall, ...times); + } + if (data.jurisdictions) { data.jurisdictions = map(data.jurisdictions, normalizeObjectTimes); }