diff --git a/DigitalLearningSolutions.Data.Migrations/202607281170_Alter_GetAssessmentResultsByDelegate.cs b/DigitalLearningSolutions.Data.Migrations/202607281170_Alter_GetAssessmentResultsByDelegate.cs new file mode 100644 index 0000000000..b31884687c --- /dev/null +++ b/DigitalLearningSolutions.Data.Migrations/202607281170_Alter_GetAssessmentResultsByDelegate.cs @@ -0,0 +1,17 @@ +namespace DigitalLearningSolutions.Data.Migrations +{ + using FluentMigrator; + + [Migration(202607301180)] + public class TD_7501_Alter_GetAssessmentResultsByDelegate : Migration + { + public override void Up() + { + Execute.Sql(Properties.Resources.TD_7501_Alter_GetAssessmentResultsByDelegate_Up); + } + public override void Down() + { + Execute.Sql(Properties.Resources.TD_7501_Alter_GetAssessmentResultsByDelegate_Down); + } + } +} diff --git a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs index a4d5b5db42..d248baf71a 100644 --- a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs +++ b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.Designer.cs @@ -3055,6 +3055,56 @@ internal static string TD_7397_Alter_usp_GetSelfAssessmentReport_Up { } } + /// + /// Looks up a localized string similar to + ////****** Object: StoredProcedure [dbo].[GetAssessmentResultsByDelegate] Script Date: 28/07/2026 13:18:46 ******/ + ///SET ANSI_NULLS ON + ///GO + ///SET QUOTED_IDENTIFIER ON + ///GO + ///-- ============================================= + ///-- Author: Auldrin Possa + ///-- Create date: 30/11/2023 + ///-- Description: Returns assessment results for a delegate + ///-- ============================================= + ///ALTER PROCEDURE [dbo].[GetAssessmentResultsByDelegate] + /// @selfAssessmentId as Int = 0, + /// @delegateId as int = 0 + ///AS + ///BEGIN + /// [rest of string was truncated]";. + /// + internal static string TD_7501_Alter_GetAssessmentResultsByDelegate_Down { + get { + return ResourceManager.GetString("TD_7501_Alter_GetAssessmentResultsByDelegate_Down", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to + ////****** Object: StoredProcedure [dbo].[GetAssessmentResultsByDelegate] Script Date: 28/07/2026 15:06:39 ******/ + ///SET ANSI_NULLS ON + ///GO + ///SET QUOTED_IDENTIFIER ON + ///GO + ///-- ============================================= + ///-- Author: Auldrin Possa + ///-- Create date: 30/11/2023 + ///-- Description: Returns assessment results for a delegate + ///-- ============================================= + ///ALTER PROCEDURE [dbo].[GetAssessmentResultsByDelegate] + /// @selfAssessmentId as Int = 0, + /// @delegateId as int = 0 + ///AS + ///BEGIN + /// [rest of string was truncated]";. + /// + internal static string TD_7501_Alter_GetAssessmentResultsByDelegate_Up { + get { + return ResourceManager.GetString("TD_7501_Alter_GetAssessmentResultsByDelegate_Up", resourceCulture); + } + } + /// /// Looks up a localized string similar to /****** Object: StoredProcedure [dbo].[GetActiveAvailableCustomisationsForCentreFiltered_V6] Script Date: 29/09/2022 19:11:04 ******/ ///SET ANSI_NULLS ON diff --git a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx index 4fa204ea85..2fb827fe89 100644 --- a/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx +++ b/DigitalLearningSolutions.Data.Migrations/Properties/Resources.resx @@ -553,4 +553,10 @@ ..\Scripts\TD-7397-Alter_usp_GetSelfAssessmentReport_Up.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 - + + ..\Resources\TD_7501_Alter_GetAssessmentResultsByDelegate_Down.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + + + ..\Resources\TD_7501_Alter_GetAssessmentResultsByDelegate_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/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Down.sql b/DigitalLearningSolutions.Data.Migrations/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Down.sql new file mode 100644 index 0000000000..33c9198547 Binary files /dev/null and b/DigitalLearningSolutions.Data.Migrations/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Down.sql differ diff --git a/DigitalLearningSolutions.Data.Migrations/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Up.sql b/DigitalLearningSolutions.Data.Migrations/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Up.sql new file mode 100644 index 0000000000..e83daf6853 --- /dev/null +++ b/DigitalLearningSolutions.Data.Migrations/Resources/TD_7501_Alter_GetAssessmentResultsByDelegate_Up.sql @@ -0,0 +1,128 @@ + +/****** Object: StoredProcedure [dbo].[GetAssessmentResultsByDelegate] Script Date: 28/07/2026 15:06:39 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: Auldrin Possa +-- Create date: 30/11/2023 +-- Description: Returns assessment results for a delegate +-- ============================================= +ALTER PROCEDURE [dbo].[GetAssessmentResultsByDelegate] + @selfAssessmentId as Int = 0, + @delegateId as int = 0 +AS +BEGIN + + SET NOCOUNT ON; + + WITH LatestAssessmentResults AS + ( + SELECT + s.CompetencyID, + s.AssessmentQuestionID, + s.ID AS ResultID, + s.DateTime AS ResultDateTime, + s.Result, + s.SupportingComments, + sv.ID AS SelfAssessmentResultSupervisorVerificationId, + sv.Requested, + sv.Verified, + sv.Comments, + sv.SignedOff, + adu.Forename + ' ' + adu.Surname AS SupervisorName, + sv.CandidateAssessmentSupervisorID, + sv.EmailSent, + 0 AS UserIsVerifier, + COALESCE (rr.LevelRAG, 0) AS ResultRAG + FROM SelfAssessmentResults s + LEFT OUTER JOIN DelegateAccounts AS da ON s.DelegateUserID = da.UserID + LEFT OUTER JOIN SelfAssessmentResultSupervisorVerifications AS sv + ON s.ID = sv.SelfAssessmentResultId AND sv.Superceded = 0 + LEFT OUTER JOIN CandidateAssessmentSupervisors AS cas + ON sv.CandidateAssessmentSupervisorID = cas.ID + LEFT OUTER JOIN SupervisorDelegates AS sd + ON cas.SupervisorDelegateId = sd.ID + LEFT OUTER JOIN AdminUsers AS adu + ON sd.SupervisorAdminID = adu.AdminID + LEFT OUTER JOIN CompetencyAssessmentQuestionRoleRequirements rr + ON s.CompetencyID = rr.CompetencyID AND s.AssessmentQuestionID = rr.AssessmentQuestionID + AND s.SelfAssessmentID = rr.SelfAssessmentID AND s.Result = rr.LevelValue + WHERE da.ID = @delegateId + ) + + + SELECT C.ID AS Id, + DENSE_RANK() OVER (ORDER BY SAS.Ordering) as RowNo, + C.Name AS Name, + C.Description AS Description, + COALESCE(CG.Name, 'Ungrouped') AS CompetencyGroup, + COALESCE(CG.ID, 0) AS CompetencyGroupID, + COALESCE(CG.Description, 'Competencies without a group') AS CompetencyGroupDescription, + COALESCE( + (SELECT TOP(1) FrameworkConfig + FROM Frameworks F + INNER JOIN FrameworkCompetencies AS FC + ON FC.FrameworkID = F.ID + WHERE FC.CompetencyID = C.ID), + 'Capability') AS Vocabulary, + 1 AS HasDelegateNominatedRoles, + SAS.Optional, + C.AlwaysShowDescription, + AQ.ID AS Id, + AQ.Question, + AQ.MaxValueDescription, + AQ.MinValueDescription, + AQ.ScoringInstructions, + AQ.MinValue, + AQ.MaxValue, + AQ.AssessmentQuestionInputTypeID, + AQ.IncludeComments, + AQ.CommentsPrompt, + AQ.CommentsHint, + CAQ.Required, + LAR.ResultId, + LAR.Result, + LAR.ResultDateTime, + LAR.SupportingComments, + LAR.SelfAssessmentResultSupervisorVerificationId, + LAR.Requested, + LAR.Verified, + LAR.Comments AS SupervisorComments, + LAR.SignedOff, + LAR.UserIsVerifier, + LAR.ResultRAG, + LAR.SupervisorName + + FROM Competencies AS C + INNER JOIN CompetencyAssessmentQuestions AS CAQ + ON CAQ.CompetencyID = C.ID + INNER JOIN AssessmentQuestions AS AQ + ON AQ.ID = CAQ.AssessmentQuestionID + INNER JOIN CandidateAssessments AS CA + ON CA.SelfAssessmentID = @selfAssessmentId AND CA.RemovedDate IS NULL + INNER JOIN DelegateAccounts AS DA ON CA.DelegateUserID = DA.UserID AND DA.ID = @delegateId + LEFT OUTER JOIN LatestAssessmentResults AS LAR + ON LAR.CompetencyID = C.ID AND LAR.AssessmentQuestionID = AQ.ID + INNER JOIN SelfAssessmentStructure AS SAS + ON C.ID = SAS.CompetencyID AND SAS.SelfAssessmentID = @selfAssessmentId + LEFT JOIN CompetencyGroups AS CG + ON SAS.CompetencyGroupID = CG.ID AND SAS.SelfAssessmentID = @selfAssessmentId + LEFT OUTER JOIN ( + SELECT + CandidateAssessmentID, + CompetencyID, + CompetencyGroupID, + CAST(MAX(CAST(IncludedInSelfAssessment AS int)) AS bit) AS IncludedInSelfAssessment + FROM CandidateAssessmentOptionalCompetencies + GROUP BY CandidateAssessmentID, CompetencyID, CompetencyGroupID + ) AS CAOC + ON CA.ID = CAOC.CandidateAssessmentID AND C.ID = CAOC.CompetencyID AND ( + CG.ID = CAOC.CompetencyGroupID + OR (CG.ID IS NULL AND CAOC.CompetencyGroupID IS NULL) + ) + + WHERE (CAOC.IncludedInSelfAssessment = 1) OR (SAS.Optional = 0) + ORDER BY SAS.Ordering, CAQ.Ordering +END \ No newline at end of file diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs index a11b3b3bc5..08d94e3798 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs @@ -459,10 +459,16 @@ INNER JOIN CandidateAssessments AS CA ON CA.SelfAssessmentID = @selfAssessmentId AND CA.DelegateUserID = @delegateUserId AND CA.RemovedDate IS NULL INNER JOIN SelfAssessmentStructure AS SAS ON C.ID = SAS.CompetencyID AND SAS.SelfAssessmentID = @selfAssessmentId - INNER JOIN CompetencyGroups AS CG + LEFT OUTER JOIN CompetencyGroups AS CG ON SAS.CompetencyGroupID = CG.ID AND SAS.SelfAssessmentID = @selfAssessmentId - LEFT OUTER JOIN CandidateAssessmentOptionalCompetencies AS CAOC - ON CA.ID = CAOC.CandidateAssessmentID AND C.ID = CAOC.CompetencyID AND CG.ID = CAOC.CompetencyGroupID + LEFT OUTER JOIN (SELECT + CandidateAssessmentID, + CompetencyID, + CAST(MAX(CAST(IncludedInSelfAssessment AS int)) AS bit) AS IncludedInSelfAssessment + FROM CandidateAssessmentOptionalCompetencies + GROUP BY CandidateAssessmentID, CompetencyID + ) AS CAOC + ON CA.ID = CAOC.CandidateAssessmentID AND C.ID = CAOC.CompetencyID WHERE (SAS.Optional = 1) ORDER BY SAS.Ordering", new { selfAssessmentId, delegateUserId } @@ -474,12 +480,16 @@ public void InsertCandidateAssessmentOptionalCompetenciesIfNotExist(int selfAsse connection.Execute( @"UPDATE CandidateAssessmentOptionalCompetencies SET IncludedInSelfAssessment = 0 - FROM CandidateAssessmentOptionalCompetencies AS CAOC + FROM ( + SELECT DISTINCT + CandidateAssessmentID, + CompetencyID + FROM CandidateAssessmentOptionalCompetencies + ) AS CAOC INNER JOIN CandidateAssessments AS CA ON CAOC.CandidateAssessmentID = CA.ID INNER JOIN SelfAssessmentStructure AS SAS ON CA.SelfAssessmentID = SAS.SelfAssessmentID AND CAOC.CompetencyID = SAS.CompetencyID AND CA.SelfAssessmentID = @selfAssessmentId - AND CAOC.CompetencyGroupID = SAS.CompetencyGroupID WHERE (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL) ", new { selfAssessmentId, delegateUserId } @@ -504,12 +514,16 @@ public void UpdateCandidateAssessmentOptionalCompetencies(int selfAssessmentStru var numberOfAffectedRows = connection.Execute( @"UPDATE CandidateAssessmentOptionalCompetencies SET IncludedInSelfAssessment = 1 - FROM CandidateAssessmentOptionalCompetencies AS CAOC + FROM ( + SELECT DISTINCT + CandidateAssessmentID, + CompetencyID + FROM CandidateAssessmentOptionalCompetencies + ) AS CAOC INNER JOIN CandidateAssessments AS CA ON CAOC.CandidateAssessmentID = CA.ID INNER JOIN SelfAssessmentStructure AS SAS ON CA.SelfAssessmentID = SAS.SelfAssessmentID AND CAOC.CompetencyID = SAS.CompetencyID - AND CAOC.CompetencyGroupID = SAS.CompetencyGroupID WHERE (SAS.ID = @selfAssessmentStructureId) AND (CA.DelegateUserID = @delegateUserId) AND (CA.RemovedDate IS NULL)", new { selfAssessmentStructureId, delegateUserId } ); @@ -553,14 +567,21 @@ public List GetCandidateAssessmentIncludedSelfAssessmentStructureIds(int se return connection.Query( @"SELECT SAS.ID - FROM CandidateAssessmentOptionalCompetencies AS CAOC - INNER JOIN CandidateAssessments AS CA - ON CAOC.CandidateAssessmentID = CA.ID AND CA.SelfAssessmentID = @selfAssessmentId - AND CA.DelegateUserID = @delegateUserId AND CA.RemovedDate IS NULL + FROM ( + SELECT DISTINCT + CandidateAssessmentID, + CompetencyID + FROM CandidateAssessmentOptionalCompetencies + WHERE IncludedInSelfAssessment = 1 + ) AS CAOC + INNER JOIN CandidateAssessments AS CA + ON CAOC.CandidateAssessmentID = CA.ID + AND CA.SelfAssessmentID = @selfAssessmentId + AND CA.DelegateUserID = @delegateUserId + AND CA.RemovedDate IS NULL INNER JOIN SelfAssessmentStructure AS SAS - ON CAOC.CompetencyID = SAS.CompetencyID AND CAOC.CompetencyGroupID = SAS.CompetencyGroupID - AND SAS.SelfAssessmentID = @selfAssessmentId - WHERE (CAOC.IncludedInSelfAssessment = 1)", + ON CAOC.CompetencyID = SAS.CompetencyID + AND SAS.SelfAssessmentID = @selfAssessmentId;", new { selfAssessmentId, delegateUserId } ).ToList(); }