/// <summary> /// Start a review. /// </summary> /// <param name="parcelId"></param> /// <returns></returns> public IActionResult ReviewStart(long parcelId) { // Create the review for the user if it does not exist string username = User.Identity.Name; FoodParcel foodParcel = this.ReviewService.GetFoodParcel(parcelId); if (foodParcel != null) { TestResult test = this.ReviewService.GetTestResult(parcelId, User.Identity.Name); if (test == null) { test = this.ReviewService.CreateTest(foodParcel, User.Identity.Name); } ReviewStartViewModel review = new ReviewStartViewModel() { TestId = test.Id, TestName = test.Name, FoodParcel = foodParcel }; return(View(review)); } else { return(RedirectToAction("Index", "Review")); } }
/// <summary> /// Get the list of all completed tests in a food parcel. /// </summary> /// <param name="foodParcel"></param> /// <returns></returns> public List <TestResultItem> CompletedTests(FoodParcel foodParcel) { List <TestResultItem> result = new List <TestResultItem>(); if (foodParcel.TestResults != null) { foreach (TestResult item in foodParcel.TestResults) { result.AddRange(from TestResultItem t in item.TestResultItems where t.Result > 0 select t); } } return(result.OrderBy(f => f.FoodItem.Description).ToList()); }
/// <summary> /// Create test records for a user and food parcel. /// </summary> /// <param name="foodParcel"></param> /// <param name="username"></param> /// <returns></returns> public TestResult CreateTest(FoodParcel foodParcel, string username) { List <TestItemCategory> measurementCategories = (from TestItemCategory l in this.TestItemResultCategoryRepository.GetAll select l).OrderBy(o => o.Value).ToList(); List <FoodItem> selectedFoodItems = foodParcel.FoodItems; TestResult test = new TestResult() { FoodParcelId = foodParcel.Id, TestDate = DateTime.Now, Name = foodParcel.Name + " Review", UserName = username }; this.TestResultRepository.Create(test); this.TestResultRepository.Save(); // Add the food items to the test foreach (FoodItem item in selectedFoodItems) { foreach (TestItemCategory category in measurementCategories) { TestResultItem testResultItem = new TestResultItem() { CategoryId = category.Id, FoodItemId = item.Id, Result = 0, TestResultId = test.Id }; this.TestResultItemRepository.Create(testResultItem); } } this.TestResultItemRepository.Save(); test = this.GetTestResult(foodParcel.Id, username); // Check the new item has been saved properly return(test); }
/// <summary> /// Create a reviewprocessviewmodel using a reviewstart model. /// </summary> /// <param name="model"></param> /// <param name="username"></param> /// <returns></returns> public ReviewProcessViewModel AssembleReviewProcessViewModel(ReviewStartResultViewModel model, string username) { ReviewProcessViewModel result = new ReviewProcessViewModel() { FoodParcelId = model.FoodParcelId, SelectedFoodItemId = model.SelectedFoodItemId, TestId = model.TestId }; FoodParcel foodParcel = this.FoodParcelRepository.Get(result.FoodParcelId); result.FoodParcelName = foodParcel.Name; FoodItem foodItem = this.FoodItemRepository.Get(result.SelectedFoodItemId); result.FoodItemName = foodItem.Description; TestResult testResult = this.TestResultRepository.Get(result.TestId); result.TestName = testResult.Name; // Get the test items using PLINQ - it may run a bit faster when there are lots of test submissions List <TestResultItem> testResultItems = (from TestResultItem t in this.TestResultItemRepository.GetAll.AsParallel().WithDegreeOfParallelism(2) where t.FoodItemId == result.SelectedFoodItemId && t.TestResultId == result.TestId && t.TestResult.UserName == username select t).ToList(); // The disadvantage of using hard-coded values is that it is difficult to change and add new things later // without changing code, recompiling, testing and deploying. result.PresentationValue = (from TestResultItem t in testResultItems where t.Category.Value == "Presentation" select t.Result).FirstOrDefault(); result.TextureValue = (from TestResultItem t in testResultItems where t.Category.Value == "Texture" select t.Result).FirstOrDefault(); result.AromaValue = (from TestResultItem t in testResultItems where t.Category.Value == "Aroma" select t.Result).FirstOrDefault(); result.FlavourValue = (from TestResultItem t in testResultItems where t.Category.Value == "Flavour" select t.Result).FirstOrDefault(); return(result); }