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); }