public async Task <BoxGraphData> GetLeadTimeBoxGraphData(DateTimeOffset startDate, DateTimeOffset finishDate,
                                                                 bool product, bool engineering, bool unanticipated, bool assessmentsTeam, bool enterpriseTeam)
        {
            Product         = product;
            Engineering     = engineering;
            Unanticipated   = unanticipated;
            AssessmentsTeam = assessmentsTeam;
            EnterpriseTeam  = enterpriseTeam;

            var boxGraphData = new BoxGraphData
            {
                Entries = new List <BoxGraphDataEntry>
                {
                    new BoxGraphDataEntry(),
                    new BoxGraphDataEntry(),
                    new BoxGraphDataEntry(),
                    new BoxGraphDataEntry()
                },
                Outliers = new List <object[]>()
            };

            var taskItems = await taskItemRepository.GetTaskItemListAsync(startDate, finishDate);

            var taskItemsByType = new[]
            {
                new List <TaskItem>(),
                new List <TaskItem>(),
                new List <TaskItem>()
            };

            var finalTaskItemList = new List <TaskItem>();

            foreach (var item in taskItems
                     .Where(item => taskItemHelper.TaskItemDevTeamIsSelected(AssessmentsTeam, EnterpriseTeam, item)))
            {
                taskItemsByType[(int)item.Type - 1].Add(item);
                if (taskItemHelper.TaskItemTypeIsSelected(Product, Engineering, Unanticipated, item))
                {
                    finalTaskItemList.Add(item);
                }
            }

            foreach (var itemList in taskItemsByType)
            {
                if (itemList.Count > 0)
                {
                    var sortedItemList = SortByLeadTime(itemList);
                    var index          = (int)itemList[0].Type - 1;
                    boxGraphData = CalculateBoxGraphData(sortedItemList, boxGraphData, index);
                }
            }

            boxGraphData = CalculateBoxGraphData(SortByLeadTime(finalTaskItemList), boxGraphData, 3);
            boxGraphData.Entries[3].TaskItemType = "Selected Task Items";

            return(boxGraphData);
        }
        public BoxGraphData CalculateBoxGraphData(List <TaskItem> itemList, BoxGraphData boxGraphData, int index)
        {
            if (itemList.IsNullOrEmpty())
            {
                return(null);
            }

            var boxGraphDataEntry = boxGraphData.Entries[index];

            boxGraphDataEntry.TaskItemType = itemList[0].Type.ToString();

            var lowerQuartileIndex = (int)((itemList.Count - 1) * (1m / 4m));
            var middleIndex        = (int)((itemList.Count - 1) / 2m);
            var upperQuartileIndex = (int)((itemList.Count - 1) * (3m / 4m));

            boxGraphDataEntry.LowerQuartile = itemList[lowerQuartileIndex].LeadTimeHours;
            boxGraphDataEntry.Median        = itemList[middleIndex].LeadTimeHours;
            boxGraphDataEntry.UpperQuartile = itemList[upperQuartileIndex].LeadTimeHours;

            var iqr = itemList[upperQuartileIndex].LeadTimeHours -
                      itemList[lowerQuartileIndex].LeadTimeHours;

            var minWhiskerValue = boxGraphDataEntry.LowerQuartile - (iqr * 1.5m) > 0
                ? boxGraphDataEntry.LowerQuartile - (iqr * 1.5m)
                : 0;
            var maxWhiskerValue = boxGraphDataEntry.UpperQuartile + (iqr * 1.5m);

            var outliers = boxGraphData.Outliers;

            (boxGraphDataEntry.Minimum, outliers) = GetMinimumAndOutliers(itemList, minWhiskerValue, outliers, index);
            (boxGraphDataEntry.Maximum, outliers) =
                GetMaximumAndSetOutliers(itemList, maxWhiskerValue, outliers, index);

            boxGraphData.Outliers = outliers;

            return(boxGraphData);
        }