diff --git a/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj b/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj index 5be3c7dcf..14ddfdbde 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj +++ b/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj @@ -92,7 +92,7 @@ - + diff --git a/LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj b/LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj index 5941936e3..a59bfcbcb 100644 --- a/LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj +++ b/LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj @@ -111,7 +111,7 @@ - + diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj index 7a4aad8fc..e7faef3dd 100644 --- a/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj +++ b/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj @@ -16,7 +16,7 @@ - + diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj index 1f6967d55..38a5e9711 100644 --- a/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj +++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj @@ -16,7 +16,7 @@ - + diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj index 0ca91c767..3524cb9e4 100644 --- a/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj +++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj @@ -24,7 +24,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj b/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj index 6ffba9df6..6a57923bd 100644 --- a/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj +++ b/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj @@ -30,7 +30,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj b/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj index 831497bc2..fa26a95ea 100644 --- a/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj +++ b/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj @@ -9,7 +9,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj b/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj index 6da2ec625..17b974e8b 100644 --- a/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj +++ b/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj @@ -11,7 +11,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj index 054baf7a8..42a432ae2 100644 --- a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj +++ b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj @@ -535,6 +535,7 @@ + diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetAssessmentActivityCompletionPercentage.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetAssessmentActivityCompletionPercentage.sql new file mode 100644 index 000000000..7b8c747ef --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetAssessmentActivityCompletionPercentage.sql @@ -0,0 +1,30 @@ +-- ============================================= +-- Author: Swapnamol Abraham +-- Create date: 17-12-2024 +-- Description: To get the details of completion percentage for an assessment with questionBlock +-- ============================================= +CREATE PROCEDURE [activity].[GetAssessmentActivityCompletionPercentage] + @userId INT, + @ResourceVersionId INT, + @activityId INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + SELECT @activityId as ResourceActivityId, + TotalQuestions, + CompletedQuestions, + CASE WHEN TotalQuestions = 0 THEN 0 ELSE (CompletedQuestions/TotalQuestions)*100 END AS CompletionPercentage +FROM + (select count(ARV.Id) as TotalQuestions from resources.AssessmentResourceVersion ARV + INNER JOIN [resources].[BlockCollection] AS BC ON BC.Id = ARV.AssessmentContentId + LEFT JOIN [resources].[Block] AS B ON B.BlockCollectionId = BC.Id + WHERE B.BlockType = 4 AND arv.ResourceVersionId = @ResourceVersionId AND BC.Deleted = 0 ) AS Total, + + (select count(ARA.Id) As completedQuestions from [activity].[AssessmentResourceActivity] ARA +LEFT JOIN [activity].[AssessmentResourceActivityInteraction] ARAI ON ARA.Id = ARAI.AssessmentResourceActivityId +Where ResourceActivityId = @activityId AND ARAI.Deleted = 0 ) AS Completed; + +END \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLatestActivityCheck.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLatestActivityCheck.sql index edb56b5ad..893febb4e 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLatestActivityCheck.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLatestActivityCheck.sql @@ -8,7 +8,7 @@ -- Sarathlal 20-02-2024 -- Sarathlal 23-04-2024 TD-2954: Audio/Video/Assessment issue resolved and duplicate issue also resolved -- Sarathlal 25-04-2024 TD-4067: Resource with muliple version issue resolved --- Arunima 11-10-2024 TD-4261: Duplicate entries for the assessment results(elearning) in the My Learning page +-- Swapna 18-12-2024 TD-5078: Removed block collection joins from the SP to improve the performance of the page ------------------------------------------------------------------------------- CREATE PROCEDURE [activity].[GetUserLatestActivityCheck] ( @@ -39,9 +39,6 @@ BEGIN ,[t2].[MaximumAttempts] AS ResourceVersion_MaximumAttempts, [t2].[PassMark] AS ResourceVersion_PassMark,[t2].[AssessmentType] as ResourceVersion_AssessmentResourceVersion_AssessmentType --Resource version columns ends here - --Block columns starts here - ,[t10].Id as Block_BlockId,[t10].[BlockCollectionId] as Block_BlockCollectionId, [t10].[BlockType] as Block_BlockType,[t10].[Title] as Block_Title, [t10].[Order] as Block_Order - --Block columns ends here --Video resource version starts here ,[VideoResourceVersion].[AmendDate] as VideoResourcVersion_AmendDate, [VideoResourceVersion].[AmendUserId] AS VideoResourcVersion_AmendUserId , [VideoResourceVersion].[ClosedCaptionsFileId] AS VideoResourcVersion_ClosedCaptionsFileId, [VideoResourceVersion].[CreateDate] AS VideoResourcVersion_CreateDate, [VideoResourceVersion].[CreateUserId] AS VideoResourcVersion_CreateUserId, [VideoResourceVersion].[Deleted] AS VideoResourcVersion_Deleted, [VideoResourceVersion].[DurationInMilliseconds] AS VideoResourcVersion_DurationInMilliseconds, [VideoResourceVersion].[ResourceAzureMediaAssetId] AS VideoResourcVersion_ResourceAzureMediaAssetId, [VideoResourceVersion].[ResourceVersionId] AS VideoResourcVersion_ResourceVersionId, @@ -75,9 +72,7 @@ BEGIN --Assessment Resource activity startes here ,[t11].[Reason] as AssessmentResourceActivity_Reason, [t11].[ResourceActivityId] as AssessmentResourceActivity_ResourceActivityId ,[t11].[Score] as AssessmentResourceActivity_Score - ,[t11].[Id0] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_Id,[t11].[QuestionBlockId] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_QuestionBlockId, - [t11].[AssessmentResourceActivityId] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_AssessmentResourceActivityId - ,[t11].[AssessmentResourceActivityId] as AssessmentResourceActivity_AssessmentResourceActivityId + ,[t11].[Id] as AssessmentResourceActivity_AssessmentResourceActivityId ,[t11].[Id] as AssessmentResourceActivity_Id --Assessment resource activity ends here @@ -176,22 +171,45 @@ FROM ( ) AS [t2] LEFT JOIN [resources].[VideoResourceVersion] AS [VideoResourceVersion] ON [t2].[Id1] = [VideoResourceVersion].[ResourceVersionId] LEFT JOIN [resources].[AudioResourceVersion] AS [AudeoResourceVersion] ON [t2].[Id1] = [AudeoResourceVersion].[ResourceVersionId] -LEFT JOIN [resources].[ScormResourceVersion] AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] and t3.Deleted=0 -LEFT JOIN [resources].[ScormResourceVersionManifest] AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] and [t4].[Deleted] = 0 -LEFT JOIN [resources].[BlockCollection] AS [t5] ON [t2].[AssessmentContentId] = [t5].[Id] AND [t5].[Deleted] = 0 -INNER JOIN [hierarchy].[NodePath] AS [t6] ON [t2].[NodePathId] = [t6].[Id] AND [t6].[Deleted] = 0 -LEFT JOIN [resources].[ResourceReference] AS [t7] ON [t2].[Id0] = [t7].[ResourceId] AND [t7].[Deleted] = 0 -LEFT JOIN [activity].[MediaResourceActivity] AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] AND [t8].[Deleted] = 0 -LEFT JOIN [activity].[ScormActivity] AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] AND [t9].[Deleted] = 0 -LEFT JOIN [resources].[Block] AS [t10] ON [t5].[Id] = [t10].[BlockCollectionId] AND [t10].[Deleted] = 0 LEFT JOIN ( - SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score], [t12].[Id] AS [Id0], [t12].[AmendDate] AS [AmendDate0], [t12].[AmendUserID] AS [AmendUserID0], [t12].[AssessmentResourceActivityId], [t12].[CreateDate] AS [CreateDate0], [t12].[CreateUserID] AS [CreateUserID0], [t12].[Deleted] AS [Deleted0], [t12].[QuestionBlockId] + SELECT [ScormResourceVersion2].[Id], [ScormResourceVersion2].[AmendDate], [ScormResourceVersion2].[AmendUserId], [ScormResourceVersion2].[CanDownload], [ScormResourceVersion2].[ClearSuspendData], [ScormResourceVersion2].[ContentFilePath], [ScormResourceVersion2].[CreateDate], [ScormResourceVersion2].[CreateUserId], [ScormResourceVersion2].[Deleted], [ScormResourceVersion2].[DevelopmentId], [ScormResourceVersion2].[EsrLinkTypeId], [ScormResourceVersion2].[FileId], [ScormResourceVersion2].[PopupHeight], [ScormResourceVersion2].[PopupWidth], [ScormResourceVersion2].[ResourceVersionId] + FROM [resources].[ScormResourceVersion] AS [ScormResourceVersion2] + WHERE [ScormResourceVersion2].[Deleted] = 0 +) AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] +LEFT JOIN ( + SELECT [ScormResourceVersionManifest3].[Id], [ScormResourceVersionManifest3].[AmendDate], [ScormResourceVersionManifest3].[AmendUserId], [ScormResourceVersionManifest3].[Author], [ScormResourceVersionManifest3].[CatalogEntry], [ScormResourceVersionManifest3].[Copyright], [ScormResourceVersionManifest3].[CreateDate], [ScormResourceVersionManifest3].[CreateUserId], [ScormResourceVersionManifest3].[Deleted], [ScormResourceVersionManifest3].[Description], [ScormResourceVersionManifest3].[Duration], [ScormResourceVersionManifest3].[ItemIdentifier], [ScormResourceVersionManifest3].[Keywords], [ScormResourceVersionManifest3].[LaunchData], [ScormResourceVersionManifest3].[ManifestURL], [ScormResourceVersionManifest3].[MasteryScore], [ScormResourceVersionManifest3].[MaxTimeAllowed], [ScormResourceVersionManifest3].[QuicklinkId], [ScormResourceVersionManifest3].[ResourceIdentifier], [ScormResourceVersionManifest3].[ScormResourceVersionId], [ScormResourceVersionManifest3].[TemplateVersion], [ScormResourceVersionManifest3].[TimeLimitAction], [ScormResourceVersionManifest3].[Title] + FROM [resources].[ScormResourceVersionManifest] AS [ScormResourceVersionManifest3] + WHERE [ScormResourceVersionManifest3].[Deleted] = 0 +) AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] +INNER JOIN ( + SELECT [NodePath].[Id], [NodePath].[AmendDate], [NodePath].[AmendUserId], [NodePath].[CatalogueNodeId], [NodePath].[CreateDate], [NodePath].[CreateUserId], [NodePath].[Deleted], [NodePath].[IsActive], [NodePath].[NodeId], [NodePath].[NodePath] + FROM [hierarchy].[NodePath] AS [NodePath] + WHERE [NodePath].[Deleted] = 0 +) AS [t6] ON [t2].[NodePathId] = [t6].[Id] +LEFT JOIN ( + SELECT [ResourceReference5].[Id], [ResourceReference5].[AmendDate], [ResourceReference5].[AmendUserId], [ResourceReference5].[CreateDate], [ResourceReference5].[CreateUserId], [ResourceReference5].[Deleted], [ResourceReference5].[NodePathId], [ResourceReference5].[OriginalResourceReferenceId], [ResourceReference5].[ResourceId] + FROM [resources].[ResourceReference] AS [ResourceReference5] + WHERE [ResourceReference5].[Deleted] = 0 +) AS [t7] ON [t2].[Id0] = [t7].[ResourceId] +LEFT JOIN ( + SELECT [MediaResourceActivity3].[Id], [MediaResourceActivity3].[ActivityStart], [MediaResourceActivity3].[AmendDate], [MediaResourceActivity3].[AmendUserID], [MediaResourceActivity3].[CreateDate], [MediaResourceActivity3].[CreateUserID], [MediaResourceActivity3].[Deleted], [MediaResourceActivity3].[PercentComplete], [MediaResourceActivity3].[ResourceActivityId], [MediaResourceActivity3].[SecondsPlayed] + FROM [activity].[MediaResourceActivity] AS [MediaResourceActivity3] + WHERE [MediaResourceActivity3].[Deleted] = 0 +) AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] +LEFT JOIN ( + SELECT [ScormActivity4].[Id], [ScormActivity4].[AmendDate], [ScormActivity4].[AmendUserID], [ScormActivity4].[CmiCoreExit], [ScormActivity4].[CmiCoreLesson_location], [ScormActivity4].[CmiCoreLesson_status], [ScormActivity4].[CmiCoreScoreMax], [ScormActivity4].[CmiCoreScoreMin], [ScormActivity4].[CmiCoreScoreRaw], [ScormActivity4].[CmiCoreSession_time], [ScormActivity4].[CmiSuspend_data], [ScormActivity4].[CreateDate], [ScormActivity4].[CreateUserID], [ScormActivity4].[Deleted], [ScormActivity4].[DurationSeconds], [ScormActivity4].[ResourceActivityId] + FROM [activity].[ScormActivity] AS [ScormActivity4] + WHERE [ScormActivity4].[Deleted] = 0 +) AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] +LEFT JOIN ( + SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score] FROM [activity].[AssessmentResourceActivity] AS [AssessmentResourceActivity5] - LEFT JOIN [activity].[AssessmentResourceActivityInteraction] AS [t12] ON [AssessmentResourceActivity5].[Id] = [t12].[AssessmentResourceActivityId] AND [t12].[Deleted] = 0 WHERE [AssessmentResourceActivity5].[Deleted] = 0 ) AS [t11] ON [t2].[Id] = [t11].[ResourceActivityId] WHERE t2.ResourceVersionId=@ResourceVersionId -ORDER BY [t2].[ActivityStart] DESC, [t2].[Id], [t2].[Id0], [t2].[Id1], [t2].[Id2], [VideoResourceVersion].[Id], [AudeoResourceVersion].[Id], [t3].[Id], [t4].[Id], [t5].[Id], [t6].[Id], [t7].[Id], [t8].[Id], [t9].[Id], [t10].[Id], [t11].[Id] +ORDER BY [t2].[ActivityStart] DESC, [t2].[Id], [t2].[Id0], [t2].[Id1], [t2].[Id2], [VideoResourceVersion].[Id], [AudeoResourceVersion].[Id], [t3].[Id], [t4].[Id], +[t6].[Id], [t7].[Id], [t8].[Id], [t9].[Id], +[t11].[Id] END \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivities.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivities.sql index 0738ac2ac..bc4088a5d 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivities.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivities.sql @@ -10,8 +10,8 @@ -- Sarathlal 08-03-2024 -- Sarathlal 23-04-2024 TD-2954: Audio/Video/Assessment issue resolved and duplicate issue also resolved -- Sarathlal 25-04-2024 TD-4067: Resource with muliple version issue resolved --- Arunima 26-07-2024 TD-4411: "Completed" filter along with "Assessment" doesn't display the correct results --- Arunima 11-10-2024 TD-4261: Duplicate entries for the assessment results(elearning) in the My Learning page +-- Arunima 26-07-2024 TD-4411: "Completed" filter along with "Assessment" doesn't display the correct results +-- Swapna 18-12-2024 TD-5078: Removed block collection joins from the SP to improve the performance of the page ------------------------------------------------------------------------------- CREATE PROCEDURE [activity].[GetUserLearningActivities] ( @userId INT @@ -80,9 +80,6 @@ BEGIN ,[t2].[MaximumAttempts] AS ResourceVersion_MaximumAttempts, [t2].[PassMark] AS ResourceVersion_PassMark, [t2].[AssessmentType] as ResourceVersion_AssessmentResourceVersion_AssessmentType --Resource version columns ends here - --Block columns starts here - ,[t10].Id as Block_BlockId,[t10].[BlockCollectionId] as Block_BlockCollectionId, [t10].[BlockType] as Block_BlockType,[t10].[Title] as Block_Title, [t10].[Order] as Block_Order - --Block columns ends here --Video resource version starts here ,[VideoResourceVersion].[AmendDate] as VideoResourcVersion_AmendDate, [VideoResourceVersion].[AmendUserId] AS VideoResourcVersion_AmendUserId , [VideoResourceVersion].[ClosedCaptionsFileId] AS VideoResourcVersion_ClosedCaptionsFileId, [VideoResourceVersion].[CreateDate] AS VideoResourcVersion_CreateDate, [VideoResourceVersion].[CreateUserId] AS VideoResourcVersion_CreateUserId, [VideoResourceVersion].[Deleted] AS VideoResourcVersion_Deleted, [VideoResourceVersion].[DurationInMilliseconds] AS VideoResourcVersion_DurationInMilliseconds, [VideoResourceVersion].[ResourceAzureMediaAssetId] AS VideoResourcVersion_ResourceAzureMediaAssetId, [VideoResourceVersion].[ResourceVersionId] AS VideoResourcVersion_ResourceVersionId, @@ -118,9 +115,7 @@ BEGIN ,[t11].[Reason] as AssessmentResourceActivity_Reason, [t11].[ResourceActivityId] as AssessmentResourceActivity_ResourceActivityId ,[t11].[Score] as AssessmentResourceActivity_Score - ,[t11].[Id0] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_Id,[t11].[QuestionBlockId] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_QuestionBlockId, - [t11].[AssessmentResourceActivityId] as AssessmentResourceActivity_AssessmentResourceActivityInteraction_AssessmentResourceActivityId - ,[t11].[AssessmentResourceActivityId] as AssessmentResourceActivity_AssessmentResourceActivityId + ,[t11].ResourceActivityId as AssessmentResourceActivity_AssessmentResourceActivityId ,[t11].[Id] as AssessmentResourceActivity_Id --Assessment resource activity ends here @@ -216,7 +211,7 @@ FROM ( WHERE ([ScormActivity].[Deleted] = 0 AND [ResourceActivity].[Id] = [ScormActivity].[ResourceActivityId]) ) IS NULL - ) + ) AND ( ( @@ -228,17 +223,12 @@ FROM ( )) ) OR - ( -- or launch resource activity completed EXISTS ( SELECT 1 FROM [activity].[ResourceActivity] AS [ResAct2] WHERE [ResAct2].[Deleted] = 0 AND [ResourceActivity].[Id] = [ResAct2].[LaunchResourceActivityId] AND [ResAct2].[ActivityStatusId] in (3,7,5,4) ) - AND - ( - [Res].[ResourceTypeId] <> 6) - ) ) AND @@ -364,7 +354,7 @@ FROM ( ( (SELECT TOP(1) [ScormActivity1].[CmiCoreLesson_status] FROM [activity].[ScormActivity] AS [ScormActivity1] - WHERE [ScormActivity1].[Deleted] = 0 AND [ResourceActivity].[Id] = [ScormActivity1].[ResourceActivityId]) = 7 + WHERE [ScormActivity1].[Deleted] = 0 AND [ResourceActivity].[Id] = [ScormActivity1].[ResourceActivityId]) = 2 ) ) @@ -487,20 +477,43 @@ FROM ( ) AS [t2] LEFT JOIN [resources].[VideoResourceVersion] AS [VideoResourceVersion] ON [t2].[Id1] = [VideoResourceVersion].[ResourceVersionId] LEFT JOIN [resources].[AudioResourceVersion] AS [AudeoResourceVersion] ON [t2].[Id1] = [AudeoResourceVersion].[ResourceVersionId] -LEFT JOIN [resources].[ScormResourceVersion] AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] and t3.Deleted=0 -LEFT JOIN [resources].[ScormResourceVersionManifest] AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] and [t4].[Deleted] = 0 -LEFT JOIN [resources].[BlockCollection] AS [t5] ON [t2].[AssessmentContentId] = [t5].[Id] AND [t5].[Deleted] = 0 -INNER JOIN [hierarchy].[NodePath] AS [t6] ON [t2].[NodePathId] = [t6].[Id] AND [t6].[Deleted] = 0 -LEFT JOIN [resources].[ResourceReference] AS [t7] ON [t2].[Id0] = [t7].[ResourceId] AND [t7].[Deleted] = 0 -LEFT JOIN [activity].[MediaResourceActivity] AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] AND [t8].[Deleted] = 0 -LEFT JOIN [activity].[ScormActivity] AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] AND [t9].[Deleted] = 0 -LEFT JOIN [resources].[Block] AS [t10] ON [t5].[Id] = [t10].[BlockCollectionId] AND [t10].[Deleted] = 0 LEFT JOIN ( - SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score], [t12].[Id] AS [Id0], [t12].[AmendDate] AS [AmendDate0], [t12].[AmendUserID] AS [AmendUserID0], [t12].[AssessmentResourceActivityId], [t12].[CreateDate] AS [CreateDate0], [t12].[CreateUserID] AS [CreateUserID0], [t12].[Deleted] AS [Deleted0], [t12].[QuestionBlockId] + SELECT [ScormResourceVersion2].[Id], [ScormResourceVersion2].[AmendDate], [ScormResourceVersion2].[AmendUserId], [ScormResourceVersion2].[CanDownload], [ScormResourceVersion2].[ClearSuspendData], [ScormResourceVersion2].[ContentFilePath], [ScormResourceVersion2].[CreateDate], [ScormResourceVersion2].[CreateUserId], [ScormResourceVersion2].[Deleted], [ScormResourceVersion2].[DevelopmentId], [ScormResourceVersion2].[EsrLinkTypeId], [ScormResourceVersion2].[FileId], [ScormResourceVersion2].[PopupHeight], [ScormResourceVersion2].[PopupWidth], [ScormResourceVersion2].[ResourceVersionId] + FROM [resources].[ScormResourceVersion] AS [ScormResourceVersion2] + WHERE [ScormResourceVersion2].[Deleted] = 0 +) AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] +LEFT JOIN ( + SELECT [ScormResourceVersionManifest3].[Id], [ScormResourceVersionManifest3].[AmendDate], [ScormResourceVersionManifest3].[AmendUserId], [ScormResourceVersionManifest3].[Author], [ScormResourceVersionManifest3].[CatalogEntry], [ScormResourceVersionManifest3].[Copyright], [ScormResourceVersionManifest3].[CreateDate], [ScormResourceVersionManifest3].[CreateUserId], [ScormResourceVersionManifest3].[Deleted], [ScormResourceVersionManifest3].[Description], [ScormResourceVersionManifest3].[Duration], [ScormResourceVersionManifest3].[ItemIdentifier], [ScormResourceVersionManifest3].[Keywords], [ScormResourceVersionManifest3].[LaunchData], [ScormResourceVersionManifest3].[ManifestURL], [ScormResourceVersionManifest3].[MasteryScore], [ScormResourceVersionManifest3].[MaxTimeAllowed], [ScormResourceVersionManifest3].[QuicklinkId], [ScormResourceVersionManifest3].[ResourceIdentifier], [ScormResourceVersionManifest3].[ScormResourceVersionId], [ScormResourceVersionManifest3].[TemplateVersion], [ScormResourceVersionManifest3].[TimeLimitAction], [ScormResourceVersionManifest3].[Title] + FROM [resources].[ScormResourceVersionManifest] AS [ScormResourceVersionManifest3] + WHERE [ScormResourceVersionManifest3].[Deleted] = 0 +) AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] +INNER JOIN ( + SELECT [NodePath].[Id], [NodePath].[AmendDate], [NodePath].[AmendUserId], [NodePath].[CatalogueNodeId], [NodePath].[CreateDate], [NodePath].[CreateUserId], [NodePath].[Deleted], [NodePath].[IsActive], [NodePath].[NodeId], [NodePath].[NodePath] + FROM [hierarchy].[NodePath] AS [NodePath] + WHERE [NodePath].[Deleted] = 0 +) AS [t6] ON [t2].[NodePathId] = [t6].[Id] +LEFT JOIN ( + SELECT [ResourceReference5].[Id], [ResourceReference5].[AmendDate], [ResourceReference5].[AmendUserId], [ResourceReference5].[CreateDate], [ResourceReference5].[CreateUserId], [ResourceReference5].[Deleted], [ResourceReference5].[NodePathId], [ResourceReference5].[OriginalResourceReferenceId], [ResourceReference5].[ResourceId] + FROM [resources].[ResourceReference] AS [ResourceReference5] + WHERE [ResourceReference5].[Deleted] = 0 +) AS [t7] ON [t2].[Id0] = [t7].[ResourceId] +LEFT JOIN ( + SELECT [MediaResourceActivity3].[Id], [MediaResourceActivity3].[ActivityStart], [MediaResourceActivity3].[AmendDate], [MediaResourceActivity3].[AmendUserID], [MediaResourceActivity3].[CreateDate], [MediaResourceActivity3].[CreateUserID], [MediaResourceActivity3].[Deleted], [MediaResourceActivity3].[PercentComplete], [MediaResourceActivity3].[ResourceActivityId], [MediaResourceActivity3].[SecondsPlayed] + FROM [activity].[MediaResourceActivity] AS [MediaResourceActivity3] + WHERE [MediaResourceActivity3].[Deleted] = 0 +) AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] +LEFT JOIN ( + SELECT [ScormActivity4].[Id], [ScormActivity4].[AmendDate], [ScormActivity4].[AmendUserID], [ScormActivity4].[CmiCoreExit], [ScormActivity4].[CmiCoreLesson_location], [ScormActivity4].[CmiCoreLesson_status], [ScormActivity4].[CmiCoreScoreMax], [ScormActivity4].[CmiCoreScoreMin], [ScormActivity4].[CmiCoreScoreRaw], [ScormActivity4].[CmiCoreSession_time], [ScormActivity4].[CmiSuspend_data], [ScormActivity4].[CreateDate], [ScormActivity4].[CreateUserID], [ScormActivity4].[Deleted], [ScormActivity4].[DurationSeconds], [ScormActivity4].[ResourceActivityId] + FROM [activity].[ScormActivity] AS [ScormActivity4] + WHERE [ScormActivity4].[Deleted] = 0 +) AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] +LEFT JOIN ( + SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score] FROM [activity].[AssessmentResourceActivity] AS [AssessmentResourceActivity5] - LEFT JOIN [activity].[AssessmentResourceActivityInteraction] AS [t12] ON [AssessmentResourceActivity5].[Id] = [t12].[AssessmentResourceActivityId] AND [t12].[Deleted] = 0 WHERE [AssessmentResourceActivity5].[Deleted] = 0 ) AS [t11] ON [t2].[Id] = [t11].[ResourceActivityId] -ORDER BY [t2].[ActivityStart] DESC, [t2].[Id], [t2].[Id0], [t2].[Id1], [t2].[Id2], [VideoResourceVersion].[Id], [AudeoResourceVersion].[Id], [t3].[Id], [t4].[Id], [t5].[Id], [t6].[Id], [t7].[Id], [t8].[Id], [t9].[Id], [t10].[Id], [t11].[Id] +ORDER BY [t2].[ActivityStart] DESC, [t2].[Id], [t2].[Id0], [t2].[Id1], [t2].[Id2], [VideoResourceVersion].[Id], [AudeoResourceVersion].[Id], [t3].[Id], [t4].[Id], +[t6].[Id], [t7].[Id], [t8].[Id], [t9].[Id], +[t11].[Id] END \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivitiesCount.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivitiesCount.sql index 255339687..19801209f 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivitiesCount.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Activity/GetUserLearningActivitiesCount.sql @@ -9,8 +9,8 @@ -- Sarathlal 18-12-2023 -- Sarathlal 08-03-2024 -- Sarathlal 23-04-2024 TD-2954: Audio/Video/Assessment issue resolved and duplicate issue also resolved --- Arunima 26-07-2024 TD-4411: "Completed" filter along with "Assessment" doesn't display the correct results --- Arunima 11-10-2024 TD-4261: Duplicate entries for the assessment results(elearning) in the My Learning page +-- Arunima 26-07-2024 TD-4411: "Completed" filter along with "Assessment" doesn't display the correct results +-- Swapna 18-12-2024 TD-5078: Removed block collection joins from the SP to improve the performance of the page ------------------------------------------------------------------------------- CREATE PROCEDURE [activity].[GetUserLearningActivitiesCount] ( @userId INT @@ -143,16 +143,12 @@ FROM ( )) ) OR - ( -- or launch resource activity completed EXISTS ( SELECT 1 FROM [activity].[ResourceActivity] AS [ResAct2] WHERE [ResAct2].[Deleted] = 0 AND [ResourceActivity].[Id] = [ResAct2].[LaunchResourceActivityId] AND [ResAct2].[ActivityStatusId] in (3,7,5,4) ) - AND - ([Res].[ResourceTypeId] <> 6) - ) ) AND @@ -278,7 +274,7 @@ FROM ( ( (SELECT TOP(1) [ScormActivity1].[CmiCoreLesson_status] FROM [activity].[ScormActivity] AS [ScormActivity1] - WHERE [ScormActivity1].[Deleted] = 0 AND [ResourceActivity].[Id] = [ScormActivity1].[ResourceActivityId]) = 7 + WHERE [ScormActivity1].[Deleted] = 0 AND [ResourceActivity].[Id] = [ScormActivity1].[ResourceActivityId]) = 2 ) ) @@ -398,18 +394,39 @@ FROM ( ) AS [t2] LEFT JOIN [resources].[VideoResourceVersion] AS [VideoResourceVersion] ON [t2].[Id1] = [VideoResourceVersion].[ResourceVersionId] LEFT JOIN [resources].[AudioResourceVersion] AS [AudeoResourceVersion] ON [t2].[Id1] = [AudeoResourceVersion].[ResourceVersionId] -LEFT JOIN [resources].[ScormResourceVersion] AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] and t3.Deleted=0 -LEFT JOIN [resources].[ScormResourceVersionManifest] AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] and [t4].[Deleted] = 0 -LEFT JOIN [resources].[BlockCollection] AS [t5] ON [t2].[AssessmentContentId] = [t5].[Id] AND [t5].[Deleted] = 0 -INNER JOIN [hierarchy].[NodePath] AS [t6] ON [t2].[NodePathId] = [t6].[Id] AND [t6].[Deleted] = 0 -LEFT JOIN [resources].[ResourceReference] AS [t7] ON [t2].[Id0] = [t7].[ResourceId] AND [t7].[Deleted] = 0 -LEFT JOIN [activity].[MediaResourceActivity] AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] AND [t8].[Deleted] = 0 -LEFT JOIN [activity].[ScormActivity] AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] AND [t9].[Deleted] = 0 -LEFT JOIN [resources].[Block] AS [t10] ON [t5].[Id] = [t10].[BlockCollectionId] AND [t10].[Deleted] = 0 LEFT JOIN ( - SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score], [t12].[Id] AS [Id0], [t12].[AmendDate] AS [AmendDate0], [t12].[AmendUserID] AS [AmendUserID0], [t12].[AssessmentResourceActivityId], [t12].[CreateDate] AS [CreateDate0], [t12].[CreateUserID] AS [CreateUserID0], [t12].[Deleted] AS [Deleted0], [t12].[QuestionBlockId] + SELECT [ScormResourceVersion2].[Id], [ScormResourceVersion2].[AmendDate], [ScormResourceVersion2].[AmendUserId], [ScormResourceVersion2].[CanDownload], [ScormResourceVersion2].[ClearSuspendData], [ScormResourceVersion2].[ContentFilePath], [ScormResourceVersion2].[CreateDate], [ScormResourceVersion2].[CreateUserId], [ScormResourceVersion2].[Deleted], [ScormResourceVersion2].[DevelopmentId], [ScormResourceVersion2].[EsrLinkTypeId], [ScormResourceVersion2].[FileId], [ScormResourceVersion2].[PopupHeight], [ScormResourceVersion2].[PopupWidth], [ScormResourceVersion2].[ResourceVersionId] + FROM [resources].[ScormResourceVersion] AS [ScormResourceVersion2] + WHERE [ScormResourceVersion2].[Deleted] = 0 +) AS [t3] ON [t2].[Id1] = [t3].[ResourceVersionId] +LEFT JOIN ( + SELECT [ScormResourceVersionManifest3].[Id], [ScormResourceVersionManifest3].[AmendDate], [ScormResourceVersionManifest3].[AmendUserId], [ScormResourceVersionManifest3].[Author], [ScormResourceVersionManifest3].[CatalogEntry], [ScormResourceVersionManifest3].[Copyright], [ScormResourceVersionManifest3].[CreateDate], [ScormResourceVersionManifest3].[CreateUserId], [ScormResourceVersionManifest3].[Deleted], [ScormResourceVersionManifest3].[Description], [ScormResourceVersionManifest3].[Duration], [ScormResourceVersionManifest3].[ItemIdentifier], [ScormResourceVersionManifest3].[Keywords], [ScormResourceVersionManifest3].[LaunchData], [ScormResourceVersionManifest3].[ManifestURL], [ScormResourceVersionManifest3].[MasteryScore], [ScormResourceVersionManifest3].[MaxTimeAllowed], [ScormResourceVersionManifest3].[QuicklinkId], [ScormResourceVersionManifest3].[ResourceIdentifier], [ScormResourceVersionManifest3].[ScormResourceVersionId], [ScormResourceVersionManifest3].[TemplateVersion], [ScormResourceVersionManifest3].[TimeLimitAction], [ScormResourceVersionManifest3].[Title] + FROM [resources].[ScormResourceVersionManifest] AS [ScormResourceVersionManifest3] + WHERE [ScormResourceVersionManifest3].[Deleted] = 0 +) AS [t4] ON [t3].[Id] = [t4].[ScormResourceVersionId] +INNER JOIN ( + SELECT [NodePath].[Id], [NodePath].[AmendDate], [NodePath].[AmendUserId], [NodePath].[CatalogueNodeId], [NodePath].[CreateDate], [NodePath].[CreateUserId], [NodePath].[Deleted], [NodePath].[IsActive], [NodePath].[NodeId], [NodePath].[NodePath] + FROM [hierarchy].[NodePath] AS [NodePath] + WHERE [NodePath].[Deleted] = 0 +) AS [t6] ON [t2].[NodePathId] = [t6].[Id] +LEFT JOIN ( + SELECT [ResourceReference5].[Id], [ResourceReference5].[AmendDate], [ResourceReference5].[AmendUserId], [ResourceReference5].[CreateDate], [ResourceReference5].[CreateUserId], [ResourceReference5].[Deleted], [ResourceReference5].[NodePathId], [ResourceReference5].[OriginalResourceReferenceId], [ResourceReference5].[ResourceId] + FROM [resources].[ResourceReference] AS [ResourceReference5] + WHERE [ResourceReference5].[Deleted] = 0 +) AS [t7] ON [t2].[Id0] = [t7].[ResourceId] +LEFT JOIN ( + SELECT [MediaResourceActivity3].[Id], [MediaResourceActivity3].[ActivityStart], [MediaResourceActivity3].[AmendDate], [MediaResourceActivity3].[AmendUserID], [MediaResourceActivity3].[CreateDate], [MediaResourceActivity3].[CreateUserID], [MediaResourceActivity3].[Deleted], [MediaResourceActivity3].[PercentComplete], [MediaResourceActivity3].[ResourceActivityId], [MediaResourceActivity3].[SecondsPlayed] + FROM [activity].[MediaResourceActivity] AS [MediaResourceActivity3] + WHERE [MediaResourceActivity3].[Deleted] = 0 +) AS [t8] ON [t2].[Id] = [t8].[ResourceActivityId] +LEFT JOIN ( + SELECT [ScormActivity4].[Id], [ScormActivity4].[AmendDate], [ScormActivity4].[AmendUserID], [ScormActivity4].[CmiCoreExit], [ScormActivity4].[CmiCoreLesson_location], [ScormActivity4].[CmiCoreLesson_status], [ScormActivity4].[CmiCoreScoreMax], [ScormActivity4].[CmiCoreScoreMin], [ScormActivity4].[CmiCoreScoreRaw], [ScormActivity4].[CmiCoreSession_time], [ScormActivity4].[CmiSuspend_data], [ScormActivity4].[CreateDate], [ScormActivity4].[CreateUserID], [ScormActivity4].[Deleted], [ScormActivity4].[DurationSeconds], [ScormActivity4].[ResourceActivityId] + FROM [activity].[ScormActivity] AS [ScormActivity4] + WHERE [ScormActivity4].[Deleted] = 0 +) AS [t9] ON [t2].[Id] = [t9].[ResourceActivityId] +LEFT JOIN ( + SELECT [AssessmentResourceActivity5].[Id], [AssessmentResourceActivity5].[AmendDate], [AssessmentResourceActivity5].[AmendUserID], [AssessmentResourceActivity5].[CreateDate], [AssessmentResourceActivity5].[CreateUserID], [AssessmentResourceActivity5].[Deleted], [AssessmentResourceActivity5].[Reason], [AssessmentResourceActivity5].[ResourceActivityId], [AssessmentResourceActivity5].[Score] FROM [activity].[AssessmentResourceActivity] AS [AssessmentResourceActivity5] - LEFT JOIN [activity].[AssessmentResourceActivityInteraction] AS [t12] ON [AssessmentResourceActivity5].[Id] = [t12].[AssessmentResourceActivityId] AND [t12].[Deleted] = 0 WHERE [AssessmentResourceActivity5].[Deleted] = 0 ) AS [t11] ON [t2].[Id] = [t11].[ResourceActivityId] GROUP BY [t2].[Id] diff --git a/WebAPI/LearningHub.Nhs.Repository.Interface/Activity/IResourceActivityRepository.cs b/WebAPI/LearningHub.Nhs.Repository.Interface/Activity/IResourceActivityRepository.cs index b1e5cdf06..25ecf5d39 100644 --- a/WebAPI/LearningHub.Nhs.Repository.Interface/Activity/IResourceActivityRepository.cs +++ b/WebAPI/LearningHub.Nhs.Repository.Interface/Activity/IResourceActivityRepository.cs @@ -95,5 +95,14 @@ int CreateActivity( /// The resource id. /// The . Task> GetAllTheActivitiesFromSP(int userId, int resourceId); + + /// + /// Get the assessment activity completion details. + /// + /// The userId. + /// The resourceVersionId. + /// The activityId. + /// The . + Task GetAssessmentActivityCompletionPercentage(int userId, int resourceVersionId, int activityId); } } diff --git a/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj b/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj index ac60ee1b6..b44a4bb5b 100644 --- a/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj +++ b/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj @@ -9,7 +9,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Repository/Activity/ResourceActivityRepository.cs b/WebAPI/LearningHub.Nhs.Repository/Activity/ResourceActivityRepository.cs index 46a7405fa..79c5260df 100644 --- a/WebAPI/LearningHub.Nhs.Repository/Activity/ResourceActivityRepository.cs +++ b/WebAPI/LearningHub.Nhs.Repository/Activity/ResourceActivityRepository.cs @@ -10,10 +10,8 @@ namespace LearningHub.Nhs.Repository.Activity using System.Threading.Tasks; using LearningHub.Nhs.Models.Entities.Activity; using LearningHub.Nhs.Models.Entities.Resource; - using LearningHub.Nhs.Models.Entities.Resource.Blocks; using LearningHub.Nhs.Models.Enums; using LearningHub.Nhs.Models.MyLearning; - using LearningHub.Nhs.Models.Resource.Blocks; using LearningHub.Nhs.Repository.Helpers; using LearningHub.Nhs.Repository.Interface; using LearningHub.Nhs.Repository.Interface.Activity; @@ -183,54 +181,54 @@ public async Task IsScormActivityFinished(int userId, int scormActivityId) /// ResourceActivity. public async Task> GetByUserIdFromSP(int userId, Models.MyLearning.MyLearningRequestModel requestModel, DateTimeOffset detailedMediaActivityRecordingStartDate) { - (DateTimeOffset? startDate, DateTimeOffset? endDate) = this.ApplyDatesFilter(requestModel); - (string strResourceTypes, bool resourceTypeFlag) = this.ApplyResourceTypesfilters(requestModel); - (string strActivityStatus, bool activityStatusEnumFlag) = this.ApplyActivityStatusFilter(requestModel); - var param0 = new SqlParameter("@userId", SqlDbType.Int) { Value = userId }; - var param1 = new SqlParameter("@searchText", SqlDbType.NVarChar) { Value = requestModel.SearchText == null ? DBNull.Value : requestModel.SearchText }; - var param2 = new SqlParameter("@activityStatuses", SqlDbType.NVarChar) { Value = activityStatusEnumFlag == false ? DBNull.Value : strActivityStatus }; - var param3 = new SqlParameter("@resourceTypes", SqlDbType.NVarChar) { Value = resourceTypeFlag == false ? DBNull.Value : strResourceTypes }; - var param4 = new SqlParameter("@activityStartDate", SqlDbType.DateTimeOffset) { Value = startDate == null ? DBNull.Value : startDate }; - var param5 = new SqlParameter("@activityEndDate", SqlDbType.DateTimeOffset) { Value = endDate == null ? DBNull.Value : endDate }; - var param6 = new SqlParameter("@mediaActivityRecordingStartDate", SqlDbType.DateTimeOffset) { Value = detailedMediaActivityRecordingStartDate }; - var param7 = new SqlParameter("@certificateEnabled", SqlDbType.Bit) { Value = requestModel.CertificateEnabled == false ? DBNull.Value : requestModel.CertificateEnabled }; - var param8 = new SqlParameter("@offSet", SqlDbType.Int) { Value = requestModel.Skip }; - var param9 = new SqlParameter("@fetchRows", SqlDbType.Int) { Value = requestModel.Take }; - var result = await this.DbContext.MyLearningActivity.FromSqlRaw("[activity].[GetUserLearningActivities] @userId, @searchText, @activityStatuses, @resourceTypes,@activityStartDate,@activityEndDate,@mediaActivityRecordingStartDate,@certificateEnabled,@offSet,@fetchRows ", param0, param1, param2, param3, param4, param5, param6, param7, param8, param9) - .AsNoTracking().ToListAsync(); - - // Bind result to ResourceActivity model - this.BindNestedData(result); - List listOfresourceActivities = result.Select(i => new ResourceActivity() - { - ActivityEnd = i.ActivityEnd, - ActivityStart = i.ActivityStart, - ActivityStatusId = i.ActivityStatusId, - AmendDate = i.AmendDate, - AmendUserId = i.AmendUserId, - AssessmentResourceActivity = i.AssessmentResourceActivity, - CreateDate = i.CreateDate, - CreateUserId = i.CreateUserId, - Deleted = i.Deleted, - DurationSeconds = i.DurationSeconds ?? 0, - Id = i.Id, - InverseLaunchResourceActivity = i.Resource_InverseLaunchResourceActivity, - LaunchResourceActivityId = i.LaunchResourceActivityId, - MajorVersion = i.MajorVersion, - MediaResourceActivity = i.MediaResourceActivity, - MinorVersion = i.MinorVersion, - NodePath = i.NodePath, - NodePathId = i.NodePathId, - Resource = i.Resource, - ResourceId = i.ResourceId, - ResourceVersion = i.ResourceVersion, - ResourceVersionId = i.ResourceVersionId, - Score = i.Score, - ScormActivity = i.ScormActivity, - UserId = i.UserId, - }).ToList(); - - return listOfresourceActivities.OrderByDescending(r => r.ActivityStart).AsQueryable(); + (DateTimeOffset? startDate, DateTimeOffset? endDate) = this.ApplyDatesFilter(requestModel); + (string strResourceTypes, bool resourceTypeFlag) = this.ApplyResourceTypesfilters(requestModel); + (string strActivityStatus, bool activityStatusEnumFlag) = this.ApplyActivityStatusFilter(requestModel); + var param0 = new SqlParameter("@userId", SqlDbType.Int) { Value = userId }; + var param1 = new SqlParameter("@searchText", SqlDbType.NVarChar) { Value = requestModel.SearchText == null ? DBNull.Value : requestModel.SearchText }; + var param2 = new SqlParameter("@activityStatuses", SqlDbType.NVarChar) { Value = activityStatusEnumFlag == false ? DBNull.Value : strActivityStatus }; + var param3 = new SqlParameter("@resourceTypes", SqlDbType.NVarChar) { Value = resourceTypeFlag == false ? DBNull.Value : strResourceTypes }; + var param4 = new SqlParameter("@activityStartDate", SqlDbType.DateTimeOffset) { Value = startDate == null ? DBNull.Value : startDate }; + var param5 = new SqlParameter("@activityEndDate", SqlDbType.DateTimeOffset) { Value = endDate == null ? DBNull.Value : endDate }; + var param6 = new SqlParameter("@mediaActivityRecordingStartDate", SqlDbType.DateTimeOffset) { Value = detailedMediaActivityRecordingStartDate }; + var param7 = new SqlParameter("@certificateEnabled", SqlDbType.Bit) { Value = requestModel.CertificateEnabled == false ? DBNull.Value : requestModel.CertificateEnabled }; + var param8 = new SqlParameter("@offSet", SqlDbType.Int) { Value = requestModel.Skip }; + var param9 = new SqlParameter("@fetchRows", SqlDbType.Int) { Value = requestModel.Take }; + var result = await this.DbContext.MyLearningActivity.FromSqlRaw("[activity].[GetUserLearningActivities] @userId, @searchText, @activityStatuses, @resourceTypes,@activityStartDate,@activityEndDate,@mediaActivityRecordingStartDate,@certificateEnabled,@offSet,@fetchRows ", param0, param1, param2, param3, param4, param5, param6, param7, param8, param9) + .AsNoTracking().ToListAsync(); + + // Bind result to ResourceActivity model + this.BindNestedData(result); + List listOfresourceActivities = result.Select(i => new ResourceActivity() + { + ActivityEnd = i.ActivityEnd, + ActivityStart = i.ActivityStart, + ActivityStatusId = i.ActivityStatusId, + AmendDate = i.AmendDate, + AmendUserId = i.AmendUserId, + AssessmentResourceActivity = i.AssessmentResourceActivity, + CreateDate = i.CreateDate, + CreateUserId = i.CreateUserId, + Deleted = i.Deleted, + DurationSeconds = i.DurationSeconds ?? 0, + Id = i.Id, + InverseLaunchResourceActivity = i.Resource_InverseLaunchResourceActivity, + LaunchResourceActivityId = i.LaunchResourceActivityId, + MajorVersion = i.MajorVersion, + MediaResourceActivity = i.MediaResourceActivity, + MinorVersion = i.MinorVersion, + NodePath = i.NodePath, + NodePathId = i.NodePathId, + Resource = i.Resource, + ResourceId = i.ResourceId, + ResourceVersion = i.ResourceVersion, + ResourceVersionId = i.ResourceVersionId, + Score = i.Score, + ScormActivity = i.ScormActivity, + UserId = i.UserId, + }).ToList(); + + return listOfresourceActivities.OrderByDescending(r => r.ActivityStart).AsQueryable(); } /// @@ -271,6 +269,28 @@ public async Task> GetAllTheActivitiesFromSP(int userId, return activities; } + /// + /// Gets a list of all the user's activities for a given resource version. + /// + /// The user id.> + /// The resource version id. + /// The resource activity id. + /// The . + public async Task GetAssessmentActivityCompletionPercentage(int userId, int resourceVersionId, int activityId) + { + var param0 = new SqlParameter("@p0", SqlDbType.Int) { Value = userId }; + var param1 = new SqlParameter("@p1", SqlDbType.Int) { Value = resourceVersionId }; + var param2 = new SqlParameter("@p2", SqlDbType.Int) { Value = activityId }; + + var retVal = await this.DbContext.AssessmentActivityCompletionViewModel + .FromSqlRaw("EXEC activity.GetAssessmentActivityCompletionPercentage @p0, @p1, @p2", param0, param1, param2) + .AsNoTracking() + .ToListAsync(); + + AssessmentActivityCompletionViewModel assessmentResourceActivityQuestion = retVal.FirstOrDefault(); + return assessmentResourceActivityQuestion; + } + /// /// Get Resource Activity by user id. /// @@ -279,42 +299,42 @@ public async Task> GetAllTheActivitiesFromSP(int userId, /// ResourceActivity. public async Task> GetByUserIdWithResourceVersionId(int userId, int resourceVersionId) { - var param0 = new SqlParameter("@userId", SqlDbType.Int) { Value = userId }; - var param1 = new SqlParameter("@resourceVersionId", SqlDbType.Int) { Value = resourceVersionId }; - var result = await this.DbContext.MyLearningActivity.FromSqlRaw("[activity].[GetUserLatestActivityCheck] @userId, @resourceVersionId ", param0, param1) - .AsNoTracking().ToListAsync(); - - // Bind result to ResourceActivity model - this.BindNestedData(result); - List listOfresourceActivities = result.Select(i => new ResourceActivity() - { - ActivityEnd = i.ActivityEnd, - ActivityStart = i.ActivityStart, - ActivityStatusId = i.ActivityStatusId, - AmendDate = i.AmendDate, - AmendUserId = i.AmendUserId, - AssessmentResourceActivity = i.AssessmentResourceActivity, - CreateDate = i.CreateDate, - CreateUserId = i.CreateUserId, - Deleted = i.Deleted, - DurationSeconds = i.DurationSeconds ?? 0, - Id = i.Id, - InverseLaunchResourceActivity = i.Resource_InverseLaunchResourceActivity, - LaunchResourceActivityId = i.LaunchResourceActivityId, - MajorVersion = i.MajorVersion, - MediaResourceActivity = i.Resource_MediaResourceActivity, - MinorVersion = i.MinorVersion, - NodePath = i.NodePath, - NodePathId = i.NodePathId, - Resource = i.Resource, - ResourceId = i.ResourceId, - ResourceVersion = i.ResourceVersion, - ResourceVersionId = i.ResourceVersionId, - Score = i.Score, - ScormActivity = i.ScormActivity, - UserId = i.UserId, - }).ToList(); - return listOfresourceActivities.OrderByDescending(r => r.ActivityStart).AsQueryable(); + var param0 = new SqlParameter("@userId", SqlDbType.Int) { Value = userId }; + var param1 = new SqlParameter("@resourceVersionId", SqlDbType.Int) { Value = resourceVersionId }; + var result = await this.DbContext.MyLearningActivity.FromSqlRaw("[activity].[GetUserLatestActivityCheck] @userId, @resourceVersionId ", param0, param1) + .AsNoTracking().ToListAsync(); + + // Bind result to ResourceActivity model + this.BindNestedData(result); + List listOfresourceActivities = result.Select(i => new ResourceActivity() + { + ActivityEnd = i.ActivityEnd, + ActivityStart = i.ActivityStart, + ActivityStatusId = i.ActivityStatusId, + AmendDate = i.AmendDate, + AmendUserId = i.AmendUserId, + AssessmentResourceActivity = i.AssessmentResourceActivity, + CreateDate = i.CreateDate, + CreateUserId = i.CreateUserId, + Deleted = i.Deleted, + DurationSeconds = i.DurationSeconds ?? 0, + Id = i.Id, + InverseLaunchResourceActivity = i.Resource_InverseLaunchResourceActivity, + LaunchResourceActivityId = i.LaunchResourceActivityId, + MajorVersion = i.MajorVersion, + MediaResourceActivity = i.Resource_MediaResourceActivity, + MinorVersion = i.MinorVersion, + NodePath = i.NodePath, + NodePathId = i.NodePathId, + Resource = i.Resource, + ResourceId = i.ResourceId, + ResourceVersion = i.ResourceVersion, + ResourceVersionId = i.ResourceVersionId, + Score = i.Score, + ScormActivity = i.ScormActivity, + UserId = i.UserId, + }).ToList(); + return listOfresourceActivities.OrderByDescending(r => r.ActivityStart).AsQueryable(); } private void BindNestedData(List result) @@ -343,25 +363,7 @@ private void BindResourceVersionBlockData(List result) { result.ToList().ForEach(i => { - var a = result.Where(x => x.Id == i.Id).ToList().DistinctBy(l => l.Block_BlockId); - List blocksList = new List(); - foreach (var b in a) - { - Block blocks = new Block(); - blocks.Id = b.Block_BlockId ?? 0; - blocks.BlockCollectionId = b.Block_BlockCollectionId ?? 0; - var blockType = b.Block_BlockType ?? 0; - blocks.BlockType = (BlockType)blockType; - blocks.Title = b.Block_Title; - blocks.Order = b.Block_Order ?? 0; - blocksList.Add(blocks); - } - - i.ResourceVersion_AssessmentResourceVersion.AssessmentContent = new BlockCollection(); - i.ResourceVersion_AssessmentResourceVersion.AssessmentContent.Blocks = blocksList; i.ResourceVersion.AssessmentResourceVersion = new AssessmentResourceVersion(); - i.ResourceVersion.AssessmentResourceVersion.AssessmentContent = new BlockCollection(); - i.ResourceVersion.AssessmentResourceVersion.AssessmentContent.Blocks = blocksList; int assessmentType = i.ResourceVersion_AssessmentResourceVersion_AssessmentType ?? 0; i.ResourceVersion.AssessmentResourceVersion.AssessmentType = (AssessmentTypeEnum)assessmentType; i.ResourceVersion.AssessmentResourceVersion.PassMark = i.ResourceVersion_PassMark; @@ -397,21 +399,6 @@ private void BindAssessmentResourceActivityNestedData(List r assessmentResourceActivity.Id = i.AssessmentResourceActivity_Id ?? 0; assessmentResourceActivity.Score = i.AssessmentResourceActivity_Score; assessmentResourceActivity.Reason = i.AssessmentResourceActivity_Reason; - var c = result.Where(x => x.Id == i.Id).ToList().DistinctBy(l => l.AssessmentResourceActivity_AssessmentResourceActivityInteraction_QuestionBlockId); - List assessmentResourceActivityInteractionList = new List(); - foreach (var item in c) - { - if (i.AssessmentResourceActivity_AssessmentResourceActivityInteraction_Id != null) - { - AssessmentResourceActivityInteraction assessmentResourceActivityInteraction = new AssessmentResourceActivityInteraction(); - assessmentResourceActivityInteraction.AssessmentResourceActivityId = i.AssessmentResourceActivity_AssessmentResourceActivityInteraction_AssessmentResourceActivityId ?? 0; - assessmentResourceActivityInteraction.Id = i.AssessmentResourceActivity_AssessmentResourceActivityInteraction_Id ?? 0; - assessmentResourceActivityInteraction.QuestionBlockId = i.AssessmentResourceActivity_AssessmentResourceActivityInteraction_QuestionBlockId ?? 0; - assessmentResourceActivityInteractionList.Add(assessmentResourceActivityInteraction); - } - } - - assessmentResourceActivity.AssessmentResourceActivityInteractions = assessmentResourceActivityInteractionList; i.AssessmentResourceActivity.Add(assessmentResourceActivity); } }); diff --git a/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj b/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj index 3027cdbc6..a94854e89 100644 --- a/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj +++ b/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj @@ -9,7 +9,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Repository/LearningHubDbContext.cs b/WebAPI/LearningHub.Nhs.Repository/LearningHubDbContext.cs index 1d94dc9b6..77f14343c 100644 --- a/WebAPI/LearningHub.Nhs.Repository/LearningHubDbContext.cs +++ b/WebAPI/LearningHub.Nhs.Repository/LearningHubDbContext.cs @@ -15,9 +15,11 @@ namespace LearningHub.Nhs.Repository using LearningHub.Nhs.Models.Entities.Resource.Blocks; using LearningHub.Nhs.Models.Hierarchy; using LearningHub.Nhs.Models.Messaging; + using LearningHub.Nhs.Models.MyLearning; using LearningHub.Nhs.Models.Resource; using LearningHub.Nhs.Models.Resource.ResourceDisplay; using LearningHub.Nhs.Models.User; + using LearningHub.Nhs.Repository.Activity; using Microsoft.EntityFrameworkCore; /// @@ -780,6 +782,11 @@ public LearningHubDbContextOptions Options /// public virtual DbSet AllCatalogueViewModel { get; set; } + /// + /// Gets or sets the AssessmentResourceActivityQuestionViewModel. + /// + public virtual DbSet AssessmentActivityCompletionViewModel { get; set; } + /// /// The on model creating. /// diff --git a/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj b/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj index b49011e8c..aa9b8c854 100644 --- a/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj +++ b/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj @@ -16,7 +16,7 @@ - + all diff --git a/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj b/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj index ef4a2180b..c8970073f 100644 --- a/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj +++ b/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj @@ -13,7 +13,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj b/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj index 9a2ab84b2..c1db140fe 100644 --- a/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj +++ b/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj @@ -13,7 +13,7 @@ - + diff --git a/WebAPI/LearningHub.Nhs.Services/MyLearningService.cs b/WebAPI/LearningHub.Nhs.Services/MyLearningService.cs index a4d6049f9..82e2ce2f8 100644 --- a/WebAPI/LearningHub.Nhs.Services/MyLearningService.cs +++ b/WebAPI/LearningHub.Nhs.Services/MyLearningService.cs @@ -362,13 +362,12 @@ public async Task> PopulateMyLearningDetai { viewModel.AssessmentResourceActivityId = activity.Id; viewModel.Complete = activity.Score != null; - var totalQuestions = resourceActivity.ResourceVersion.AssessmentResourceVersion.AssessmentContent.Blocks.Where(b => b.BlockType == BlockType.Question).Count(); - var completedQuestions = activity.AssessmentResourceActivityInteractions.Count(); - viewModel.CompletionPercentage = totalQuestions == 0 ? 0 : Convert.ToInt32(100 * completedQuestions / Convert.ToDecimal(totalQuestions)); viewModel.ScorePercentage = activity.Score.HasValue ? (int)Math.Round(activity.Score.Value, MidpointRounding.AwayFromZero) : 0; var currentAttempt = allAttempts.FindIndex(a => a.Id == resourceActivity.Id) + 1; + var assessmemntActivityQuestion = await this.resourceActivityRepository.GetAssessmentActivityCompletionPercentage(resourceActivity.CreateUserId, resourceActivity.ResourceVersionId, resourceActivity.Id); + viewModel.CompletionPercentage = (int)assessmemntActivityQuestion.CompletionPercentage; if (viewModel.CompletionPercentage == 100) { if (resourceActivity.ResourceVersion.AssessmentResourceVersion.AssessmentType == AssessmentTypeEnum.Informal) diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj index 28730e740..22f02c0cf 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj @@ -24,7 +24,7 @@ - + all diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj index d08aa9391..8a45f5232 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj @@ -9,7 +9,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj index 28916df8b..64a326d3b 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj @@ -10,7 +10,7 @@ - + all diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj index e71105e0b..226acf08a 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj @@ -9,7 +9,7 @@ - + diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj index 9addb85a0..70df59e57 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj @@ -10,7 +10,7 @@ - + diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj index 8e0c512aa..fb53d0e90 100644 --- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj +++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive