diff --git a/DigitalLearningSolutions.Data.Migrations/202507040803_FixCreateOrAlterGetSelfAssessmentReport.cs b/DigitalLearningSolutions.Data.Migrations/202507040803_FixCreateOrAlterGetSelfAssessmentReport.cs new file mode 100644 index 0000000000..73aab1d8a0 --- /dev/null +++ b/DigitalLearningSolutions.Data.Migrations/202507040803_FixCreateOrAlterGetSelfAssessmentReport.cs @@ -0,0 +1,12 @@ +namespace DigitalLearningSolutions.Data.Migrations +{ + using FluentMigrator; + [Migration(202507040803)] + public class FixCreateOrAlterGetSelfAssessmentReport : ForwardOnlyMigration + { + public override void Up() + { + Execute.Sql(Properties.Resources.TD_5759_CreateOrAlterSelfAssessmentReportSPandTVF_Fix_UP); + } + } +} diff --git a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs index 1e78c0fc6d..4bd193dcf1 100644 --- a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs +++ b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs @@ -2524,6 +2524,30 @@ internal static string TD_5514_Alter_SendExpiredTBCReminders_Up { } } + /// + /// Looks up a localized string similar to CREATE OR ALTER PROCEDURE [dbo].[usp_GetSelfAssessmentReport] + /// @SelfAssessmentID INT, + /// @CentreID INT + ///AS + ///BEGIN + /// SET NOCOUNT ON; + /// + /// -- Step 1: Materialize the LatestAssessmentResults into a temp table + /// IF OBJECT_ID('tempdb..#LatestAssessmentResults') IS NOT NULL + /// DROP TABLE #LatestAssessmentResults; + /// + /// SELECT + /// s.DelegateUserID, + /// CASE WHEN COALESCE(rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed, + /// CASE + /// WHEN sv.Verified IS NOT N [rest of string was truncated]";. + /// + internal static string TD_5759_CreateOrAlterSelfAssessmentReportSPandTVF_Fix_UP { + get { + return ResourceManager.GetString("TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP", resourceCulture); + } + } + /// /// Looks up a localized string similar to CREATE OR ALTER FUNCTION dbo.GetOtherCentresForSelfAssessmentTVF ///( diff --git a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx index 5410e423e6..d6a79ed9d3 100644 --- a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx +++ b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx @@ -490,4 +490,7 @@ ..\Scripts\TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + ..\Scripts\TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/DigitalLearningSolutions.Data.Migrations/Scripts/TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql b/DigitalLearningSolutions.Data.Migrations/Scripts/TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql new file mode 100644 index 0000000000..21922679ff --- /dev/null +++ b/DigitalLearningSolutions.Data.Migrations/Scripts/TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql @@ -0,0 +1,117 @@ +CREATE OR ALTER PROCEDURE [dbo].[usp_GetSelfAssessmentReport] + @SelfAssessmentID INT, + @CentreID INT +AS +BEGIN + SET NOCOUNT ON; + + -- Step 1: Materialize the LatestAssessmentResults into a temp table + IF OBJECT_ID('tempdb..#LatestAssessmentResults') IS NOT NULL + DROP TABLE #LatestAssessmentResults; + + SELECT + s.DelegateUserID, + CASE WHEN COALESCE(rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed, + CASE + WHEN sv.Verified IS NOT NULL AND sv.SignedOff = 1 AND COALESCE(rr.LevelRAG, 0) = 3 + THEN s.ID ELSE NULL + END AS Confirmed, + CASE WHEN sas.Optional = 1 THEN s.CompetencyID ELSE NULL END AS Optional + INTO #LatestAssessmentResults + FROM SelfAssessmentResults AS s + LEFT JOIN SelfAssessmentStructure AS sas + ON sas.SelfAssessmentID = @SelfAssessmentID + AND s.CompetencyID = sas.CompetencyID + LEFT JOIN SelfAssessmentResultSupervisorVerifications AS sv + ON s.ID = sv.SelfAssessmentResultId + AND sv.Superceded = 0 + LEFT JOIN CompetencyAssessmentQuestionRoleRequirements AS rr + ON s.CompetencyID = rr.CompetencyID + AND s.AssessmentQuestionID = rr.AssessmentQuestionID + AND sas.SelfAssessmentID = rr.SelfAssessmentID + AND s.Result = rr.LevelValue + WHERE sas.SelfAssessmentID = @SelfAssessmentID; + + CREATE NONCLUSTERED INDEX IX_LAR_DelegateUserID ON #LatestAssessmentResults(DelegateUserID); + + -- Step 2: Run the main query + SELECT + sa.Name AS SelfAssessment, + u.LastName + ', ' + u.FirstName AS Learner, + da.Active AS LearnerActive, + u.ProfessionalRegistrationNumber AS PRN, + jg.JobGroupName AS JobGroup, + da.Answer1 AS RegistrationAnswer1, + da.Answer2 AS RegistrationAnswer2, + da.Answer3 AS RegistrationAnswer3, + da.Answer4 AS RegistrationAnswer4, + da.Answer5 AS RegistrationAnswer5, + da.Answer6 AS RegistrationAnswer6, + oc.OtherCentres, + CASE + WHEN aa.ID IS NULL THEN 'Learner' + WHEN aa.IsCentreManager = 1 THEN 'Centre Manager' + WHEN aa.IsCentreAdmin = 1 AND aa.IsCentreManager = 0 THEN 'Centre Admin' + WHEN aa.IsSupervisor = 1 THEN 'Supervisor' + WHEN aa.IsNominatedSupervisor = 1 THEN 'Nominated supervisor' + END AS DLSRole, + da.DateRegistered AS Registered, + ca.StartedDate AS [Started], + ca.LastAccessed, + COUNT(DISTINCT LAR.Optional) AS [OptionalProficienciesAssessed], + COUNT(DISTINCT LAR.SelfAssessed) AS [SelfAssessedAchieved], + COUNT(DISTINCT LAR.Confirmed) AS [ConfirmedResults], + MAX(casv.Requested) AS SignOffRequested, + MAX(1 * casv.SignedOff) AS SignOffAchieved, + MIN(casv.Verified) AS ReviewedDate + FROM CandidateAssessments AS ca + INNER JOIN DelegateAccounts AS da + ON ca.DelegateUserID = da.UserID + AND da.CentreID = @CentreID + INNER JOIN Users AS u + ON u.ID = da.UserID + INNER JOIN SelfAssessments AS sa + ON ca.SelfAssessmentID = sa.ID + INNER JOIN CentreSelfAssessments AS csa + ON sa.ID = csa.SelfAssessmentID + INNER JOIN Centres AS c + ON csa.CentreID = c.CentreID + AND da.CentreID = c.CentreID + INNER JOIN JobGroups AS jg + ON u.JobGroupID = jg.JobGroupID + LEFT JOIN AdminAccounts AS aa + ON da.UserID = aa.UserID + AND aa.CentreID = da.CentreID + AND aa.Active = 1 + LEFT JOIN CandidateAssessmentSupervisors AS cas + ON ca.ID = cas.CandidateAssessmentID + LEFT JOIN CandidateAssessmentSupervisorVerifications AS casv + ON casv.CandidateAssessmentSupervisorID = cas.ID + LEFT JOIN SupervisorDelegates AS sd + ON cas.SupervisorDelegateId = sd.ID + LEFT JOIN #LatestAssessmentResults AS LAR + ON LAR.DelegateUserID = ca.DelegateUserID + OUTER APPLY dbo.GetOtherCentresForSelfAssessmentTVF(da.UserID, @SelfAssessmentID, c.CentreID) AS oc + WHERE + sa.ID = @SelfAssessmentID + AND sa.ArchivedDate IS NULL + AND c.Active = 1 + AND ca.RemovedDate IS NULL + AND ca.NonReportable = 0 + GROUP BY + sa.Name, + u.LastName + ', ' + u.FirstName, + da.Active, + u.ProfessionalRegistrationNumber, + jg.JobGroupName, + da.Answer1, da.Answer2, da.Answer3, da.Answer4, da.Answer5, da.Answer6, + da.DateRegistered, + ca.StartedDate, + ca.LastAccessed, + oc.OtherCentres, + aa.ID, aa.IsCentreManager, aa.IsCentreAdmin, aa.IsSupervisor, aa.IsNominatedSupervisor + ORDER BY + sa.Name, u.LastName + ', ' + u.FirstName; + +END; +GO \ No newline at end of file