public async Task <dynamic> GetChartsData(SafetyResourceParameter parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            var data = await _context.Incidences
                       .Include(x => x.Injury)
                       .Include(x => x.BodyPart)
                       .Include(x => x.InjuryStat)
                       .AsNoTracking()
                       .Where(
                x =>
                x.AccidentDate.Date >= parameter.StartDate &&
                x.AccidentDate.Date <= parameter.EndDate
                )
                       .OrderByDescending(x => x.AccidentDate)
                       .ToListAsync()
                       .ConfigureAwait(false);

            var manHours = await _context.ManHours
                           .Where(
                x => x.MosDte.Date >= parameter.StartDate && x.MosDte.Date <= parameter.EndDate
                )
                           .ToListAsync()
                           .ConfigureAwait(false);

            var incidenceDto = _mapper.Map <List <SafetyIncidenceDto> >(data);

            var filteredData = parameter.ShowNearMiss
                ? data
                : data.Where(x => x.InjuryStatId != "Near Miss").ToList();

            var filteredDataByDept = filteredData
                                     .Where(x => x.Dept.Contains(parameter.Department))
                                     .ToList();
            var monthlyNearMissData = data.Where(
                x => x.InjuryStatId == "Near Miss" && x.Dept.Contains(parameter.Department)
                )
                                      .ToList();

            return(new
            {
                IncidentsByDepartment = GetIncidentsByDepartment(filteredData),
                OpenStatusByDepartment = GetOpenStatusByDepartment(data),
                MonthlyIncidentRate = GetMonthlyIncidentRate(data, manHours, parameter),
                MonthlyIncidents = GetMonthlyIncidents(filteredDataByDept),
                MonthlyNearMissIncidents = GetMonthlyIncidents(monthlyNearMissData),
                InjuryByDepartment = GetInjuries(filteredDataByDept),
                BodyPartByDepartment = GetBodyParts(filteredDataByDept),
                Mitigation = GetAverageDaysBeforeMitigation(incidenceDto),
                NotMitigatedOver14Days = GetNumberOfIssuesNotMitigateOver14Days(incidenceDto), //change name later when front end is deployed
            });
        }
        public async Task <IActionResult> GetChartsData(
            [FromQuery] SafetyResourceParameter parameter
            )
        {
            try
            {
                var data = await _service.GetChartsData(parameter).ConfigureAwait(false);

                return(Ok(data));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        private static dynamic GetMonthlyIncidentRate(
            List <Incidence> data,
            IReadOnlyCollection <ManHour> manHours,
            SafetyResourceParameter parameter
            )
        {
            var result = data.Where(x => x.InjuryStatId.ToLower().Contains("recordable"))
                         .GroupBy(
                x =>
                new
            {
                x.AccidentDate.Year,
                x.AccidentDate.Month,
                MonthName = x.AccidentDate.ToMonthName()
            }
                )
                         .Select(
                x =>
            {
                var monthlyHours = manHours
                                   .Where(
                    m => m.MosDte.Year == x.Key.Year && m.MosDte.Month == x.Key.Month
                    )
                                   .Sum(m => m.Manhrs);

                return(new MonthlyIncidentRateDto
                {
                    Year = x.Key.Year,
                    Month = x.Key.Month,
                    MonthName = x.Key.MonthName,
                    Recordables = x.Count(),
                    Hours = monthlyHours,
                    Rate = CalculateIncidentRates(x.Count(), (double)monthlyHours)
                });
            }
                )
                         .OrderBy(x => x.Year)
                         .ThenBy(x => x.Month)
                         .ToList();

            var year   = parameter.StartDate.Year;
            var months = new List <MonthlyIncidentRateDto>();

            while (year <= parameter.EndDate.Year)
            {
                for (var month = 1; month <= 12; month++)
                {
                    var record = result.FirstOrDefault(x => x.Year == year && x.Month == month);
                    months.Add(
                        record
                        ?? new MonthlyIncidentRateDto
                    {
                        Year      = year,
                        Month     = month,
                        MonthName = month.ToMonthName()
                    }
                        );
                }

                year++;
            }

            var monthlyHoursYtd = manHours.Sum(m => m.Manhrs);
            var recordablesYtd  = data.Count(x => x.InjuryStatId.ToLower().Contains("recordable"));
            var ytdRate         = CalculateIncidentRates(recordablesYtd, (double)monthlyHoursYtd);

            months.Add(
                new MonthlyIncidentRateDto
            {
                Year        = 0,
                Month       = 0,
                MonthName   = "n/a",
                Hours       = monthlyHoursYtd,
                Recordables = recordablesYtd,
                Rate        = ytdRate
            }
                );

            return(months);
        }