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();
}