public DashboardController(Repository r, IMonthlySubmissionRepository m)
        {
            _monthly_submission_repo = m;
            _repository = r;

            dRepo = new DashboardRepository(r);

            if (DOWidget == null)
            {
                DOWidget = new DepartmentalOverviewWidget(dRepo);
            }

            if (MLSWidget == null)
            {
                MLSWidget = new MultiLevelScoreWidget(dRepo);
            }

            if (SMCWidget == null)
            {
                SMCWidget = new SingleMeasurementChartWidget(dRepo);
            }
        }
        /// <summary>
        /// Gets department's measurements values information for widget data
        /// </summary>
        /// <returns>DataTable containing information on department's measurements, goals, and values</returns>
        public DataTable GetData()
        {
            if (CurrentDept == null)
            {
                return null;
            }

            var results = new DataTable();
            results.Columns.Add("MeasurementName", typeof(string));
            results.Columns.Add("CurrentMonthVal", typeof(string));
            results.Columns.Add("CurrentMonthScore", typeof(string));
            results.Columns.Add("PrevMonthVal", typeof(string));
            results.Columns.Add("PrevMonthScore", typeof(string));
            results.Columns.Add("PctChange", typeof(string));
            results.Columns.Add("Values", typeof(string[][]));
            results.Columns.Add("Months", typeof(int[]));
            results.Columns.Add("MonthNames", typeof(string[]));
            results.Columns.Add("MeetsVal", typeof(string));
            results.Columns.Add("MeetsPlusVal", typeof(string));
            results.Columns.Add("ExceedsVal", typeof(string));
            results.Columns.Add("Color", typeof(string));

            var scoreCalculator = new MultiLevelScoreWidget(repo);

            if (CurrentDept.Measurements != null)
            {
                foreach (var meas in CurrentDept.Measurements)
                {
                    //meas.RefreshDatapoints();
                    //meas.RefreshGoals();
                    var endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
                    var startDate = endDate.AddMonths(-1);

                    string[] vals = new string[12];
                    string[][] values = new string[1][];
                    int[] months = new int[12];
                    string[] monthNames = new string[12];

                    for (var i = 0; i < 12; i++)
                    {
                        months[i] = i + 1;
                    }

                    var measurementName = meas.ViewModel.NameMeasurement;
                    var currentMonth = meas.CalculateSingleMeasurementValue(startDate, endDate);
                    if (currentMonth != null)
                    {
                        vals[11] = ((double)currentMonth).ToString("F0");
                    }
                    monthNames[11] = endDate.ToString("MMM");
                    var score = scoreCalculator.GetMeasScore(meas, startDate, endDate);
                    string currentMonthScore = score == null ? "" : score >= 5 ? "Exceeds" : score >= 4
                        ? "MeetsPlus" : score >= 3 ? "Meets" : score < 3 ? "Fails" : "";

                    endDate = endDate.AddMonths(-1);
                    startDate = startDate.AddMonths(-1);
                    var prevMonth = meas.CalculateSingleMeasurementValue(startDate, endDate);
                    if (prevMonth != null)
                    {
                        vals[10] = ((double)prevMonth).ToString("F0");
                    }
                    monthNames[10] = endDate.ToString("MMM");
                    score = scoreCalculator.GetMeasScore(meas, startDate, endDate);
                    string prevMonthScore = score == null ? "" : score >= 5 ? "Exceeds" : score >= 4
                        ? "MeetsPlus" : score >= 3 ? "Meets" : score < 3 ? "Fails" : "";

                    var pctChange = "N/A";
                    if (currentMonth != null && prevMonth != null && prevMonth != 0)
                    {
                        var pctChangeVal = ((double)(((currentMonth / prevMonth) - 1) * 100));
                        pctChange = pctChangeVal.ToString("F0") + "%";
                        if (pctChangeVal >= 0)
                        {
                            pctChange = "+" + pctChange;
                        }
                    }

                    var currentMonthVal = currentMonth.ToString();
                    var prevMonthVal = prevMonth.ToString();

                    for (int i = 9; i >= 0; i--)
                    {
                        endDate = endDate.AddMonths(-1);
                        startDate = startDate.AddMonths(-1);
                        var curMonth = meas.CalculateSingleMeasurementValue(startDate, endDate);
                        if (curMonth != null)
                        {
                            vals[i] = ((double)curMonth).ToString("F0");
                        }
                        monthNames[i] = endDate.ToString("MMM");
                    }

                    values[0] = vals;

                    string meetsVal = "";
                    string meetsPlusVal = "";
                    string exceedsVal = "";

                    if (meas.Goal != null)
                    {
                        var vm = meas.Goal.ViewModel;
                        meetsVal = vm.MeetsVal != null ? ((double)vm.MeetsVal).ToString("0.00") : "";
                        meetsPlusVal = vm.MeetsPlusVal != null ? ((double)vm.MeetsPlusVal).ToString("0.00") : "";
                        exceedsVal = vm.ExceedsVal != null ? ((double)vm.ExceedsVal).ToString("0.00") : "";
                    }

                    var color = getRandomColor();

                    results.Rows.Add(measurementName, currentMonthVal, currentMonthScore,
                        prevMonthVal, prevMonthScore, pctChange, values, months, monthNames,
                        meetsVal, meetsPlusVal, exceedsVal, color);
                }
            }
            return results;
        }
        /// <summary>
        /// Gets department's measurement value information for currently set month
        /// </summary>
        /// <returns>DataTable containing information on department's measurements, goals, and values</returns>
        public DataTable GetData()
        {
            if (CurrentDept == null)
            {
                return null;
            }
            if (String.IsNullOrEmpty(CurrentPerformanceLevel))
            {
                CurrentPerformanceLevel = "Meets";
            }

            var results = new DataTable();
            results.Columns.Add("Measurement", typeof(string));
            results.Columns.Add("Goal", typeof(string));
            results.Columns.Add("Value", typeof(string));

            var endDate = new DateTime(currentYear, currentMonth, 1);
            var startDate = endDate.AddMonths(-1);
            var scoreCalculator = new MultiLevelScoreWidget(repo);

            if (CurrentDept.Measurements != null)
            {
                try
                {

                    foreach (var meas in CurrentDept.Measurements)

                    {
                        //meas.RefreshDatapoints();
                        //meas.RefreshGoals();
                        if (meas.Goal != null) // no point adding to this widget if no measurement
                        {
                            string value = "";
                            var measVal = meas.CalculateSingleMeasurementValue(startDate, endDate);
                            if (measVal != null)
                            {
                                value = ((double)measVal).ToString("0.00");
                            }

                            var measPerformanceLevel = scoreCalculator.GetMeasScore(meas, startDate, endDate);
                            var measName = meas.ViewModel.NameMeasurement;

                            string goal = "";

                            var vm = meas.Goal.ViewModel;

                            if (CurrentPerformanceLevel == "Exceeds" && measPerformanceLevel >= 5)
                            {
                                if (vm.ExceedsVal != null)
                                {
                                    goal = (vm.Operation == "<=" ? "≤" : "≥") + " " + ((double)(vm.ExceedsVal)).ToString("0.00");
                                }
                                results.Rows.Add(measName, goal, value);
                            }
                            else if (CurrentPerformanceLevel == "MeetsPlus" && measPerformanceLevel >= 4)
                            {
                                if (vm.MeetsPlusVal != null)
                                {
                                    goal = (vm.Operation == "<=" ? "≤" : "≥") + " " + ((double)(vm.MeetsPlusVal)).ToString("0.00");
                                }
                                results.Rows.Add(measName, goal, value);
                            }
                            else if ((CurrentPerformanceLevel == "Meets" && measPerformanceLevel >= 3) ||
                                (CurrentPerformanceLevel == "Fails" && measPerformanceLevel < 3))
                            {
                                if (vm.MeetsVal != null)
                                {
                                    goal = (vm.Operation == "<=" ? "≤" : "≥") + " " + ((double)(vm.MeetsVal)).ToString("0.00");
                                }
                                results.Rows.Add(measName, goal, value);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
            return results;
        }