public async Task <object> Complete(int id) { var workItem = await _context.WorkItems .Include(x => x.AssignedUser) .Include(x => x.Report.Submission) .FirstOrDefaultAsync(x => x.Id == id); if (workItem == null) { return(NotFound()); } //TODO: Pulling too much data here var submission = _context.Submissions .Include(f => f.FileSpecification.GenerationGroup.Users) .Include(f => f.FileSpecification.ApprovalGroup.Users) .Include(f => f.FileSpecification.SubmissionGroup.Users) .FirstOrDefault(x => x.Id == workItem.Report.SubmissionId); var currentReport = submission.Reports.FirstOrDefault(x => x.Id == submission.CurrentReportId); Group group = submission.FileSpecification.GenerationGroup; switch (workItem.WorkItemAction) { case WorkItemAction.Generate: group = submission.FileSpecification.GenerationGroup; break; case WorkItemAction.Review: group = submission.FileSpecification.ApprovalGroup; break; case WorkItemAction.Approve: group = submission.FileSpecification.SubmissionGroup; break; } if (group == null) { return(BadRequest($"No group defined for next task")); } //If current workitem is a generation task, the review task should return to same user var assignee = workItem.AssignedUser; if (workItem.WorkItemAction != WorkItemAction.Generate || workItem.WorkItemAction == WorkItemAction.Submit) { assignee = _membershipService.GetAssignee(group); } if (assignee == null) { return(BadRequest($"No members in {group.Name} to assign next task")); } //TODO Move to completed work method if (workItem.WorkItemAction == WorkItemAction.Generate) { var result = _documentService.GenerateDocuments(currentReport); if (result.IsFailure) { return(BadRequest(result.Error)); } } var wi = submission.CompleteWork(workItem, assignee); if (wi.WorkItemAction == 0) { var notifiers = _membershipService.GetGroupMembers(Constants.SubmissionNotifiers); var generators = _membershipService.GetGroupMembers(submission.FileSpecification.GenerationGroup.Name).ToList(); var approvers = _membershipService.GetGroupMembers(submission.FileSpecification.ApprovalGroup.Name).ToList(); notifiers.AddRange(generators); notifiers.AddRange(approvers); WorkEmailer.SendCompletion(wi, submission, notifiers); } else { WorkEmailer.Send(wi, submission, null); } _context.SaveChanges(); var dto = Mapper.Map <WorkItemViewDto>(workItem); return(Ok(dto)); }