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 @@ -269,19 +269,19 @@ FROM Sessions AS S1 WITH (NOLOCK)
{
try
{
return connection.QueryFirst<int>(
@"SELECT ProgressId
FROM Progress
return connection.QueryFirst<int?>(
@"SELECT COALESCE((SELECT ProgressID
FROM Progress
WHERE CandidateID = @candidateId
AND CustomisationID = @customisationId
AND SystemRefreshed = 0
AND RemovedDate IS NULL",
AND RemovedDate IS NULL), NULL) AS ProgressId",
new { candidateId, customisationId }
);
}
catch (InvalidOperationException)
{
return null;
return 0;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -348,8 +348,10 @@ public CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificat
LearnerDetails.SelfAssessmentID,
LearnerDetails.Vocabulary,
LearnerDetails.SupervisorDelegateId,
LearnerDetails.FormattedDate
LearnerDetails.FormattedDate,
LearnerDetails.NonReportable
FROM(SELECT casv.ID,
ca.NonReportable,
sa.Name AS SelfAssessment,
Learner.FirstName + ' ' + Learner.LastName AS LearnerName,
Learner.ProfessionalRegistrationNumber AS LearnerPRN,
Expand Down Expand Up @@ -430,7 +432,7 @@ LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr
INNER JOIN Users AS u ON U.PrimaryEmail = au.Email
WHERE
(sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @DelegateUserID) AND (ca.SelfAssessmentID = @selfAssessmentId)) Accessor
ORDER BY AccessorPRN DESC",
ORDER BY AccessorName, AccessorPRN DESC",
new { selfAssessmentId, delegateUserID }
);
}
Expand Down Expand Up @@ -478,21 +480,5 @@ CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
new { CandidateAssessmentSupervisorVerificationsId }
);
}
public int? GetRoleCount(int CandidateId)
{
return connection.QueryFirstOrDefault<int?>(
@"SELECT COUNT(sas1.CompetencyID) AS RoleCount FROM
SelfAssessmentResults AS sar1
LEFT OUTER JOIN
CompetencyAssessmentQuestionRoleRequirements AS caqrr1 ON sar1.Result = caqrr1.LevelValue AND sar1.CompetencyID = caqrr1.CompetencyID AND sar1.SelfAssessmentID = caqrr1.SelfAssessmentID AND
sar1.AssessmentQuestionID = caqrr1.AssessmentQuestionID RIGHT OUTER JOIN
SelfAssessmentStructure AS sas1 INNER JOIN
CandidateAssessments AS ca1 ON sas1.SelfAssessmentID = ca1.SelfAssessmentID INNER JOIN
CompetencyAssessmentQuestions AS caq1 ON sas1.CompetencyID = caq1.CompetencyID ON sar1.SelfAssessmentID =sas1.SelfAssessmentID and sar1.CompetencyID=sas1.CompetencyID AND sar1.AssessmentQuestionID = caq1.AssessmentQuestionID AND sar1.DelegateUserID = ca1.DelegateUserID LEFT OUTER JOIN
CandidateAssessmentOptionalCompetencies AS caoc1 ON sas1.CompetencyID = caoc1.CompetencyID AND sas1.CompetencyGroupID = caoc1.CompetencyGroupID AND ca1.ID = caoc1.CandidateAssessmentID
WHERE (ca1.ID = @CandidateId ) AND (CAOC1.IncludedInSelfAssessment = 1)",
new { CandidateId }
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string so
CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
IEnumerable<Accessor> GetAccessor(int selfAssessmentId, int delegateUserID);
ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
int? GetRoleCount(int CandidateId);
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ int delegateUserId
{
return connection.Query<SelfAssessmentSupervisor>(
@$"{SelectSelfAssessmentSupervisorQuery}
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)",
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)
ORDER BY SupervisorName",
new { selfAssessmentId, delegateUserId }
);
}
Expand All @@ -91,7 +92,8 @@ int delegateUserId
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.DelegateUserID = @delegateUserId)
AND (ca.SelfAssessmentID = @selfAssessmentId) AND (sd.SupervisorAdminID IS NOT NULL)
AND (coalesce(sasr.ResultsReview, 1) = 1)
AND au.Active = 1",
AND au.Active = 1
ORDER BY SupervisorName",
new { selfAssessmentId, delegateUserId }
);
}
Expand Down Expand Up @@ -119,7 +121,8 @@ FROM SupervisorDelegates AS sd
INNER JOIN DelegateAccounts da ON sd.DelegateUserID = da.UserID and au.CentreID = da.CentreID and da.Active=1
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.SupervisorAdminID IS NOT NULL) AND (sd.DelegateUserID = @delegateUserId)
AND (au.Supervisor = 1 OR au.NominatedSupervisor = 1) AND (au.Active = 1)
AND (ca.SelfAssessmentID <> @selfAssessmentId)",
AND (ca.SelfAssessmentID <> @selfAssessmentId)
ORDER BY SupervisorName",
new { selfAssessmentId, delegateUserId }
);
}
Expand All @@ -144,7 +147,8 @@ int delegateUserId
@$"{SelectSelfAssessmentSupervisorQuery}
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)
AND (sd.SupervisorAdminID IS NOT NULL) AND (coalesce(sasr.SelfAssessmentReview, 1) = 1)
AND (cas.ID NOT IN (SELECT CandidateAssessmentSupervisorID FROM CandidateAssessmentSupervisorVerifications WHERE Verified IS NULL))",
AND (cas.ID NOT IN (SELECT CandidateAssessmentSupervisorID FROM CandidateAssessmentSupervisorVerifications WHERE Verified IS NULL))
ORDER BY SupervisorName",
new { selfAssessmentId, delegateUserId }
);
}
Expand Down Expand Up @@ -251,7 +255,8 @@ INNER JOIN CandidateAssessments AS ca
AND (cas.Removed IS NULL)
AND (sd.Removed IS NULL)
)
AND (Supervisor = 1 OR NominatedSupervisor = 1) AND (Active = 1) AND (Email LIKE '%@%')",
AND (Supervisor = 1 OR NominatedSupervisor = 1) AND (Active = 1) AND (Email LIKE '%@%')
ORDER BY Forename, Surname",
new { centreId, selfAssessmentId, delegateUserId }
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@ public class CompetencySelfAssessmentCertificate
public string? Vocabulary { get; set; }
public int SupervisorDelegateId { get; set; }
public string FormattedDate { get; set; } = string.Empty;
public bool NonReportable { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -241,49 +241,50 @@ public void Index_unable_to_enrol_should_not_StartOrUpdate_course_sessions()
// Then
A.CallTo(() => sessionService.StartOrUpdateDelegateSession(A<int>._, A<int>._, A<ISession>._)).MustNotHaveHappened();
}

[Test]
public void Index_detects_id_manipulation_no_progress_id()
{
// Given
var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
.Returns(expectedCourseContent);
A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);

// When
var result = controller.Index(CustomisationId);

// Then
result.Should()
.BeRedirectToActionResult()
.WithControllerName("LearningSolutions")
.WithActionName("StatusCode")
.WithRouteValue("code", 404);
}

[Test]
public void Index_detects_id_manipulation_self_register_false()
{
// Given
var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
.Returns(expectedCourseContent);
A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
A.CallTo(() => courseDataService.GetSelfRegister(CustomisationId)).Returns(false);

// When
var result = controller.Index(CustomisationId);

// Then
result.Should()
.BeRedirectToActionResult()
.WithControllerName("LearningSolutions")
.WithActionName("StatusCode")
.WithRouteValue("code", 404);
}
//Deprecated in response to TD-3838 - a bug caused by this id manipulation detection functionality

//[Test]
//public void Index_detects_id_manipulation_no_progress_id()
//{
// // Given
// var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
// A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
// .Returns(expectedCourseContent);
// A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
// A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);

// // When
// var result = controller.Index(CustomisationId);

// // Then
// result.Should()
// .BeRedirectToActionResult()
// .WithControllerName("LearningSolutions")
// .WithActionName("StatusCode")
// .WithRouteValue("code", 404);
//}

//[Test]
//public void Index_detects_id_manipulation_self_register_false()
//{
// // Given
// var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
// A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
// .Returns(expectedCourseContent);
// A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
// A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
// A.CallTo(() => courseDataService.GetSelfRegister(CustomisationId)).Returns(false);

// // When
// var result = controller.Index(CustomisationId);

// // Then
// result.Should()
// .BeRedirectToActionResult()
// .WithControllerName("LearningSolutions")
// .WithActionName("StatusCode")
// .WithRouteValue("code", 404);
//}

[Test]
public void Index_not_detects_id_manipulation_self_register_true()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,11 @@ public IActionResult Index(int customisationId)
var sectionId = courseContent.Sections.First().Id;
return RedirectToAction("Section", "LearningMenu", new { customisationId, sectionId });
}
if (UniqueIdManipulationDetected(candidateId, customisationId))
{
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
}
// Unique Id Manipulation Detection is being disabled as part of work on TD-3838 - a bug created by its introduction
//if (UniqueIdManipulationDetected(candidateId, customisationId))
//{
// return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
//}
var progressId = courseContentService.GetOrCreateProgressId(candidateId, customisationId, centreId);
if (progressId == null)
{
Expand All @@ -97,6 +98,7 @@ public IActionResult Index(int customisationId)
$"Candidate id: {candidateId}, customisation id: {customisationId}, centre id: {centreId}");
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
}

if (sessionService.StartOrUpdateDelegateSession(candidateId, customisationId, HttpContext.Session) > 0)
{
courseContentService.UpdateProgress(progressId.Value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,6 @@ public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessment
}

var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
var roleCount = selfAssessmentService.GetRoleCount(candidateAssessmentId);
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
var competencyIds = recentResults.Select(c => c.Id).ToArray();
Expand Down Expand Up @@ -413,7 +412,7 @@ public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessment

ViewBag.CompetencySummaries = competencySummaries;
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment, roleCount);
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment);
ViewBag.LoggedInSupervisorDelegatesId = supervisorDelegateId;
return View("Current/CompetencySelfAssessmentCertificate", model);
}
Expand All @@ -435,7 +434,6 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
var delegateUserId = competencymaindata.LearnerId;

var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
var roleCount = selfAssessmentService.GetRoleCount(candidateAssessmentId);
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
Expand Down Expand Up @@ -474,7 +472,7 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
};

ViewBag.CompetencySummaries = competencySummaries;
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment, roleCount);
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment);
var renderedViewHTML = RenderRazorViewToString(this, "Current/DownloadCompetencySelfAssessmentCertificate", model);

var pdfReportResponse = await pdfService.PdfReport(candidateAssessmentId.ToString(), renderedViewHTML, delegateId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ public IActionResult StartAddNewSupervisor(int selfAssessmentId)
User.GetCentreIdKnownNotNull(),
selfAssessmentId,
User.GetUserIdKnownNotNull()
).Select(c => new { c.CentreID, c.CentreName }).Distinct().ToList();
).Select(c => new { c.CentreID, c.CentreName }).Distinct().OrderBy(o => o.CentreName).ToList();

if (distinctSupervisorCentres.Count() > 1)
{
Expand Down Expand Up @@ -672,7 +672,7 @@ public IActionResult AddNewSupervisor(int selfAssessmentId,
User.GetCentreIdKnownNotNull(),
selfAssessmentId,
User.GetUserIdKnownNotNull()
).OrderBy(s => s.Forename).ToList();
).ToList();

if (sessionAddSupervisor?.CentreID != null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ public int GetSelfAssessmentActivityDelegatesExportCount(string searchString, st
CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
IEnumerable<Accessor> GetAccessor(int selfAssessmentId, int delegateUserID);
ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
int? GetRoleCount(int CandidateId);
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
}

Expand Down Expand Up @@ -537,11 +536,6 @@ public ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAs
{
return selfAssessmentDataService.GetActivitySummaryCompetencySelfAssesment(CandidateAssessmentSupervisorVerificationsId);

}
public int? GetRoleCount(int CandidateId)
{
return selfAssessmentDataService.GetRoleCount(CandidateId);

}
public bool IsUnsupervisedSelfAssessment(int selfAssessmentId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ public CompetencySelfAssessmentCertificateViewModel()
public CompetencySelfAssessmentCertificateViewModel(CompetencySelfAssessmentCertificate competency,
IEnumerable<CompetencyCountSelfAssessmentCertificate> competencies,
int route, IEnumerable<Accessor> accessors,
ActivitySummaryCompetencySelfAssesment activitySummaryCompetencySelfAssesment,
int? roleCount
ActivitySummaryCompetencySelfAssesment activitySummaryCompetencySelfAssesment
)
{
Route = route;
Expand All @@ -24,11 +23,9 @@ public CompetencySelfAssessmentCertificateViewModel(CompetencySelfAssessmentCert
VocabPlural = FrameworkVocabularyHelper.VocabularyPlural(competency.Vocabulary);
Accessors = accessors;
ActivitySummaryCompetencySelfAssesment = activitySummaryCompetencySelfAssesment;
RoleCount = roleCount;
}

public int Route { get; set; }
public int? RoleCount { get; set; }
public string? VocabPlural { get; set; }
public ActivitySummaryCompetencySelfAssesment ActivitySummaryCompetencySelfAssesment { get; set; }
public CompetencySelfAssessmentCertificate CompetencySelfAssessmentCertificates { get; set; }
Expand Down
Loading