From 43396127893cd1d6162b7090f6b27bec18bddc3c Mon Sep 17 00:00:00 2001 From: Brenda Sukh Date: Fri, 13 Nov 2020 15:15:58 -0500 Subject: [PATCH] Update compared change calculation to use last billing date --- plugins/cost-insights/src/utils/change.ts | 27 +++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/cost-insights/src/utils/change.ts b/plugins/cost-insights/src/utils/change.ts index 79f653158a..a5a0a86f0a 100644 --- a/plugins/cost-insights/src/utils/change.ts +++ b/plugins/cost-insights/src/utils/change.ts @@ -25,6 +25,11 @@ import { } from '../types'; import { aggregationSort } from '../utils/sort'; import moment from 'moment'; +import dayjs, { OpUnitType } from 'dayjs'; +import duration, { DurationInputType } from 'dayjs/plugin/duration'; +import { inclusiveStartDateOf } from './duration'; + +dayjs.extend(duration); // Used for displaying status colors export function growthOf(ratio: number, amount?: number) { @@ -48,9 +53,14 @@ export function getComparedChange( dailyCost: Cost, metricData: MetricData, duration: Duration, + lastCompleteBillingDate: string, // YYYY-MM-DD, ): ChangeStatistic { const ratio = dailyCost.change.ratio - metricData.change.ratio; - const previousPeriodTotal = getPreviousPeriodTotalCost(dailyCost, duration); + const previousPeriodTotal = getPreviousPeriodTotalCost( + dailyCost, + duration, + lastCompleteBillingDate, + ); return { ratio: ratio, amount: previousPeriodTotal * ratio, @@ -60,15 +70,18 @@ export function getComparedChange( export function getPreviousPeriodTotalCost( dailyCost: Cost, duration: Duration, + endDate: string, ): number { - const costsByDate = dailyCost.aggregation.slice().sort(aggregationSort); - const nextPeriodStart = moment(costsByDate[0].date).add( - moment.duration(duration), - ); + const dayjsDuration = dayjs.duration(duration); + const startDate = inclusiveStartDateOf(duration, endDate); + const [amount, type]: [number, OpUnitType] = dayjsDuration.days() + ? [dayjsDuration.days(), 'days' as OpUnitType] + : [dayjsDuration.months(), 'months' as OpUnitType]; + const nextPeriodStart = dayjs(startDate).add(amount, type); // Add up costs that incurred before the start of the next period. - return costsByDate.reduce((acc, costByDate) => { - return moment(costByDate.date).isBefore(nextPeriodStart) + return dailyCost.aggregation.reduce((acc, costByDate) => { + return dayjs(costByDate.date).isBefore(nextPeriodStart) ? acc + costByDate.amount : acc; }, 0);