예제 #1
0
        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
                }));
            }
        }
예제 #2
0
        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
                }));
            }
        }