var helpers = { numbers: {}, dates: {}, pdc: {} } helpers.numbers.toPercent = function (nbr) { return Math.floor(nbr * 100).toString() + '%' || ''; } helpers.dates.toNumber = function (str, from) { return moment(str).diff(from, 'days') } helpers.dates.toString = function (nbr, from) { return moment(from).add(nbr, 'days').format('YYYY-MM-DD') } helpers.pdc.stage = function (claims, from, thru) { } helpers.pdc.calc = function (claims, from, thru) { _.chain(claims) .map(function (item) { item._dateOfFill = helpers.dates.toNumber(item.dateOfFill, from); item._dateOfFirstDose = helpers.dates.toNumber(item.dateOfFirstDose, from); item._dateOfLastDose = helpers.dates.toNumber(item.dateOfLastDose, from); item.overlap = item._dateOfFirstDose - item._dateOfFill item.calendar = Array(helpers.dates.toNumber(thru, from) + 1).fill(0).fill(1, item._dateOfFirstDose, item._dateOfLastDose + 1) return item; }) .sortBy('_dateOfFirstDose') .value(); result = {} result.calendar = _.chain(claims) .reduce(function (memo, item) { for (var i = 0; i <= helpers.dates.toNumber(thru, from); i++) { memo[i] = item.calendar[i] | memo[i]; } return memo; }, Array(helpers.dates.toNumber(thru, from) + 1).fill(0)) .value(); result.indexDate = ''; result.daysInMeasPeriod = 0; result.daysCovered = 0; for (var i = 0; i <= helpers.dates.toNumber(thru, from); i++) { if (result.calendar[i] == 1) { if(!result.indexDate) result.indexDate = helpers.dates.toString(i, from) result.daysInMeasPeriod += 1; result.daysCovered +=1 } else if (result.daysInMeasPeriod) { result.daysInMeasPeriod += 1; } else { result.calendar[i] = -1; } } result.uniqueDatesOfService = _.uniq(claims, false, function (item) { return item.dateOfFill; }).length; result.denominator = result.daysInMeasPeriod >= 91 && result.uniqueDatesOfService >= 2; result.pdc = helpers.numbers.toPercent(result.daysCovered/result.daysInMeasPeriod); result.numerator = result.daysCovered/result.daysInMeasPeriod >= 0.8; return result; }