public async Task <ActionResult <AvailabilityDataViewModel> > GetAvailabilityData(Guid projectId) { if (projectId == Guid.Empty) { return(BadRequest("No valid projectId.")); } try { TaskListResult <ProjectTask> taskResult = await taskService.GetAllProjectTasksAsync(projectId); TaskListResult <Shift> shiftResult = await shiftService.GetShiftsWithAvailabilitiesAsync(projectId); if (!taskResult.Succeeded) { return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = taskResult.Message })); } if (!shiftResult.Succeeded) { return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = shiftResult.Message })); } List <Schedule> knownAvailabilities = new List <Schedule>(); foreach (IGrouping <DateTime, Shift> grouping in shiftResult.Data.GroupBy(s => s.Date)) { List <AvailabilityStatus> dateStatus = new List <AvailabilityStatus>(); foreach (Shift shift in grouping) { int numberOfAvailabilities = shift.Availabilities.Where(a => a.Type == AvailibilityType.Ok).Count(); int numberOfSchedule = shift.Availabilities.Count(a => a.Type == AvailibilityType.Scheduled); if (numberOfSchedule >= shift.ParticipantsRequired) { dateStatus.Add(AvailabilityStatus.Scheduled); } else if (numberOfAvailabilities >= shift.ParticipantsRequired) { dateStatus.Add(AvailabilityStatus.Complete); } else { dateStatus.Add(AvailabilityStatus.Incomplete); } } Schedule schedule = new Schedule(grouping.Key, AvailabilityStatus.Incomplete); if (dateStatus.All(a => a == AvailabilityStatus.Complete || a == AvailabilityStatus.Scheduled)) { schedule.Status = AvailabilityStatus.Complete; } if (dateStatus.All(a => a == AvailabilityStatus.Scheduled)) { schedule.Status = AvailabilityStatus.Scheduled; } knownAvailabilities.Add(schedule); } List <TaskViewModel> taskViewModels = taskResult.Data .Select(projectTask => TaskViewModel.CreateVm(projectTask.Task)).ToList(); AvailabilityDataViewModel vm = new AvailabilityDataViewModel { ProjectTasks = taskViewModels, KnownAvailabilities = knownAvailabilities }; return(Ok(vm)); } catch (Exception ex) { string message = GetType().Name + "Error in " + nameof(GetAvailabilityData); logger.LogError(ex, message); return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = message })); } }
public async Task <ActionResult <AvailabilityDataViewModel> > GetAvailabilityData(Guid projectId, Guid userId) { if (projectId == Guid.Empty) { return(BadRequest("No valid projectId.")); } if (userId == Guid.Empty) { return(BadRequest("No valid userId.")); } try { TaskListResult <ProjectTask> taskResult = await taskService.GetAllProjectTasksAsync(projectId); TaskListResult <Shift> shiftResult = await shiftService.GetShiftsWithAvailabilitiesAsync(projectId, userId); TaskResult <Person> person = await personService.GetPersonAsync(userId); if (!taskResult.Succeeded) { return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = taskResult.Message })); } if (!shiftResult.Succeeded) { return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = shiftResult.Message })); } if (!person.Succeeded) { return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = person.Message })); } List <Schedule> knownAvailabilities = new List <Schedule>(); foreach (IGrouping <DateTime, Shift> grouping in shiftResult.Data.GroupBy(s => s.Date)) { int numberOfShifts = grouping.Count(); int numberOfAvailabilities = 0; bool scheduled = false; bool anyAvailable = false; foreach (Shift shift in grouping) { if (shift.Availabilities.Count <= 0) { continue; } numberOfAvailabilities++; shift.Availabilities.ForEach(a => { if (a.Type == AvailibilityType.Scheduled) { scheduled = true; } else if (a.Type == AvailibilityType.Ok) { anyAvailable = true; } }); } if (scheduled) { knownAvailabilities.Add(new Schedule(grouping.Key, AvailabilityStatus.Scheduled)); } else if (anyAvailable) { knownAvailabilities.Add(new Schedule(grouping.Key, AvailabilityStatus.Complete)); } else if (numberOfAvailabilities > 0 && !anyAvailable) { knownAvailabilities.Add(new Schedule(grouping.Key, AvailabilityStatus.Unavailable)); } else { knownAvailabilities.Add(new Schedule(grouping.Key, AvailabilityStatus.Incomplete)); } } List <TaskViewModel> taskViewModels = taskResult.Data .Where(t => t.Task.Requirements .All(r => person.Data.Certificates .Where(c => c.DateExpired == null || c.DateExpired > DateTime.UtcNow) .Select(c => c.CertificateTypeId) .Contains(r.CertificateTypeId))) .Select(projectTask => TaskViewModel .CreateVm(projectTask.Task)) .ToList(); AvailabilityDataViewModel vm = new AvailabilityDataViewModel { ProjectTasks = taskViewModels, KnownAvailabilities = knownAvailabilities }; return(Ok(vm)); } catch (Exception ex) { string message = GetType().Name + "Error in " + nameof(GetAvailabilityData); logger.LogError(ex, message); return(UnprocessableEntity(new ErrorViewModel { Type = Type.Error, Message = message })); } }