private IList<GetCartesianChartDataResponse.SeriesResponse> _getKpiActualSeries(IList<GetCartesianChartDataRequest.SeriesRequest> configSeries, PeriodeType periodeType, IList<DateTime> dateTimePeriodes, string seriesType, RangeFilter rangeFilter, string graphicType,out string newTimeInformation, out IList<DateTime> newDatetimePeriodes, bool comparison = false) { var seriesResponse = new List<GetCartesianChartDataResponse.SeriesResponse>(); var start = dateTimePeriodes[0]; var end = dateTimePeriodes[dateTimePeriodes.Count - 1]; newTimeInformation = null; newDatetimePeriodes = new List<DateTime>(); foreach (var series in configSeries) { if (series.Stacks.Count == 0) { var kpiActuals = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiActual = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == series.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiActual != null) { kpiActuals = new List<KpiAchievement> { kpiActual }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiActual.Periode.ToString("MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiActual.Periode.ToString("yyyy", CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiActual.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped" && graphicType == "baraccumulative") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Stack = series.Label, Color = series.Color }; if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Stack = series.Label }; for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); seriesResponse.Add(aSeries); } else if (seriesType == "multi-stacks" && graphicType == "baraccumulative") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, }; if (comparison) { previousSeries.Stack = "KpiActual"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); seriesResponse.Add(aSeries); } else if ((seriesType == "multi-stacks" || seriesType == "multi-stacks-grouped") && graphicType == "barachievement") { var kpiTargets = DataContext.KpiTargets.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { if (kpiActuals.Count > 0) { var periode = kpiActuals.First().Periode; kpiTargets = DataContext.KpiTargets.Where(x => x.PeriodeType == periodeType && x.Periode == periode && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); } } var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = string.IsNullOrEmpty(series.Color) ? "blue" : series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } var remainSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Remain", Color = "red" }; if (comparison) { remainSeries.Stack = "KpiActual"; } var exceedSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Exceed", Color = "green" }; if (seriesType == "multi-stacks-grouped") { aSeries.Stack = series.Label; remainSeries.Stack = series.Label; exceedSeries.Stack = series.Label; } if (comparison) { exceedSeries.Stack = "KpiActual"; } foreach (var periode in dateTimePeriodes) { if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { var actual = kpiActuals.Where(x => x.Periode <= periode) .GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); var target = kpiTargets.Where(x => x.Periode <= periode) .GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (!actual.HasValue) { if (!target.HasValue) { exceedSeries.Data.Add(0); remainSeries.Data.Add(0); aSeries.Data.Add(0); } else { aSeries.Data.Add(0); remainSeries.Data.Add(target.Value); exceedSeries.Data.Add(0); } } else { if (!target.HasValue) { aSeries.Data.Add(target.Value); remainSeries.Data.Add(0); exceedSeries.Data.Add(actual.Value); } else { var remain = target.Value - actual.Value; if (remain > 0) { aSeries.Data.Add(actual.Value); remainSeries.Data.Add(remain); exceedSeries.Data.Add(0); } else { aSeries.Data.Add(target.Value); exceedSeries.Data.Add(-remain); remainSeries.Data.Add(0); } } } } else { var actual = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); var target = kpiTargets.Where(x => x.Periode == periode).FirstOrDefault(); if (actual == null || !actual.Value.HasValue) { if (target == null || !target.Value.HasValue) { exceedSeries.Data.Add(0); remainSeries.Data.Add(0); aSeries.Data.Add(0); } else { aSeries.Data.Add(0); remainSeries.Data.Add(target.Value.Value); exceedSeries.Data.Add(0); } } else { if (target == null || !target.Value.HasValue) { aSeries.Data.Add(target.Value.Value); remainSeries.Data.Add(0); exceedSeries.Data.Add(actual.Value.Value); } else { var remain = target.Value.Value - actual.Value.Value; if (remain > 0) { aSeries.Data.Add(actual.Value.Value); remainSeries.Data.Add(remain); exceedSeries.Data.Add(0); } else { aSeries.Data.Add(target.Value.Value); exceedSeries.Data.Add(-remain); remainSeries.Data.Add(0); } } } } } seriesResponse.Add(remainSeries); seriesResponse.Add(exceedSeries); seriesResponse.Add(aSeries); } else { //var kpiTargets = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && // x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) // .OrderBy(x => x.Periode).ToList(); var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, }; if (comparison) { previousSeries.Stack = "KpiActual"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); } } else { foreach (var stack in series.Stacks) { var kpiActuals = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == stack.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiActual = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == stack.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiActual != null) { kpiActuals = new List<KpiAchievement> { kpiActual }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiActual.Periode.ToString("MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiActual.Periode.ToString("yyyy", CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiActual.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Stack = series.Label, Color = stack.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } seriesResponse.Add(aSeries); } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Color = stack.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } seriesResponse.Add(aSeries); } } } } return seriesResponse; }
private IList<GetCartesianChartDataResponse.SeriesResponse> _getKpiEconomicSeries(IList<GetCartesianChartDataRequest.SeriesRequest> configSeries, PeriodeType periodeType, IList<DateTime> dateTimePeriodes, string seriesType, RangeFilter rangeFilter, string graphicType, out string newTimeInformation, out IList<DateTime> newDatetimePeriodes, bool comparison = false, bool asNetbackChart = false) { var seriesResponse = new List<GetCartesianChartDataResponse.SeriesResponse>(); var start = rangeFilter == RangeFilter.AllExistingYears ? DateTime.Now : dateTimePeriodes[0]; var end = rangeFilter == RangeFilter.AllExistingYears ? DateTime.Now : dateTimePeriodes[dateTimePeriodes.Count - 1]; var scenarioId = 0; var scenario = DataContext.Scenarios.FirstOrDefault(x => x.IsDashboard == true); if (scenario != null) { scenarioId = scenario.Id; } newTimeInformation = null; newDatetimePeriodes = new List<DateTime>(); foreach (var series in configSeries) { if (series.Stacks.Count == 0) { IList<KeyOperationData> kpiEconomics = new List<KeyOperationData>(); if (rangeFilter == RangeFilter.AllExistingYears) { kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Kpi.Id == series.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); } else { kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); } if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiEconomic = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == series.KpiId && (x.Value != null && x.Value.Value != 0) && x.Scenario.Id == scenarioId) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiEconomic != null) { kpiEconomics = new List<KeyOperationData> { kpiEconomic }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiEconomic.Periode.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiEconomic.Periode.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiEconomic.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Stack = series.Label, Color = series.Color, Order = series.Order }; if (asNetbackChart) { var sumValue = kpiEconomics.Sum(x => x.Value); aSeries.BorderColor = "transparent"; aSeries.Data.Add(sumValue); if (newTimeInformation == null && newDatetimePeriodes.Count == 0) { if (rangeFilter == RangeFilter.AllExistingYears) { newTimeInformation = "2011 - 2030"; newDatetimePeriodes = new List<DateTime> { new DateTime(2011, 1, 1, 0, 0, 0), new DateTime(2030, 1, 1, 0, 0, 0) }; } else { switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = start.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture) + " - " + end.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = start.ToString("dd MMM yy", CultureInfo.InvariantCulture) + " - " + end.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = start.ToString("MMM yy", CultureInfo.InvariantCulture) + " - " + end.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = start.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture) + " - " + end.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { start, end }; newDatetimePeriodes = dateTimePeriodes; } } } else if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Stack = series.Label, Order = series.Order }; for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); if (asNetbackChart && seriesResponse.Count > 1) { var invicibleSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "invisible_" + series.Label, Stack = series.Label, Color = "transparent", BorderColor = "transparent", ShowInLegend = false }; invicibleSeries.Data.Add(seriesResponse[seriesResponse.Count - 2].Data[0] - seriesResponse[seriesResponse.Count - 1].Data[0]); seriesResponse.Add(invicibleSeries); } } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color, Order = series.Order }; if (comparison) { aSeries.Stack = "KpiTarget"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Order = series.Order }; if (comparison) { previousSeries.Stack = "KpiTarget"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); } } else { foreach (var stack in series.Stacks) { var kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == stack.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiEconomic = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == stack.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiEconomic != null) { kpiEconomics = new List<KeyOperationData> { kpiEconomic }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiEconomic.Periode.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiEconomic.Periode.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiEconomic.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Stack = series.Label, Color = stack.Color, Order = series.Order }; if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var economic = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (economic == null || !economic.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economic.Value.Value); } } } seriesResponse.Add(aSeries); } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Color = stack.Color, Order = series.Order }; if (comparison) { aSeries.Stack = "KpiTarget"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var economic = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (economic == null || !economic.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economic.Value.Value); } } } seriesResponse.Add(aSeries); } } } } return seriesResponse; }