public PartialViewResult PredictAnalysis()
        {
            var currentIncome = _analysisModule.GetCurrentIncome();
            var movingAverageForCurrentIncome = _analysisModule.GetMovingAverageForNextYear(3, currentIncome);

            for (int i = 1; i < 12; i++)
            {
                currentIncome[i] = Math.Round(currentIncome[i], 2);
                movingAverageForCurrentIncome[i] = Math.Round(movingAverageForCurrentIncome[i], 2);
            }

            var months =
                currentIncome.Select(x => x.Key).OrderBy(x => x).Select(x => Enum.GetName(typeof (Months), x)).ToArray();

            var series = new List<Series>
            {
                new Series
                {
                    Name = "Przychód bieżący",
                    Data = new Data(currentIncome.Select(x => x.Value).Cast<object>().ToArray())
                },
                new Series
                {
                    Name = "Przychód przewidywany",
                    Data = new Data(movingAverageForCurrentIncome.Select(x => x).Cast<object>().ToArray())
                }
            };

            var viewModel = new AnalysisChartModel
            {
                Charts = new List<Highcharts>
                {
                    LineChart("Przewidywany miesięczny przychód bazujący na bieżącym", 1300, 400, months,
                        series.ToArray(), "chart1", "Dochód")
                }
            };

            return PartialView("_AnalysisChartSection", viewModel);
        }
        public PartialViewResult ProductAnalysis()
        {
            var top5products = _analysisModule.GetTopProducts(5);
            var top5worstProducts = _analysisModule.GetTopWorstProducts(5);

            var top5Data = new List<object[]>();
            var top5WorstData = new List<object[]>();
            var top5Sum = 0;

            var top5Total = top5products.Sum(x => x.Value);
            var top5WorstTotal = top5worstProducts.Sum(x => x.Value);
            var top5WorstSum = 0;

            foreach (var product in top5products)
            {
                var obj = new object[2];
                obj[0] = product.Key;
                obj[1] = (int) Math.Round((double) (100*product.Value)/top5Total);
                top5Data.Add(obj);
                top5Sum += (int) Math.Round((double) (100*product.Value)/top5Total);
            }

            if (top5Sum < 100)
            {
                var lastItem = top5Data.LastOrDefault();
                lastItem[1] = Convert.ToInt32(lastItem[1]) + (100 - top5Sum);
            }

            foreach (var product in top5worstProducts)
            {
                var obj = new object[2];
                obj[0] = product.Key;
                obj[1] = (int) Math.Round((double) (100*product.Value)/top5WorstTotal);
                top5WorstData.Add(obj);
                top5WorstSum += (int) Math.Round((double) (100*product.Value)/top5WorstTotal);
            }

            if (top5WorstSum < 100)
            {
                var lastItem = top5WorstData.LastOrDefault();
                lastItem[1] = Convert.ToInt32(lastItem[1]) + (100 - top5WorstSum);
            }

            var viewModel = new AnalysisChartModel
            {
                Charts = new List<Highcharts>()
                {
                    PieChart("Top 5 najczęściej kupowanych produktów",
                        top5Data,
                        1300, 400, "chart1"),
                    PieChart("Top 5 najgorzej sprzedających się produktów",
                        top5WorstData,
                        1300, 400, "chart2")
                }
            };

            return PartialView("_AnalysisChartSection", viewModel);
        }
        public PartialViewResult OriginAnalysis()
        {
            var ordersByCity = _analysisModule.OrderCountByCities();
            var incomeByCity = _analysisModule.IncomeByCity();
            var totalIncome = incomeByCity.Sum(x => x.Value);
            var incomeChartData = new List<object[]>();
            var cities = ordersByCity.Select(x => x.Key).OrderBy(x => x).ToArray();
            var orderByCityData = ordersByCity.Select(x => x.Value).Cast<object>().ToArray();
            var viewModel = new AnalysisChartModel
            {
                CityIncome = new Dictionary<string, int>(),
                Charts = new List<Highcharts>()
            };
            var incomeSum = 0;

            foreach (var income in incomeByCity)
            {
                var obj = new object[2];
                obj[0] = income.Key;
                obj[1] = (int) Math.Round((double) (100*income.Value)/totalIncome);
                incomeChartData.Add(obj);
                viewModel.CityIncome.Add(income.Key, income.Value);
                incomeSum += (int) Math.Round((double) (100*income.Value)/totalIncome);
            }

            if (incomeSum < 100)
            {
                var lastItem = incomeChartData.LastOrDefault();
                lastItem[1] = Convert.ToInt32(lastItem[1]) + (100 - incomeSum);
            }

            viewModel.CityIncome.Add("Zysk całkowity", totalIncome);
            viewModel.Charts.Add(ColumnChart("Ilość dokonanych zamówień względem miejscowości",
                "Ilość dokonanych zamówień", cities,
                orderByCityData, 1300, 400, "Ilość", "chart1"));
            viewModel.Charts.Add(PieChart("Procentowy dochów wygenerowany w poszczególnych miejscowościach",
                incomeChartData,
                1300, 400, "chart2"));

            return PartialView("_AnalysisChartSection", viewModel);
        }