예제 #1
0
        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;
        }
예제 #2
0
        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;
        }