Skip to content

Commit 3b5f388

Browse files
authored
Merge pull request #3400 from TechnologyEnhancedLearning/Develop/Fix/TD-6313-Platform-doesn't-over-ride-final-sign-off
TD-6313-Sql queries have been modified to return sign-off value based on on the current status of the self-assessment.
2 parents ca0b53d + 7a6af41 commit 3b5f388

File tree

6 files changed

+63
-26
lines changed

6 files changed

+63
-26
lines changed

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,12 @@ FROM SelfAssessments
296296
COALESCE(ucd.Email, u.PrimaryEmail) AS DelegateEmail,
297297
da.Active AS IsDelegateActive,
298298
sa.Name AS [Name],
299-
MAX(casv.Verified) as SignedOff,
299+
CASE
300+
WHEN MAX(sar.[DateTime]) >= MAX(casv.Verified) THEN NULL
301+
ELSE (
302+
MAX(casv.Verified)
303+
)
304+
END AS SignedOff,
300305
sa.SupervisorSelfAssessmentReview,
301306
sa.SupervisorResultsReview";
302307

@@ -311,6 +316,8 @@ LEFT OUTER JOIN Users AS uEnrolledBy WITH (NOLOCK) ON uEnrolledBy.ID = aaEnrolle
311316
LEFT JOIN dbo.CandidateAssessmentSupervisors AS cas WITH (NOLOCK) ON ca.ID = cas.CandidateAssessmentID
312317
LEFT JOIN dbo.CandidateAssessmentSupervisorVerifications AS casv WITH (NOLOCK) ON cas.ID = casv.CandidateAssessmentSupervisorID AND
313318
(casv.Verified IS NOT NULL AND casv.SignedOff = 1)
319+
LEFT JOIN SelfAssessmentResults AS sar ON ca.SelfAssessmentID = sar.SelfAssessmentID AND
320+
ca.DelegateUserID = sar.DelegateUserID
314321
315322
WHERE sa.ID = @selfAssessmentId
316323
AND da.CentreID = @centreID AND csa.CentreID = @centreID
@@ -349,7 +356,8 @@ LEFT JOIN dbo.CandidateAssessmentSupervisorVerifications AS casv WITH (NOLOCK) O
349356

350357
if (signedOff != null)
351358
{
352-
groupBy += (bool)signedOff ? " HAVING MAX(casv.Verified) IS NOT NULL " : " HAVING MAX(casv.Verified) IS NULL ";
359+
groupBy += (bool)signedOff ? " HAVING MAX(sar.[DateTime]) < MAX(casv.Verified) AND MAX(casv.Verified) IS NOT NULL " :
360+
" HAVING MAX(sar.[DateTime]) >= MAX(casv.Verified) OR MAX(casv.Verified) IS NULL ";
353361
}
354362

355363
string orderBy;

DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,33 @@ INNER JOIN AdminAccounts AS aa
106106
";
107107

108108
private const string delegateSelfAssessmentFields = "ca.ID, sa.ID AS SelfAssessmentID, sa.Name AS RoleName, sa.SupervisorSelfAssessmentReview, sa.SupervisorResultsReview, COALESCE (sasr.RoleName, 'Supervisor') AS SupervisorRoleTitle, ca.StartedDate";
109-
private const string signedOffFields = @"(SELECT TOP (1) casv.Verified
110-
FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
111-
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID
112-
WHERE(cas.CandidateAssessmentID = ca.ID) AND(casv.Requested IS NOT NULL) AND(casv.Verified IS NOT NULL)
113-
ORDER BY casv.Requested DESC) AS SignedOffDate,
114-
(SELECT TOP(1) casv.SignedOff
115-
FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
116-
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID
117-
WHERE(cas.CandidateAssessmentID = ca.ID) AND(casv.Requested IS NOT NULL) AND(casv.Verified IS NOT NULL)
118-
ORDER BY casv.Requested DESC) AS SignedOff,";
109+
private const string signedOffFields = @"(SELECT CASE
110+
WHEN MAX(sar.[DateTime]) >= MAX(casv.Verified) THEN NULL
111+
ELSE MAX(casv.Verified)
112+
END AS Verified
113+
FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
114+
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID INNER JOIN
115+
CandidateAssessments AS ca1 ON cas.CandidateAssessmentID = ca1.ID LEFT JOIN
116+
SelfAssessmentResults AS sar ON ca1.SelfAssessmentID = sar.SelfAssessmentID AND ca1.DelegateUserID = sar.DelegateUserID
117+
WHERE(cas.CandidateAssessmentID = ca.ID) AND(casv.Requested IS NOT NULL) AND(casv.Verified IS NOT NULL)
118+
GROUP BY ca1.ID ) AS SignedOffDate,
119+
120+
(SELECT CASE
121+
WHEN MAX(sar.[DateTime]) >= MAX(casv.Verified) THEN NULL
122+
ELSE (
123+
SELECT TOP(1) casv.SignedOff
124+
FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
125+
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID
126+
WHERE(cas.CandidateAssessmentID = ca.ID) AND(casv.Requested IS NOT NULL) AND(casv.Verified IS NOT NULL)
127+
ORDER BY casv.Verified DESC
128+
)
129+
END AS SignedOff
130+
FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
131+
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID INNER JOIN
132+
CandidateAssessments AS ca1 ON cas.CandidateAssessmentID = ca1.ID LEFT JOIN
133+
SelfAssessmentResults AS sar ON ca1.SelfAssessmentID = sar.SelfAssessmentID AND ca1.DelegateUserID = sar.DelegateUserID
134+
WHERE(cas.CandidateAssessmentID = ca.ID) AND(casv.Requested IS NOT NULL) AND(casv.Verified IS NOT NULL)
135+
GROUP BY ca1.ID) AS SignedOff,";
119136

120137
public SupervisorDataService(IDbConnection connection, ILogger<SupervisorDataService> logger)
121138
{
@@ -583,7 +600,7 @@ public bool RemoveSupervisorDelegateById(int supervisorDelegateId, int delegateU
583600
public IEnumerable<DelegateSelfAssessment> GetSelfAssessmentsForSupervisorDelegateId(int supervisorDelegateId, int? adminIdCategoryId)
584601
{
585602
return connection.Query<DelegateSelfAssessment>(
586-
@$"SELECT {delegateSelfAssessmentFields}, COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, r.CompetencyAssessment, sg.SubGroup, pg.ProfessionalGroup,CONVERT(BIT, IIF(cas.CandidateAssessmentID IS NULL, 0, 1)) AS IsAssignedToSupervisor,ca.DelegateUserID,
603+
@$"SELECT {delegateSelfAssessmentFields}, COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, r.RoleProfile, sg.SubGroup, pg.ProfessionalGroup,CONVERT(BIT, IIF(cas.CandidateAssessmentID IS NULL, 0, 1)) AS IsAssignedToSupervisor,ca.DelegateUserID,
587604
(SELECT COUNT(*) AS Expr1
588605
FROM CandidateAssessmentSupervisorVerifications AS casv
589606
WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested,
@@ -785,7 +802,7 @@ FROM NRPProfessionalGroups
785802
(SELECT SubGroup
786803
FROM NRPSubGroups
787804
WHERE (ID = rp.NRPSubGroupID)) AS NRPSubGroup,
788-
(SELECT CompetencyAssessment
805+
(SELECT RoleProfile
789806
FROM NRPRoles
790807
WHERE (ID = rp.NRPRoleID)) AS NRPRole, 0 AS SelfAssessmentReviewID
791808
FROM SelfAssessments AS rp INNER JOIN
@@ -816,7 +833,7 @@ FROM NRPProfessionalGroups
816833
(SELECT SubGroup
817834
FROM NRPSubGroups
818835
WHERE (ID = rp.NRPSubGroupID)) AS NRPSubGroup,
819-
(SELECT CompetencyAssessment
836+
(SELECT RoleProfile
820837
FROM NRPRoles
821838
WHERE (ID = rp.NRPRoleID)) AS NRPRole, 0 AS SelfAssessmentReviewID
822839
FROM SelfAssessments AS rp
@@ -1147,7 +1164,7 @@ FROM CandidateAssessmentSupervisors
11471164
{
11481165
return connection.Query<SelfAssessmentResultSummary>(
11491166
@"SELECT ca.ID, ca.SelfAssessmentID, sa.Name AS RoleName, sa.ReviewerCommentsLabel, COALESCE (sasr.SelfAssessmentReview, 1) AS SelfAssessmentReview, COALESCE (sasr.ResultsReview, 1) AS SupervisorResultsReview, COALESCE (sasr.RoleName, 'Supervisor') AS SupervisorRoleTitle, ca.StartedDate,
1150-
ca.LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, npg.ProfessionalGroup, nsg.SubGroup, nr.CompetencyAssessment, casv.ID AS CandidateAssessmentSupervisorVerificationId,
1167+
ca.LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, npg.ProfessionalGroup, nsg.SubGroup, nr.RoleProfile, casv.ID AS CandidateAssessmentSupervisorVerificationId,
11511168
(SELECT COUNT(sas1.CompetencyID) AS CompetencyAssessmentQuestionCount
11521169
FROM SelfAssessmentStructure AS sas1 INNER JOIN
11531170
CandidateAssessments AS ca1 ON sas1.SelfAssessmentID = ca1.SelfAssessmentID INNER JOIN

DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ public IActionResult Index(
244244
saDelegate.LastAccessed = DateHelper.GetLocalDateTime(saDelegate.LastAccessed);
245245
saDelegate.SubmittedDate = DateHelper.GetLocalDateTime(saDelegate.SubmittedDate);
246246
saDelegate.RemovedDate = DateHelper.GetLocalDateTime(saDelegate.RemovedDate);
247+
saDelegate.SignedOff = saDelegate.SignedOff is null ? null : DateHelper.GetLocalDateTime(saDelegate.SignedOff.Value);
247248
}
248249
}
249250

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@
178178
view-data="@(new ViewDataDictionary(ViewData) { { "IsSupervisorResultsReviewed", Model.SelfAssessment.IsSupervisorResultsReviewed } })" />
179179
<h2>@Model.SelfAssessment.SignOffRoleName Sign-off</h2>
180180
<partial name="../../Supervisor/Shared/_SupervisorSignOffSummary.cshtml" model="Model.SupervisorSignOffs"
181-
view-data="@(new ViewDataDictionary(ViewData) { { "IsAllCompetencyConfirmed", competencySummaries.Sum(c => (int)c["questionsCount"]) == competencySummaries.Sum(c => (int)c["verifiedCount"]) }})" />
181+
view-data="@(new ViewDataDictionary(ViewData) { { "IsAllCompetencyConfirmed", competencySummaries.Sum(c => (int)c["questionsCount"]) == competencySummaries.Sum(c => (int)c["verifiedCount"]) },
182+
{ "IsOngoingSelfAssessment", latestResult > latestSignoff }})" />
182183
@if (Model.AllQuestionsVerifiedOrNotRequired)
183184
{
184185
@if (!Model.SupervisorSignOffs.Any())

DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,10 @@
177177
@if (!string.IsNullOrWhiteSpace(competency.Description) && !competency.AlwaysShowDescription)
178178
{
179179
<details class="nhsuk-details">
180-
<summary class="nhsuk-details__summary">
181-
<span class="nhsuk-details__summary-text">
182-
@competency.Name
183-
</span>
180+
<summary class="nhsuk-details__summary">
181+
<span class="nhsuk-details__summary-text">
182+
@competency.Name
183+
</span>
184184
</summary>
185185
<div class="nhsuk-details__text">
186186
@(Html.Raw(@competency.Description))
@@ -225,7 +225,8 @@
225225
{
226226
<div class="nhsuk-u-margin-top-4">
227227
<h3>Self Assessment Sign-off Status</h3>
228-
<partial name="Shared/_SupervisorSignOffSummary" model="@Model.SupervisorSignOffs" view-data="@(new ViewDataDictionary(ViewData) { { "IsAllCompetencyConfirmed", true }})" />
228+
<partial name="Shared/_SupervisorSignOffSummary" model="@Model.SupervisorSignOffs" view-data="@(new ViewDataDictionary(ViewData) { { "IsAllCompetencyConfirmed", true },
229+
{ "IsOngoingSelfAssessment", !Model.DelegateSelfAssessment.SignedOff }})" />
229230
</div>
230231
}
231232
@if (Model.CompetencyGroups.Any())

DigitalLearningSolutions.Web/Views/Supervisor/Shared/_SupervisorSignOffSummary.cshtml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
@if (Model.Any())
77
{
8+
var notValidated = Model.FirstOrDefault().Verified != null && Model.FirstOrDefault().SignedOff && (bool)ViewData["IsOngoingSelfAssessment"];
89
<dl class="nhsuk-summary-list">
910
<div class="nhsuk-summary-list__row">
1011
<dt class="nhsuk-summary-list__key">
1112
@Model.FirstOrDefault().SupervisorRoleName
1213
</dt>
1314
<dd class="nhsuk-summary-list__value">
14-
@Model.FirstOrDefault().SupervisorName (@Model.FirstOrDefault().SupervisorEmail)
15+
@(notValidated ? "" : $"{Model.FirstOrDefault().SupervisorName} ({Model.FirstOrDefault().SupervisorEmail})")
1516
@if (Model.FirstOrDefault().Removed != null)
1617
{
1718
<span class="nhsuk-tag nhsuk-tag--red">Removed @Model.FirstOrDefault().Removed.Value.ToShortDateString()</span>
@@ -34,6 +35,10 @@
3435
{
3536
<span class="nhsuk-tag">Requested @Model.FirstOrDefault().Requested.Value.ToShortDateString()</span>
3637
}
38+
else if (notValidated)
39+
{
40+
<span class="nhsuk-tag nhsuk-tag--red">Not validated</span>
41+
}
3742
else if (Model.FirstOrDefault().SignedOff && Model.FirstOrDefault().Verified != null)
3843
{
3944
<span class="nhsuk-tag nhsuk-tag--green">Signed off @Model.FirstOrDefault().Verified.Value.ToShortDateString()</span>
@@ -44,7 +49,7 @@
4449
}
4550
</dd>
4651
<dd class="nhsuk-summary-list__actions">
47-
@if (Model.FirstOrDefault().Verified == null && Model.FirstOrDefault().Removed == null)
52+
@if (!notValidated && Model.FirstOrDefault().Verified == null && Model.FirstOrDefault().Removed == null)
4853
{
4954
@if (Model.FirstOrDefault().EmailSent == null || Model.FirstOrDefault().EmailSent.Value.ToShortDateString() != ClockUtility.UtcNow.ToShortDateString())
5055
{
@@ -54,7 +59,8 @@
5459
}
5560
}
5661

57-
@if (Context.Request.Path.Value!.Contains("SelfAssessment")) {
62+
@if (Context.Request.Path.Value!.Contains("SelfAssessment"))
63+
{
5864
<a asp-action="WithdrawSupervisorSignOffRequest" asp-route-selfAssessmentId=@ViewContext.RouteData.Values["selfAssessmentId"]
5965
asp-route-candidateAssessmentSupervisorVerificationId="@Model.FirstOrDefault().ID" asp-route-vocabulary="Proficiencies" asp-route-source="SupervisorSignOffSummary">Withdraw</a>
6066
}
@@ -66,7 +72,10 @@
6672
Comments
6773
</dt>
6874
<dd class="nhsuk-summary-list__value">
69-
@Model.FirstOrDefault().Comments
75+
@if (!notValidated)
76+
{
77+
@Model.FirstOrDefault().Comments
78+
}
7079
</dd>
7180
@if ((Model.Count() - 1) > 0)
7281
{

0 commit comments

Comments
 (0)