Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -291,5 +292,19 @@ public void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelega
builder.HtmlBody = $@"<body style= 'font-family: Calibri; font-size: small;'><p>Dear {supervisorDelegate.FirstName}</p><p>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.</p><p><a href='{selfAssessmentUrl}'>Click here</a> to access your {delegateSelfAssessment.RoleName} profile assessment.</p></body>";
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 = $@"<body style= 'font-family: Calibri; font-size: small;'><p>Dear {supervisorDelegate.FirstName}</p><p> {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.</p><p><a href='{selfAssessmentUrl}'>Click here</a> to access your {delegateSelfAssessment.RoleName} profile assessment.</p></body>";
emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
}
}
}
22 changes: 22 additions & 0 deletions DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public interface ISelfAssessmentService
void SetResultForCompetency(int competencyId, int selfAssessmentId, int candidateId, int assessmentQuestionId, int result, string? supportingComments);
IEnumerable<Competency> GetMostRecentResults(int selfAssessmentId, int candidateId);
IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId);
IEnumerable<Competency> 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);
Expand Down Expand Up @@ -340,6 +341,27 @@ public IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAs
return groupedCompetency;
});
}
public IEnumerable<Competency> GetCandidateAssessmentResultsForReviewById(int candidateAssessmentId, int adminId)
{
var result = connection.Query<Competency, Models.SelfAssessments.AssessmentQuestion, Competency>(
$@"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)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<int> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
<partial name="Shared/_StaffDetails" model="Model.SupervisorDelegateDetail" />
</div>
</details>
<h2>Summary</h2>
<h2>Enrolment Summary</h2>
<dl class="nhsuk-summary-list">

<div class="nhsuk-summary-list__row">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<partial name="Shared/_StaffDetails" model="Model.SupervisorDelegate" />
</div>
</details>
<h2>Self Assessment Outcome</h2>
<h2>@Model.Competency.Vocabulary Self Assessment Result</h2>
<dl class="nhsuk-summary-list">

<div class="nhsuk-summary-list__row">
Expand Down Expand Up @@ -134,7 +134,7 @@
<fieldset class="nhsuk-fieldset">
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
<h2 class="nhsuk-fieldset__heading">
Review Self Assessment Outcome
Review @Model.Competency.Vocabulary Self Assessment Result
</h2>
</legend>
<input name="ResultSupervisorVerificationId" type="hidden" asp-for="ResultSupervisorVerificationId" />
Expand All @@ -146,7 +146,7 @@
<div class="nhsuk-checkboxes__item">
<input class="nhsuk-checkboxes__input" id="cb-sign-off" name="SignedOff" asp-for="SignedOff" type="checkbox">
<label class="nhsuk-label nhsuk-checkboxes__label" for="cb-sign-off">
Sign-off self-assessment outcome
Sign-off self-assessment result
</label>
<div class="nhsuk-hint nhsuk-checkboxes__hint" id="cb-sign-off-item-hint">
I agree with @Model.SupervisorDelegate.FirstName @Model.SupervisorDelegate.LastName's self-assessment against this @Model.Competency.Vocabulary.ToLower()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,21 @@
<partial name="Shared/_StaffDetails" model="Model.SupervisorDelegateDetail" />
</div>
</details>
<h2>@Model.DelegateSelfAssessment.RoleName</h2>
<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-two-thirds">
<h2>@Model.DelegateSelfAssessment.RoleName</h2>
</div>
<div class="nhsuk-grid-column-one-third">
@if (Model.DelegateSelfAssessment.VerificationRequested > 0)
{
<a role="button" asp-action="SubmitProfileAssessmentReview" asp-route-candidateAssessmentId="@Model.DelegateSelfAssessment.ID" asp-route-supervisorDelegateId="@Model.SupervisorDelegateDetail.ID" class="nhsuk-button">Review profile assessment</a>
}
@if (Model.DelegateSelfAssessment.ResultsVerificationRequests > 1)
{
<a role="button" asp-action="VerifyMultipleResults" asp-route-candidateAssessmentId="@Model.DelegateSelfAssessment.ID" asp-route-supervisorDelegateId="@Model.SupervisorDelegateDetail.ID" class="nhsuk-button">Verify multiple results</a>
}
</div>
</div>
@if (Model.CompetencyGroups.Any())
{
foreach (var competencyGroup in Model.CompetencyGroups)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@using DigitalLearningSolutions.Data.Models.SelfAssessments;
@model AssessmentQuestion

<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">Questions </span>
<span class="status-tag">

@Model.Question

</span>
</td>
<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">Responses </span>
<partial name="Shared/_AssessmentQuestionResponse" model="Model" />
</td>
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,7 @@
@model AssessmentQuestion


<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">Questions </span>
<span class="status-tag">

@Model.Question

</span>
</td>
<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">Responses </span>
<partial name="Shared/_AssessmentQuestionResponse" model="Model" />
</td>
<partial name="Shared/_AssessmentQuestionCells" model="Model" />
<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">Questions </span>
<partial name="Shared/_AssessmentQuestionStatusTag" model="Model" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
@using DigitalLearningSolutions.Web.ViewModels.Supervisor;
@model ReviewSelfAssessmentViewModel;
@{
ViewData["Title"] = "Review Self Assessment";
ViewData["Application"] = "Supervisor";
}
<link rel="stylesheet" href="@Url.Content("~/css/frameworks/frameworksShared.css")" asp-append-version="true">
<link rel="stylesheet" href="@Url.Content("~/css/shared/searchableElements/searchableElements.css")" asp-append-version="true">
@section NavMenuItems {
<partial name="Shared/_NavMenuItems" />
}
@section NavBreadcrumbs {
<nav class="nhsuk-breadcrumb" aria-label="Breadcrumb">
<div class="nhsuk-width-container">
<ol class="nhsuk-breadcrumb__list">
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-controller="Supervisor" asp-action="Index">Supervisor</a></li>
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-controller="Supervisor" asp-action="MyStaffList">My Staff</a></li>
<li class="nhsuk-breadcrumb__item">
<a class="nhsuk-breadcrumb__link trigger-loader" asp-controller="Supervisor"
asp-action="DelegateProfileAssessments"
asp-route-supervisorDelegateId="@ViewContext.RouteData.Values["supervisorDelegateId"]">@Model.SupervisorDelegateDetail.FirstName @Model.SupervisorDelegateDetail.LastName</a>
</li>
<li class="nhsuk-breadcrumb__item">
<a class="nhsuk-breadcrumb__link trigger-loader" asp-controller="Supervisor" asp-action="ReviewDelegateSelfAssessment" asp-route-supervisorDelegateId="@ViewContext.RouteData.Values["supervisorDelegateId"]" asp-route-candidateAssessmentId="@ViewContext.RouteData.Values["candidateAssessmentId"]">
@(Model.DelegateSelfAssessment.RoleName.Length > 35 ? Model.DelegateSelfAssessment.RoleName.Substring(0,32) + "..." : Model.DelegateSelfAssessment.RoleName )
</a>
</li>
<li>
Verify results
</li>
</ol>
</div>
</nav>
}
<details class="nhsuk-details nhsuk-expander">
<summary class="nhsuk-details__summary">
<h1 class="nhsuk-details__summary-text nhsuk-u-margin-bottom-0">
@Model.SupervisorDelegateDetail.FirstName @Model.SupervisorDelegateDetail.LastName
</h1>
</summary>
<div class="nhsuk-details__text">
<partial name="Shared/_StaffDetails" model="Model.SupervisorDelegateDetail" />
</div>
</details>
<h2>Sign-off Multiple Results for @Model.DelegateSelfAssessment.RoleName</h2>
@if (Model.CompetencyGroups.Any())
{
<h3>Tick each self assessment result that you wish to verify and sign-off and then click Submit</h3>
<form method="post">
@foreach (var competencyGroup in Model.CompetencyGroups)
{
<table role="table" class="nhsuk-table-responsive nhsuk-u-margin-top-4">
<caption class="nhsuk-table__caption"><h3>@competencyGroup.Key</h3></caption>
<thead role="rowgroup" class="nhsuk-table__head">
<tr role="row">
<th role="columnheader" class="" scope="col">
@competencyGroup.First().Vocabulary
</th>
<th role="columnheader" class="" scope="col">
Question
</th>
<th role="columnheader" class="" scope="col">
Response
</th>
</tr>
</thead>
<tbody class="nhsuk-table__body">
@foreach (var competency in competencyGroup)
{
@foreach (var question in competency.AssessmentQuestions)
{
<tr role="row" class="nhsuk-table__row">
<td role="cell" class="nhsuk-table__cell nhsuk-u-font-size-16">
<span class="nhsuk-table-responsive__heading">@competency.Vocabulary </span>
<div class="nhsuk-checkboxes__item">
<input class="nhsuk-checkboxes__input" id="result-check-@question.SelfAssessmentResultSupervisorVerificationId" name="resultChecked" type="checkbox" value="@question.SelfAssessmentResultSupervisorVerificationId">
<label class="nhsuk-label nhsuk-checkboxes__label nhsuk-u-font-size-16" for="result-check-@question.SelfAssessmentResultSupervisorVerificationId">
@competency.Name
</label>
</div>
</td>
<partial name="Shared/_AssessmentQuestionCells" model="question" />

</tr>
}
}
</tbody>
</table>
}
<div class="nhsuk-grid-row nhsuk-u-margin-top-4">
<div class="nhsuk-grid-column-full">
<button class="nhsuk-button" type="submit">Submit</button>
<a class="nhsuk-button nhsuk-button--secondary" asp-controller="Supervisor" asp-action="ReviewDelegateSelfAssessment" asp-route-supervisorDelegateId="@ViewContext.RouteData.Values["supervisorDelegateId"]" asp-route-candidateAssessmentId="@ViewContext.RouteData.Values["candidateAssessmentId"]">Cancel</a>
</div>
</div>
</form>
}
else
{
<p>
Oops. There are no results awaiting sign-off.
</p>
<a class="nhsuk-button nhsuk-button--secondary" asp-controller="Supervisor" asp-action="ReviewDelegateSelfAssessment" asp-route-supervisorDelegateId="@ViewContext.RouteData.Values["supervisorDelegateId"]" asp-route-candidateAssessmentId="@ViewContext.RouteData.Values["candidateAssessmentId"]">Cancel</a>
}