From 4742b5719e272488647e8ee50293570dcbf41021 Mon Sep 17 00:00:00 2001 From: OluwatobiAwe Date: Tue, 16 Sep 2025 16:22:20 +0100 Subject: [PATCH] TD-6208 Update : make certificate available for informal certificate once status completed and ignore if user pass or fail or pass mark was created or not --- .../Services/MyLearningService.cs | 24 +++++++++++++++++-- .../Resources/GetUsercertificateDetails.sql | 16 +++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/MyLearningService.cs b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/MyLearningService.cs index 748b69d3..04807be0 100644 --- a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/MyLearningService.cs +++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/MyLearningService.cs @@ -387,8 +387,28 @@ public async Task> GetResourceCertif activityEntities.RemoveAll(x => x.Resource.ResourceTypeEnum == ResourceTypeEnum.Scorm && (x.ActivityStatusId == (int)ActivityStatusEnum.Downloaded || x.ActivityStatusId == (int)ActivityStatusEnum.Incomplete || x.ActivityStatusId == (int)ActivityStatusEnum.InProgress)); if (activityEntities.Any() && activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Assessment) { - totalNumberOfAccess = activityQuery.SelectMany(x => x.AssessmentResourceActivity).OrderByDescending(a => a.CreateDate).ToList().Count(); - activityEntities = activityEntities.Where(x => x.AssessmentResourceActivity.FirstOrDefault() != null && x.AssessmentResourceActivity.FirstOrDefault().Score.HasValue && (int)Math.Round(x.AssessmentResourceActivity.FirstOrDefault().Score.Value, MidpointRounding.AwayFromZero) >= x.ResourceVersion.AssessmentResourceVersion.PassMark).ToList(); + totalNumberOfAccess = activityQuery.SelectMany(x => x.AssessmentResourceActivity) + .OrderByDescending(a => a.CreateDate) + .Count(); + + var assessmentType = activityEntities.First().ResourceVersion.AssessmentResourceVersion.AssessmentType; + + if (assessmentType == AssessmentTypeEnum.Formal) + { + activityEntities = activityEntities.Where(x => { + var act = x.AssessmentResourceActivity.FirstOrDefault(); + var ver = x.ResourceVersion.AssessmentResourceVersion; + return act != null && act.Score.HasValue && + Math.Round(act.Score.Value, MidpointRounding.AwayFromZero) >= ver.PassMark; + }).ToList(); + } + else if (assessmentType == AssessmentTypeEnum.Informal) + { + activityEntities = activityEntities.Where(x => { + var act = x.AssessmentResourceActivity.FirstOrDefault(); + return act != null && x.ActivityStatusId == (int)ActivityStatusEnum.Completed; + }).ToList(); + } } else if (activityEntities.Any() && (activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Video || activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Audio)) { diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/GetUsercertificateDetails.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/GetUsercertificateDetails.sql index 2e1c7613..560c892b 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/GetUsercertificateDetails.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/GetUsercertificateDetails.sql @@ -54,17 +54,25 @@ BEGIN ) OR ra.ActivityStatusId IN (3,5) )) - OR (r.ResourceTypeId = 11 AND ( + OR ( + r.ResourceTypeId = 11 + AND ( + -- Either passed by score, or completed with no pass mark EXISTS ( SELECT 1 FROM activity.AssessmentResourceActivity ara JOIN resources.AssessmentResourceVersion arv ON arv.ResourceVersionId = ra.ResourceVersionId WHERE ara.ResourceActivityId = ra.Id - AND ara.Score >= arv.PassMark + AND ( + ara.Score >= arv.PassMark -- formal assessment + OR (ra.ActivityStatusId = 3 AND arv.AssessmentType = 1) --informal assessment + ) ) - OR ra.ActivityStatusId IN (3,5) - )) + -- Or explicitly marked as passed + OR ra.ActivityStatusId = 5 + ) + ) OR (r.ResourceTypeId IN (1, 5, 8, 9, 10, 12) AND ra.ActivityStatusId = 3) )