Skip to content

Commit bc83b0d

Browse files
committed
Merge branch 'DLS-Release-v1.1.1' into Develop/Features/TD-5153-BulkUploadCompetenciesPage
2 parents 860066a + 28f843b commit bc83b0d

File tree

9 files changed

+153
-30
lines changed

9 files changed

+153
-30
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
namespace DigitalLearningSolutions.Data.Migrations
2+
{
3+
using FluentMigrator;
4+
5+
[Migration(202412020900)]
6+
public class UpdateCandidateAssessmentSupervisorsTable : ForwardOnlyMigration
7+
{
8+
public override void Up()
9+
{
10+
Execute.Sql($@"UPDATE cas
11+
SET SelfAssessmentSupervisorRoleID = (SELECT ID FROM SelfAssessmentSupervisorRoles
12+
WHERE SelfAssessmentID = ssr.SelfAssessmentID and AllowDelegateNomination = 1)
13+
FROM CandidateAssessmentSupervisors cas INNER JOIN
14+
SelfAssessmentSupervisorRoles ssr ON cas.SelfAssessmentSupervisorRoleID = ssr.ID
15+
AND cas.Removed IS NULL AND ssr.AllowDelegateNomination = 0 INNER JOIN
16+
SupervisorDelegates sd ON cas.SupervisorDelegateId = sd.ID INNER JOIN
17+
AdminAccounts aa ON sd.SupervisorAdminID = aa.ID
18+
WHERE aa.IsSupervisor = 0 AND aa.IsNominatedSupervisor = 1
19+
-- to exclude duplicate CandidateAssessmentID from update
20+
AND cas.CandidateAssessmentID NOT IN (
21+
SELECT CandidateAssessmentID FROM CandidateAssessmentSupervisors WHERE CandidateAssessmentID in (
22+
SELECT Cas2.CandidateAssessmentID
23+
FROM CandidateAssessmentSupervisors cas2 with (nolock) INNER JOIN
24+
SelfAssessmentSupervisorRoles ssr2 with (nolock) ON cas2.SelfAssessmentSupervisorRoleID = ssr2.ID
25+
AND cas2.Removed IS NULL AND ssr2.AllowDelegateNomination = 0 INNER JOIN
26+
SupervisorDelegates sd2 with (nolock) ON cas2.SupervisorDelegateId = sd2.ID INNER JOIN
27+
AdminAccounts aa2 with (nolock) ON sd2.SupervisorAdminID = aa2.ID
28+
WHERE aa2.IsSupervisor = 0 AND aa2.IsNominatedSupervisor = 1
29+
)
30+
GROUP BY CandidateAssessmentID,SupervisorDelegateId
31+
HAVING COUNT(*)>1
32+
)"
33+
);
34+
}
35+
}
36+
}

DigitalLearningSolutions.Data/DataServices/CourseDataService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ LEFT OUTER JOIN UserCentreDetails AS UCD ON
542542
new { candidateAssessmentId, enrolmentMethodId, completeByDateDynamic }
543543
);
544544
}
545-
if (candidateAssessmentId > 1 && supervisorDelegateId !=0)
545+
if (candidateAssessmentId > 1 && supervisorDelegateId != 0)
546546
{
547547
string sqlQuery = $@"
548548
BEGIN TRANSACTION
@@ -551,17 +551,17 @@ BEGIN TRANSACTION
551551
552552
UPDATE CandidateAssessmentSupervisors SET Removed = NULL
553553
{((selfAssessmentSupervisorRoleId > 0) ? " ,SelfAssessmentSupervisorRoleID = @selfAssessmentSupervisorRoleID" : string.Empty)}
554-
WHERE CandidateAssessmentID = @candidateAssessmentId
554+
WHERE CandidateAssessmentID = @candidateAssessmentId AND SupervisorDelegateId = @supervisorDelegateId
555555
556556
COMMIT TRANSACTION";
557557

558558
connection.Execute(sqlQuery
559-
, new { candidateAssessmentId, selfAssessmentSupervisorRoleId, enrolmentMethodId, completeByDateDynamic });
559+
, new { candidateAssessmentId, selfAssessmentSupervisorRoleId, enrolmentMethodId, completeByDateDynamic, supervisorDelegateId });
560560
}
561561

562562
if (supervisorId > 0)
563563
{
564-
564+
565565
var adminUserId = Convert.ToInt32(connection.ExecuteScalar(@"SELECT UserID FROM AdminAccounts WHERE (AdminAccounts.ID = @supervisorId)",
566566
new { supervisorId })
567567
);

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
public partial class SelfAssessmentDataService
1010
{
11-
public IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId, int? adminCategoryId)
11+
public IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId, int? adminIdCategoryID)
1212
{
1313
return connection.Query<CurrentSelfAssessment>(
1414
@"SELECT SelfAssessment.Id,
@@ -67,7 +67,8 @@ Competencies AS C RIGHT OUTER JOIN
6767
CandidateAssessmentSupervisorVerifications AS casv ON casv.CandidateAssessmentSupervisorID = cas.ID LEFT OUTER JOIN
6868
AdminAccounts AS aaEnrolledBy ON aaEnrolledBy.ID = CA.EnrolledByAdminID LEFT OUTER JOIN
6969
Users AS uEnrolledBy ON uEnrolledBy.ID = aaEnrolledBy.UserID
70-
WHERE (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL) AND (CA.CompletedDate IS NULL) AND (ISNULL(@adminCategoryId, 0) = 0 OR sa.CategoryID = @adminCategoryId)
70+
WHERE (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL) AND (CA.CompletedDate IS NULL)
71+
AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)
7172
GROUP BY
7273
CA.SelfAssessmentID, SA.Name, SA.Description, SA.IncludesSignposting, SA.SupervisorResultsReview,
7374
SA.ReviewerCommentsLabel, SA.IncludeRequirementsFilters,
@@ -83,10 +84,87 @@ CandidateAssessments AS CA LEFT OUTER JOIN
8384
(casv.Verified IS NOT NULL)
8485
GROUP BY SelfAssessmentID,casv.SignedOff
8586
)Signoff ON SelfAssessment.Id =Signoff.SelfAssessmentID",
86-
new { delegateUserId, centreId, adminCategoryId }
87+
new { delegateUserId, centreId, adminIdCategoryID }
88+
);
89+
}
90+
public IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId)
91+
{
92+
return connection.Query<CurrentSelfAssessment>(
93+
@"SELECT SelfAssessment.Id,
94+
SelfAssessment.Name,
95+
SelfAssessment.Description,
96+
SelfAssessment.IncludesSignposting,
97+
SelfAssessment.IncludeRequirementsFilters,
98+
SelfAssessment. IsSupervisorResultsReviewed,
99+
SelfAssessment.ReviewerCommentsLabel,
100+
SelfAssessment. Vocabulary,
101+
SelfAssessment. NumberOfCompetencies,
102+
SelfAssessment.StartedDate,
103+
SelfAssessment.LastAccessed,
104+
SelfAssessment.CompleteByDate,
105+
SelfAssessment.CandidateAssessmentId,
106+
SelfAssessment.UserBookmark,
107+
SelfAssessment.UnprocessedUpdates,
108+
SelfAssessment.LaunchCount,
109+
SelfAssessment. IsSelfAssessment,
110+
SelfAssessment.SubmittedDate,
111+
SelfAssessment. CentreName,
112+
SelfAssessment.EnrolmentMethodId,
113+
Signoff.SignedOff,
114+
Signoff.Verified,
115+
EnrolledByForename +' '+EnrolledBySurname AS EnrolledByFullName
116+
FROM (SELECT
117+
CA.SelfAssessmentID AS Id,
118+
SA.Name,
119+
SA.Description,
120+
SA.IncludesSignposting,
121+
SA.IncludeRequirementsFilters,
122+
SA.SupervisorResultsReview AS IsSupervisorResultsReviewed,
123+
SA.ReviewerCommentsLabel,
124+
COALESCE(SA.Vocabulary, 'Capability') AS Vocabulary,
125+
COUNT(C.ID) AS NumberOfCompetencies,
126+
CA.StartedDate,
127+
CA.LastAccessed,
128+
CA.CompleteByDate,
129+
CA.ID AS CandidateAssessmentId,
130+
CA.UserBookmark,
131+
CA.UnprocessedUpdates,
132+
CA.LaunchCount,
133+
1 AS IsSelfAssessment,
134+
CA.SubmittedDate,
135+
CR.CentreName AS CentreName,
136+
CA.EnrolmentMethodId,
137+
uEnrolledBy.FirstName AS EnrolledByForename,
138+
uEnrolledBy.LastName AS EnrolledBySurname
139+
FROM Centres AS CR INNER JOIN
140+
CandidateAssessments AS CA INNER JOIN
141+
SelfAssessments AS SA ON CA.SelfAssessmentID = SA.ID ON CR.CentreID = CA.CentreID INNER JOIN
142+
CentreSelfAssessments AS csa ON csa.SelfAssessmentID = SA.ID AND csa.CentreID = @centreId LEFT OUTER JOIN
143+
Competencies AS C RIGHT OUTER JOIN
144+
SelfAssessmentStructure AS SAS ON C.ID = SAS.CompetencyID ON CA.SelfAssessmentID = SAS.SelfAssessmentID LEFT OUTER JOIN
145+
CandidateAssessmentSupervisors AS cas ON ca.ID =cas.CandidateAssessmentID LEFT OUTER JOIN
146+
CandidateAssessmentSupervisorVerifications AS casv ON casv.CandidateAssessmentSupervisorID = cas.ID LEFT OUTER JOIN
147+
AdminAccounts AS aaEnrolledBy ON aaEnrolledBy.ID = CA.EnrolledByAdminID LEFT OUTER JOIN
148+
Users AS uEnrolledBy ON uEnrolledBy.ID = aaEnrolledBy.UserID
149+
WHERE (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL) AND (CA.CompletedDate IS NULL)
150+
GROUP BY
151+
CA.SelfAssessmentID, SA.Name, SA.Description, SA.IncludesSignposting, SA.SupervisorResultsReview,
152+
SA.ReviewerCommentsLabel, SA.IncludeRequirementsFilters,
153+
COALESCE(SA.Vocabulary, 'Capability'), CA.StartedDate, CA.LastAccessed, CA.CompleteByDate,
154+
CA.ID,
155+
CA.UserBookmark, CA.UnprocessedUpdates, CA.LaunchCount, CA.SubmittedDate, CR.CentreName,CA.EnrolmentMethodId,
156+
uEnrolledBy.FirstName,uEnrolledBy.LastName)SelfAssessment LEFT OUTER JOIN
157+
(SELECT SelfAssessmentID,casv.SignedOff,MAX(casv.Verified) Verified FROM
158+
CandidateAssessments AS CA LEFT OUTER JOIN
159+
CandidateAssessmentSupervisors AS cas ON ca.ID =cas.CandidateAssessmentID LEFT OUTER JOIN
160+
CandidateAssessmentSupervisorVerifications AS casv ON casv.CandidateAssessmentSupervisorID = cas.ID
161+
WHERE (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL) AND (CA.CompletedDate IS NULL) AND (casv.SignedOff = 1) AND
162+
(casv.Verified IS NOT NULL)
163+
GROUP BY SelfAssessmentID,casv.SignedOff
164+
)Signoff ON SelfAssessment.Id =Signoff.SelfAssessmentID",
165+
new { delegateUserId, centreId }
87166
);
88167
}
89-
90168
public CurrentSelfAssessment? GetSelfAssessmentForCandidateById(int delegateUserId, int selfAssessmentId)
91169
{
92170
return connection.QueryFirstOrDefault<CurrentSelfAssessment>(

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ int competencyId
7272

7373
// CandidateAssessmentsDataService
7474

75-
IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId, int? adminCategoryId);
76-
75+
IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId, int? adminIdCategoryID);
76+
IEnumerable<CurrentSelfAssessment> GetSelfAssessmentsForCandidate(int delegateUserId, int centreId);
7777
CurrentSelfAssessment? GetSelfAssessmentForCandidateById(int delegateUserId, int selfAssessmentId);
7878

7979
void UpdateLastAccessed(int selfAssessmentId, int delegateUserId);
@@ -174,7 +174,6 @@ int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string so
174174
bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId);
175175
int GetSelfAssessmentCategoryId(int selfAssessmentId);
176176
}
177-
178177
public partial class SelfAssessmentDataService : ISelfAssessmentDataService
179178
{
180179
private readonly IDbConnection connection;

DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public interface ISupervisorDataService
2222
DelegateSelfAssessment? GetSelfAssessmentByCandidateAssessmentId(int candidateAssessmentId, int adminId, int? adminIdCategoryId);
2323
IEnumerable<SupervisorDashboardToDoItem> GetSupervisorDashboardToDoItemsForRequestedSignOffs(int adminId);
2424
IEnumerable<SupervisorDashboardToDoItem> GetSupervisorDashboardToDoItemsForRequestedReviews(int adminId);
25-
DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId);
25+
DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId, int? adminIdCategoryId);
2626
IEnumerable<RoleProfile> GetAvailableRoleProfilesForDelegate(int candidateId, int centreId, int? categoryId);
2727
RoleProfile? GetRoleProfileById(int selfAssessmentId);
2828
IEnumerable<SelfAssessmentSupervisorRole> GetSupervisorRolesForSelfAssessment(int selfAssessmentId);
@@ -594,7 +594,7 @@ FROM CandidateAssessmentSupervisors AS cas INNER JOIN
594594
WHERE (ca.RemovedDate IS NULL) AND (cas.SupervisorDelegateId = @supervisorDelegateId) AND (cas.Removed IS NULL) AND (sa.ID = @selfAssessmentId)", new { selfAssessmentId, supervisorDelegateId }
595595
).FirstOrDefault();
596596
}
597-
public DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId)
597+
public DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId, int? adminIdCategoryId)
598598
{
599599
return connection.Query<DelegateSelfAssessment>(
600600
@$"SELECT ca.ID, sa.ID AS SelfAssessmentID, sa.Name AS RoleName, sa.QuestionLabel, sa.DescriptionLabel, sa.ReviewerCommentsLabel,
@@ -611,7 +611,7 @@ FROM SelfAssessmentResultSupervisorVerifications AS sarsv
611611
FROM CandidateAssessmentSupervisors AS cas INNER JOIN
612612
CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN
613613
SelfAssessments AS sa ON sa.ID = ca.SelfAssessmentID
614-
WHERE (ca.ID = @candidateAssessmentId)", new { candidateAssessmentId }
614+
WHERE (ca.ID = @candidateAssessmentId) AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)", new { candidateAssessmentId, adminIdCategoryId }
615615
).FirstOrDefault();
616616
}
617617
public DelegateSelfAssessment? GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(int candidateAssessmentId, int supervisorDelegateId)

DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ int resultId
515515
)
516516
{
517517
var model = ReviewCompetencySelfAsessmentData(supervisorDelegateId, candidateAssessmentId, resultId);
518-
518+
if (model == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
519519
return View("ReviewCompetencySelfAsessment", model);
520520
}
521521

@@ -587,8 +587,10 @@ int resultId
587587
candidateAssessmentId,
588588
adminId
589589
);
590+
var loggedInAdminUser = userService.GetAdminUserById(adminId);
590591
var delegateSelfAssessment =
591-
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
592+
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId, loggedInAdminUser.CategoryId);
593+
if (delegateSelfAssessment == null) return null;
592594
var assessmentQuestion = GetLevelDescriptorsForAssessmentQuestion(competency.AssessmentQuestions.First());
593595
competency.CompetencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyId(competency.Id);
594596
var model = new ReviewCompetencySelfAsessmentViewModel()
@@ -610,10 +612,12 @@ int resultId
610612
public IActionResult VerifyMultipleResults(int supervisorDelegateId, int candidateAssessmentId)
611613
{
612614
var adminId = GetAdminId();
615+
var loggedInAdminUser = userService.GetAdminUserById(adminId);
613616
var superviseDelegate =
614617
supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0);
615618
var delegateSelfAssessment =
616-
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
619+
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId, loggedInAdminUser.CategoryId);
620+
if (delegateSelfAssessment == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
617621
var reviewedCompetencies = PopulateCompetencyLevelDescriptors(
618622
selfAssessmentService.GetCandidateAssessmentResultsForReviewById(candidateAssessmentId, adminId)
619623
.ToList()
@@ -638,10 +642,11 @@ List<int> resultChecked
638642
if (resultChecked.Count == 0)
639643
{
640644
var adminId = GetAdminId();
645+
var loggedInAdminUser = userService.GetAdminUserById(adminId);
641646
var superviseDelegate =
642647
supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0);
643648
var delegateSelfAssessment =
644-
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
649+
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId, loggedInAdminUser.CategoryId);
645650
var reviewedCompetencies = PopulateCompetencyLevelDescriptors(
646651
selfAssessmentService.GetCandidateAssessmentResultsForReviewById(candidateAssessmentId, adminId)
647652
.ToList()
@@ -1260,10 +1265,12 @@ SignOffProfileAssessmentViewModel model
12601265
public IActionResult SignOffHistory(int supervisorDelegateId, int candidateAssessmentId)
12611266
{
12621267
var adminId = GetAdminId();
1268+
var loggedInAdminUser = userService.GetAdminUserById(adminId);
12631269
var superviseDelegate =
12641270
supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0);
12651271
var delegateSelfAssessment =
1266-
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
1272+
supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId, loggedInAdminUser.CategoryId);
1273+
if (delegateSelfAssessment == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
12671274
var model = new SignOffHistoryViewModel()
12681275
{
12691276
DelegateSelfAssessment = delegateSelfAssessment,

0 commit comments

Comments
 (0)