diff --git a/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs b/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
index eb230772b9..511dfcbb99 100644
--- a/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
+++ b/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
@@ -20,6 +20,7 @@ public interface IFrameworkNotificationService
void SendSupervisorResultReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int resultId);
void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate);
void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId);
+ void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults);
}
public class FrameworkNotificationService : IFrameworkNotificationService
{
@@ -291,5 +292,19 @@ public void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelega
builder.HtmlBody = $@"
Dear {supervisorDelegate.FirstName}
This is a reminder sent by your {delegateSelfAssessment.RoleName}, {supervisorDelegate.SupervisorName}, to complete the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your {delegateSelfAssessment.RoleName} profile assessment.
";
emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
}
+
+ public void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults)
+ {
+ var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId);
+ var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
+ var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+ string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Signed-off {countResults} results - Digital Learning Solutions";
+ var builder = new BodyBuilder();
+ builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+ {supervisorDelegate.SupervisorName} has signed-off {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
+ To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+ builder.HtmlBody = $@"
Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has signed-off {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your {delegateSelfAssessment.RoleName} profile assessment.
";
+ emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+ }
}
}
diff --git a/DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs b/DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs
index d3f97a5f3a..0e1268e44f 100644
--- a/DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs
+++ b/DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs
@@ -19,6 +19,7 @@ public interface ISelfAssessmentService
void SetResultForCompetency(int competencyId, int selfAssessmentId, int candidateId, int assessmentQuestionId, int result, string? supportingComments);
IEnumerable GetMostRecentResults(int selfAssessmentId, int candidateId);
IEnumerable GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId);
+ IEnumerable GetCandidateAssessmentResultsForReviewById(int candidateAssessmentId, int adminId);
Competency GetCompetencyByCandidateAssessmentResultId(int resultId, int candidateAssessmentId, int adminId);
void UpdateLastAccessed(int selfAssessmentId, int candidateId);
void SetSubmittedDateNow(int selfAssessmentId, int candidateId);
@@ -340,6 +341,27 @@ public IEnumerable GetCandidateAssessmentResultsById(int candidateAs
return groupedCompetency;
});
}
+ public IEnumerable GetCandidateAssessmentResultsForReviewById(int candidateAssessmentId, int adminId)
+ {
+ var result = connection.Query(
+ $@"WITH {SpecificAssessmentResults}
+ SELECT {CompetencyFields}
+ FROM {SpecificCompetencyTables}
+ WHERE (LAR.Requested IS NOT NULL) AND (LAR.Verified IS NULL) AND (LAR.UserIsVerifier = 1)",
+ (competency, assessmentQuestion) =>
+ {
+ competency.AssessmentQuestions.Add(assessmentQuestion);
+ return competency;
+ },
+ param: new { candidateAssessmentId, adminId }
+ );
+ return result.GroupBy(competency => competency.Id).Select(group =>
+ {
+ var groupedCompetency = group.First();
+ groupedCompetency.AssessmentQuestions = group.Select(competency => competency.AssessmentQuestions.Single()).ToList();
+ return groupedCompetency;
+ });
+ }
public void UpdateLastAccessed(int selfAssessmentId, int candidateId)
{
diff --git a/DigitalLearningSolutions.Data/Services/SupervisorService.cs b/DigitalLearningSolutions.Data/Services/SupervisorService.cs
index 51a4ff049f..1c175d99cd 100644
--- a/DigitalLearningSolutions.Data/Services/SupervisorService.cs
+++ b/DigitalLearningSolutions.Data/Services/SupervisorService.cs
@@ -414,7 +414,7 @@ FROM CandidateAssessments
public bool RemoveCandidateAssessment(int candidateAssessmentId)
{
var numberOfAffectedRows = connection.Execute(
- @"UPDATE CandidateAssessments SET RemovedDate = getUTCDate(), RemovalMethodID = 2,
+ @"UPDATE CandidateAssessments SET RemovedDate = getUTCDate(), RemovalMethodID = 2
WHERE ID = @candidateAssessmentId AND RemovedDate IS NULL",
new { candidateAssessmentId });
if (numberOfAffectedRows < 1)
diff --git a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs
index 447066ec45..0a11f349ab 100644
--- a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs
+++ b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs
@@ -189,7 +189,39 @@ public IActionResult SubmitReviewCompetencySelfAssessment(int supervisorDelegate
};
return RedirectToAction("ReviewCompetencySelfAssessment", "Supervisor", new { supervisorDelegateId = supervisorDelegateId, candidateAssessmentId = candidateAssessmentId, viewMode = "View", resultId = resultId });
}
- public IActionResult StartEnrolDelegateOnProfileAssessment(int supervisorDelegateId)
+ [Route("/Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{candidateAssessmentId}/VerifyMultiple/")]
+ public IActionResult VerifyMultipleResults(int supervisorDelegateId, int candidateAssessmentId)
+ {
+ var adminId = GetAdminID();
+ var superviseDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId);
+ var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
+ var reviewedCompetencies = selfAssessmentService.GetCandidateAssessmentResultsForReviewById(candidateAssessmentId, adminId).ToList();
+ var model = new ReviewSelfAssessmentViewModel()
+ {
+ SupervisorDelegateDetail = superviseDelegate,
+ DelegateSelfAssessment = delegateSelfAssessment,
+ CompetencyGroups = reviewedCompetencies.GroupBy(competency => competency.CompetencyGroup)
+ };
+ return View("VerifyMultipleResults", model);
+ }
+ [HttpPost]
+ [Route("/Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{candidateAssessmentId}/VerifyMultiple/")]
+ public IActionResult SubmitVerifyMultipleResults(int supervisorDelegateId, int candidateAssessmentId, List resultChecked)
+ {
+ int countResults = 0;
+ foreach (var result in resultChecked)
+ {
+ if (supervisorService.UpdateSelfAssessmentResultSupervisorVerifications(result, null, true, GetAdminID()))
+ { countResults += 1; }
+ }
+ if (countResults > 0)
+ {
+ //Send notification
+ frameworkNotificationService.SendSupervisorMultipleResultsReviewed(GetAdminID(), supervisorDelegateId, candidateAssessmentId, countResults);
+ }
+ return RedirectToAction("ReviewDelegateSelfAssessment", "Supervisor", new { supervisorDelegateId = supervisorDelegateId, candidateAssessmentId = candidateAssessmentId, viewMode = "Review" });
+ }
+ public IActionResult StartEnrolDelegateOnProfileAssessment(int supervisorDelegateId)
{
TempData.Clear();
var sessionEnrolOnRoleProfile = new SessionEnrolOnRoleProfile();
diff --git a/DigitalLearningSolutions.Web/Views/Supervisor/EnrolDelegateSummary.cshtml b/DigitalLearningSolutions.Web/Views/Supervisor/EnrolDelegateSummary.cshtml
index 9fc9fb2058..1418c50b72 100644
--- a/DigitalLearningSolutions.Web/Views/Supervisor/EnrolDelegateSummary.cshtml
+++ b/DigitalLearningSolutions.Web/Views/Supervisor/EnrolDelegateSummary.cshtml
@@ -38,7 +38,7 @@
-