diff --git a/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs index c285a4c28d..df0ef4ffa8 100644 --- a/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs @@ -183,7 +183,7 @@ FROM NRPRoles private const string SelfAssessmentBaseTables = @"SelfAssessments AS sa LEFT OUTER JOIN - SelfAssessmentCollaborators AS sac ON sac.SelfAssessmentID = sa.ID AND sac.AdminID = @adminId"; + SelfAssessmentCollaborators AS sac ON sac.SelfAssessmentID = sa.ID AND sac.AdminID = @adminId AND sac.IsDeleted = 0"; private const string SelfAssessmentTables = @" LEFT OUTER JOIN @@ -1177,10 +1177,14 @@ public void RemoveCollaboratorFromCompetencyAssessment(int competencyAssessmentI CASE WHEN sc.CanModify = 1 THEN 'Contributor' ELSE 'Reviewer' END AS CompetencyAssessmentRole, sa.[Name] AS CompetencyAssessmentName, (SELECT Forename + ' ' + Surname + (CASE WHEN Active = 1 THEN '' ELSE ' (Inactive)' END) AS Expr1 FROM AdminUsers AS au1 WHERE (AdminID = @invitedByAdminId)) AS InvitedByName, - (SELECT Email FROM AdminUsers AS au2 WHERE (AdminID = @invitedByAdminId)) AS InvitedByEmail + (SELECT Email FROM AdminUsers AS au2 WHERE (AdminID = @invitedByAdminId)) AS InvitedByEmail, + sr.ID AS SelfAssessmentReviewID FROM SelfAssessmentCollaborators AS sc - INNER JOIN SelfAssessments AS sa ON sc.SelfAssessmentID = sa.ID - INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID + INNER JOIN SelfAssessments AS sa ON sc.SelfAssessmentID = sa.ID + INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID + LEFT JOIN SelfAssessmentReviews AS sr + ON sr.SelfAssessmentID = sa.ID AND sr.SelfAssessmentCollaboratorID = sc.ID + AND sr.ReviewComplete IS NULL AND sr.Archived IS NULL WHERE (sc.ID = @id) AND (sc.IsDeleted=0)", new { invitedByAdminId, id } ).FirstOrDefault(); diff --git a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs index 2c7d07013a..42d7cdc60d 100644 --- a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs @@ -2284,7 +2284,7 @@ FROM FrameworkCollaborators (SELECT COUNT(*) FROM SelfAssessments) AS CompetencyAssessmentCount, (SELECT COUNT(*) FROM SelfAssessments AS RP LEFT OUTER JOIN - SelfAssessmentCollaborators AS RPC ON RPC.SelfAssessmentID = RP.ID AND RPC.AdminID = @adminId + SelfAssessmentCollaborators AS RPC ON RPC.SelfAssessmentID = RP.ID AND RPC.AdminID = @adminId AND RPC.IsDeleted = 0 WHERE (RP.CreatedByAdminID = @adminId) OR (@adminId IN (SELECT AdminID @@ -2299,7 +2299,7 @@ public IEnumerable GetDashboardToDoItems(int adminId) return connection.Query( @"SELECT FW.ID AS FrameworkID, - 0 AS SelfAssessmentID, + 0 AS CompetencyAssessmentID, FW.FrameworkName AS ItemName, AU.Forename + ' ' + AU.Surname + (CASE WHEN AU.Active = 1 THEN '' ELSE ' (Inactive)' END) AS RequestorName, FWR.SignOffRequired, @@ -2319,7 +2319,7 @@ UNION ALL RPR.ReviewRequested AS Requested FROM SelfAssessmentReviews AS RPR INNER JOIN SelfAssessments AS RP ON RPR.SelfAssessmentID = RP.ID - INNER JOIN SelfAssessmentCollaborators AS RPC ON RPR.SelfAssessmentCollaboratorID = RPC.ID + INNER JOIN SelfAssessmentCollaborators AS RPC ON RPR.SelfAssessmentCollaboratorID = RPC.ID AND RPC.IsDeleted = 0 INNER JOIN AdminUsers AS AU ON RP.CreatedByAdminID = AU.AdminID WHERE (RPC.AdminID = @adminId) AND (RPR.ReviewComplete IS NULL) AND (RPR.Archived IS NULL)", new { adminId } diff --git a/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs index ac127b95a7..e6e0bed7aa 100644 --- a/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs +++ b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs @@ -1530,6 +1530,10 @@ public IActionResult PublishWithoutReview(int competencyAssessmentId) [Route("/CompetencyAssessments/{competencyAssessmentId}/PublishWithoutReview")] public IActionResult PublishWithoutReview(PublishWithoutReviewViewModel publish) { + if (!ModelState.IsValid) + { + return View(publish); + } var adminId = GetAdminID(); var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(publish.CompetencyAssessmentID, adminId); var result = ValidateCompetencyAssessmentAndRole(publish.CompetencyAssessmentID, adminId, "Publish Without Review", competencyAssessmentBase); diff --git a/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs b/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs index d63447a265..b5d98402fe 100644 --- a/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs +++ b/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs @@ -150,7 +150,7 @@ public void SendReviewRequestForCompetencyAssessment(int id, int invitedByAdminI { throw new NotificationDataException($"No record found when trying to fetch collaboratorNotification Data. id: {id}, invitedByAdminId: {invitedByAdminId}"); } - var competencyAssessmentUrl = GetCompetencyAssessmentUrl(collaboratorNotification.SelfAssessmentID, "Review"); + var competencyAssessmentUrl = GetCompetencyAssessmentUrl(collaboratorNotification.SelfAssessmentID, "Review", collaboratorNotification.SelfAssessmentReviewID); string emailSubjectLine = (reminder ? " REMINDER: " : "") + "Competency Assessment Review Request - Digital Learning Solutions"; string signOffRequired = required ? "You are required to sign-off this competency assessment before it can be published." : "You are not required to sign-off this competency assessment before it is published."; var builder = new BodyBuilder @@ -168,10 +168,13 @@ public string GetFrameworkUrl(int frameworkId, string tab) frameworkUrl.Path += $"Framework/{frameworkId}/{tab}/"; return frameworkUrl.Uri.ToString(); } - public string GetCompetencyAssessmentUrl(int selfAssessmentID, string actionName) + public string GetCompetencyAssessmentUrl(int selfAssessmentID, string actionName, int? id = null) { var competencyAssessmentUrl = GetDLSUriBuilder(); - competencyAssessmentUrl.Path += $"CompetencyAssessments/{selfAssessmentID}/{actionName}"; + + competencyAssessmentUrl.Path += id != null + ? $"CompetencyAssessments/{selfAssessmentID}/{id}/{actionName}" + : $"CompetencyAssessments/{selfAssessmentID}/{actionName}"; return competencyAssessmentUrl.Uri.ToString(); } public string GetCurrentActivitiesUrl() diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/PublishReviewViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/PublishReviewViewModel.cs index 5ca2d9d2b3..79aeef2b8d 100644 --- a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/PublishReviewViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/PublishReviewViewModel.cs @@ -15,7 +15,7 @@ public PublishReviewViewModel(int competencyAssessmentID, string competencyAsses CompetencyAssessmentName = competencyAssessmentName; SelfAssessmentReviews = selfAssessmentReviews; CompetencyAssessmentBase = competencyAssessmentBase; - CanPublish = selfAssessmentReviews?.All(x => x.SignedOff) ?? true; + CanPublish = selfAssessmentReviews?.Where(x => x.SignOffRequired).All(x => x.SignedOff) ?? true; } public int CompetencyAssessmentID { get; set; } public string CompetencyAssessmentName { get; set; } = string.Empty; diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml index 5cfd64bf85..ada73dd4d0 100644 --- a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml @@ -36,6 +36,11 @@
@Model.CompetencyAssessmentName
+ @if (Model.SelfAssessmentReviewID != null && Model.SelfAssessmentCommentID is null) + { +
+
+ }
Change assessment name @@ -51,14 +56,16 @@ @(Model.PublishStatusID == 1 ? "Draft" : Model.PublishStatusID == 2 ? "In review" : "Published")
-
- @if (Model.SelfAssessmentReviewID != null && Model.SelfAssessmentCommentID is null) - { + @if (Model.SelfAssessmentReviewID != null && Model.SelfAssessmentCommentID is null) + { +
+ Submit my review review - } -
+ + + } @if (Model.HasCompetencies) {
@@ -73,7 +80,7 @@ diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Index.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Index.cshtml index 22b3983e71..de1fb0d506 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Index.cshtml @@ -21,7 +21,7 @@ }

Frameworks Dashboard

-

Welcome @Model.Username. You are accessing as a @(Model.IsFrameworkDeveloper ? "Framework Developer" : Model.IsFrameworkContributor ? "Framework Contributor" : "Framework Viewer") and a @(Model.IsWorkforceManager | Model.IsFrameworkDeveloper ? "Self Assessment Developer" : "Self Assessment Viewer").

+

Welcome @Model.Username. You are accessing as a @(Model.IsFrameworkDeveloper ? "Framework Developer" : Model.IsFrameworkContributor ? "Framework Contributor" : "Framework Viewer") and a @(Model.IsWorkforceManager | Model.IsFrameworkDeveloper ? "Self Assessment Developer" : "Self Assessment Viewer").

Your to do list

@if (Model.DashboardToDoItems.Count() > 0) { @@ -29,7 +29,7 @@ @foreach (var toDoItem in Model.DashboardToDoItems) {
  • - @if (toDoItem.FrameworkID != null) + @if (toDoItem.FrameworkID != 0) { @(toDoItem.SignOffRequired ? "Approve " : "Review ") @toDoItem.ItemName for @toDoItem.RequestorName (requested @toDoItem.Requested.ToShortDateString()) @@ -37,7 +37,7 @@ } else { - + @(toDoItem.SignOffRequired ? "Approve " : "Review ") @toDoItem.ItemName for @toDoItem.RequestorName (requested @toDoItem.Requested.ToShortDateString()) }