Skip to content

Commit 653cc83

Browse files
committed
TD-149-created CanViewCertificate helper method to show/hide certificate. Modified the Sql query to return correct centre name.
1 parent 6e25a66 commit 653cc83

File tree

9 files changed

+76
-58
lines changed

9 files changed

+76
-58
lines changed

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,17 @@ FROM CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
383383
Centres AS ce ON CE.CentreID = ca.CentreID INNER JOIN
384384
DelegateAccounts AS da ON da.UserID = Learner.ID AND da.CentreID = ca.CentreID
385385
WHERE (ca.Id=@candidateAssessmentID) AND (casv.SignedOff = 1) AND (NOT (casv.Verified IS NULL))) LearnerDetails INNER JOIN
386-
(select casv.ID ,Supervisor.FirstName + ' ' + Supervisor.LastName AS SupervisorName,
387-
Supervisor.ProfessionalRegistrationNumber AS SupervisorPRN,
388-
ce.CentreName AS SupervisorCentreName
386+
(select sd.SupervisorAdminID, casv.ID ,u.FirstName + ' ' + u.LastName AS SupervisorName,
387+
u.ProfessionalRegistrationNumber AS SupervisorPRN,
388+
c.CentreName AS SupervisorCentreName,ca.CentreID
389389
from CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
390390
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID INNER JOIN
391391
SupervisorDelegates AS sd ON sd.ID = cas.SupervisorDelegateId INNER JOIN
392-
Users AS Supervisor ON Supervisor.PrimaryEmail = sd.SupervisorEmail INNER JOIN
393-
CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN
394-
Centres AS ce ON ca.CentreID = ce.CentreID
395-
where (ca.ID=@candidateAssessmentID) AND (casv.SignedOff = 1)
392+
AdminAccounts AS aa ON sd.SupervisorAdminID = aa.ID INNER JOIN
393+
Users AS u ON aa.UserID = u.ID INNER JOIN
394+
Centres c ON aa.CentreID = c.CentreID INNER JOIN
395+
CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID
396+
where (ca.ID = @candidateAssessmentID) AND (casv.SignedOff = 1)
396397
AND (NOT (casv.Verified IS NULL))) Supervisor ON LearnerDetails.Id =Supervisor.Id
397398
ORDER BY Verified DESC",
398399
new { candidateAssessmentID }

DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ int delegateUserId
344344
return (resources.ToList(), apiIsAccessible);
345345
}
346346
[Route("/LearningPortal/Current/{candidateAssessmentId:int}/{route:int}/Certificate")]
347+
[NoCaching]
347348
public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessmentId, int route)
348349
{
349350

@@ -360,11 +361,18 @@ public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessment
360361

361362
var delegateUserId = competencymaindata.LearnerId;
362363

364+
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
365+
var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId);
366+
367+
if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs))
368+
{
369+
return NotFound();
370+
}
371+
363372
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
364373
var roleCount = selfAssessmentService.GetRoleCount(candidateAssessmentId);
365374
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
366375
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
367-
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
368376
var competencyIds = recentResults.Select(c => c.Id).ToArray();
369377
var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds);
370378
var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null);

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,8 @@ public IActionResult SelfAssessmentOverview(int selfAssessmentId, string vocabul
478478
{
479479
searchModel.IsSupervisorResultsReviewed = assessment.IsSupervisorResultsReviewed;
480480
}
481+
482+
ViewBag.CanViewCertificate = CertificateHelper.CanViewCertificate(recentResults, model.SupervisorSignOffs);
481483
ViewBag.SupervisorSelfAssessmentReview = assessment.SupervisorSelfAssessmentReview;
482484
return View("SelfAssessments/SelfAssessmentOverview", model);
483485
}
@@ -1536,15 +1538,15 @@ public IActionResult SignOffHistory(int selfAssessmentId, string vocabulary)
15361538
};
15371539
return View("SelfAssessments/SignOffHistory", model);
15381540
}
1539-
public IActionResult ExportCandidateAssessment(int candidateAssessmentId,string candidateAssessmentName, string delegateName)
1541+
public IActionResult ExportCandidateAssessment(int candidateAssessmentId, string candidateAssessmentName, string delegateName)
15401542
{
15411543
var content = candidateAssessmentDownloadFileService.GetCandidateAssessmentDownloadFileForCentre(candidateAssessmentId, User.GetUserIdKnownNotNull(), true);
15421544
var fileName = $"{((candidateAssessmentName.Length > 30) ? candidateAssessmentName.Substring(0, 30) : candidateAssessmentName)} - {delegateName} - {clockUtility.UtcNow:yyyy-MM-dd}.xlsx";
1543-
return File(
1544-
content,
1545-
FileHelper.GetContentTypeFromFileName(fileName),
1546-
fileName
1547-
);
1545+
return File(
1546+
content,
1547+
FileHelper.GetContentTypeFromFileName(fileName),
1548+
fileName
1549+
);
15481550
}
15491551

15501552
public IActionResult RemoveEnrolment(int selfAssessmentId)

DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ public IActionResult ReviewDelegateSelfAssessment(int supervisorDelegateId, int
365365
);
366366
}
367367

368+
ViewBag.CanViewCertificate = CertificateHelper.CanViewCertificate(reviewedCompetencies, model.SupervisorSignOffs);
368369
ViewBag.SupervisorSelfAssessmentReview = delegateSelfAssessment.SupervisorSelfAssessmentReview;
369370
ViewBag.navigatedFrom = selfAssessmentResultId == null;
370371
TempData["CertificateSupervisorDelegateId"] = supervisorDelegateId;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using DigitalLearningSolutions.Data.Enums;
5+
using DigitalLearningSolutions.Data.Models.SelfAssessments;
6+
using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
7+
using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments;
8+
9+
namespace DigitalLearningSolutions.Web.Helpers
10+
{
11+
public class CertificateHelper
12+
{
13+
public static bool CanViewCertificate(List<Competency> reviewedCompetencies, IEnumerable<SupervisorSignOff>? SupervisorSignOffs)
14+
{
15+
16+
var CompetencyGroups = reviewedCompetencies.GroupBy(competency => competency.CompetencyGroup);
17+
18+
var competencySummaries = CompetencyGroups.Select(g =>
19+
{
20+
var questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required);
21+
var verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required));
22+
return new
23+
{
24+
QuestionsCount = questions.Count(),
25+
VerifiedCount = verifiedCount
26+
};
27+
});
28+
29+
var latestSignoff = SupervisorSignOffs
30+
.Select(s => s.Verified)
31+
.DefaultIfEmpty(DateTime.MinValue)
32+
.Max();
33+
var latestResult = CompetencyGroups
34+
.SelectMany(g => g.SelectMany(c => c.AssessmentQuestions))
35+
.Select(q => q.ResultDateTime)
36+
.DefaultIfEmpty(DateTime.MinValue)
37+
.Max();
38+
39+
var allComptConfirmed = competencySummaries.Count() == 0 ? false : competencySummaries.Sum(c => c.VerifiedCount) == competencySummaries.Sum(c => c.QuestionsCount);
40+
41+
return SupervisorSignOffs?.FirstOrDefault()?.Verified != null &&
42+
SupervisorSignOffs.FirstOrDefault().SignedOff &&
43+
allComptConfirmed && latestResult <= latestSignoff;
44+
}
45+
}
46+
}

DigitalLearningSolutions.Web/Views/LearningPortal/Current/CompetencySelfAssessmentCertificate.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125
</div>
126126
</h1>
127127
<p>
128-
Signed off at @Model.CompetencySelfAssessmentCertificates.CentreName <span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">by @Model.CompetencySelfAssessmentCertificates.SupervisorName </span><span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">@Model.CompetencySelfAssessmentCertificates.SupervisorPRN</span>
128+
Signed off at @Model.CompetencySelfAssessmentCertificates.SupervisorCentreName <span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">by @Model.CompetencySelfAssessmentCertificates.SupervisorName </span><span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">@Model.CompetencySelfAssessmentCertificates.SupervisorPRN</span>
129129
</p>
130130

131131
<p>

DigitalLearningSolutions.Web/Views/LearningPortal/Current/DownloadCompetencySelfAssessmentCertificate.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@
434434
</div>
435435
</h1>
436436
<p>
437-
Signed off at @Model.CompetencySelfAssessmentCertificates.CentreName <span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">by @Model.CompetencySelfAssessmentCertificates.SupervisorName </span><span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">@Model.CompetencySelfAssessmentCertificates.SupervisorPRN</span>
437+
Signed off at @Model.CompetencySelfAssessmentCertificates.SupervisorCentreName <span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">by @Model.CompetencySelfAssessmentCertificates.SupervisorName </span><span class="nhsuk-body-m nhsuk-u-font-weight-normal nhsuk-u-margin-bottom-0">@Model.CompetencySelfAssessmentCertificates.SupervisorPRN</span>
438438
</p>
439439

440440
<p>

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

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,6 @@
11
@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments
22
@using DigitalLearningSolutions.Web.Helpers
33
@model SelfAssessmentOverviewViewModel
4-
@{
5-
var latestSignoff = Model.SupervisorSignOffs
6-
.Select(s => s.Verified)
7-
.DefaultIfEmpty(DateTime.MinValue)
8-
.Max();
9-
var latestResult = Model.CompetencyGroups
10-
.SelectMany(g => g.SelectMany(c => c.AssessmentQuestions))
11-
.Select(q => q.ResultDateTime)
12-
.DefaultIfEmpty(DateTime.MinValue)
13-
.Max();
14-
15-
var competencySummaries = from g in Model.CompetencyGroups
16-
let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required)
17-
let selfAssessedCount = questions.Count(q => q.Result.HasValue)
18-
let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required))
19-
select new ViewDataDictionary(ViewData)
20-
{
21-
22-
{ "questionsCount", questions.Count() },
23-
{ "selfAssessedCount", selfAssessedCount },
24-
{ "verifiedCount", verifiedCount }
25-
};
26-
var allComptConfirmed = competencySummaries.Sum(c => (int)c["verifiedCount"]) == competencySummaries.Sum(c => (int)c["questionsCount"]);
27-
}
284

295
@if (Model.NumberOfOptionalCompetencies > 0)
306
{
@@ -55,8 +31,7 @@
5531
Export to Excel
5632
</a>
5733
</feature>
58-
@if (Model?.SupervisorSignOffs?.FirstOrDefault()?.Verified != null &&
59-
Model.SupervisorSignOffs.FirstOrDefault().SignedOff && allComptConfirmed && latestResult <= latestSignoff)
34+
@if (ViewBag.CanViewCertificate)
6035
{
6136
<a class="nhsuk-button "
6237
asp-route-candidateAssessmentId="@Model.SelfAssessment.CandidateAssessmentId"

DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@
55
ViewData["Application"] = "Supervisor";
66
ViewData["HeaderPathName"] = "Supervisor";
77

8-
var latestSignoff = Model.SupervisorSignOffs
9-
.Select(s => s.Verified)
10-
.DefaultIfEmpty(DateTime.MinValue)
11-
.Max();
12-
var latestResult = Model.CompetencyGroups
13-
.SelectMany(g => g.SelectMany(c => c.AssessmentQuestions))
14-
.Select(q => q.ResultDateTime)
15-
.DefaultIfEmpty(DateTime.MinValue)
16-
.Max();
17-
188
var competencySummaries = from g in Model.CompetencyGroups
199
let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required)
2010
let selfAssessedCount = questions.Count(q => q.Result.HasValue)
@@ -26,7 +16,6 @@
2616
{ "selfAssessedCount", selfAssessedCount },
2717
{ "verifiedCount", verifiedCount }
2818
};
29-
var allComptConfirmed = competencySummaries.Sum(c => (int)c["verifiedCount"]) == competencySummaries.Sum(c => (int)c["questionsCount"]);
3019
}
3120
<link rel="stylesheet" href="@Url.Content("~/css/frameworks/frameworksShared.css")" asp-append-version="true">
3221
<link rel="stylesheet" href="@Url.Content("~/css/shared/searchableElements/searchableElements.css")" asp-append-version="true">
@@ -107,12 +96,8 @@
10796
</a>
10897
}
10998

110-
@if (Model?.SupervisorSignOffs?.FirstOrDefault()?.Verified != null &&
111-
Model.SupervisorSignOffs.FirstOrDefault().SignedOff &&
112-
Model?.DelegateSelfAssessment?.ResultsVerificationRequests == 0 && allComptConfirmed && latestResult <= latestSignoff
113-
)
99+
@if (ViewBag.CanViewCertificate)
114100
{
115-
116101
<a class="nhsuk-button"
117102
asp-controller="LearningPortal"
118103
asp-route-candidateAssessmentId="@Model.CandidateAssessmentId"

0 commit comments

Comments
 (0)