Skip to content

Commit b12fa66

Browse files
authored
Merge pull request #3316 from TechnologyEnhancedLearning/DLS-Release-v1.2.1-Hotfix
Dls release v1.2.1 hotfix to production
2 parents 5d0610c + 63b8659 commit b12fa66

File tree

8 files changed

+351
-89
lines changed

8 files changed

+351
-89
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
namespace DigitalLearningSolutions.Data.Migrations
2+
{
3+
using FluentMigrator;
4+
[Migration(20250703091)]
5+
public class CreateOrAlterGetSelfAssessmentReport : Migration
6+
{
7+
public override void Up()
8+
{
9+
Execute.Sql(Properties.Resources.TD_5759_CreateOrAlterSelfAssessmentReportSPandTVF_UP);
10+
}
11+
public override void Down()
12+
{
13+
Execute.Sql("DROP PROCEDURE IF EXISTS [dbo].[usp_GetSelfAssessmentReport]");
14+
Execute.Sql("DROP FUNCTION IF EXISTS [dbo].[GetOtherCentresForSelfAssessmentTVF]");
15+
}
16+
}
17+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace DigitalLearningSolutions.Data.Migrations
2+
{
3+
using FluentMigrator;
4+
[Migration(202507040803)]
5+
public class FixCreateOrAlterGetSelfAssessmentReport : ForwardOnlyMigration
6+
{
7+
public override void Up()
8+
{
9+
Execute.Sql(Properties.Resources.TD_5759_CreateOrAlterSelfAssessmentReportSPandTVF_Fix_UP);
10+
}
11+
}
12+
}

DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,4 +487,10 @@
487487
<data name="TD_5447_Alter_ReorderFrameworkCompetency_Up" type="System.Resources.ResXFileRef, System.Windows.Forms">
488488
<value>..\Scripts\TD-5447-Alter_ReorderFrameworkCompetency_Up.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
489489
</data>
490+
<data name="TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF_UP" type="System.Resources.ResXFileRef, System.Windows.Forms">
491+
<value>..\Scripts\TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
492+
</data>
493+
<data name="TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP" type="System.Resources.ResXFileRef, System.Windows.Forms">
494+
<value>..\Scripts\TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
495+
</data>
490496
</root>
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
CREATE OR ALTER PROCEDURE [dbo].[usp_GetSelfAssessmentReport]
2+
@SelfAssessmentID INT,
3+
@CentreID INT
4+
AS
5+
BEGIN
6+
SET NOCOUNT ON;
7+
8+
-- Step 1: Materialize the LatestAssessmentResults into a temp table
9+
IF OBJECT_ID('tempdb..#LatestAssessmentResults') IS NOT NULL
10+
DROP TABLE #LatestAssessmentResults;
11+
12+
SELECT
13+
s.DelegateUserID,
14+
CASE WHEN COALESCE(rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed,
15+
CASE
16+
WHEN sv.Verified IS NOT NULL AND sv.SignedOff = 1 AND COALESCE(rr.LevelRAG, 0) = 3
17+
THEN s.ID ELSE NULL
18+
END AS Confirmed,
19+
CASE WHEN sas.Optional = 1 THEN s.CompetencyID ELSE NULL END AS Optional
20+
INTO #LatestAssessmentResults
21+
FROM SelfAssessmentResults AS s
22+
LEFT JOIN SelfAssessmentStructure AS sas
23+
ON sas.SelfAssessmentID = @SelfAssessmentID
24+
AND s.CompetencyID = sas.CompetencyID
25+
LEFT JOIN SelfAssessmentResultSupervisorVerifications AS sv
26+
ON s.ID = sv.SelfAssessmentResultId
27+
AND sv.Superceded = 0
28+
LEFT JOIN CompetencyAssessmentQuestionRoleRequirements AS rr
29+
ON s.CompetencyID = rr.CompetencyID
30+
AND s.AssessmentQuestionID = rr.AssessmentQuestionID
31+
AND sas.SelfAssessmentID = rr.SelfAssessmentID
32+
AND s.Result = rr.LevelValue
33+
WHERE sas.SelfAssessmentID = @SelfAssessmentID;
34+
35+
CREATE NONCLUSTERED INDEX IX_LAR_DelegateUserID ON #LatestAssessmentResults(DelegateUserID);
36+
37+
-- Step 2: Run the main query
38+
SELECT
39+
sa.Name AS SelfAssessment,
40+
u.LastName + ', ' + u.FirstName AS Learner,
41+
da.Active AS LearnerActive,
42+
u.ProfessionalRegistrationNumber AS PRN,
43+
jg.JobGroupName AS JobGroup,
44+
da.Answer1 AS RegistrationAnswer1,
45+
da.Answer2 AS RegistrationAnswer2,
46+
da.Answer3 AS RegistrationAnswer3,
47+
da.Answer4 AS RegistrationAnswer4,
48+
da.Answer5 AS RegistrationAnswer5,
49+
da.Answer6 AS RegistrationAnswer6,
50+
oc.OtherCentres,
51+
CASE
52+
WHEN aa.ID IS NULL THEN 'Learner'
53+
WHEN aa.IsCentreManager = 1 THEN 'Centre Manager'
54+
WHEN aa.IsCentreAdmin = 1 AND aa.IsCentreManager = 0 THEN 'Centre Admin'
55+
WHEN aa.IsSupervisor = 1 THEN 'Supervisor'
56+
WHEN aa.IsNominatedSupervisor = 1 THEN 'Nominated supervisor'
57+
END AS DLSRole,
58+
da.DateRegistered AS Registered,
59+
ca.StartedDate AS [Started],
60+
ca.LastAccessed,
61+
COUNT(DISTINCT LAR.Optional) AS [OptionalProficienciesAssessed],
62+
COUNT(DISTINCT LAR.SelfAssessed) AS [SelfAssessedAchieved],
63+
COUNT(DISTINCT LAR.Confirmed) AS [ConfirmedResults],
64+
MAX(casv.Requested) AS SignOffRequested,
65+
MAX(1 * casv.SignedOff) AS SignOffAchieved,
66+
MIN(casv.Verified) AS ReviewedDate
67+
FROM CandidateAssessments AS ca
68+
INNER JOIN DelegateAccounts AS da
69+
ON ca.DelegateUserID = da.UserID
70+
AND da.CentreID = @CentreID
71+
INNER JOIN Users AS u
72+
ON u.ID = da.UserID
73+
INNER JOIN SelfAssessments AS sa
74+
ON ca.SelfAssessmentID = sa.ID
75+
INNER JOIN CentreSelfAssessments AS csa
76+
ON sa.ID = csa.SelfAssessmentID
77+
INNER JOIN Centres AS c
78+
ON csa.CentreID = c.CentreID
79+
AND da.CentreID = c.CentreID
80+
INNER JOIN JobGroups AS jg
81+
ON u.JobGroupID = jg.JobGroupID
82+
LEFT JOIN AdminAccounts AS aa
83+
ON da.UserID = aa.UserID
84+
AND aa.CentreID = da.CentreID
85+
AND aa.Active = 1
86+
LEFT JOIN CandidateAssessmentSupervisors AS cas
87+
ON ca.ID = cas.CandidateAssessmentID
88+
LEFT JOIN CandidateAssessmentSupervisorVerifications AS casv
89+
ON casv.CandidateAssessmentSupervisorID = cas.ID
90+
LEFT JOIN SupervisorDelegates AS sd
91+
ON cas.SupervisorDelegateId = sd.ID
92+
LEFT JOIN #LatestAssessmentResults AS LAR
93+
ON LAR.DelegateUserID = ca.DelegateUserID
94+
OUTER APPLY dbo.GetOtherCentresForSelfAssessmentTVF(da.UserID, @SelfAssessmentID, c.CentreID) AS oc
95+
WHERE
96+
sa.ID = @SelfAssessmentID
97+
AND sa.ArchivedDate IS NULL
98+
AND c.Active = 1
99+
AND ca.RemovedDate IS NULL
100+
AND ca.NonReportable = 0
101+
GROUP BY
102+
sa.Name,
103+
u.LastName + ', ' + u.FirstName,
104+
da.Active,
105+
u.ProfessionalRegistrationNumber,
106+
jg.JobGroupName,
107+
da.Answer1, da.Answer2, da.Answer3, da.Answer4, da.Answer5, da.Answer6,
108+
da.DateRegistered,
109+
ca.StartedDate,
110+
ca.LastAccessed,
111+
oc.OtherCentres,
112+
aa.ID, aa.IsCentreManager, aa.IsCentreAdmin, aa.IsSupervisor, aa.IsNominatedSupervisor
113+
ORDER BY
114+
sa.Name, u.LastName + ', ' + u.FirstName;
115+
116+
END;
117+
GO
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
CREATE OR ALTER FUNCTION dbo.GetOtherCentresForSelfAssessmentTVF
2+
(
3+
@UserID INT,
4+
@SelfAssessmentID INT,
5+
@ExcludeCentreID INT
6+
)
7+
RETURNS TABLE
8+
AS
9+
RETURN
10+
(
11+
SELECT
12+
STUFF((
13+
SELECT DISTINCT
14+
', ' + c.CentreName
15+
FROM Users AS u
16+
INNER JOIN DelegateAccounts AS da ON u.ID = da.UserID
17+
INNER JOIN Centres AS c ON da.CentreID = c.CentreID
18+
INNER JOIN CentreSelfAssessments AS csa ON c.CentreID = csa.CentreID
19+
WHERE u.ID = @UserID
20+
AND da.Active = 1
21+
AND da.Approved = 1
22+
AND csa.SelfAssessmentID = @SelfAssessmentID
23+
AND c.CentreID <> @ExcludeCentreID
24+
FOR XML PATH(''), TYPE
25+
).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS OtherCentres
26+
);
27+
GO
28+
29+
CREATE OR ALTER PROCEDURE [dbo].[usp_GetSelfAssessmentReport]
30+
@SelfAssessmentID INT,
31+
@CentreID INT
32+
AS
33+
BEGIN
34+
SET NOCOUNT ON;
35+
36+
-- Step 1: Materialize the LatestAssessmentResults into a temp table
37+
IF OBJECT_ID('tempdb..#LatestAssessmentResults') IS NOT NULL
38+
DROP TABLE #LatestAssessmentResults;
39+
40+
SELECT
41+
s.DelegateUserID,
42+
CASE WHEN COALESCE(rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed,
43+
CASE
44+
WHEN sv.Verified IS NOT NULL AND sv.SignedOff = 1 AND COALESCE(rr.LevelRAG, 0) = 3
45+
THEN s.ID ELSE NULL
46+
END AS Confirmed,
47+
CASE WHEN sas.Optional = 1 THEN s.CompetencyID ELSE NULL END AS Optional
48+
INTO #LatestAssessmentResults
49+
FROM SelfAssessmentResults AS s
50+
LEFT JOIN SelfAssessmentStructure AS sas
51+
ON sas.SelfAssessmentID = @SelfAssessmentID
52+
AND s.CompetencyID = sas.CompetencyID
53+
LEFT JOIN SelfAssessmentResultSupervisorVerifications AS sv
54+
ON s.ID = sv.SelfAssessmentResultId
55+
AND sv.Superceded = 0
56+
LEFT JOIN CompetencyAssessmentQuestionRoleRequirements AS rr
57+
ON s.CompetencyID = rr.CompetencyID
58+
AND s.AssessmentQuestionID = rr.AssessmentQuestionID
59+
AND sas.SelfAssessmentID = rr.SelfAssessmentID
60+
AND s.Result = rr.LevelValue
61+
WHERE sas.SelfAssessmentID = @SelfAssessmentID;
62+
63+
CREATE NONCLUSTERED INDEX IX_LAR_DelegateUserID ON #LatestAssessmentResults(DelegateUserID);
64+
65+
-- Step 2: Run the main query
66+
SELECT
67+
sa.Name AS SelfAssessment,
68+
u.LastName + ', ' + u.FirstName AS Learner,
69+
da.Active AS LearnerActive,
70+
u.ProfessionalRegistrationNumber AS PRN,
71+
jg.JobGroupName AS JobGroup,
72+
da.Answer1,
73+
da.Answer2,
74+
da.Answer3,
75+
da.Answer4,
76+
da.Answer5,
77+
da.Answer6,
78+
oc.OtherCentres,
79+
CASE
80+
WHEN aa.ID IS NULL THEN 'Learner'
81+
WHEN aa.IsCentreManager = 1 THEN 'Centre Manager'
82+
WHEN aa.IsCentreAdmin = 1 AND aa.IsCentreManager = 0 THEN 'Centre Admin'
83+
WHEN aa.IsSupervisor = 1 THEN 'Supervisor'
84+
WHEN aa.IsNominatedSupervisor = 1 THEN 'Nominated supervisor'
85+
END AS DLSRole,
86+
da.DateRegistered AS Registered,
87+
ca.StartedDate,
88+
ca.LastAccessed,
89+
COUNT(DISTINCT LAR.Optional) AS [OptionalProficienciesAssessed],
90+
COUNT(DISTINCT LAR.SelfAssessed) AS [SelfAssessedAchieved],
91+
COUNT(DISTINCT LAR.Confirmed) AS [ConfirmedResults],
92+
MAX(casv.Requested) AS SignOffRequested,
93+
MAX(1 * casv.SignedOff) AS SignOffAchieved,
94+
MIN(casv.Verified) AS ReviewedDate
95+
FROM CandidateAssessments AS ca
96+
INNER JOIN DelegateAccounts AS da
97+
ON ca.DelegateUserID = da.UserID
98+
AND da.CentreID = @CentreID
99+
INNER JOIN Users AS u
100+
ON u.ID = da.UserID
101+
INNER JOIN SelfAssessments AS sa
102+
ON ca.SelfAssessmentID = sa.ID
103+
INNER JOIN CentreSelfAssessments AS csa
104+
ON sa.ID = csa.SelfAssessmentID
105+
INNER JOIN Centres AS c
106+
ON csa.CentreID = c.CentreID
107+
AND da.CentreID = c.CentreID
108+
INNER JOIN JobGroups AS jg
109+
ON u.JobGroupID = jg.JobGroupID
110+
LEFT JOIN AdminAccounts AS aa
111+
ON da.UserID = aa.UserID
112+
AND aa.CentreID = da.CentreID
113+
AND aa.Active = 1
114+
LEFT JOIN CandidateAssessmentSupervisors AS cas
115+
ON ca.ID = cas.CandidateAssessmentID
116+
LEFT JOIN CandidateAssessmentSupervisorVerifications AS casv
117+
ON casv.CandidateAssessmentSupervisorID = cas.ID
118+
LEFT JOIN SupervisorDelegates AS sd
119+
ON cas.SupervisorDelegateId = sd.ID
120+
LEFT JOIN #LatestAssessmentResults AS LAR
121+
ON LAR.DelegateUserID = ca.DelegateUserID
122+
OUTER APPLY dbo.GetOtherCentresForSelfAssessmentTVF(da.UserID, @SelfAssessmentID, c.CentreID) AS oc
123+
WHERE
124+
sa.ID = @SelfAssessmentID
125+
AND sa.ArchivedDate IS NULL
126+
AND c.Active = 1
127+
AND ca.RemovedDate IS NULL
128+
AND ca.NonReportable = 0
129+
GROUP BY
130+
sa.Name,
131+
u.LastName + ', ' + u.FirstName,
132+
da.Active,
133+
u.ProfessionalRegistrationNumber,
134+
jg.JobGroupName,
135+
da.Answer1, da.Answer2, da.Answer3, da.Answer4, da.Answer5, da.Answer6,
136+
da.DateRegistered,
137+
ca.StartedDate,
138+
ca.LastAccessed,
139+
oc.OtherCentres,
140+
aa.ID, aa.IsCentreManager, aa.IsCentreAdmin, aa.IsSupervisor, aa.IsNominatedSupervisor
141+
ORDER BY
142+
sa.Name, u.LastName + ', ' + u.FirstName;
143+
144+
END;
145+
GO

0 commit comments

Comments
 (0)