Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public partial class SelfAssessmentDataService
sv.Verified,
sv.Comments,
sv.SignedOff,
sv.CandidateAssessmentSupervisorID,
sv.EmailSent,
0 AS UserIsVerifier,
COALESCE (rr.LevelRAG, 0) AS ResultRAG
FROM SelfAssessmentResults s
Expand Down Expand Up @@ -229,13 +231,14 @@ public IEnumerable<Competency> GetMostRecentResults(int selfAssessmentId, int ca
return GroupCompetencyAssessmentQuestions(result);
}

public IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId)
public IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId, int? selfAssessmentResultId = null)
{
var resultIdFilter = selfAssessmentResultId.HasValue ? $"ResultID = {selfAssessmentResultId.Value}" : "1=1";
var result = connection.Query<Competency, AssessmentQuestion, Competency>(
$@"WITH {SpecificAssessmentResults}
SELECT {CompetencyFields}
FROM {SpecificCompetencyTables}
WHERE (CAOC.IncludedInSelfAssessment = 1) OR (SAS.Optional = 0)
WHERE (CAOC.IncludedInSelfAssessment = 1 OR SAS.Optional = 0) AND {resultIdFilter}
ORDER BY SAS.Ordering, CAQ.Ordering",
(competency, assessmentQuestion) =>
{
Expand Down Expand Up @@ -269,6 +272,39 @@ int adminId
return GroupCompetencyAssessmentQuestions(result);
}

public IEnumerable<Competency> GetResultSupervisorVerifications(int selfAssessmentId, int candidateId)
{
const string supervisorFields = @"
LAR.EmailSent,
LAR.Requested AS SupervisorVerificationRequested,
COALESCE(au.Forename + ' ' + au.Surname + (CASE WHEN au.Active = 1 THEN '' ELSE ' (Inactive)' END), sd.SupervisorEmail) AS SupervisorName,
SelfAssessmentResultSupervisorVerificationId AS SupervisorVerificationId,
CandidateAssessmentSupervisorID";
const string supervisorTables = @"
LEFT OUTER JOIN CandidateAssessmentSupervisors AS cas ON cas.ID = CandidateAssessmentSupervisorID
LEFT OUTER JOIN SupervisorDelegates AS sd ON sd.ID = cas.SupervisorDelegateId AND sd.Removed IS NULL
LEFT OUTER JOIN AdminUsers AS au ON au.AdminID = sd.SupervisorAdminID";

var result = connection.Query<Competency, AssessmentQuestion, Competency>(
$@"WITH {LatestAssessmentResults}
SELECT {supervisorFields}, {CompetencyFields}
FROM {CompetencyTables}
INNER JOIN SelfAssessments AS SA ON CA.SelfAssessmentID = SA.ID
{supervisorTables}
WHERE (LAR.Verified IS NULL) 
AND ((LAR.Result IS NOT NULL) OR (LAR.SupportingComments IS NOT NULL)) 
AND (LAR.Requested IS NOT NULL)
ORDER BY SupervisorVerificationRequested DESC, C.Name",
(competency, assessmentQuestion) =>
{
competency.AssessmentQuestions.Add(assessmentQuestion);
return competency;
},
new { selfAssessmentId, candidateId }
);
return result;
}

public IEnumerable<Competency> GetCandidateAssessmentResultsToVerifyById(int selfAssessmentId, int candidateId)
{
var result = connection.Query<Competency, AssessmentQuestion, Competency>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ public interface ISelfAssessmentDataService

IEnumerable<Competency> GetMostRecentResults(int selfAssessmentId, int candidateId);

IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId);
IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId, int? selfAssessmentResultId = null);

IEnumerable<Competency> GetCandidateAssessmentResultsForReviewById(int candidateAssessmentId, int adminId);

IEnumerable<Competency> GetCandidateAssessmentResultsToVerifyById(int selfAssessmentId, int candidateId);
IEnumerable<Competency> GetResultSupervisorVerifications(int selfAssessmentId, int candidateId);

Competency? GetCompetencyByCandidateAssessmentResultId(int resultId, int candidateAssessmentId, int adminId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@ public class Competency
public bool IncludedInSelfAssessment { get; set; }
public DateTime? Verified { get; set; }
public DateTime? Requested { get; set; }
public DateTime? EmailSent { get; set; }
public bool? SignedOff { get; set; }
public DateTime? SupervisorVerificationRequested { get; set; }
public int? SupervisorVerificationId { get; set; }
public int? CandidateAssessmentSupervisorId { get; set; }
public string? SupervisorName { get; set; }
public List<AssessmentQuestion> AssessmentQuestions { get; set; } = new List<AssessmentQuestion>();
public IEnumerable<CompetencyFlag> CompetencyFlags { get; set; } = new List<CompetencyFlag>();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public interface IFrameworkNotificationService
void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate);
void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId);
void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults);
void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId);
void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId);
void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId, int? selfAssessmentResultId = null);
void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId, int? selfAssessmentResultId = null);
void SendSignOffRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int delegateId);
void SendProfileAssessmentSignedOff(int supervisorDelegateId, int candidateAssessmentId, string? supervisorComments, bool signedOff, int adminId);
}
Expand Down Expand Up @@ -298,49 +298,44 @@ public void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDel
emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
}

public void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId)
public void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId, int? selfAssessmentResultId = null)
{
var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
if (supervisorDelegate == null)
if (supervisorDelegate == null || supervisorDelegate.CandidateID == null || supervisorDelegate.SupervisorAdminID == null)
{
return;
}
if (supervisorDelegate.CandidateID == null)
{
return;
}
var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateSelfAssessmentId(selfAssessmentID, (int)supervisorDelegate.ID);
var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateSelfAssessmentId(selfAssessmentID, supervisorDelegate.ID);
string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Role Request - Digital Learning Solutions";
var builder = new BodyBuilder();
if (supervisorDelegate.SupervisorAdminID == null)
{
return;
}

var profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, delegateSelfAssessment.ID);
var profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, delegateSelfAssessment.ID, selfAssessmentResultId);
builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
You have been identified by {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
To supervise this activity, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
builder.HtmlBody = $@"<body style= 'font-family: Calibri; font-size: small;'><p>Dear {supervisorDelegate.SupervisorName},</p><p>You have been identified by <a href='mailto:{supervisorDelegate.DelegateEmail}'>{supervisorDelegate.FirstName} {supervisorDelegate.LastName}</a> as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.</p><p>You are already registered as a delegate at the supervisor's DLS centre. <a href='{profileReviewUrl}'>Click here</a> to supervise this activity (sign in using your existing DLS credentials).</p></body>";
supervisorService.UpdateNotificationSent(supervisorDelegateId);
emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
}
protected string GetSupervisorProfileReviewUrl(int supervisorDelegateId, int delegateSelfAssessmentId)
protected string GetSupervisorProfileReviewUrl(int supervisorDelegateId, int delegateSelfAssessmentId, int? selfAssessmentResultId = null)
{
var dlsUrlBuilder = GetDLSUriBuilder();
dlsUrlBuilder.Path += $"Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{delegateSelfAssessmentId}/Review";
if (selfAssessmentResultId.HasValue)
{
dlsUrlBuilder.Path += $"/{selfAssessmentResultId}";
}
return dlsUrlBuilder.Uri.ToString();
}

public void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId)
public void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId, int? selfAssessmentResultId)
{
var candidateAssessmentSupervisor = supervisorService.GetCandidateAssessmentSupervisorById(candidateAssessmentSupervisorId);
int supervisorDelegateId = candidateAssessmentSupervisor.SupervisorDelegateId;
int candidateAssessmentId = candidateAssessmentSupervisor.CandidateAssessmentID;
var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentSupervisor.CandidateAssessmentID);
string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Self Assessment Results Review Request - Digital Learning Solutions";
string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId);
string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId, selfAssessmentResultId);
BodyBuilder? builder = new BodyBuilder();
builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) has requested that you review {resultCount.ToString()} of their self assessment results for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
Expand Down
12 changes: 9 additions & 3 deletions DigitalLearningSolutions.Data/Services/SelfAssessmentService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,12 @@ public interface ISelfAssessmentService
bool CanDelegateAccessSelfAssessment(int delegateId, int selfAssessmentId);

// Competencies
IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId);
IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId, int? selfAssessmentResultId = null);

IEnumerable<Competency> GetCandidateAssessmentResultsForReviewById(int candidateAssessmentId, int adminId);

IEnumerable<Competency> GetCandidateAssessmentResultsToVerifyById(int selfAssessmentId, int candidateId);
IEnumerable<Competency> GetResultSupervisorVerifications(int selfAssessmentId, int candidateId);

IEnumerable<LevelDescriptor> GetLevelDescriptorsForAssessmentQuestion(
int assessmentQuestionId,
Expand Down Expand Up @@ -170,9 +171,9 @@ public void SetCompleteByDate(int selfAssessmentId, int candidateId, DateTime? c
selfAssessmentDataService.SetCompleteByDate(selfAssessmentId, candidateId, completeByDate);
}

public IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId)
public IEnumerable<Competency> GetCandidateAssessmentResultsById(int candidateAssessmentId, int adminId, int? selfAssessmentResultId = null)
{
return selfAssessmentDataService.GetCandidateAssessmentResultsById(candidateAssessmentId, adminId);
return selfAssessmentDataService.GetCandidateAssessmentResultsById(candidateAssessmentId, adminId, selfAssessmentResultId);
}

public IEnumerable<Competency> GetCandidateAssessmentResultsForReviewById(
Expand All @@ -188,6 +189,11 @@ public IEnumerable<Competency> GetCandidateAssessmentResultsToVerifyById(int sel
return selfAssessmentDataService.GetCandidateAssessmentResultsToVerifyById(selfAssessmentId, candidateId);
}

public IEnumerable<Competency> GetResultSupervisorVerifications(int selfAssessmentId, int candidateId)
{
return selfAssessmentDataService.GetResultSupervisorVerifications(selfAssessmentId, candidateId);
}

public IEnumerable<SelfAssessmentSupervisor> GetSupervisorsForSelfAssessmentId(
int selfAssessmentId,
int candidateId
Expand Down
29 changes: 29 additions & 0 deletions DigitalLearningSolutions.Data/Services/SupervisorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ public interface ISupervisorService
bool ConfirmSupervisorDelegateById(int supervisorDelegateId, int candidateId, int adminId);
bool RemoveSupervisorDelegateById(int supervisorDelegateId, int candidateId, int adminId);
bool UpdateSelfAssessmentResultSupervisorVerifications(int selfAssessmentResultSupervisorVerificationId, string? comments, bool signedOff, int adminId);
bool UpdateSelfAssessmentResultSupervisorVerificationsEmailSent(int selfAssessmentResultSupervisorVerificationId);
int RemoveSelfAssessmentResultSupervisorVerificationById(int id);
bool RemoveCandidateAssessment(int candidateAssessmentId);
void UpdateNotificationSent(int supervisorDelegateId);
void UpdateCandidateAssessmentSupervisorVerificationById(int? candidateAssessmentSupervisorVerificationId, string? supervisorComments, bool signedOff);
Expand Down Expand Up @@ -389,6 +391,33 @@ FROM SelfAssessmentResultSupervisorVerifications INNER JOIN
return false;
}
}

public bool UpdateSelfAssessmentResultSupervisorVerificationsEmailSent(int selfAssessmentResultSupervisorVerificationId)
{
var numberOfAffectedRows = connection.Execute(
@"UPDATE SelfAssessmentResultSupervisorVerifications
SET EmailSent = getUTCDate()
FROM SelfAssessmentResultSupervisorVerifications
WHERE ID = @selfAssessmentResultSupervisorVerificationId",
new { selfAssessmentResultSupervisorVerificationId }
);
return numberOfAffectedRows > 0;
}

public int RemoveSelfAssessmentResultSupervisorVerificationById(int id)
{
var numberOfAffectedRows = connection.Execute(
@"DELETE FROM SelfAssessmentResultSupervisorVerifications WHERE ID = @id",
new { id });

if (numberOfAffectedRows < 1)
{
logger.LogWarning(
$"Not deleting supervisor verifications as db update failed. SelfAssessmentResultSupervisorVerification.Id: {id}"
);
}
return numberOfAffectedRows;
}
public IEnumerable<RoleProfile> GetAvailableRoleProfilesForDelegate(int candidateId, int centreId)
{
return connection.Query<RoleProfile>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,6 @@ public IActionResult CreateNewFramework(string actionname, int frameworkId = 0)
);
multiPageFormService.SetMultiPageFormData(sessionNewFramework, MultiPageFormDataFeature.AddNewFramework, TempData);
detailFramework = sessionNewFramework.DetailFramework;
multiPageFormService.SetMultiPageFormData(
sessionNewFramework,
MultiPageFormDataFeature.AddNewFramework,
TempData
);
}
return View("Developer/Name", detailFramework);
}
Expand Down
Loading