diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs index fc933c6589..9e2a682b9b 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs @@ -335,7 +335,7 @@ FROM CandidateAssessments new { selfAssessmentId, delegateUserId } ); } - public CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID) + public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID) { return connection.QueryFirstOrDefault( @"SELECT @@ -388,7 +388,59 @@ from CandidateAssessmentSupervisorVerifications AS casv INNER JOIN new { candidateAssessmentID } ); } - + public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId) + { + return connection.QueryFirstOrDefault( + @"SELECT + LearnerDetails.ID , + LearnerDetails.SelfAssessment, + LearnerDetails.LearnerName, + LearnerDetails.LearnerPRN, + LearnerId,LearnerDelegateAccountId, + LearnerDetails.Verified, + LearnerDetails.CentreName, + Supervisor.SupervisorName , + Supervisor.SupervisorPRN , + Supervisor.SupervisorCentreName, + LearnerDetails.BrandName , + LearnerDetails.BrandImage, + LearnerDetails.CandidateAssessmentID, + LearnerDetails.SelfAssessmentID, + LearnerDetails.Vocabulary, + LearnerDetails.SupervisorDelegateId, + LearnerDetails.FormattedDate, + LearnerDetails.NonReportable + FROM(SELECT casv.ID, ca.NonReportable, sa.Name AS SelfAssessment, Learner.FirstName + ' ' + Learner.LastName AS LearnerName, Learner.ProfessionalRegistrationNumber AS LearnerPRN, Learner.ID AS LearnerId, da.ID AS LearnerDelegateAccountId, casv.Verified, ce.CentreName, + Supervisor.FirstName + ' ' + Supervisor.LastName AS SupervisorName, Supervisor.ProfessionalRegistrationNumber AS SupervisorPRN, b.BrandName, b.BrandImage, ca.ID AS CandidateAssessmentID, ca.SelfAssessmentID, COALESCE (sa.Vocabulary, 'Capability') AS Vocabulary, + cas.SupervisorDelegateId, CONVERT(VARCHAR(2), DAY(casv.Verified)) + CASE WHEN DAY(Verified) % 100 IN (11, 12, 13) THEN 'th' WHEN DAY(Verified) % 10 = 1 THEN 'st' WHEN DAY(Verified) % 10 = 2 THEN 'nd' WHEN DAY(Verified) + % 10 = 3 THEN 'rd' ELSE 'th' END + ' ' + FORMAT(casv.Verified, 'MMMM yyyy') AS FormattedDate + FROM dbo.CandidateAssessments AS ca LEFT OUTER JOIN + dbo.DelegateAccounts AS da RIGHT OUTER JOIN + dbo.Users AS Learner ON da.UserID = Learner.ID ON ca.CentreID = da.CentreID AND ca.DelegateUserID = Learner.ID LEFT OUTER JOIN + dbo.Centres AS ce ON ca.CentreID = ce.CentreID LEFT OUTER JOIN + dbo.Brands AS b RIGHT OUTER JOIN + dbo.SelfAssessments AS sa ON b.BrandID = sa.BrandID ON ca.SelfAssessmentID = sa.ID LEFT OUTER JOIN + dbo.CandidateAssessmentSupervisors AS cas ON ca.ID = cas.CandidateAssessmentID LEFT OUTER JOIN + dbo.Users AS Supervisor RIGHT OUTER JOIN + dbo.AdminAccounts AS aa ON Supervisor.ID = aa.UserID RIGHT OUTER JOIN + dbo.CandidateAssessmentSupervisorVerifications AS casv ON aa.ID = casv.ID ON cas.ID = casv.CandidateAssessmentSupervisorID + WHERE (CA.SelfAssessmentID =@selfassessmentId AND Learner.ID = @userId) AND (casv.SignedOff = 1) AND (NOT (casv.Verified IS NULL))) LearnerDetails INNER JOIN + (select sd.SupervisorAdminID, casv.ID ,u.FirstName + ' ' + u.LastName AS SupervisorName, + u.ProfessionalRegistrationNumber AS SupervisorPRN, + c.CentreName AS SupervisorCentreName,ca.CentreID + from CandidateAssessmentSupervisorVerifications AS casv INNER JOIN + CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID INNER JOIN + SupervisorDelegates AS sd ON sd.ID = cas.SupervisorDelegateId INNER JOIN + AdminAccounts AS aa ON sd.SupervisorAdminID = aa.ID INNER JOIN + Users AS u ON aa.UserID = u.ID INNER JOIN + Centres c ON aa.CentreID = c.CentreID INNER JOIN + CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID + where (CA.SelfAssessmentID =@selfassessmentId AND u.ID = @userId) AND (casv.SignedOff = 1) + AND (NOT (casv.Verified IS NULL))) Supervisor ON LearnerDetails.Id =Supervisor.Id + ORDER BY Verified DESC", + new { selfassessmentId , userId } + ); + } public IEnumerable GetCompetencyCountSelfAssessmentCertificate(int candidateAssessmentID) { return connection.Query( diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs index 98820ac326..cfb00c9e3d 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs @@ -157,16 +157,17 @@ IEnumerable GetSelfAssessmentActivityDelegatesExport(str int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, int currentRun, bool? submitted, bool? signedOff); int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string sortBy, string sortDirection, int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff); - string GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId); + string? GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId); - RemoveSelfAssessmentDelegate GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId); + RemoveSelfAssessmentDelegate? GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId); void RemoveDelegateSelfAssessment(int candidateAssessmentsId); int? GetSupervisorsCountFromCandidateAssessmentId(int candidateAssessmentsId); bool CheckForSameCentre(int centreId, int candidateAssessmentsId); int? GetDelegateAccountId(int centreId, int delegateUserId); int CheckDelegateSelfAssessment(int candidateAssessmentsId); IEnumerable GetCompetencyCountSelfAssessmentCertificate(int candidateAssessmentID); - CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID); + CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID); + CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId); IEnumerable GetAccessor(int selfAssessmentId, int delegateUserID); ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId); bool IsUnsupervisedSelfAssessment(int selfAssessmentId); @@ -624,7 +625,7 @@ LEFT OUTER JOIN AdminAccounts AS aaEnrolledBy WITH (NOLOCK) ON aaEnrolledBy.ID = ); return ResultCount; } - public string GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId) + public string? GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId) { return connection.Query( @$"SELECT @@ -647,7 +648,7 @@ LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr new { delegateUserId, selfAssessmentId } ).FirstOrDefault(); } - public RemoveSelfAssessmentDelegate GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId) + public RemoveSelfAssessmentDelegate? GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId) { return connection.QueryFirstOrDefault( @"Select diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs index 7d8836a69f..d77ae9f556 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs @@ -22,9 +22,6 @@ using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current; using DocumentFormat.OpenXml.EMMA; using Microsoft.AspNetCore.Mvc; - using Microsoft.AspNetCore.Mvc.Rendering; - using Microsoft.AspNetCore.Mvc.ViewEngines; - using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.Logging; using Microsoft.FeatureManagement.Mvc; @@ -343,180 +340,5 @@ int delegateUserId await actionPlanService.GetIncompleteActionPlanResources(delegateUserId); return (resources.ToList(), apiIsAccessible); } - [Route("/LearningPortal/Current/{candidateAssessmentId:int}/{route:int}/Certificate")] - [NoCaching] - public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessmentId, int route) - { - int supervisorDelegateId = 0; - if (candidateAssessmentId == 0) - { - return NotFound(); - } - - var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId); - if (competencymaindata == null) - { - return NotFound(); - } - - var delegateUserId = competencymaindata.LearnerId; - if (route == 3) - { - var supervisorDelegate = supervisorService.GetSupervisorDelegate(User.GetAdminIdKnownNotNull(), delegateUserId); - supervisorDelegateId = supervisorDelegate.ID; - } - var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList(); - var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId); - - if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs)) - { - return NotFound(); - } - - var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId); - var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId); - var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID); - var competencyIds = recentResults.Select(c => c.Id).ToArray(); - var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds); - var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null); - foreach (var competency in competencies) - { - competency.QuestionLabel = assessment.QuestionLabel; - foreach (var assessmentQuestion in competency.AssessmentQuestions) - { - if (assessmentQuestion.AssessmentQuestionInputTypeID != 2) - { - assessmentQuestion.LevelDescriptors = selfAssessmentService - .GetLevelDescriptorsForAssessmentQuestion( - assessmentQuestion.Id, - assessmentQuestion.MinValue, - assessmentQuestion.MaxValue, - assessmentQuestion.MinValue == 0 - ).ToList(); - } - } - } - - var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup); - var competencySummaries = from g in CompetencyGroups - let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required) - let selfAssessedCount = questions.Count(q => q.Result.HasValue) - let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required)) - - select new - { - SelfAssessedCount = selfAssessedCount, - VerifiedCount = verifiedCount, - Questions = questions.Count() - }; - - int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount); - int sumQuestions = competencySummaries.Sum(item => item.Questions); - var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id); - var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, supervisorDelegateId); - return View("Current/CompetencySelfAssessmentCertificate", model); - } - [Route("DownloadCertificate")] - public async Task DownloadCertificate(int candidateAssessmentId) - { - PdfReportStatusResponse pdfReportStatusResponse = new PdfReportStatusResponse(); - if (candidateAssessmentId == 0) - { - return NotFound(); - } - var delegateId = User.GetCandidateIdKnownNotNull(); - var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId); - - if (competencymaindata == null) - { - return NotFound(); - } - var delegateUserId = competencymaindata.LearnerId; - - var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId); - var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId); - var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id); - var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID); - var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList(); - var competencyIds = recentResults.Select(c => c.Id).ToArray(); - var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds); - var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null); - foreach (var competency in competencies) - { - competency.QuestionLabel = assessment.QuestionLabel; - foreach (var assessmentQuestion in competency.AssessmentQuestions) - { - if (assessmentQuestion.AssessmentQuestionInputTypeID != 2) - { - assessmentQuestion.LevelDescriptors = selfAssessmentService - .GetLevelDescriptorsForAssessmentQuestion( - assessmentQuestion.Id, - assessmentQuestion.MinValue, - assessmentQuestion.MaxValue, - assessmentQuestion.MinValue == 0 - ).ToList(); - } - } - } - - var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup); - var competencySummaries = from g in CompetencyGroups - let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required) - let selfAssessedCount = questions.Count(q => q.Result.HasValue) - let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required)) - select new - { - SelfAssessedCount = selfAssessedCount, - VerifiedCount = verifiedCount, - Questions = questions.Count() - }; - - int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount); - int sumQuestions = competencySummaries.Sum(item => item.Questions); - var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, null); - var renderedViewHTML = RenderRazorViewToString(this, "Current/DownloadCompetencySelfAssessmentCertificate", model); - - var pdfReportResponse = await pdfService.PdfReport(candidateAssessmentId.ToString(), renderedViewHTML, delegateId); - if (pdfReportResponse != null) - { - do - { - pdfReportStatusResponse = await pdfService.PdfReportStatus(pdfReportResponse); - } while (pdfReportStatusResponse.Id == 1); - - var pdfReportFile = await pdfService.GetPdfReportFile(pdfReportResponse); - if (pdfReportFile != null) - { - var nameTextLength = string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerName) ? 0 : model.CompetencySelfAssessmentCertificates.LearnerName.Length; - var isPrnExist = !string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerPRN); - var fileName = $"Competency Certificate - {model.CompetencySelfAssessmentCertificates.LearnerName.Substring(0, nameTextLength >= 15 ? 15 : nameTextLength)}" + (isPrnExist ? $" - {model.CompetencySelfAssessmentCertificates.LearnerPRN}.pdf" : ".pdf"); - return File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName); - } - } - return View("Current/CompetencySelfAssessmentCertificate", model); - } - - public static string RenderRazorViewToString(Controller controller, string viewName, object model = null) - { - controller.ViewData.Model = model; - using (var sw = new StringWriter()) - { - IViewEngine viewEngine = - controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as - ICompositeViewEngine; - ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, false); - - ViewContext viewContext = new ViewContext( - controller.ControllerContext, - viewResult.View, - controller.ViewData, - controller.TempData, - sw, - new HtmlHelperOptions() - ); - viewResult.View.RenderAsync(viewContext); - return sw.GetStringBuilder().ToString(); - } - } } } diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs index aa5248c1c9..bdc0c8a971 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs @@ -27,6 +27,11 @@ using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.ViewDelegate; using DocumentFormat.OpenXml.EMMA; using DigitalLearningSolutions.Data.Models.Supervisor; + using DigitalLearningSolutions.Data.Models.Common; + using Microsoft.AspNetCore.Mvc.Rendering; + using Microsoft.AspNetCore.Mvc.ViewEngines; + using Microsoft.AspNetCore.Mvc.ViewFeatures; + using System.IO; public partial class LearningPortalController { @@ -1611,5 +1616,178 @@ public IActionResult WithdrawSupervisorSignOffRequest( new { selfAssessmentId, vocabulary } ); } + + + [Route("/LearningPortal/selfAssessments/{selfassessmentId:int}/{vocabulary}/Certificate")] + + public IActionResult CompetencySelfAssessmentCertificate(int selfAssessmentId, string vocabulary) + { + int supervisorDelegateId = 0; + var adminId = User.GetAdminId(); + User.GetUserIdKnownNotNull(); + var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(selfAssessmentId, User.GetUserIdKnownNotNull()); + if((competencymaindata == null)|| ( competencymaindata.LearnerId != User.GetUserIdKnownNotNull()) || (selfAssessmentId == 0)) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + } + var delegateUserId = competencymaindata.LearnerId; + if (vocabulary == "Supervise") + { + var supervisorDelegateDetails = supervisorService.GetSupervisorDelegateDetailsForAdminId(adminId.Value); + var checkSupervisorDelegate = supervisorDelegateDetails.Where(x=> x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault(); + if (checkSupervisorDelegate == null) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + } + var supervisorDelegate = supervisorService.GetSupervisorDelegate(User.GetAdminIdKnownNotNull(), delegateUserId); + supervisorDelegateId = supervisorDelegate.ID; + } + var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList(); + var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId); + + if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs)) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 401 }); + } + + var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(competencymaindata.CandidateAssessmentID); + var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId); + var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID); + var competencyIds = recentResults.Select(c => c.Id).ToArray(); + var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds); + var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null); + foreach (var competency in competencies) + { + competency.QuestionLabel = assessment.QuestionLabel; + foreach (var assessmentQuestion in competency.AssessmentQuestions) + { + if (assessmentQuestion.AssessmentQuestionInputTypeID != 2) + { + assessmentQuestion.LevelDescriptors = selfAssessmentService + .GetLevelDescriptorsForAssessmentQuestion( + assessmentQuestion.Id, + assessmentQuestion.MinValue, + assessmentQuestion.MaxValue, + assessmentQuestion.MinValue == 0 + ).ToList(); + } + } + } + + var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup); + var competencySummaries = from g in CompetencyGroups + let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required) + let selfAssessedCount = questions.Count(q => q.Result.HasValue) + let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required)) + + select new + { + SelfAssessedCount = selfAssessedCount, + VerifiedCount = verifiedCount, + Questions = questions.Count() + }; + + int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount); + int sumQuestions = competencySummaries.Sum(item => item.Questions); + var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id); + var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, vocabulary, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, supervisorDelegateId); + return View("SelfAssessments/CompetencySelfAssessmentCertificate", model); + } + [Route("DownloadCertificate")] + public async Task DownloadCertificate(int candidateAssessmentId) + { + PdfReportStatusResponse pdfReportStatusResponse = new PdfReportStatusResponse(); + var delegateId = User.GetCandidateIdKnownNotNull(); + var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId); + if (competencymaindata == null || candidateAssessmentId == 0) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + } + var delegateUserId = competencymaindata.LearnerId; + var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId); + var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId); + var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id); + var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID); + var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList(); + var competencyIds = recentResults.Select(c => c.Id).ToArray(); + var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds); + var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null); + foreach (var competency in competencies) + { + competency.QuestionLabel = assessment.QuestionLabel; + foreach (var assessmentQuestion in competency.AssessmentQuestions) + { + if (assessmentQuestion.AssessmentQuestionInputTypeID != 2) + { + assessmentQuestion.LevelDescriptors = selfAssessmentService + .GetLevelDescriptorsForAssessmentQuestion( + assessmentQuestion.Id, + assessmentQuestion.MinValue, + assessmentQuestion.MaxValue, + assessmentQuestion.MinValue == 0 + ).ToList(); + } + } + } + + var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup); + var competencySummaries = from g in CompetencyGroups + let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required) + let selfAssessedCount = questions.Count(q => q.Result.HasValue) + let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required)) + select new + { + SelfAssessedCount = selfAssessedCount, + VerifiedCount = verifiedCount, + Questions = questions.Count() + }; + + int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount); + int sumQuestions = competencySummaries.Sum(item => item.Questions); + var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, "Proficiencies", accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, null); + var renderedViewHTML = RenderRazorViewToString(this, "SelfAssessments/DownloadCompetencySelfAssessmentCertificate", model); + + var pdfReportResponse = await pdfService.PdfReport(candidateAssessmentId.ToString(), renderedViewHTML, delegateId); + if (pdfReportResponse != null) + { + do + { + pdfReportStatusResponse = await pdfService.PdfReportStatus(pdfReportResponse); + } while (pdfReportStatusResponse.Id == 1); + + var pdfReportFile = await pdfService.GetPdfReportFile(pdfReportResponse); + if (pdfReportFile != null) + { + var nameTextLength = string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerName) ? 0 : model.CompetencySelfAssessmentCertificates.LearnerName.Length; + var isPrnExist = !string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerPRN); + var fileName = $"Competency Certificate - {model.CompetencySelfAssessmentCertificates.LearnerName.Substring(0, nameTextLength >= 15 ? 15 : nameTextLength)}" + (isPrnExist ? $" - {model.CompetencySelfAssessmentCertificates.LearnerPRN}.pdf" : ".pdf"); + return File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName); + } + } + return View("SelfAssessments/CompetencySelfAssessmentCertificate", model); + } + + public static string RenderRazorViewToString(Controller controller, string viewName, object model = null) + { + controller.ViewData.Model = model; + using (var sw = new StringWriter()) + { + IViewEngine viewEngine = + controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as + ICompositeViewEngine; + ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, false); + + ViewContext viewContext = new ViewContext( + controller.ControllerContext, + viewResult.View, + controller.ViewData, + controller.TempData, + sw, + new HtmlHelperOptions() + ); + viewResult.View.RenderAsync(viewContext); + return sw.GetStringBuilder().ToString(); + } + } } } diff --git a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs index ccc9d501b1..7b645c8bb9 100644 --- a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs +++ b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs @@ -1362,5 +1362,72 @@ public IActionResult ExportCandidateAssessment(int candidateAssessmentId, string fileName ); } + [Route("/Supervisor/Staff/{supervisorDelegateId:int}/ProfileAssessment/{candidateAssessmentId:int}/Certificate")] + public IActionResult CompetencySelfAssessmentCertificatesupervisor(int candidateAssessmentId, int supervisorDelegateId) + { + var adminId = User.GetAdminId(); + User.GetUserIdKnownNotNull(); + var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId); + if ((competencymaindata == null) || (candidateAssessmentId == 0)) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + } + var supervisorDelegateDetails = supervisorService.GetSupervisorDelegateDetailsForAdminId(adminId.Value); + var checkSupervisorDelegate = supervisorDelegateDetails.Where(x => x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault(); + if ( (checkSupervisorDelegate == null) ) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + } + var delegateUserId = competencymaindata.LearnerId; + var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList(); + var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId); + if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs)) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 401 }); + } + + var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(competencymaindata.CandidateAssessmentID); + var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId); + var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID); + var competencyIds = recentResults.Select(c => c.Id).ToArray(); + var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds); + var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null); + foreach (var competency in competencies) + { + competency.QuestionLabel = assessment.QuestionLabel; + foreach (var assessmentQuestion in competency.AssessmentQuestions) + { + if (assessmentQuestion.AssessmentQuestionInputTypeID != 2) + { + assessmentQuestion.LevelDescriptors = selfAssessmentService + .GetLevelDescriptorsForAssessmentQuestion( + assessmentQuestion.Id, + assessmentQuestion.MinValue, + assessmentQuestion.MaxValue, + assessmentQuestion.MinValue == 0 + ).ToList(); + } + } + } + + var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup); + var competencySummaries = from g in CompetencyGroups + let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required) + let selfAssessedCount = questions.Count(q => q.Result.HasValue) + let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required)) + + select new + { + SelfAssessedCount = selfAssessedCount, + VerifiedCount = verifiedCount, + Questions = questions.Count() + }; + + int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount); + int sumQuestions = competencySummaries.Sum(item => item.Questions); + var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id); + var model = new ViewModels.LearningPortal.SelfAssessments.CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, "ProfileAssessment", accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, supervisorDelegateId); + return View("SelfAssessments/CompetencySelfAssessmentCertificate", model); + } } } diff --git a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs index c3ce3747f8..47a02db68c 100644 --- a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs +++ b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs @@ -144,7 +144,8 @@ public int GetSelfAssessmentActivityDelegatesExportCount(string searchString, st public int? GetDelegateAccountId(int centreId, int delegateUserId); int CheckDelegateSelfAssessment(int candidateAssessmentsId); IEnumerable GetCompetencyCountSelfAssessmentCertificate(int candidateAssessmentID); - CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID); + CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID); + CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId); IEnumerable GetAccessor(int selfAssessmentId, int delegateUserID); ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId); bool IsUnsupervisedSelfAssessment(int selfAssessmentId); @@ -526,10 +527,14 @@ public IEnumerable GetCompetencyCountS { return selfAssessmentDataService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentID); } - public CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID) + public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID) { return selfAssessmentDataService.GetCompetencySelfAssessmentCertificate(candidateAssessmentID); } + public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId) + { + return selfAssessmentDataService.GetCompetencySelfAssessmentCertificate(selfassessmentId,userId); + } public IEnumerable GetAccessor(int selfAssessmentId, int delegateUserID) { return selfAssessmentDataService.GetAccessor(selfAssessmentId, delegateUserID); diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CompetencySelfAssessmentCertificateViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificateViewModel.cs similarity index 92% rename from DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CompetencySelfAssessmentCertificateViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificateViewModel.cs index 8aab97d925..c22743c0e1 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CompetencySelfAssessmentCertificateViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificateViewModel.cs @@ -3,7 +3,7 @@ using DigitalLearningSolutions.Web.Helpers; using System.Collections.Generic; -namespace DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current +namespace DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments { public class CompetencySelfAssessmentCertificateViewModel { @@ -13,14 +13,14 @@ public CompetencySelfAssessmentCertificateViewModel() } public CompetencySelfAssessmentCertificateViewModel(CompetencySelfAssessmentCertificate competency, IEnumerable competencies, - int route, IEnumerable accessors, + string vocabulary, IEnumerable accessors, ActivitySummaryCompetencySelfAssesment activitySummaryCompetencySelfAssesment, int questionResponses, int confirmedResponses, int? loggedInSupervisorDelegateId ) { - Route = route; + Vocabulary = vocabulary; CompetencySelfAssessmentCertificates = competency; CompetencyCountSelfAssessmentCertificate = competencies; VocabPlural = FrameworkVocabularyHelper.VocabularyPlural(competency.Vocabulary); @@ -31,7 +31,7 @@ public CompetencySelfAssessmentCertificateViewModel(CompetencySelfAssessmentCert LoggedInSupervisorDelegateId = loggedInSupervisorDelegateId; } - public int Route { get; set; } + public string Vocabulary { get; set; } public string? VocabPlural { get; set; } public ActivitySummaryCompetencySelfAssesment ActivitySummaryCompetencySelfAssesment { get; set; } public CompetencySelfAssessmentCertificate CompetencySelfAssessmentCertificates { get; set; } @@ -40,6 +40,6 @@ public CompetencySelfAssessmentCertificateViewModel(CompetencySelfAssessmentCert public int QuestionResponses { get; set; } public int ConfirmedResponses { get; set; } public int? LoggedInSupervisorDelegateId { get; set; } - + } } diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/Current/CompetencySelfAssessmentCertificate.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/Current/CompetencySelfAssessmentCertificate.cshtml deleted file mode 100644 index bfedb9d201..0000000000 --- a/DigitalLearningSolutions.Web/Views/LearningPortal/Current/CompetencySelfAssessmentCertificate.cshtml +++ /dev/null @@ -1,247 +0,0 @@ -@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current -@model CompetencySelfAssessmentCertificateViewModel -@{ - var errorHasOccurred = !ViewData.ModelState.IsValid; - ViewData["Title"] = "Competency Self Assessment Certificate"; -} - - - - -@section NavMenuItems { - -} - - -
-
-
-
-

Certificate

- -

@Model.CompetencySelfAssessmentCertificates.SelfAssessment - @Model.CompetencySelfAssessmentCertificates.LearnerName

- - - Download certificate - -
-
-
-
- - -
-

-
- - This is to certify that - - @Model.CompetencySelfAssessmentCertificates.LearnerName - - @Model.CompetencySelfAssessmentCertificates.LearnerPRN - -
-
- - has successfully completed the - - @Model.CompetencySelfAssessmentCertificates.SelfAssessment -
-

-

- Signed off at @Model.CompetencySelfAssessmentCertificates.SupervisorCentreName by @Model.CompetencySelfAssessmentCertificates.SupervisorName @Model.CompetencySelfAssessmentCertificates.SupervisorPRN -

- -

- on @Model.CompetencySelfAssessmentCertificates.FormattedDate -

-
- -
-
- -
- @if (Model.CompetencyCountSelfAssessmentCertificate.Any()) - { -

- Including the following optional proficiencies: -

- @foreach (var entry in Model.CompetencyCountSelfAssessmentCertificate) - { -

- @entry.CompetencyGroup - @entry.OptionalCompetencyCount - @if (@entry.OptionalCompetencyCount == 1) - { - @Model.CompetencySelfAssessmentCertificates.Vocabulary - } - else - { - @Model.VocabPlural - } -

- } - } -
- - @if (Model.CompetencySelfAssessmentCertificates.NonReportable) - { - - } - - - -
-
-
-
-
-

-
-
-

Activity summary report

-
- @if (Model.CompetencySelfAssessmentCertificates.NonReportable) - { -

THIS IS AN EXAMPLE ONLY, GENERATED FROM A TEST SELF ASSESSMENT

- } -
-

Activity: @Model.CompetencySelfAssessmentCertificates.SelfAssessment

-
-
-

Name: @Model.CompetencySelfAssessmentCertificates.LearnerName

-
-
-

Professional Registration Number: @Model.CompetencySelfAssessmentCertificates.LearnerPRN

-
-
-

Assessment question responses

- @Model.QuestionResponses -

-
-
-

Responses confirmed by assessor

- @Model.ConfirmedResponses -

-
-
-

Assessors

    - @foreach (var accessor in Model.Accessors) - { -

    - @accessor.AccessorList -

    - - } -
-
-
-

Signed Off By

- @if (string.IsNullOrEmpty(@Model.CompetencySelfAssessmentCertificates.SupervisorPRN)) - { -

- @Model.CompetencySelfAssessmentCertificates.SupervisorName -

- } - else - { -

- @Model.CompetencySelfAssessmentCertificates.SupervisorName, @Model.CompetencySelfAssessmentCertificates.SupervisorPRN -

- } -
-
-

Certificate generated on @DateTime.Now.ToString("dd/MM/yyyy")

-
-
-
-
diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificate.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificate.cshtml new file mode 100644 index 0000000000..68c5269896 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificate.cshtml @@ -0,0 +1,95 @@ +@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments +@model CompetencySelfAssessmentCertificateViewModel +@{ + var errorHasOccurred = !ViewData.ModelState.IsValid; + ViewData["Title"] = "Competency Self Assessment Certificate"; +} + + + + +@section NavMenuItems { + +} + + +
+
+
+
+

Certificate

+ +

@Model.CompetencySelfAssessmentCertificates.SelfAssessment - @Model.CompetencySelfAssessmentCertificates.LearnerName

+ + + Download certificate + +
+
+ +

+ + +
+
+
diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/Current/DownloadCompetencySelfAssessmentCertificate.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/DownloadCompetencySelfAssessmentCertificate.cshtml similarity index 56% rename from DigitalLearningSolutions.Web/Views/LearningPortal/Current/DownloadCompetencySelfAssessmentCertificate.cshtml rename to DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/DownloadCompetencySelfAssessmentCertificate.cshtml index 06eeb53e31..066ad343e0 100644 --- a/DigitalLearningSolutions.Web/Views/LearningPortal/Current/DownloadCompetencySelfAssessmentCertificate.cshtml +++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/DownloadCompetencySelfAssessmentCertificate.cshtml @@ -1,4 +1,4 @@ -@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current +@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments @model CompetencySelfAssessmentCertificateViewModel @{ var errorHasOccurred = !ViewData.ModelState.IsValid; @@ -401,161 +401,9 @@
-
-
- - - -
-

-
- - This is to certify that - - @Model.CompetencySelfAssessmentCertificates.LearnerName - - @Model.CompetencySelfAssessmentCertificates.LearnerPRN - -
-
- - has successfully completed the - - @Model.CompetencySelfAssessmentCertificates.SelfAssessment -
-

-

- Signed off at @Model.CompetencySelfAssessmentCertificates.SupervisorCentreName by @Model.CompetencySelfAssessmentCertificates.SupervisorName @Model.CompetencySelfAssessmentCertificates.SupervisorPRN -

- -

- on @Model.CompetencySelfAssessmentCertificates.FormattedDate -

-
- -
-
- -
- @if (Model.CompetencyCountSelfAssessmentCertificate.Any()) - { -

- Including the following optional proficiencies: -

- @foreach (var entry in Model.CompetencyCountSelfAssessmentCertificate) - { -

- @entry.CompetencyGroup - @entry.OptionalCompetencyCount - @if (@entry.OptionalCompetencyCount == 1) - { - @Model.CompetencySelfAssessmentCertificates.Vocabulary - } - else - { - @Model.VocabPlural - } -

- } - } -
- - @if (Model.CompetencySelfAssessmentCertificates.NonReportable) - { - - } - - - -
-
-
-
-
+
- -
-
-

Activity summary report

-
- @if (Model.CompetencySelfAssessmentCertificates.NonReportable) - { -

THIS IS AN EXAMPLE ONLY, GENERATED FROM A TEST SELF ASSESSMENT

- } -
-

Activity: @Model.CompetencySelfAssessmentCertificates.SelfAssessment

-
-
-

Name: @Model.CompetencySelfAssessmentCertificates.LearnerName

-
-
-

Professional Registration Number: @Model.CompetencySelfAssessmentCertificates.LearnerPRN

-
-
-

Assessment question responses

- @Model.QuestionResponses -

-
-
-

Responses confirmed by assessor

- @Model.ConfirmedResponses -

-
-
-

Assessors

    - @foreach (var accessor in Model.Accessors) - { -

    - @accessor.AccessorList -

    - - } -
-
-
-

Signed Off By

- @if (string.IsNullOrEmpty(@Model.CompetencySelfAssessmentCertificates.SupervisorPRN)) - { -

- @Model.CompetencySelfAssessmentCertificates.SupervisorName -

- } - else - { -

- @Model.CompetencySelfAssessmentCertificates.SupervisorName, @Model.CompetencySelfAssessmentCertificates.SupervisorPRN -

- } -
-
-

Certificate generated on @DateTime.Now.ToString("dd/MM/yyyy")

-
+
diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_OverviewActionButtons.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_OverviewActionButtons.cshtml index 3ef930f62e..4c6d1a97e6 100644 --- a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_OverviewActionButtons.cshtml +++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_OverviewActionButtons.cshtml @@ -34,10 +34,10 @@ @if (ViewBag.CanViewCertificate) { - Certificate + asp-route-selfAssessmentId="@Model.SelfAssessment.Id" + asp-route-vocabulary="@Model.VocabPlural()" + asp-action="CompetencySelfAssessmentCertificate" + role="button"> + Certificate } diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateFirstPage.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateFirstPage.cshtml new file mode 100644 index 0000000000..9450aa86a8 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateFirstPage.cshtml @@ -0,0 +1,99 @@ +@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments +@model CompetencySelfAssessmentCertificateViewModel +
+
+ + + +
+

+
+ + This is to certify that + + @Model.CompetencySelfAssessmentCertificates.LearnerName + + @Model.CompetencySelfAssessmentCertificates.LearnerPRN + +
+
+ + has successfully completed the + + @Model.CompetencySelfAssessmentCertificates.SelfAssessment +
+

+

+ Signed off at @Model.CompetencySelfAssessmentCertificates.SupervisorCentreName by @Model.CompetencySelfAssessmentCertificates.SupervisorName @Model.CompetencySelfAssessmentCertificates.SupervisorPRN +

+ +

+ on @Model.CompetencySelfAssessmentCertificates.FormattedDate +

+
+ +
+
+ +
+ @if (Model.CompetencyCountSelfAssessmentCertificate.Any()) + { +

+ Including the following optional proficiencies: +

+ @foreach (var entry in Model.CompetencyCountSelfAssessmentCertificate) + { +

+ @entry.CompetencyGroup - @entry.OptionalCompetencyCount + @if (@entry.OptionalCompetencyCount == 1) + { + @Model.CompetencySelfAssessmentCertificates.Vocabulary + } + else + { + @Model.VocabPlural + } +

+ } + } +
+ + @if (Model.CompetencySelfAssessmentCertificates.NonReportable) + { + + } + + + +
+
+
+
+
diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateSecondPage.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateSecondPage.cshtml new file mode 100644 index 0000000000..2d91b24e83 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/_SelfAssessmentCertificateSecondPage.cshtml @@ -0,0 +1,58 @@ +@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments +@model CompetencySelfAssessmentCertificateViewModel +
+
+

Activity summary report

+
+ @if (Model.CompetencySelfAssessmentCertificates.NonReportable) + { +

THIS IS AN EXAMPLE ONLY, GENERATED FROM A TEST SELF ASSESSMENT

+ } +
+

Activity: @Model.CompetencySelfAssessmentCertificates.SelfAssessment

+
+
+

Name: @Model.CompetencySelfAssessmentCertificates.LearnerName

+
+
+

Professional Registration Number: @Model.CompetencySelfAssessmentCertificates.LearnerPRN

+
+
+

Assessment question responses

+ @Model.QuestionResponses +

+
+
+

Responses confirmed by assessor

+ @Model.ConfirmedResponses +

+
+
+

Assessors

    + @foreach (var accessor in Model.Accessors) + { +

    + @accessor.AccessorList +

    + + } +
+
+
+

Signed Off By

+ @if (string.IsNullOrEmpty(@Model.CompetencySelfAssessmentCertificates.SupervisorPRN)) + { +

+ @Model.CompetencySelfAssessmentCertificates.SupervisorName +

+ } + else + { +

+ @Model.CompetencySelfAssessmentCertificates.SupervisorName, @Model.CompetencySelfAssessmentCertificates.SupervisorPRN +

+ } +
+
+

Certificate generated on @DateTime.Now.ToString("dd/MM/yyyy")

+
diff --git a/DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml b/DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml index 1aa381fe1a..b043c5e2ab 100644 --- a/DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml +++ b/DigitalLearningSolutions.Web/Views/Supervisor/ReviewSelfAssessment.cshtml @@ -99,11 +99,10 @@ @if (ViewBag.CanViewCertificate) { + asp-route-candidateAssessmentId="@Model.CandidateAssessmentId" + asp-action="CompetencySelfAssessmentCertificatesupervisor" + asp-route-supervisorDelegateId="@Model.SupervisorDelegateDetail.ID" + role="button"> Certificate }