Skip to content

Commit df24eb8

Browse files
TD-5084 Self-assessments Sign off should not be allowed through URL manipulation
1 parent 4b0e1f9 commit df24eb8

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,6 +1558,12 @@ ManageOptionalCompetenciesViewModel model
15581558
public IActionResult RequestSignOff(int selfAssessmentId)
15591559
{
15601560
var delegateUserId = User.GetUserIdKnownNotNull();
1561+
var delegateId = User.GetCandidateIdKnownNotNull();
1562+
var recentResults = selfAssessmentService.GetMostRecentResults(selfAssessmentId, delegateId).ToList();
1563+
var competencySummaries = CertificateHelper.CompetencySummation(recentResults);
1564+
1565+
if (competencySummaries.QuestionsCount != competencySummaries.VerifiedCount) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
1566+
15611567
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId);
15621568
var supervisors =
15631569
selfAssessmentService.GetSignOffSupervisorsForSelfAssessmentId(selfAssessmentId, delegateUserId);
@@ -1568,6 +1574,8 @@ public IActionResult RequestSignOff(int selfAssessmentId)
15681574
Supervisors = supervisors,
15691575
NumberOfSelfAssessedOptionalCompetencies = optionalCompetencies.Count(x => x.IncludedInSelfAssessment)
15701576
};
1577+
if (model.NumberOfSelfAssessedOptionalCompetencies < model.SelfAssessment.MinimumOptionalCompetencies) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
1578+
15711579
return View("SelfAssessments/RequestSignOff", model);
15721580
}
15731581

DigitalLearningSolutions.Web/Helpers/CertificateHelper.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,25 @@ public static CompetencySummary CanViewCertificate(List<Competency> reviewedComp
4646
};
4747
return model;
4848
}
49+
public static CompetencySummary CompetencySummation(List<Competency> reviewedCompetencies)
50+
{
51+
var CompetencyGroups = reviewedCompetencies.GroupBy(competency => competency.CompetencyGroup);
52+
var competencySummaries = CompetencyGroups.Select(g =>
53+
{
54+
var questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required);
55+
var verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required));
56+
return new
57+
{
58+
QuestionsCount = questions.Count(),
59+
VerifiedCount = verifiedCount
60+
};
61+
});
62+
var model = new CompetencySummary()
63+
{
64+
VerifiedCount = competencySummaries.Sum(item => item.VerifiedCount),
65+
QuestionsCount = competencySummaries.Sum(item => item.QuestionsCount),
66+
};
67+
return model;
68+
}
4969
}
5070
}

0 commit comments

Comments
 (0)