Ejemplo n.º 1
0
 public static ReviewTask ConvertToEntity(this ReviewTaskDTO dto)
 {
     return(new ReviewTask {
         Id = dto.Id,
         Answers = dto.Answers?.Select(e => e.ConvertToEntity()).ToList(),
         TaskDelegationId = dto.TaskDelegationId,
         User = dto.User?.ConvertToEntity(),
         UserId = dto.User?.Id ?? 0,
         IsSubmitted = dto.IsSubmitted
     });
 }
Ejemplo n.º 2
0
        public async Task <IActionResult> SubmitTask([FromBody] ReviewTaskDTO taskDto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = await _taskLogic.SubmitTask(taskDto);

            if (!result)
            {
                return(BadRequest(ModelState));
            }

            return(Ok(result));
        }
Ejemplo n.º 3
0
        public async Task <bool> StartPhase(PhaseDTO phase)
        {
            var study = await _studyRepo.ReadAsync(phase.StudyId);

            study.ActivePhase = phase;

            await _studyRepo.UpdateAsync(study);

            var p = study.Users;

            p = p.OrderBy(a => Guid.NewGuid()).ToList();
            var participants = p.ToList();

            study.Publications = study.Publications.OrderBy(a => Guid.NewGuid()).ToList(); // Shuffle list

            /*
             * Gennemgå hver publication
             *  Lav en task delegation for hver publication
             *      Lav antal x tasks (hver til én user)
             *          Få id fra GetNextUser
             **/


            var publications = study.Publications.ToList();

            var numPubs  = study.Publications.Count();
            var numUsers = participants.Count();

            var numOverlap = numPubs * 100.0 / phase.OverlapPercentage;

            var numMinTasks   = numOverlap / numUsers; // Number of minimum tasks for each researcher
            var numExtraTasks = numOverlap % numUsers; // Number of researchers that must get an extra task

            int curUserIdx = 0;

            var taskList = new List <ReviewTaskDTO>();

            foreach (PublicationDTO publication in publications)
            {
                var delegation = new TaskDelegationDTO {
                    PhaseId     = phase.Id,
                    Publication = publication,
                    Tasks       = taskList
                };

                await _taskDelRepo.CreateAsync(delegation);

                var numTasks = numMinTasks + (numExtraTasks-- >= 0 ? 1 : 0); // Min tasks and maybe plus an extra
                for (int n = 0; n < numTasks; n++)
                {
                    var task = new ReviewTaskDTO {
                        TaskDelegationId = delegation.Id,
                        User             = participants[curUserIdx].User
                    };

                    await _taskRepo.CreateAsync(task);

                    taskList.Add(task);

                    curUserIdx = (curUserIdx + 1) % participants.Count();
                }

                await _taskDelRepo.UpdateAsync(delegation);

                return(await Update(phase));
            }

            return(false);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Submits the given task. The task has to be created in the database beforehand.
        /// </summary>
        /// <param name="task">The task to be submitted</param>
        /// <returns>True if successful, false if the task could not be submitted</returns>
        public async Task <bool> SubmitTask(ReviewTaskDTO task)
        {
            // Make a list of all field ids in the answers of the task
            List <int> taskListId = new List <int>();

            foreach (AnswerDTO a in task.Answers)
            {
                taskListId.Add(a.Field.Id);
            }

            ReviewTaskDTO readTask;

            if ((readTask = await _taskRepo.ReadAsync(task.Id)) != null)
            {
                var readTaskDelegation = await _taskDelegationRepository.ReadAsync(readTask.TaskDelegationId);

                var readPhase = await _phaseRepository.ReadAsync(readTaskDelegation.PhaseId);

                var taskDelegation = await _taskDelegationRepository.ReadAsync(task.TaskDelegationId);

                var phase = await _phaseRepository.ReadAsync(taskDelegation.PhaseId);

                // Check if the phases match
                if (readPhase.Id != phase.Id)
                {
                    return(false);
                }

                // Check if all the fields in the phase match the fields in the answers
                var fieldListId = from s in phase.InputFields
                                  where taskListId.Contains(s.Id)
                                  select s.Id;

                // Check if the answers and the phase have the same amount of fields
                if (fieldListId.Count() != taskListId.Count())
                {
                    return(false);
                }

                // Use the above fieldList to get all tasks that match the
                if (fieldListId == null)
                {
                    return(false);
                }
                List <AnswerDTO> answerList = new List <AnswerDTO>();
                foreach (AnswerDTO a in task.Answers)
                {
                    if (fieldListId.Contains(a.Field.Id))
                    {
                        answerList.Add(a);
                    }
                }
                // Create all the answers
                if (answerList[0] == null)
                {
                    return(false);
                }
                foreach (AnswerDTO a in answerList)
                {
                    await _answerRepo.CreateAsync(a);
                }

                // Submit the task
                task.IsSubmitted = true;
                // Update the task
                if (!await _taskRepo.UpdateAsync(task))
                {
                    return(false);
                }

                var taskList = taskDelegation.Tasks.ToList();
                int j        = 0;
                // Check if all tasks have been submitted
                for (int i = 0; i < taskList.Count(); i++)
                {
                    if (taskList[i].IsSubmitted)
                    {
                        j++;
                    }
                }

                // Check if all tasks have been submitted
                if (j == taskList.Count())
                {
                    CommitTaskDelegation(taskDelegation);
                    var exclusions = (await _studyRepo.ReadAsync(phase.StudyId)).ExclusionCriteria;
                    foreach (var exclusionCriterionDto in exclusions)
                    {
                        var publication = taskDelegation.Publication;

                        var dataField = publication.Data.Single(d =>
                        {
                            var f = _fieldRepository.ReadAsync(d.FieldId).Result;
                            return(f.Id == exclusionCriterionDto.FieldId);
                        });
                        publication.Active = publication.Active && exclusionCriterionDto.Condition.Apply(dataField.Value);
                    }
                }
            }
            return(true);
        }