private ChartViewModel GetStatesOptions(MachineInfoModel machine, PeriodModel period)
        {
            var options = new ChartViewModel();

            options.series = new List <SerieViewModel>();


            var data = _stateService.GetAggregationStates(machine, period, enDataType.Dashboard);

            if (!data.Any())
            {
                return(options);
            }

            var stateProd  = data.FirstOrDefault(w => w.enState == enState.Production);
            var statePause = data.FirstOrDefault(w => w.enState == enState.Pause);

            var stateError  = data.FirstOrDefault(w => w.enState == enState.Error);
            var stateManual = data.FirstOrDefault(w => w.enState == enState.Manual);

            long?totalProd   = stateProd?.ElapsedTime ?? 0;
            long?totalPause  = statePause?.ElapsedTime ?? 0;
            long?totalError  = stateError?.ElapsedTime ?? 0;
            long?totalManual = stateManual?.ElapsedTime ?? 0;

            var totalOn  = data.Where(w => w.enState != enState.Offline).Select(s => s.ElapsedTime).Sum();
            var totalOff = data.Where(w => w.enState == enState.Offline).Select(s => s.ElapsedTime).Sum();

            decimal?percProd   = Common.GetPercentage(totalProd, totalOn);
            decimal?percPause  = Common.GetPercentage(totalPause, totalOn);
            decimal?percError  = Common.GetPercentage(totalError, totalOn);
            decimal?percManual = Common.GetPercentage(totalManual, totalOn);


            // state prod
            var prod = new SerieViewModel();

            prod.name  = enState.Production.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            prod.y     = percProd ?? 0;
            prod.color = CommonViewService.GetColorState(enState.Production);
            options.series.Add(prod);

            // state pause
            var pause = new SerieViewModel();

            pause.name  = enState.Pause.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            pause.y     = percPause ?? 0;
            pause.color = CommonViewService.GetColorState(enState.Pause);
            options.series.Add(pause);


            var manual = new SerieViewModel();

            manual.name  = enState.Manual.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            manual.y     = percManual ?? 0;
            manual.color = CommonViewService.GetColorState(enState.Manual);
            options.series.Add(manual);


            var error = new SerieViewModel();

            error.name  = enState.Error.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            error.y     = percError ?? 0;
            error.color = CommonViewService.GetColorState(enState.Error);
            options.series.Add(error);


            return(options);
        }
        private List <SerieViewModel> GetSeriesStackedBarChart(List <HistoryStateModel> data, List <string> categories, enDataType chart)
        {
            var series = new List <SerieViewModel>();

            var serieProd = new SerieViewModel();

            serieProd.name  = enState.Production.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieProd.color = CommonViewService.GetColorState(enState.Production);
            serieProd.data  = new List <int>();

            var seriePause = new SerieViewModel();

            seriePause.name  = enState.Pause.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            seriePause.color = CommonViewService.GetColorState(enState.Pause);
            seriePause.data  = new List <int>();

            var serieManual = new SerieViewModel();

            serieManual.name  = enState.Manual.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieManual.color = CommonViewService.GetColorState(enState.Manual);
            serieManual.data  = new List <int>();

            var serieError = new SerieViewModel();

            serieError.name  = enState.Error.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieError.color = CommonViewService.GetColorState(enState.Error);
            serieError.data  = new List <int>();

            // create data foreach categories (operator or shift)
            foreach (var categorie in categories)
            {
                var dataCategorie = new List <HistoryStateModel>();

                switch (chart)
                {
                case enDataType.Operators:
                    dataCategorie = data.Where(w => w.Operator == categorie).ToList();
                    break;
                }

                if (dataCategorie.Count == 0)
                {
                    continue;
                }

                var totalOn = dataCategorie.Where(w => w.enState != enState.Offline).Select(s => s.ElapsedTime).Sum();

                var stateProd = dataCategorie.FirstOrDefault(w => w.enState == enState.Production);

                if (stateProd != null)
                {
                    var     totalProd = stateProd.ElapsedTime;
                    decimal?percProd  = Common.GetPercentage(totalProd, totalOn);
                    serieProd.data.Add(((decimal)percProd).RoundToInt());
                }
                else
                {
                    serieProd.data.Add(0);
                }

                var stateManual = dataCategorie.FirstOrDefault(w => w.enState == enState.Manual);

                if (stateManual != null)
                {
                    var     totalManual = stateManual.ElapsedTime;
                    decimal?percManual  = Common.GetPercentage(totalManual, totalOn);
                    serieManual.data.Add(((decimal)percManual).RoundToInt());
                }
                else
                {
                    serieManual.data.Add(0);
                }

                var statePause = dataCategorie.FirstOrDefault(w => w.enState == enState.Pause);

                if (statePause != null)
                {
                    var     totalPause = statePause.ElapsedTime;
                    decimal?percPause  = Common.GetPercentage(totalPause, totalOn);
                    seriePause.data.Add(((decimal)percPause).RoundToInt());
                }
                else
                {
                    seriePause.data.Add(0);
                }

                var stateError = dataCategorie.FirstOrDefault(w => w.enState == enState.Error);

                if (stateError != null)
                {
                    var     totalError = stateError.ElapsedTime;
                    decimal?percError  = Common.GetPercentage(totalError, totalOn);
                    serieError.data.Add(((decimal)percError).RoundToInt());
                }
                else
                {
                    serieError.data.Add(0);
                }
            }

            series.Add(serieError);
            series.Add(seriePause);
            series.Add(serieManual);
            series.Add(serieProd);

            return(series);
        }
        private ChartViewModel GetHistoricalOptions(MachineInfoModel machine, PeriodModel period)
        {
            var options = new ChartViewModel();

            var granularity    = Common.GetAggregationType(period.StartDate, period.EndDate);
            var startDateTrend = Common.GetStartDateTrend(period.EndDate, period.StartDate, granularity);

            var periodTrend = new PeriodModel
            {
                StartDate   = startDateTrend.ToUniversalTime().Date,
                EndDate     = period.EndDate.ToUniversalTime().Date.AddDays(1).AddMinutes(-1),
                Aggregation = granularity
            };

            var data = _stateService.GetAggregationStates(machine, periodTrend, enDataType.Historical).Where(w => w.enState != enState.Offline).OrderBy(o => o.Day).ToList();

            if (data.Count == 0)
            {
                return(null);
            }

            // calcolo dell'unità di misura delle serie del grafico sul valore medio
            var avgData     = (long)data.Average(a => a.ElapsedTime ?? 0);
            var measurement = Common.GetTimeMeasurement(avgData);

            options.yTitle      = $"{Resource.Duration} ({measurement.GetDescription()})";
            options.valueSuffix = $" {measurement.GetDescription()}";

            var days = data.Where(w => w.Day != null).Select(s => s.Day.Value).Distinct().ToList();

            options.categories = CommonViewService.GetTimeCategories(days, granularity);

            var series = new List <SerieViewModel>();

            var serieProd = new SerieViewModel();

            serieProd.name  = enState.Production.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieProd.color = CommonViewService.GetColorState(enState.Production);
            List <long> lista = GetDataGroup(data, days, granularity, enState.Production);

            serieProd.data = Common.ConvertElapsedByMeasurement(lista, measurement);
            series.Add(serieProd);


            var serieManual = new SerieViewModel();

            serieManual.name  = enState.Manual.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieManual.color = CommonViewService.GetColorState(enState.Manual);
            serieManual.data  = Common.ConvertElapsedByMeasurement(GetDataGroup(data, days, granularity, enState.Manual), measurement);
            series.Add(serieManual);

            var seriePause = new SerieViewModel();

            seriePause.name  = enState.Pause.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            seriePause.color = CommonViewService.GetColorState(enState.Pause);
            seriePause.data  = Common.ConvertElapsedByMeasurement(GetDataGroup(data, days, granularity, enState.Pause), measurement);
            series.Add(seriePause);

            var serieError = new SerieViewModel();

            serieError.name  = enState.Error.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage);
            serieError.color = CommonViewService.GetColorState(enState.Error);
            serieError.data  = Common.ConvertElapsedByMeasurement(GetDataGroup(data, days, granularity, enState.Error), measurement);
            series.Add(serieError);

            options.series = series;

            return(options);
        }