diff --git a/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs index 29c9e5e6c7..db51ab8eee 100644 --- a/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs @@ -24,6 +24,8 @@ public interface ICompetencyAssessmentDataService IEnumerable GetNRPProfessionalGroups(); + CompetencyAssessmentTaskStatus GetOrInsertAndReturnAssessmentTaskStatus(int assessmentId, bool frameworkBased); + //UPDATE DATA bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName); @@ -34,6 +36,7 @@ bool UpdateCompetencyAssessmentBranding( int categoryId, int adminId ); + bool UpdateCompetencyAssessmentVocabulary(int competencyAssessmentId, int adminId, string vocabulary); bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription); //INSERT DATA int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName); @@ -49,7 +52,7 @@ public class CompetencyAssessmentDataService : ICompetencyAssessmentDataService sa.NRPProfessionalGroupID, sa.NRPSubGroupID, sa.NRPRoleID, - sa.PublishStatusID, CASE WHEN sa.CreatedByAdminID = @adminId THEN 3 WHEN sac.CanModify = 1 THEN 2 WHEN sac.CanModify = 0 THEN 1 ELSE 0 END AS UserRole"; + sa.PublishStatusID, sa.Vocabulary, CASE WHEN sa.CreatedByAdminID = @adminId THEN 3 WHEN sac.CanModify = 1 THEN 2 WHEN sac.CanModify = 0 THEN 1 ELSE 0 END AS UserRole"; private const string SelfAssessmentFields = @", sa.CreatedDate, @@ -265,7 +268,7 @@ int adminId if (numberOfAffectedRows < 1) { logger.LogWarning( - "Not updating competency assessment as db update failed. " + + "Not updating competency assessment branding as db update failed. " + $"frameworkId: {competencyAssessmentId}, brandId: {brandId}, categoryId: {categoryId}, AdminId: {adminId}" ); return false; @@ -284,7 +287,7 @@ public bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, in if (numberOfAffectedRows < 1) { logger.LogWarning( - "Not updating competency assessment as db update failed. " + + "Not updating competency assessment Description as db update failed. " + $"frameworkId: {competencyAssessmentId}, competencyAssessmentDescription: {competencyAssessmentDescription}, AdminId: {adminId}" ); return false; @@ -292,6 +295,24 @@ public bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, in return true; } + public bool UpdateCompetencyAssessmentVocabulary(int competencyAssessmentId, int adminId, string vocabulary) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessments SET Vocabulary = @vocabulary, UpdatedByAdminID = @adminId + WHERE ID = @competencyAssessmentId", + new { adminId, competencyAssessmentId, vocabulary } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating competency assessment vocabulary as db update failed. " + + $"frameworkId: {competencyAssessmentId}, vocabulary: {vocabulary}, AdminId: {adminId}" + ); + return false; + } + return true; + } + public bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId) { var numberOfAffectedRows = connection.Execute( @@ -312,5 +333,21 @@ WHERE NOT EXISTS (SELECT 1 FROM SelfAssessmentFrameworks WHERE SelfAssessmentId return true; } + + public CompetencyAssessmentTaskStatus GetOrInsertAndReturnAssessmentTaskStatus(int assessmentId, bool frameworkBased) + { + bool? frameworkItemBool = frameworkBased ? false : null; + connection.Execute( + @"INSERT INTO SelfAssessmentTaskStatus (SelfAssessmentId, IntroductoryTextTaskStatus, BrandingTaskStatus, VocabularyTaskStatus, FrameworkLinksTaskStatus) + SELECT @assessmentId, @frameworkItemBool, @frameworkItemBool, @frameworkItemBool, @frameworkItemBool + WHERE NOT EXISTS (SELECT 1 FROM SelfAssessmentTaskStatus WHERE SelfAssessmentId = @assessmentId)", new { assessmentId, frameworkItemBool }); + return connection.Query( + $@"SELECT * + FROM SelfAssessmentTaskStatus + WHERE (SelfAssessmentId = @assessmentId)", + new { assessmentId } + ).Single(); + + } } } diff --git a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs index f7e090372e..125a66aaca 100644 --- a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs @@ -285,7 +285,7 @@ public class FrameworkDataService : IFrameworkDataService fwr.ID AS FrameworkReviewID"; private const string BrandedFrameworkFields = - @", FW.Description, (SELECT BrandName + @", FW.Description, FW.FrameworkConfig AS Vocabulary, (SELECT BrandName FROM Brands WHERE (BrandID = FW.BrandID)) AS Brand, (SELECT CategoryName @@ -2193,7 +2193,7 @@ public IEnumerable GetDashboardToDoItems(int adminId) return connection.Query( @"SELECT FW.ID AS FrameworkID, - 0 AS CompetencyAssessmentID, + 0 AS SelfAssessmentID, FW.FrameworkName AS ItemName, AU.Forename + ' ' + AU.Surname + (CASE WHEN AU.Active = 1 THEN '' ELSE ' (Inactive)' END) AS RequestorName, FWR.SignOffRequired, @@ -2205,8 +2205,8 @@ FROM FrameworkReviews AS FWR WHERE (FWC.AdminID = @adminId) AND (FWR.ReviewComplete IS NULL) AND (FWR.Archived IS NULL) UNION ALL SELECT - 0 AS SelfAssessmentID, - RP.ID AS SelfAssessmentID, + 0 AS FrameworkID, + RP.ID AS CompetencyAssessmentID, RP.Name AS ItemName, AU.Forename + ' ' + AU.Surname + (CASE WHEN AU.Active = 1 THEN '' ELSE ' (Inactive)' END) AS RequestorName, RPR.SignOffRequired, diff --git a/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs index f679ad6da9..7824fff1eb 100644 --- a/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs @@ -1,7 +1,6 @@ namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { using System; - using System.ComponentModel.DataAnnotations; public class CompetencyAssessment : CompetencyAssessmentBase { public DateTime CreatedDate { get; set; } diff --git a/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs index 23ec8fede7..840f6218bd 100644 --- a/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs @@ -19,6 +19,7 @@ public class CompetencyAssessmentBase public int? NRPRoleID { get; set; } public int PublishStatusID { get; set; } public int UserRole { get; set; } + public string? Vocabulary { get; set; } } } diff --git a/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentTaskStatus.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentTaskStatus.cs new file mode 100644 index 0000000000..654220f151 --- /dev/null +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentTaskStatus.cs @@ -0,0 +1,20 @@ +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments +{ + public class CompetencyAssessmentTaskStatus + { + public int Id { get; set; } + public bool? IntroductoryTextTaskStatus { get; set; } + public bool? BrandingTaskStatus { get; set; } + public bool? VocabularyTaskStatus { get; set; } + public bool? WorkingGroupTaskStatus { get; set; } + public bool? NationalRoleProfileTaskStatus { get; set; } + public bool? FrameworkLinksTaskStatus { get; set; } + public bool? SelectCompetenciesTaskStatus { get; set; } + public bool? OptionalCompetenciesTaskStatus { get; set; } + public bool? RoleRequirementsTaskStatus { get; set; } + public bool? SupervisorRolesTaskStatus { get; set; } + public bool? SelfAssessmentOptionsTaskStatus { get; set; } + public bool? ReviewTaskStatus { get; set; } + + } +} diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs b/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs index fdcc327484..5ba38617ac 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs @@ -3,6 +3,7 @@ public class BrandedFramework : BaseFramework { public string? Description { get; set; } + public string? Vocabulary { get; set; } public string? Brand { get => brand; diff --git a/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs index 907bd33328..58fc9a890e 100644 --- a/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs +++ b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs @@ -114,10 +114,10 @@ public IActionResult CompetencyAssessmentName(string actionName, int competencyA return StatusCode(403); } } - else if( frameworkId != null ) + else if (frameworkId != null) { var framework = frameworkService.GetBaseFrameworkByFrameworkId((int)frameworkId, adminId); - if ( framework != null ) + if (framework != null) { competencyAssessmentBase.CompetencyAssessmentName = framework.FrameworkName; } @@ -151,11 +151,11 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name."); return View("Name", competencyAssessmentBase); } - competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId); + competencyAssessmentId = competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId); } else - { - + { + var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentName(competencyAssessmentBase.ID, adminId, competencyAssessmentBase.CompetencyAssessmentName); if (!isUpdated) { @@ -163,8 +163,27 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme return View("Name", competencyAssessmentBase); } } - return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId }); + return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId, frameworkId }); + } + } + [Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Manage")] + [Route("/CompetencyAssessments/{competencyAssessmentId}/Manage")] + public IActionResult ManageCompetencyAssessment(int competencyAssessmentId, int? frameworkId = null) + { + var adminId = GetAdminID(); + var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + if (competencyAssessmentBase == null) + { + logger.LogWarning($"Failed to load name page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}"); + return StatusCode(500); + } + if (competencyAssessmentBase.UserRole < 2) + { + return StatusCode(403); } + var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, frameworkId); + var model = new ManageCompetencyAssessmentViewModel(competencyAssessmentBase, competencyAssessmentTaskStatus); + return View("ManageCompetencyAssessment", model); } [Route("/CompetencyAssessments/ProfessionalGroup/{actionName}/{competencyAssessmentId}")] diff --git a/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs b/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs index e867731ba5..4df6ffd173 100644 --- a/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs +++ b/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs @@ -17,6 +17,8 @@ public interface ICompetencyAssessmentService IEnumerable GetNRPProfessionalGroups(); + CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId); + //UPDATE DATA bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName); @@ -69,6 +71,7 @@ public int InsertCompetencyAssessment(int adminId, int centreId, string competen competencyAssessmentDataService.InsertSelfAssessmentFramework(adminId, assessmentId, framework.ID); competencyAssessmentDataService.UpdateCompetencyAssessmentDescription(adminId, assessmentId, framework.Description); competencyAssessmentDataService.UpdateCompetencyAssessmentBranding(assessmentId, (int)framework.BrandID, (int)framework.CategoryID, adminId); + competencyAssessmentDataService.UpdateCompetencyAssessmentVocabulary(assessmentId, adminId, framework.Vocabulary); } } return assessmentId; @@ -83,5 +86,9 @@ public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessment { return competencyAssessmentDataService.UpdateCompetencyAssessmentProfessionalGroup(competencyAssessmentId, adminId, nrpProfessionalGroupID); } + public CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId) + { + return competencyAssessmentDataService.GetOrInsertAndReturnAssessmentTaskStatus(assessmentId, (frameworkId != null)); + } } } diff --git a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs index 4bee1e1baf..45828f985f 100644 --- a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs +++ b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs @@ -175,7 +175,7 @@ CompetencyTableRow competencyRow int? frameworkCompetencyGroupId = null; if (competencyRow.CompetencyGroup != null) { - int newCompetencyGroupId = frameworkService.InsertCompetencyGroup(competencyRow.CompetencyGroup, competencyRow.GroupDescription, adminUserId, frameworkId); + var newCompetencyGroupId = frameworkService.InsertCompetencyGroup(competencyRow.CompetencyGroup, competencyRow.GroupDescription, adminUserId); if (newCompetencyGroupId > 0) { frameworkCompetencyGroupId = frameworkService.InsertFrameworkCompetencyGroup(newCompetencyGroupId, frameworkId, adminUserId); diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/ManageCompetencyAssessmentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/ManageCompetencyAssessmentViewModel.cs new file mode 100644 index 0000000000..a4a3f41115 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/ManageCompetencyAssessmentViewModel.cs @@ -0,0 +1,24 @@ +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + public class ManageCompetencyAssessmentViewModel + { + public ManageCompetencyAssessmentViewModel( + CompetencyAssessmentBase competencyAssessmentBase, + CompetencyAssessmentTaskStatus competencyAssessmentTaskStatus + ) + { + CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName; + PublishStatusID = competencyAssessmentBase.PublishStatusID; + UserRole = competencyAssessmentBase.UserRole; + CompetencyAssessmentTaskStatus = competencyAssessmentTaskStatus; + Vocabulary = competencyAssessmentBase.Vocabulary; + } + public string CompetencyAssessmentName { get; set; } + public int PublishStatusID { get; set; } + public int UserRole { get; set; } + public string? Vocabulary { get; set; } + public CompetencyAssessmentTaskStatus CompetencyAssessmentTaskStatus { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml new file mode 100644 index 0000000000..2cd4e0cb3c --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml @@ -0,0 +1,244 @@ +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model ManageCompetencyAssessmentViewModel +@{ + ViewData["Title"] = Model.PublishStatusID == 3 ? "Manage" : "Create" + " competency assessment"; + ViewData["Application"] = "Framework Service"; +} + +@section NavMenuItems { + +} +@section NavBreadcrumbs { + +} + +

@ViewData["Title"]

+ +
+
+ +
+
+ Assessment name +
+
+ @Model.CompetencyAssessmentName +
+
+ + Change assessment name + +
+
+
+
+ Publish status +
+
+ + @(Model.PublishStatusID == 1 ? "Draft" : Model.PublishStatusID == 2 ? "In review" : "Published") + +
+
+
+ + +
diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml index 93fb40d442..69feaf3825 100644 --- a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml @@ -8,7 +8,7 @@ @section NavMenuItems { } -@if ((string)ViewContext.RouteData.Values["actionName"] == "New") + @if ((string)ViewContext.RouteData.Values["actionname"] == "New") { @section NavBreadcrumbs { } @@ -97,7 +97,7 @@ else Save