private void CommitTaskDelegation(TaskDelegationDTO taskDelegation) { var answers = taskDelegation.Tasks.Select(t => t.Answers).SelectMany(t => t); var answerDict = CreateTaskDictionary(answers); var publication = taskDelegation.Publication; foreach (var fieldAnswerList in answerDict) { var fieldId = fieldAnswerList.Key; // TODO : Write framework for conflict handling var valueDict = CreateValueDict(fieldAnswerList.Value); // Find the value that was submitted the maximum number of times var mostPopular = valueDict.Aggregate((max, cur) => cur.Value > max.Value ? cur : max); publication.Data.Single(d => { var f = _fieldRepository.ReadAsync(d.FieldId).Result; return(f.Id == fieldId); }).Value = mostPopular.Key; } }
public static TaskDelegation ConvertToEntity(this TaskDelegationDTO dto) { return(new TaskDelegation { Id = dto.Id, PhaseId = dto.PhaseId, Publication = dto.Publication?.ConvertToEntity(), PublicationId = dto.Publication?.Id ?? 0, Tasks = dto.Tasks?.Select(d => d.ConvertToEntity()).ToList() }); }
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); }