Skip to content

Commit d9faf16

Browse files
authored
Merge pull request #2657 from TechnologyEnhancedLearning/Develop/Features/TD-4092-RefactorDLSCompetencySelfAssessmentCertificatetoimprovemaintainabilityandsecurity
TD-4092 Refactor dls competency self assessment certificate to improve maintainability and security
2 parents 572af95 + f1e2b05 commit d9faf16

File tree

14 files changed

+581
-604
lines changed

14 files changed

+581
-604
lines changed

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ FROM CandidateAssessments
335335
new { selfAssessmentId, delegateUserId }
336336
);
337337
}
338-
public CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID)
338+
public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID)
339339
{
340340
return connection.QueryFirstOrDefault<CompetencySelfAssessmentCertificate>(
341341
@"SELECT
@@ -388,7 +388,59 @@ from CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
388388
new { candidateAssessmentID }
389389
);
390390
}
391-
391+
public CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId)
392+
{
393+
return connection.QueryFirstOrDefault<CompetencySelfAssessmentCertificate>(
394+
@"SELECT
395+
LearnerDetails.ID ,
396+
LearnerDetails.SelfAssessment,
397+
LearnerDetails.LearnerName,
398+
LearnerDetails.LearnerPRN,
399+
LearnerId,LearnerDelegateAccountId,
400+
LearnerDetails.Verified,
401+
LearnerDetails.CentreName,
402+
Supervisor.SupervisorName ,
403+
Supervisor.SupervisorPRN ,
404+
Supervisor.SupervisorCentreName,
405+
LearnerDetails.BrandName ,
406+
LearnerDetails.BrandImage,
407+
LearnerDetails.CandidateAssessmentID,
408+
LearnerDetails.SelfAssessmentID,
409+
LearnerDetails.Vocabulary,
410+
LearnerDetails.SupervisorDelegateId,
411+
LearnerDetails.FormattedDate,
412+
LearnerDetails.NonReportable
413+
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,
414+
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,
415+
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)
416+
% 10 = 3 THEN 'rd' ELSE 'th' END + ' ' + FORMAT(casv.Verified, 'MMMM yyyy') AS FormattedDate
417+
FROM dbo.CandidateAssessments AS ca LEFT OUTER JOIN
418+
dbo.DelegateAccounts AS da RIGHT OUTER JOIN
419+
dbo.Users AS Learner ON da.UserID = Learner.ID ON ca.CentreID = da.CentreID AND ca.DelegateUserID = Learner.ID LEFT OUTER JOIN
420+
dbo.Centres AS ce ON ca.CentreID = ce.CentreID LEFT OUTER JOIN
421+
dbo.Brands AS b RIGHT OUTER JOIN
422+
dbo.SelfAssessments AS sa ON b.BrandID = sa.BrandID ON ca.SelfAssessmentID = sa.ID LEFT OUTER JOIN
423+
dbo.CandidateAssessmentSupervisors AS cas ON ca.ID = cas.CandidateAssessmentID LEFT OUTER JOIN
424+
dbo.Users AS Supervisor RIGHT OUTER JOIN
425+
dbo.AdminAccounts AS aa ON Supervisor.ID = aa.UserID RIGHT OUTER JOIN
426+
dbo.CandidateAssessmentSupervisorVerifications AS casv ON aa.ID = casv.ID ON cas.ID = casv.CandidateAssessmentSupervisorID
427+
WHERE (CA.SelfAssessmentID =@selfassessmentId AND Learner.ID = @userId) AND (casv.SignedOff = 1) AND (NOT (casv.Verified IS NULL))) LearnerDetails INNER JOIN
428+
(select sd.SupervisorAdminID, casv.ID ,u.FirstName + ' ' + u.LastName AS SupervisorName,
429+
u.ProfessionalRegistrationNumber AS SupervisorPRN,
430+
c.CentreName AS SupervisorCentreName,ca.CentreID
431+
from CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
432+
CandidateAssessmentSupervisors AS cas ON casv.CandidateAssessmentSupervisorID = cas.ID INNER JOIN
433+
SupervisorDelegates AS sd ON sd.ID = cas.SupervisorDelegateId INNER JOIN
434+
AdminAccounts AS aa ON sd.SupervisorAdminID = aa.ID INNER JOIN
435+
Users AS u ON aa.UserID = u.ID INNER JOIN
436+
Centres c ON aa.CentreID = c.CentreID INNER JOIN
437+
CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID
438+
where (CA.SelfAssessmentID =@selfassessmentId AND u.ID = @userId) AND (casv.SignedOff = 1)
439+
AND (NOT (casv.Verified IS NULL))) Supervisor ON LearnerDetails.Id =Supervisor.Id
440+
ORDER BY Verified DESC",
441+
new { selfassessmentId , userId }
442+
);
443+
}
392444
public IEnumerable<CompetencyCountSelfAssessmentCertificate> GetCompetencyCountSelfAssessmentCertificate(int candidateAssessmentID)
393445
{
394446
return connection.Query<CompetencyCountSelfAssessmentCertificate>(

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,16 +157,17 @@ IEnumerable<SelfAssessmentDelegate> GetSelfAssessmentActivityDelegatesExport(str
157157
int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, int currentRun, bool? submitted, bool? signedOff);
158158
int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string sortBy, string sortDirection,
159159
int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff);
160-
string GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId);
160+
string? GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId);
161161

162-
RemoveSelfAssessmentDelegate GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId);
162+
RemoveSelfAssessmentDelegate? GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId);
163163
void RemoveDelegateSelfAssessment(int candidateAssessmentsId);
164164
int? GetSupervisorsCountFromCandidateAssessmentId(int candidateAssessmentsId);
165165
bool CheckForSameCentre(int centreId, int candidateAssessmentsId);
166166
int? GetDelegateAccountId(int centreId, int delegateUserId);
167167
int CheckDelegateSelfAssessment(int candidateAssessmentsId);
168168
IEnumerable<CompetencyCountSelfAssessmentCertificate> GetCompetencyCountSelfAssessmentCertificate(int candidateAssessmentID);
169-
CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
169+
CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
170+
CompetencySelfAssessmentCertificate? GetCompetencySelfAssessmentCertificate(int selfassessmentId, int userId);
170171
IEnumerable<Accessor> GetAccessor(int selfAssessmentId, int delegateUserID);
171172
ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
172173
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
@@ -624,7 +625,7 @@ LEFT OUTER JOIN AdminAccounts AS aaEnrolledBy WITH (NOLOCK) ON aaEnrolledBy.ID =
624625
);
625626
return ResultCount;
626627
}
627-
public string GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId)
628+
public string? GetSelfAssessmentActivityDelegatesSupervisor(int selfAssessmentId, int delegateUserId)
628629
{
629630
return connection.Query<string>(
630631
@$"SELECT
@@ -647,7 +648,7 @@ LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr
647648
new { delegateUserId, selfAssessmentId }
648649
).FirstOrDefault();
649650
}
650-
public RemoveSelfAssessmentDelegate GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId)
651+
public RemoveSelfAssessmentDelegate? GetDelegateSelfAssessmentByCandidateAssessmentsId(int candidateAssessmentsId)
651652
{
652653
return connection.QueryFirstOrDefault<RemoveSelfAssessmentDelegate>(
653654
@"Select

DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs

Lines changed: 0 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current;
2323
using DocumentFormat.OpenXml.EMMA;
2424
using Microsoft.AspNetCore.Mvc;
25-
using Microsoft.AspNetCore.Mvc.Rendering;
26-
using Microsoft.AspNetCore.Mvc.ViewEngines;
27-
using Microsoft.AspNetCore.Mvc.ViewFeatures;
2825
using Microsoft.Extensions.Logging;
2926
using Microsoft.FeatureManagement.Mvc;
3027

@@ -343,180 +340,5 @@ int delegateUserId
343340
await actionPlanService.GetIncompleteActionPlanResources(delegateUserId);
344341
return (resources.ToList(), apiIsAccessible);
345342
}
346-
[Route("/LearningPortal/Current/{candidateAssessmentId:int}/{route:int}/Certificate")]
347-
[NoCaching]
348-
public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessmentId, int route)
349-
{
350-
int supervisorDelegateId = 0;
351-
if (candidateAssessmentId == 0)
352-
{
353-
return NotFound();
354-
}
355-
356-
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId);
357-
if (competencymaindata == null)
358-
{
359-
return NotFound();
360-
}
361-
362-
var delegateUserId = competencymaindata.LearnerId;
363-
if (route == 3)
364-
{
365-
var supervisorDelegate = supervisorService.GetSupervisorDelegate(User.GetAdminIdKnownNotNull(), delegateUserId);
366-
supervisorDelegateId = supervisorDelegate.ID;
367-
}
368-
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
369-
var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId);
370-
371-
if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs))
372-
{
373-
return NotFound();
374-
}
375-
376-
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
377-
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
378-
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
379-
var competencyIds = recentResults.Select(c => c.Id).ToArray();
380-
var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds);
381-
var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null);
382-
foreach (var competency in competencies)
383-
{
384-
competency.QuestionLabel = assessment.QuestionLabel;
385-
foreach (var assessmentQuestion in competency.AssessmentQuestions)
386-
{
387-
if (assessmentQuestion.AssessmentQuestionInputTypeID != 2)
388-
{
389-
assessmentQuestion.LevelDescriptors = selfAssessmentService
390-
.GetLevelDescriptorsForAssessmentQuestion(
391-
assessmentQuestion.Id,
392-
assessmentQuestion.MinValue,
393-
assessmentQuestion.MaxValue,
394-
assessmentQuestion.MinValue == 0
395-
).ToList();
396-
}
397-
}
398-
}
399-
400-
var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup);
401-
var competencySummaries = from g in CompetencyGroups
402-
let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required)
403-
let selfAssessedCount = questions.Count(q => q.Result.HasValue)
404-
let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required))
405-
406-
select new
407-
{
408-
SelfAssessedCount = selfAssessedCount,
409-
VerifiedCount = verifiedCount,
410-
Questions = questions.Count()
411-
};
412-
413-
int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount);
414-
int sumQuestions = competencySummaries.Sum(item => item.Questions);
415-
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
416-
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, supervisorDelegateId);
417-
return View("Current/CompetencySelfAssessmentCertificate", model);
418-
}
419-
[Route("DownloadCertificate")]
420-
public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
421-
{
422-
PdfReportStatusResponse pdfReportStatusResponse = new PdfReportStatusResponse();
423-
if (candidateAssessmentId == 0)
424-
{
425-
return NotFound();
426-
}
427-
var delegateId = User.GetCandidateIdKnownNotNull();
428-
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(candidateAssessmentId);
429-
430-
if (competencymaindata == null)
431-
{
432-
return NotFound();
433-
}
434-
var delegateUserId = competencymaindata.LearnerId;
435-
436-
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
437-
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
438-
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
439-
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
440-
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
441-
var competencyIds = recentResults.Select(c => c.Id).ToArray();
442-
var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds);
443-
var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null);
444-
foreach (var competency in competencies)
445-
{
446-
competency.QuestionLabel = assessment.QuestionLabel;
447-
foreach (var assessmentQuestion in competency.AssessmentQuestions)
448-
{
449-
if (assessmentQuestion.AssessmentQuestionInputTypeID != 2)
450-
{
451-
assessmentQuestion.LevelDescriptors = selfAssessmentService
452-
.GetLevelDescriptorsForAssessmentQuestion(
453-
assessmentQuestion.Id,
454-
assessmentQuestion.MinValue,
455-
assessmentQuestion.MaxValue,
456-
assessmentQuestion.MinValue == 0
457-
).ToList();
458-
}
459-
}
460-
}
461-
462-
var CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup);
463-
var competencySummaries = from g in CompetencyGroups
464-
let questions = g.SelectMany(c => c.AssessmentQuestions).Where(q => q.Required)
465-
let selfAssessedCount = questions.Count(q => q.Result.HasValue)
466-
let verifiedCount = questions.Count(q => !((q.Result == null || q.Verified == null || q.SignedOff != true) && q.Required))
467-
select new
468-
{
469-
SelfAssessedCount = selfAssessedCount,
470-
VerifiedCount = verifiedCount,
471-
Questions = questions.Count()
472-
};
473-
474-
int sumVerifiedCount = competencySummaries.Sum(item => item.VerifiedCount);
475-
int sumQuestions = competencySummaries.Sum(item => item.Questions);
476-
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, null);
477-
var renderedViewHTML = RenderRazorViewToString(this, "Current/DownloadCompetencySelfAssessmentCertificate", model);
478-
479-
var pdfReportResponse = await pdfService.PdfReport(candidateAssessmentId.ToString(), renderedViewHTML, delegateId);
480-
if (pdfReportResponse != null)
481-
{
482-
do
483-
{
484-
pdfReportStatusResponse = await pdfService.PdfReportStatus(pdfReportResponse);
485-
} while (pdfReportStatusResponse.Id == 1);
486-
487-
var pdfReportFile = await pdfService.GetPdfReportFile(pdfReportResponse);
488-
if (pdfReportFile != null)
489-
{
490-
var nameTextLength = string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerName) ? 0 : model.CompetencySelfAssessmentCertificates.LearnerName.Length;
491-
var isPrnExist = !string.IsNullOrEmpty(model.CompetencySelfAssessmentCertificates.LearnerPRN);
492-
var fileName = $"Competency Certificate - {model.CompetencySelfAssessmentCertificates.LearnerName.Substring(0, nameTextLength >= 15 ? 15 : nameTextLength)}" + (isPrnExist ? $" - {model.CompetencySelfAssessmentCertificates.LearnerPRN}.pdf" : ".pdf");
493-
return File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName);
494-
}
495-
}
496-
return View("Current/CompetencySelfAssessmentCertificate", model);
497-
}
498-
499-
public static string RenderRazorViewToString(Controller controller, string viewName, object model = null)
500-
{
501-
controller.ViewData.Model = model;
502-
using (var sw = new StringWriter())
503-
{
504-
IViewEngine viewEngine =
505-
controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as
506-
ICompositeViewEngine;
507-
ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, false);
508-
509-
ViewContext viewContext = new ViewContext(
510-
controller.ControllerContext,
511-
viewResult.View,
512-
controller.ViewData,
513-
controller.TempData,
514-
sw,
515-
new HtmlHelperOptions()
516-
);
517-
viewResult.View.RenderAsync(viewContext);
518-
return sw.GetStringBuilder().ToString();
519-
}
520-
}
521343
}
522344
}

0 commit comments

Comments
 (0)