diff --git a/DigitalLearningSolutions.Data.Migrations/202501280929_CreateCompetencyAssessmentTables.cs b/DigitalLearningSolutions.Data.Migrations/202501280929_CreateCompetencyAssessmentTables.cs new file mode 100644 index 0000000000..3ad9669e2c --- /dev/null +++ b/DigitalLearningSolutions.Data.Migrations/202501280929_CreateCompetencyAssessmentTables.cs @@ -0,0 +1,57 @@ +namespace DigitalLearningSolutions.Data.Migrations +{ + using FluentMigrator; + using FluentMigrator.SqlServer; + [Migration(202501280929)] + public class CreateCompetencyAssessmentTables : Migration + { + public override void Up() + { + Create.Table("SelfAssessmentFrameworks") + .WithColumn("ID").AsInt32().NotNullable().PrimaryKey().Identity() + .WithColumn("SelfAssessmentId").AsInt32().NotNullable().ForeignKey("SelfAssessments", "ID") + .WithColumn("FrameworkId").AsInt32().NotNullable().ForeignKey("Frameworks", "ID") + .WithColumn("CreatedDate").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime) + .WithColumn("CreatedByAdminId").AsInt32().NotNullable().ForeignKey("AdminAccounts", "ID") + .WithColumn("RemovedDate").AsDateTime().Nullable() + .WithColumn("RemovedByAdminId").AsInt32().Nullable().ForeignKey("AdminAccounts", "ID") + .WithColumn("AmendedDate").AsDateTime().Nullable() + .WithColumn("AmendedByAdminId").AsInt32().Nullable().ForeignKey("AdminAccounts", "ID"); + Create.Table("SelfAssessmentTaskStatus") + .WithColumn("ID").AsInt32().NotNullable().PrimaryKey().Identity() + .WithColumn("SelfAssessmentId").AsInt32().NotNullable().ForeignKey("SelfAssessments", "ID").Unique() + .WithColumn("IntroductoryTextTaskStatus").AsBoolean().Nullable() + .WithColumn("BrandingTaskStatus").AsBoolean().Nullable() + .WithColumn("VocabularyTaskStatus").AsBoolean().Nullable() + .WithColumn("WorkingGroupTaskStatus").AsBoolean().Nullable() + .WithColumn("NationalRoleProfileTaskStatus").AsBoolean().Nullable() + .WithColumn("FrameworkLinksTaskStatus").AsBoolean().Nullable() + .WithColumn("SelectCompetenciesTaskStatus").AsBoolean().Nullable() + .WithColumn("OptionalCompetenciesTaskStatus").AsBoolean().Nullable() + .WithColumn("RoleRequirementsTaskStatus").AsBoolean().Nullable() + .WithColumn("SupervisorRolesTaskStatus").AsBoolean().Nullable() + .WithColumn("SelfAssessmentOptionsTaskStatus").AsBoolean().Nullable() + .WithColumn("ReviewTaskStatus").AsBoolean().Nullable(); + Alter.Table("SelfAssessments").AlterColumn("Description").AsString(int.MaxValue).Nullable(); + Execute.Sql($@"INSERT INTO SelfAssessmentFrameworks (SelfAssessmentId, FrameworkId, CreatedByAdminId) + SELECT sa.ID, fc.FrameworkID, sa.CreatedByAdminID + FROM SelfAssessments AS sa INNER JOIN + SelfAssessmentStructure AS sas ON sa.ID = sas.SelfAssessmentID INNER JOIN + FrameworkCompetencies AS fc ON sas.CompetencyID = fc.CompetencyID + GROUP BY sa.ID, fc.FrameworkID, sa.CreatedByAdminID + "); + Execute.Sql($@"INSERT INTO SelfAssessmentTaskStatus (SelfAssessmentId, IntroductoryTextTaskStatus, BrandingTaskStatus, VocabularyTaskStatus, WorkingGroupTaskStatus, NationalRoleProfileTaskStatus, FrameworkLinksTaskStatus, SelectCompetenciesTaskStatus, OptionalCompetenciesTaskStatus, RoleRequirementsTaskStatus, SupervisorRolesTaskStatus, SelfAssessmentOptionsTaskStatus) + SELECT ID, 1,1,1,1,1,1,1,1,1,1,1 + FROM SelfAssessments AS sa + "); + } + + public override void Down() + { + Delete.Table("SelfAssessmentFrameworks"); + Delete.Table("SelfAssessmentTaskStatus"); + Alter.Table("SelfAssessments").AlterColumn("Description").AsString(int.MaxValue).NotNullable(); + } + + } +} diff --git a/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs new file mode 100644 index 0000000000..983bdba073 --- /dev/null +++ b/DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs @@ -0,0 +1,463 @@ +namespace DigitalLearningSolutions.Data.DataServices +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.Linq; + using Dapper; + using DigitalLearningSolutions.Data.Models.Common; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using DigitalLearningSolutions.Data.Models.Frameworks; + using DocumentFormat.OpenXml.Wordprocessing; + using Microsoft.Extensions.Logging; + + public interface ICompetencyAssessmentDataService + { + //GET DATA + IEnumerable GetAllCompetencyAssessments(int adminId); + + IEnumerable GetCompetencyAssessmentsForAdminId(int adminId); + + CompetencyAssessmentBase? GetCompetencyAssessmentBaseById(int competencyAssessmentId, int adminId); + + CompetencyAssessmentBase? GetCompetencyAssessmentBaseByName(string competencyAssessmentName, int adminId); + CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId); + IEnumerable GetNRPProfessionalGroups(); + IEnumerable GetNRPSubGroups(int? nRPProfessionalGroupID); + IEnumerable GetNRPRoles(int? nRPSubGroupID); + + CompetencyAssessmentTaskStatus GetOrInsertAndReturnAssessmentTaskStatus(int assessmentId, bool frameworkBased); + + //UPDATE DATA + bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName); + + bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId); + bool UpdateCompetencyAssessmentBranding( + int competencyAssessmentId, + int adminId, + int brandId, + int categoryId + ); + bool UpdateCompetencyAssessmentVocabulary(int competencyAssessmentId, int adminId, string vocabulary); + bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription); + bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus); + bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus); + bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus); + bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus); + //INSERT DATA + int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName); + bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId); + //DELETE DATA + } + + public class CompetencyAssessmentDataService : ICompetencyAssessmentDataService + { + private const string SelfAssessmentBaseFields = @"sa.ID, sa.Name AS CompetencyAssessmentName, sa.Description, sa.BrandID, + sa.ParentSelfAssessmentID, + sa.[National], sa.[Public], sa.CreatedByAdminID AS OwnerAdminID, + sa.NRPProfessionalGroupID, + sa.NRPSubGroupID, + sa.NRPRoleID, + 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.CategoryID, sa.CreatedDate, + (SELECT BrandName + FROM Brands + WHERE (BrandID = sa.BrandID)) AS Brand, + (SELECT CategoryName + FROM CourseCategories + WHERE (CourseCategoryID = sa.CategoryID)) AS Category, + (SELECT [Name] + FROM SelfAssessments AS sa2 + WHERE (ID = sa.ParentSelfAssessmentID)) AS ParentSelfAssessment, + (SELECT Forename + ' ' + Surname + (CASE WHEN Active = 1 THEN '' ELSE ' (Inactive)' END) AS Expr1 + FROM AdminUsers + WHERE (AdminID = sa.CreatedByAdminID)) AS Owner, + sa.Archived, + sa.LastEdit, + STUFF(( + SELECT + ', ' + f.FrameworkName + FROM + Frameworks f + WHERE + f.ID = saf.FrameworkId + FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS LinkedFrameworks, + (SELECT ProfessionalGroup + FROM NRPProfessionalGroups + WHERE (ID = sa.NRPProfessionalGroupID)) AS NRPProfessionalGroup, + (SELECT SubGroup + FROM NRPSubGroups + WHERE (ID = sa.NRPSubGroupID)) AS NRPSubGroup, + (SELECT RoleProfile + FROM NRPRoles + WHERE (ID = sa.NRPRoleID)) AS NRPRole, sar.ID AS SelfAssessmentReviewID"; + + private const string SelfAssessmentBaseTables = + @"SelfAssessments AS sa LEFT OUTER JOIN + SelfAssessmentCollaborators AS sac ON sac.SelfAssessmentID = sa.ID AND sac.AdminID = @adminId"; + + private const string SelfAssessmentTables = + @" LEFT OUTER JOIN + SelfAssessmentReviews AS sar ON sac.ID = sar.SelfAssessmentCollaboratorID AND sar.Archived IS NULL AND sar.ReviewComplete IS NULL + LEFT OUTER JOIN SelfAssessmentFrameworks AS saf ON sa.ID = saf.SelfAssessmentId"; + + private readonly IDbConnection connection; + private readonly ILogger logger; + + public CompetencyAssessmentDataService(IDbConnection connection, ILogger logger) + { + this.connection = connection; + this.logger = logger; + } + + public IEnumerable GetAllCompetencyAssessments(int adminId) + { + return connection.Query( + $@"SELECT {SelfAssessmentBaseFields} {SelfAssessmentFields} + FROM {SelfAssessmentBaseTables} {SelfAssessmentTables}", + new { adminId } + ); + } + + public IEnumerable GetCompetencyAssessmentsForAdminId(int adminId) + { + return connection.Query( + $@"SELECT {SelfAssessmentBaseFields} {SelfAssessmentFields} + FROM {SelfAssessmentBaseTables} {SelfAssessmentTables} + WHERE (sa.CreatedByAdminID = @adminId) OR + (@adminId IN + (SELECT AdminID + FROM SelfAssessmentCollaborators + WHERE (SelfAssessmentID = sa.ID)))", + new { adminId } + ); + } + + public CompetencyAssessmentBase? GetCompetencyAssessmentBaseById(int competencyAssessmentId, int adminId) + { + return connection.Query( + $@"SELECT {SelfAssessmentBaseFields} + FROM {SelfAssessmentBaseTables} + WHERE (sa.ID = @competencyAssessmentId)", + new { competencyAssessmentId, adminId } + ).FirstOrDefault(); + } + + public int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName) + { + if ((competencyAssessmentName.Length == 0) | (adminId < 1)) + { + logger.LogWarning( + $"Not inserting competency assessmente as it failed server side validation. AdminId: {adminId}, competencyAssessmentName: {competencyAssessmentName}" + ); + return -1; + } + var result = connection.ExecuteScalar( + @"SELECT COUNT(*) FROM SelfAssessments WHERE [Name] = @competencyAssessmentName", + new { competencyAssessmentName } + ); + int existingSelfAssessments = Convert.ToInt32(result); + if (existingSelfAssessments > 0) + { + return -1; + } + var assessmentId = connection.QuerySingle( + @"INSERT INTO SelfAssessments ([Name], CreatedByCentreID, CreatedByAdminID) + OUTPUT INSERTED.Id + VALUES (@competencyAssessmentName, @centreId, @adminId)" + , + new { competencyAssessmentName, centreId, adminId } + ); + return assessmentId; + } + public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName) + { + if ((competencyAssessmentName.Length == 0) | (adminId < 1) | (competencyAssessmentId < 1)) + { + logger.LogWarning( + $"Not updating role profile name as it failed server side validation. AdminId: {adminId}, competencyAssessmentName: {competencyAssessmentName}, competencyAssessmentId: {competencyAssessmentId}" + ); + return false; + } + var result = connection.ExecuteScalar( + @"SELECT COUNT(*) FROM SelfAssessments WHERE [Name] = @competencyAssessmentName AND ID <> @competencyAssessmentId", + new { competencyAssessmentName, competencyAssessmentId } + ); + int existingSelfAssessments = Convert.ToInt32(result); + if (existingSelfAssessments > 0) + { + return false; + } + + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessments SET [Name] = @competencyAssessmentName, UpdatedByAdminID = @adminId + WHERE ID = @competencyAssessmentId", + new { competencyAssessmentName, adminId, competencyAssessmentId } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating role profile name as db update failed. " + + $"SelfAssessmentName: {competencyAssessmentName}, admin id: {adminId}, competencyAssessmentId: {competencyAssessmentId}" + ); + return false; + } + + return true; + } + + public IEnumerable GetNRPProfessionalGroups() + { + return connection.Query( + @"SELECT ID, ProfessionalGroup, Active + FROM NRPProfessionalGroups + WHERE (Active = 1) + ORDER BY ProfessionalGroup" + ); + } + + public CompetencyAssessmentBase? GetCompetencyAssessmentBaseByName(string competencyAssessmentName, int adminId) + { + return connection.Query( + $@"SELECT {SelfAssessmentBaseFields} + FROM {SelfAssessmentBaseTables} + WHERE (sa.Name = @competencyAssessmentName)", + new { competencyAssessmentName, adminId } + ).FirstOrDefault(); + } + + public bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId) + { + var result = connection.ExecuteScalar( + @"SELECT COUNT(*) FROM SelfAssessments WHERE ID = @competencyAssessmentId AND NRPProfessionalGroupID = @professionalGroupId AND NRPSubGroupID = @subGroupId AND NRPRoleID = @roleId", + new { competencyAssessmentId, professionalGroupId, subGroupId, roleId } + ); + int sameCount = Convert.ToInt32(result); + if (sameCount > 0) + { + //same so don't update: + return false; + } + + //needs updating: + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessments SET NRPProfessionalGroupID = @professionalGroupId, NRPSubGroupID = @subGroupId, NRPRoleID = @roleId, UpdatedByAdminID = @adminId + WHERE ID = @competencyAssessmentId", + new { adminId, competencyAssessmentId, professionalGroupId, subGroupId, roleId } + ); + if (numberOfAffectedRows > 0) + { + return true; + } + + return false; + } + public bool UpdateCompetencyAssessmentBranding( + int competencyAssessmentId, + int adminId, + int brandId, + int categoryId + ) + { + if ((competencyAssessmentId < 1) | (brandId < 1) | (categoryId < 1) | (adminId < 1)) + { + logger.LogWarning( + $"Not updating competency assessment as it failed server side validation. competencyAssessmentId: {competencyAssessmentId}, brandId: {brandId}, categoryId: {categoryId}, AdminId: {adminId}" + ); + return false; + } + + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessments SET BrandID = @brandId, CategoryID = @categoryId, UpdatedByAdminID = @adminId + WHERE ID = @competencyAssessmentId", + new { brandId, categoryId, adminId, competencyAssessmentId } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating competency assessment branding as db update failed. " + + $"frameworkId: {competencyAssessmentId}, brandId: {brandId}, categoryId: {categoryId}, AdminId: {adminId}" + ); + return false; + } + + return true; + } + + public bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessments SET Description = @competencyAssessmentDescription, UpdatedByAdminID = @adminId + WHERE ID = @competencyAssessmentId", + new { adminId, competencyAssessmentId, competencyAssessmentDescription } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating competency assessment Description as db update failed. " + + $"frameworkId: {competencyAssessmentId}, competencyAssessmentDescription: {competencyAssessmentDescription}, AdminId: {adminId}" + ); + return false; + } + 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( + @"INSERT INTO SelfAssessmentFrameworks (SelfAssessmentId, FrameworkId, CreatedByAdminId) + SELECT @selfAssessmentId, @frameworkId, @adminId + WHERE NOT EXISTS (SELECT 1 FROM SelfAssessmentFrameworks WHERE SelfAssessmentId = @selfAssessmentId AND FrameworkId = @frameworkId)" + , + new { adminId, selfAssessmentId, frameworkId } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not inserting SelfAssessmentFrameworks record as db insert failed. " + + $"selfAssessmentId: {selfAssessmentId}, frameworkId: {frameworkId}, AdminId: {adminId}" + ); + return false; + } + + 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(); + + } + public bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessmentTaskStatus SET IntroductoryTextTaskStatus = @taskStatus + WHERE SelfAssessmentId = @assessmentId", + new { assessmentId, taskStatus } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating IntroductoryTextTaskStatus as db update failed. " + + $"assessmentId: {assessmentId}, taskStatus: {taskStatus}" + ); + return false; + } + return true; + } + + public CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId) + { + return connection.Query( + $@"SELECT {SelfAssessmentBaseFields} {SelfAssessmentFields} + FROM {SelfAssessmentBaseTables} {SelfAssessmentTables} + WHERE (sa.ID = @competencyAssessmentId)", + new { competencyAssessmentId, adminId } + ).FirstOrDefault(); + } + + public bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessmentTaskStatus SET BrandingTaskStatus = @taskStatus + WHERE SelfAssessmentId = @assessmentId", + new { assessmentId, taskStatus } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating BrandingTaskStatus as db update failed. " + + $"assessmentId: {assessmentId}, taskStatus: {taskStatus}" + ); + return false; + } + return true; + } + + public bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessmentTaskStatus SET VocabularyTaskStatus = @taskStatus + WHERE SelfAssessmentId = @assessmentId", + new { assessmentId, taskStatus } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating VocabularyTaskStatus as db update failed. " + + $"assessmentId: {assessmentId}, taskStatus: {taskStatus}" + ); + return false; + } + return true; + } + + public IEnumerable GetNRPSubGroups(int? nRPProfessionalGroupID) + { + return connection.Query( + @"SELECT ID, SubGroup, Active + FROM NRPSubGroups + WHERE (Active = 1) AND (NRPProfessionalGroupID = @nRPProfessionalGroupID) + ORDER BY SubGroup", new { nRPProfessionalGroupID } + ); + } + + public IEnumerable GetNRPRoles(int? nRPSubGroupID) + { + return connection.Query( + @"SELECT ID, RoleProfile AS ProfileName, Active + FROM NRPRoles + WHERE (Active = 1) AND (NRPSubGroupID = @nRPSubGroupID) + ORDER BY RoleProfile", new { nRPSubGroupID } + ); + } + + public bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus) + { + var numberOfAffectedRows = connection.Execute( + @"UPDATE SelfAssessmentTaskStatus SET NationalRoleProfileTaskStatus = @taskStatus + WHERE SelfAssessmentId = @assessmentId", + new { assessmentId, taskStatus } + ); + if (numberOfAffectedRows < 1) + { + logger.LogWarning( + "Not updating NationalRoleProfileTaskStatus as db update failed. " + + $"assessmentId: {assessmentId}, taskStatus: {taskStatus}" + ); + return false; + } + return true; + } + } +} diff --git a/DigitalLearningSolutions.Data/DataServices/CourseCategoriesDataService.cs b/DigitalLearningSolutions.Data/DataServices/CourseCategoriesDataService.cs index 1135172708..ad6e96166c 100644 --- a/DigitalLearningSolutions.Data/DataServices/CourseCategoriesDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/CourseCategoriesDataService.cs @@ -9,7 +9,7 @@ public interface ICourseCategoriesDataService { IEnumerable GetCategoriesForCentreAndCentrallyManagedCourses(int centreId); - string? GetCourseCategoryName(int categoryId); + string? GetCourseCategoryName(int? categoryId); } public class CourseCategoriesDataService : ICourseCategoriesDataService @@ -34,7 +34,7 @@ FROM CourseCategories ); } - public string? GetCourseCategoryName(int categoryId) + public string? GetCourseCategoryName(int? categoryId) { var name = connection.QueryFirstOrDefault( @"SELECT CategoryName diff --git a/DigitalLearningSolutions.Data/DataServices/CourseDataService.cs b/DigitalLearningSolutions.Data/DataServices/CourseDataService.cs index fee4f1b696..06196293a0 100644 --- a/DigitalLearningSolutions.Data/DataServices/CourseDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/CourseDataService.cs @@ -551,7 +551,7 @@ BEGIN TRANSACTION UPDATE CandidateAssessmentSupervisors SET Removed = NULL {((selfAssessmentSupervisorRoleId > 0) ? " ,SelfAssessmentSupervisorRoleID = @selfAssessmentSupervisorRoleID" : string.Empty)} - WHERE CandidateAssessmentID = @candidateAssessmentId AND SupervisorDelegateId = @supervisorDelegateId + WHERE CandidateAssessmentID = @candidateAssessmentId AND SupervisorDelegateId = @supervisorDelegateId AND SelfAssessmentSupervisorRoleID = @selfAssessmentSupervisorRoleID COMMIT TRANSACTION"; diff --git a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs index b73bce21b8..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 = - @",(SELECT BrandName + @", FW.Description, FW.FrameworkConfig AS Vocabulary, (SELECT BrandName FROM Brands WHERE (BrandID = FW.BrandID)) AS Brand, (SELECT CategoryName @@ -581,7 +581,7 @@ OUTPUT INSERTED.Id VALUES (@groupName, @groupDescription, @adminId)", new { groupName, groupDescription, adminId } ); - + return existingId; } @@ -613,7 +613,7 @@ FROM [FrameworkCompetencyGroups] WHERE ([FrameworkID] = @frameworkId)), 0)+1, @frameworkId)", new { groupId, adminId, frameworkId } ); - + return existingId; } @@ -1047,7 +1047,7 @@ public void UpdateFrameworkCompetency(int frameworkCompetencyId, string name, st @"UPDATE Competencies SET Name = @name, Description = @description, UpdatedByAdminID = @adminId, AlwaysShowDescription = CASE WHEN @alwaysShowDescription IS NULL THEN AlwaysShowDescription ELSE @alwaysShowDescription END FROM Competencies INNER JOIN FrameworkCompetencies AS fc ON Competencies.ID = fc.CompetencyID WHERE (fc.Id = @frameworkCompetencyId)", - new { name, description, adminId, frameworkCompetencyId, alwaysShowDescription} + new { name, description, adminId, frameworkCompetencyId, alwaysShowDescription } ); if (numberOfAffectedRows < 1) { @@ -2175,7 +2175,7 @@ public void ArchiveReviewRequest(int reviewId) FROM FrameworkCollaborators WHERE (FrameworkID = FW.ID) AND (IsDeleted=0)))) AS MyFrameworksCount, - (SELECT COUNT(*) FROM SelfAssessments) AS RoleProfileCount, + (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 @@ -2183,7 +2183,7 @@ FROM FrameworkCollaborators (@adminId IN (SELECT AdminID FROM SelfAssessmentCollaborators - WHERE (SelfAssessmentID = RP.ID)))) AS MyRoleProfileCount", + WHERE (SelfAssessmentID = RP.ID)))) AS MyCompetencyAssessmentCount", new { adminId } ).FirstOrDefault(); } @@ -2193,7 +2193,7 @@ public IEnumerable GetDashboardToDoItems(int adminId) return connection.Query( @"SELECT FW.ID AS FrameworkID, - 0 AS RoleProfileID, + 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/DataServices/RoleProfileDataService.cs b/DigitalLearningSolutions.Data/DataServices/RoleProfileDataService.cs deleted file mode 100644 index 7e37d4ff03..0000000000 --- a/DigitalLearningSolutions.Data/DataServices/RoleProfileDataService.cs +++ /dev/null @@ -1,197 +0,0 @@ -namespace DigitalLearningSolutions.Data.DataServices -{ - using System.Collections.Generic; - using System.Data; - using System.Linq; - using Dapper; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using Microsoft.Extensions.Logging; - - public interface IRoleProfileDataService - { - //GET DATA - IEnumerable GetAllRoleProfiles(int adminId); - - IEnumerable GetRoleProfilesForAdminId(int adminId); - - RoleProfileBase? GetRoleProfileBaseById(int roleProfileId, int adminId); - - RoleProfileBase? GetRoleProfileByName(string roleProfileName, int adminId); - - IEnumerable GetNRPProfessionalGroups(); - - //UPDATE DATA - bool UpdateRoleProfileName(int roleProfileId, int adminId, string roleProfileName); - - bool UpdateRoleProfileProfessionalGroup(int roleProfileId, int adminId, int? nrpProfessionalGroupID); - //INSERT DATA - - //DELETE DATA - } - - public class RoleProfileDataService : IRoleProfileDataService - { - private const string SelfAssessmentBaseFields = @"rp.ID, rp.Name AS RoleProfileName, rp.Description, rp.BrandID, - rp.ParentSelfAssessmentID, - rp.[National], rp.[Public], rp.CreatedByAdminID AS OwnerAdminID, - rp.NRPProfessionalGroupID, - rp.NRPSubGroupID, - rp.NRPRoleID, - rp.PublishStatusID, CASE WHEN rp.CreatedByAdminID = @adminId THEN 3 WHEN rpc.CanModify = 1 THEN 2 WHEN rpc.CanModify = 0 THEN 1 ELSE 0 END AS UserRole"; - - private const string SelfAssessmentFields = - @", rp.CreatedDate, - (SELECT BrandName - FROM Brands - WHERE (BrandID = rp.BrandID)) AS Brand, - (SELECT [Name] - FROM SelfAssessments AS rp2 - WHERE (ID = rp.ParentSelfAssessmentID)) AS ParentSelfAssessment, - (SELECT Forename + ' ' + Surname + (CASE WHEN Active = 1 THEN '' ELSE ' (Inactive)' END) AS Expr1 - FROM AdminUsers - WHERE (AdminID = rp.CreatedByAdminID)) AS Owner, - rp.Archived, - rp.LastEdit, - (SELECT ProfessionalGroup - FROM NRPProfessionalGroups - WHERE (ID = rp.NRPProfessionalGroupID)) AS NRPProfessionalGroup, - (SELECT SubGroup - FROM NRPSubGroups - WHERE (ID = rp.NRPSubGroupID)) AS NRPSubGroup, - (SELECT RoleProfile - FROM NRPRoles - WHERE (ID = rp.NRPRoleID)) AS NRPRole, rpr.ID AS SelfAssessmentReviewID"; - - private const string SelfAssessmentBaseTables = - @"SelfAssessments AS rp LEFT OUTER JOIN - SelfAssessmentCollaborators AS rpc ON rpc.SelfAssessmentID = rp.ID AND rpc.AdminID = @adminId"; - - private const string SelfAssessmentTables = - @" LEFT OUTER JOIN - SelfAssessmentReviews AS rpr ON rpc.ID = rpr.SelfAssessmentCollaboratorID AND rpr.Archived IS NULL AND rpr.ReviewComplete IS NULL"; - - private readonly IDbConnection connection; - private readonly ILogger logger; - - public RoleProfileDataService(IDbConnection connection, ILogger logger) - { - this.connection = connection; - this.logger = logger; - } - - public IEnumerable GetAllRoleProfiles(int adminId) - { - return connection.Query( - $@"SELECT {SelfAssessmentBaseFields} {SelfAssessmentFields} - FROM {SelfAssessmentBaseTables} {SelfAssessmentTables}", - new { adminId } - ); - } - - public IEnumerable GetRoleProfilesForAdminId(int adminId) - { - return connection.Query( - $@"SELECT {SelfAssessmentBaseFields} {SelfAssessmentFields} - FROM {SelfAssessmentBaseTables} {SelfAssessmentTables} - WHERE (rp.CreatedByAdminID = @adminId) OR - (@adminId IN - (SELECT AdminID - FROM SelfAssessmentCollaborators - WHERE (SelfAssessmentID = rp.ID)))", - new { adminId } - ); - } - - public RoleProfileBase? GetRoleProfileBaseById(int roleProfileId, int adminId) - { - return connection.Query( - $@"SELECT {SelfAssessmentBaseFields} - FROM {SelfAssessmentBaseTables} - WHERE (rp.ID = @roleProfileId)", - new { roleProfileId, adminId } - ).FirstOrDefault(); - } - - public bool UpdateRoleProfileName(int roleProfileId, int adminId, string roleProfileName) - { - if ((roleProfileName.Length == 0) | (adminId < 1) | (roleProfileId < 1)) - { - logger.LogWarning( - $"Not updating role profile name as it failed server side validation. AdminId: {adminId}, roleProfileName: {roleProfileName}, roleProfileId: {roleProfileId}" - ); - return false; - } - - var existingSelfAssessments = (int)connection.ExecuteScalar( - @"SELECT COUNT(*) FROM SelfAssessments WHERE [Name] = @roleProfileName AND ID <> @roleProfileId", - new { roleProfileName, roleProfileId } - ); - if (existingSelfAssessments > 0) - { - return false; - } - - var numberOfAffectedRows = connection.Execute( - @"UPDATE SelfAssessments SET [Name] = @roleProfileName, UpdatedByAdminID = @adminId - WHERE ID = @roleProfileId", - new { roleProfileName, adminId, roleProfileId } - ); - if (numberOfAffectedRows < 1) - { - logger.LogWarning( - "Not updating role profile name as db update failed. " + - $"SelfAssessmentName: {roleProfileName}, admin id: {adminId}, roleProfileId: {roleProfileId}" - ); - return false; - } - - return true; - } - - public IEnumerable GetNRPProfessionalGroups() - { - return connection.Query( - @"SELECT ID, ProfessionalGroup, Active - FROM NRPProfessionalGroups - WHERE (Active = 1) - ORDER BY ProfessionalGroup" - ); - } - - public RoleProfileBase? GetRoleProfileByName(string roleProfileName, int adminId) - { - return connection.Query( - $@"SELECT {SelfAssessmentBaseFields} - FROM {SelfAssessmentBaseTables} - WHERE (rp.Name = @roleProfileName)", - new { roleProfileName, adminId } - ).FirstOrDefault(); - } - - public bool UpdateRoleProfileProfessionalGroup(int roleProfileId, int adminId, int? nrpProfessionalGroupID) - { - var sameCount = (int)connection.ExecuteScalar( - @"SELECT COUNT(*) FROM RoleProfiles WHERE ID = @roleProfileId AND NRPProfessionalGroupID = @nrpProfessionalGroupID", - new { roleProfileId, nrpProfessionalGroupID } - ); - if (sameCount > 0) - { - //same so don't update: - return false; - } - - //needs updating: - var numberOfAffectedRows = connection.Execute( - @"UPDATE SelfAssessments SET NRPProfessionalGroupID = @nrpProfessionalGroupID, NRPSubGroupID = NULL, NRPRoleID = NULL, UpdatedByAdminID = @adminId - WHERE ID = @roleProfileId", - new { nrpProfessionalGroupID, adminId, roleProfileId } - ); - if (numberOfAffectedRows > 0) - { - return true; - } - - return false; - } - } -} diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs index 2390d54147..bb1dc7649f 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs @@ -298,6 +298,13 @@ INNER JOIN CompetencyGroups AS CG } } + public void RemoveSignoffRequestById(int candidateAssessmentSupervisorVerificationsId) + { + var numberOfAffectedRows = connection.Execute( + @" DELETE FROM CandidateAssessmentSupervisorVerifications WHERE ID = @candidateAssessmentSupervisorVerificationsId ", + new { candidateAssessmentSupervisorVerificationsId }); + } + public void SetCompleteByDate(int selfAssessmentId, int delegateUserId, DateTime? completeByDate) { diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs index 76a1a199bd..3c333e78e8 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CompetencyDataService.cs @@ -635,7 +635,7 @@ FROM SelfAssessmentResults s inner join SelfAssessmentResultSupervisorVerifications sv ON s.ID = sv.SelfAssessmentResultId AND sv.Superceded = 0 WHERE s.CompetencyID = @competencyId AND s.SelfAssessmentID = @selfAssessmentId - AND s.DelegateUserID = @delegateUserId", + AND s.DelegateUserID = @delegateUserId AND sv.Verified IS NULL", new { selfAssessmentId, delegateUserId, competencyId } ); } @@ -643,8 +643,6 @@ FROM SelfAssessmentResults s inner join public void RemoveReviewCandidateAssessmentOptionalCompetencies(int id) { - connection.Execute(@"UPDATE SelfAssessmentResults SET Result = NULL WHERE ID = @id", new { id}); - connection.Execute( @"delete from SelfAssessmentResultSupervisorVerifications WHERE SelfAssessmentResultId = @id", new { id }); diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs index d4b87c6f78..324a1050a7 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs @@ -78,6 +78,7 @@ int competencyId void UpdateLastAccessed(int selfAssessmentId, int delegateUserId); void RemoveSignoffRequests(int selfAssessmentId, int delegateUserId, int competencyGroupsId); + void RemoveSignoffRequestById(int candidateAssessmentSupervisorVerificationsId); void SetCompleteByDate(int selfAssessmentId, int delegateUserId, DateTime? completeByDate); void SetSubmittedDateNow(int selfAssessmentId, int delegateUserId); @@ -173,7 +174,7 @@ int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string so bool IsCentreSelfAssessment(int selfAssessmentId, int centreId); bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId); int GetSelfAssessmentCategoryId(int selfAssessmentId); - void RemoveReviewCandidateAssessmentOptionalCompetencies(int id); + void RemoveReviewCandidateAssessmentOptionalCompetencies(int id); public IEnumerable GetSelfAssessmentResultswithSupervisorVerificationsForDelegateSelfAssessmentCompetency( int delegateUserId, int selfAssessmentId, @@ -683,9 +684,6 @@ BEGIN TRANSACTION UPDATE CandidateAssessments SET RemovedDate = GETUTCDATE(), RemovalMethodID = 2 WHERE ID = @candidateAssessmentsId AND RemovedDate IS NULL - UPDATE CandidateAssessmentSupervisors SET Removed = GETUTCDATE() - WHERE CandidateAssessmentID = @candidateAssessmentsId AND Removed IS NULL - COMMIT TRANSACTION END TRY BEGIN CATCH diff --git a/DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs b/DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs index 0d8fab0715..3409396ab1 100644 --- a/DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SupervisorDataService.cs @@ -1,7 +1,7 @@ namespace DigitalLearningSolutions.Data.DataServices { using Dapper; - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.SelfAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using Microsoft.Extensions.Logging; @@ -23,8 +23,8 @@ public interface ISupervisorDataService IEnumerable GetSupervisorDashboardToDoItemsForRequestedSignOffs(int adminId); IEnumerable GetSupervisorDashboardToDoItemsForRequestedReviews(int adminId); DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId, int? adminIdCategoryId); - IEnumerable GetAvailableRoleProfilesForDelegate(int candidateId, int centreId, int? categoryId); - RoleProfile? GetRoleProfileById(int selfAssessmentId); + IEnumerable GetAvailableCompetencyAssessmentsForDelegate(int candidateId, int centreId, int? categoryId); + CompetencyAssessment? GetCompetencyAssessmentById(int selfAssessmentId); IEnumerable GetSupervisorRolesForSelfAssessment(int selfAssessmentId); IEnumerable GetSupervisorRolesBySelfAssessmentIdForSupervisor(int selfAssessmentId); IEnumerable GetDelegateNominatableSupervisorRolesForSelfAssessment(int selfAssessmentId); @@ -576,7 +576,7 @@ public bool RemoveSupervisorDelegateById(int supervisorDelegateId, int delegateU public IEnumerable GetSelfAssessmentsForSupervisorDelegateId(int supervisorDelegateId, int? adminIdCategoryId) { return connection.Query( - @$"SELECT {delegateSelfAssessmentFields}, COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, r.RoleProfile, sg.SubGroup, pg.ProfessionalGroup,CONVERT(BIT, IIF(cas.CandidateAssessmentID IS NULL, 0, 1)) AS IsAssignedToSupervisor,ca.DelegateUserID, + @$"SELECT {delegateSelfAssessmentFields}, COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, r.CompetencyAssessment, sg.SubGroup, pg.ProfessionalGroup,CONVERT(BIT, IIF(cas.CandidateAssessmentID IS NULL, 0, 1)) AS IsAssignedToSupervisor,ca.DelegateUserID, (SELECT COUNT(*) AS Expr1 FROM CandidateAssessmentSupervisorVerifications AS casv WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested, @@ -620,20 +620,21 @@ FROM CandidateAssessmentSupervisors AS cas INNER JOIN { return connection.Query( @$"SELECT ca.ID, sa.ID AS SelfAssessmentID, sa.Name AS RoleName, sa.QuestionLabel, sa.DescriptionLabel, sa.ReviewerCommentsLabel, - sa.SupervisorSelfAssessmentReview, sa.SupervisorResultsReview, ca.StartedDate, - COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, - ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, - (SELECT COUNT(*) AS Expr1 - FROM CandidateAssessmentSupervisorVerifications AS casv - WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested, - {signedOffFields} - (SELECT COUNT(*) AS Expr1 - FROM SelfAssessmentResultSupervisorVerifications AS sarsv - WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Verified IS NULL) AND (sarsv.Superceded = 0)) AS ResultsVerificationRequests - FROM CandidateAssessmentSupervisors AS cas INNER JOIN - CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN - SelfAssessments AS sa ON sa.ID = ca.SelfAssessmentID - WHERE (ca.ID = @candidateAssessmentId) AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)", new { candidateAssessmentId, adminIdCategoryId } + sa.SupervisorSelfAssessmentReview, sa.SupervisorResultsReview, ca.StartedDate, + COALESCE(ca.LastAccessed, ca.StartedDate) AS LastAccessed, + ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, + (SELECT COUNT(*) AS Expr1 + FROM CandidateAssessmentSupervisorVerifications AS casv + WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested, + {signedOffFields} + (SELECT COUNT(*) AS Expr1 + FROM SelfAssessmentResultSupervisorVerifications AS sarsv + WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Verified IS NULL) AND (sarsv.Superceded = 0)) AS ResultsVerificationRequests, + sa.Vocabulary + FROM CandidateAssessmentSupervisors AS cas INNER JOIN + CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN + SelfAssessments AS sa ON sa.ID = ca.SelfAssessmentID + WHERE (ca.ID = @candidateAssessmentId) AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)", new { candidateAssessmentId, adminIdCategoryId } ).FirstOrDefault(); } public DelegateSelfAssessment? GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(int candidateAssessmentId, int supervisorDelegateId) @@ -696,23 +697,24 @@ FROM SelfAssessmentResults AS sar2 { return connection.Query( @$"SELECT ca.ID, sa.ID AS SelfAssessmentID, sa.Name AS RoleName, sa.SupervisorSelfAssessmentReview, sa.SupervisorResultsReview, sa.ReviewerCommentsLabel, COALESCE (sasr.RoleName, 'Supervisor') AS SupervisorRoleTitle, ca.StartedDate, ca.LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, r.RoleProfile, sg.SubGroup, pg.ProfessionalGroup, sa.SupervisorResultsReview AS IsSupervisorResultsReviewed, - (SELECT COUNT(*) AS Expr1 - FROM CandidateAssessmentSupervisorVerifications AS casv - WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested, - {signedOffFields} - (SELECT COUNT(*) AS Expr1 - FROM SelfAssessmentResultSupervisorVerifications AS sarsv - WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Verified IS NULL) AND (Superceded = 0)) AS ResultsVerificationRequests, - ca.NonReportable,ca.DelegateUserID + (SELECT COUNT(*) AS Expr1 + FROM CandidateAssessmentSupervisorVerifications AS casv + WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Requested IS NOT NULL) AND (Verified IS NULL)) AS SignOffRequested, + {signedOffFields} + (SELECT COUNT(*) AS Expr1 + FROM SelfAssessmentResultSupervisorVerifications AS sarsv + WHERE (CandidateAssessmentSupervisorID = cas.ID) AND (Verified IS NULL) AND (Superceded = 0)) AS ResultsVerificationRequests, + ca.NonReportable,ca.DelegateUserID, + sa.Vocabulary FROM CandidateAssessmentSupervisors AS cas INNER JOIN - CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN - SelfAssessments AS sa ON sa.ID = ca.SelfAssessmentID INNER JOIN - SupervisorDelegates AS sd ON cas.SupervisorDelegateId = sd.ID LEFT OUTER JOIN - NRPProfessionalGroups AS pg ON sa.NRPProfessionalGroupID = pg.ID LEFT OUTER JOIN - NRPSubGroups AS sg ON sa.NRPSubGroupID = sg.ID LEFT OUTER JOIN - NRPRoles AS r ON sa.NRPRoleID = r.ID - LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr ON cas.SelfAssessmentSupervisorRoleID = sasr.ID - WHERE (ca.ID = @candidateAssessmentId) AND (cas.Removed IS NULL) AND (sd.SupervisorAdminID = @adminId) AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)", + CandidateAssessments AS ca ON cas.CandidateAssessmentID = ca.ID INNER JOIN + SelfAssessments AS sa ON sa.ID = ca.SelfAssessmentID INNER JOIN + SupervisorDelegates AS sd ON cas.SupervisorDelegateId = sd.ID LEFT OUTER JOIN + NRPProfessionalGroups AS pg ON sa.NRPProfessionalGroupID = pg.ID LEFT OUTER JOIN + NRPSubGroups AS sg ON sa.NRPSubGroupID = sg.ID LEFT OUTER JOIN + NRPRoles AS r ON sa.NRPRoleID = r.ID + LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr ON cas.SelfAssessmentSupervisorRoleID = sasr.ID + WHERE (ca.ID = @candidateAssessmentId) AND (cas.Removed IS NULL) AND (sd.SupervisorAdminID = @adminId) AND (ISNULL(@adminIdCategoryID, 0) = 0 OR sa.CategoryID = @adminIdCategoryId)", new { candidateAssessmentId, adminId, adminIdCategoryId } ).FirstOrDefault(); } @@ -763,10 +765,10 @@ public int RemoveSelfAssessmentResultSupervisorVerificationById(int id) } return numberOfAffectedRows; } - public IEnumerable GetAvailableRoleProfilesForDelegate(int delegateUserId, int centreId, int? categoryId) + public IEnumerable GetAvailableCompetencyAssessmentsForDelegate(int delegateUserId, int centreId, int? categoryId) { - return connection.Query( - $@"SELECT rp.ID, rp.Name AS RoleProfileName, rp.Description, rp.BrandID, rp.ParentSelfAssessmentID, rp.[National], rp.[Public], rp.CreatedByAdminID AS OwnerAdminID, rp.NRPProfessionalGroupID, rp.NRPSubGroupID, rp.NRPRoleID, rp.PublishStatusID, 0 AS UserRole, rp.CreatedDate, + return connection.Query( + $@"SELECT rp.ID, rp.Name AS CompetencyAssessmentName, rp.Description, rp.BrandID, rp.ParentSelfAssessmentID, rp.[National], rp.[Public], rp.CreatedByAdminID AS OwnerAdminID, rp.NRPProfessionalGroupID, rp.NRPSubGroupID, rp.NRPRoleID, rp.PublishStatusID, 0 AS UserRole, rp.CreatedDate, (SELECT BrandName FROM Brands WHERE (BrandID = rp.BrandID)) AS Brand, '' AS ParentSelfAssessment, '' AS Owner, rp.Archived, rp.LastEdit, @@ -776,7 +778,7 @@ FROM NRPProfessionalGroups (SELECT SubGroup FROM NRPSubGroups WHERE (ID = rp.NRPSubGroupID)) AS NRPSubGroup, - (SELECT RoleProfile + (SELECT CompetencyAssessment FROM NRPRoles WHERE (ID = rp.NRPRoleID)) AS NRPRole, 0 AS SelfAssessmentReviewID FROM SelfAssessments AS rp INNER JOIN @@ -791,10 +793,10 @@ FROM CandidateAssessments AS CA ); } - public RoleProfile? GetRoleProfileById(int selfAssessmentId) + public CompetencyAssessment? GetCompetencyAssessmentById(int selfAssessmentId) { - return connection.Query( - $@"SELECT ID, Name AS RoleProfileName, Description, BrandID, ParentSelfAssessmentID, [National], [Public], CreatedByAdminID AS OwnerAdminID, NRPProfessionalGroupID, NRPSubGroupID, NRPRoleID, PublishStatusID, 0 AS UserRole, CreatedDate, + return connection.Query( + $@"SELECT ID, Name AS CompetencyAssessmentName, Description, BrandID, ParentSelfAssessmentID, [National], [Public], CreatedByAdminID AS OwnerAdminID, NRPProfessionalGroupID, NRPSubGroupID, NRPRoleID, PublishStatusID, 0 AS UserRole, CreatedDate, (SELECT BrandName FROM Brands WHERE (BrandID = rp.BrandID)) AS Brand, @@ -806,7 +808,7 @@ FROM NRPProfessionalGroups (SELECT SubGroup FROM NRPSubGroups WHERE (ID = rp.NRPSubGroupID)) AS NRPSubGroup, - (SELECT RoleProfile + (SELECT CompetencyAssessment FROM NRPRoles WHERE (ID = rp.NRPRoleID)) AS NRPRole, 0 AS SelfAssessmentReviewID FROM SelfAssessments AS rp @@ -941,18 +943,45 @@ FROM CandidateAssessmentSupervisors if (candidateAssessmentSupervisorsId == 0) { + //For a candidate assessment, only one supervisor role should be active (Removed = null) var numberOfAffectedRows = connection.Execute( - @"INSERT INTO CandidateAssessmentSupervisors (CandidateAssessmentID, SupervisorDelegateId, SelfAssessmentSupervisorRoleID) - VALUES (@candidateAssessmentId, @supervisorDelegateId, @selfAssessmentSupervisorRoleId)", new { candidateAssessmentId, supervisorDelegateId, selfAssessmentSupervisorRoleId } + @"BEGIN TRY + BEGIN TRANSACTION + UPDATE CandidateAssessmentSupervisors SET Removed = getUTCDate() WHERE CandidateAssessmentID = @candidateAssessmentId + AND SupervisorDelegateId = @supervisorDelegateId + AND Removed IS NULL + + INSERT INTO CandidateAssessmentSupervisors (CandidateAssessmentID, SupervisorDelegateId, SelfAssessmentSupervisorRoleID) + VALUES (@candidateAssessmentId, @supervisorDelegateId, @selfAssessmentSupervisorRoleId) + + COMMIT TRANSACTION + END TRY + BEGIN CATCH + ROLLBACK TRANSACTION + END CATCH", + new { candidateAssessmentId, supervisorDelegateId, selfAssessmentSupervisorRoleId } ); } else { + //For a candidate assessment, only one supervisor role should be active (Removed = null) int numberOfAffectedRows = connection.Execute( - @"UPDATE CandidateAssessmentSupervisors SET Removed = NULL WHERE CandidateAssessmentID = @candidateAssessmentId - AND SupervisorDelegateId = @supervisorDelegateId - AND SelfAssessmentSupervisorRoleId=@selfAssessmentSupervisorRoleId", - new { candidateAssessmentId, supervisorDelegateId, selfAssessmentSupervisorRoleId }); + @"BEGIN TRY + BEGIN TRANSACTION + UPDATE CandidateAssessmentSupervisors SET Removed = getUTCDate() WHERE CandidateAssessmentID = @candidateAssessmentId + AND SupervisorDelegateId = @supervisorDelegateId + AND Removed IS NULL + + UPDATE CandidateAssessmentSupervisors SET Removed = NULL WHERE CandidateAssessmentID = @candidateAssessmentId + AND SupervisorDelegateId = @supervisorDelegateId + AND SelfAssessmentSupervisorRoleId = @selfAssessmentSupervisorRoleId + + COMMIT TRANSACTION + END TRY + BEGIN CATCH + ROLLBACK TRANSACTION + END CATCH", + new { candidateAssessmentId, supervisorDelegateId, selfAssessmentSupervisorRoleId }); } } return candidateAssessmentId; @@ -966,9 +995,6 @@ BEGIN TRANSACTION UPDATE CandidateAssessments SET RemovedDate = getUTCDate(), RemovalMethodID = 2 WHERE ID = @candidateAssessmentId AND RemovedDate IS NULL - UPDATE CandidateAssessmentSupervisors SET Removed = getUTCDate() - WHERE CandidateAssessmentID = @candidateAssessmentId AND Removed IS NULL - COMMIT TRANSACTION END TRY BEGIN CATCH @@ -1113,7 +1139,7 @@ FROM CandidateAssessmentSupervisors { return connection.Query( @"SELECT ca.ID, ca.SelfAssessmentID, sa.Name AS RoleName, sa.ReviewerCommentsLabel, COALESCE (sasr.SelfAssessmentReview, 1) AS SelfAssessmentReview, COALESCE (sasr.ResultsReview, 1) AS SupervisorResultsReview, COALESCE (sasr.RoleName, 'Supervisor') AS SupervisorRoleTitle, ca.StartedDate, - ca.LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, npg.ProfessionalGroup, nsg.SubGroup, nr.RoleProfile, casv.ID AS CandidateAssessmentSupervisorVerificationId, + ca.LastAccessed, ca.CompleteByDate, ca.LaunchCount, ca.CompletedDate, npg.ProfessionalGroup, nsg.SubGroup, nr.CompetencyAssessment, casv.ID AS CandidateAssessmentSupervisorVerificationId, (SELECT COUNT(sas1.CompetencyID) AS CompetencyAssessmentQuestionCount FROM SelfAssessmentStructure AS sas1 INNER JOIN CandidateAssessments AS ca1 ON sas1.SelfAssessmentID = ca1.SelfAssessmentID INNER JOIN diff --git a/DigitalLearningSolutions.Data/DigitalLearningSolutions.Data.csproj b/DigitalLearningSolutions.Data/DigitalLearningSolutions.Data.csproj index 05556966ee..2d7bea0631 100644 --- a/DigitalLearningSolutions.Data/DigitalLearningSolutions.Data.csproj +++ b/DigitalLearningSolutions.Data/DigitalLearningSolutions.Data.csproj @@ -14,7 +14,7 @@ - + diff --git a/DigitalLearningSolutions.Data/Enums/NavMenuTab.cs b/DigitalLearningSolutions.Data/Enums/NavMenuTab.cs index a0d60c8399..7691f565e9 100644 --- a/DigitalLearningSolutions.Data/Enums/NavMenuTab.cs +++ b/DigitalLearningSolutions.Data/Enums/NavMenuTab.cs @@ -91,9 +91,9 @@ public class NavMenuTab : Enumeration nameof(Frameworks) ); - public static readonly NavMenuTab RolesProfiles = new NavMenuTab( + public static readonly NavMenuTab CompetencyAssessments = new NavMenuTab( 17, - nameof(RolesProfiles) + nameof(CompetencyAssessments) ); public static readonly NavMenuTab LogOut = new NavMenuTab( diff --git a/DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfile.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs similarity index 59% rename from DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfile.cs rename to DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs index ec1970fc92..c5db0ca4be 100644 --- a/DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfile.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessment.cs @@ -1,8 +1,7 @@ -namespace DigitalLearningSolutions.Data.Models.RoleProfiles +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { using System; - using System.ComponentModel.DataAnnotations; - public class RoleProfile : RoleProfileBase + public class CompetencyAssessment : CompetencyAssessmentBase { public DateTime CreatedDate { get; set; } public string? Brand @@ -10,15 +9,22 @@ public string? Brand get => brand; set => brand = GetValidOrNull(value); } - public string? ParentRoleProfile { get; set; } + public string? Category + { + get => category; + set => category = GetValidOrNull(value); + } + public string? ParentCompetencyAssessment { get; set; } public string? Owner { get; set; } public DateTime? Archived { get; set; } public DateTime LastEdit { get; set; } + public string? LinkedFrameworks { get; set; } public string? NRPProfessionalGroup { get; set; } public string? NRPSubGroup { get; set; } public string? NRPRole { get; set; } - public int? RoleProfileReviewID { get; set; } + public int? CompetencyAssessmentReviewID { get; set; } private string? brand; + private string? category; private static string? GetValidOrNull(string? toValidate) { return toValidate != null && toValidate.ToLower() == "undefined" ? null : toValidate; diff --git a/DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfileBase.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs similarity index 64% rename from DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfileBase.cs rename to DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs index 1c843fae46..5fa9080ae3 100644 --- a/DigitalLearningSolutions.Data/Models/RoleProfiles/RoleProfileBase.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/CompetencyAssessmentBase.cs @@ -1,16 +1,16 @@ -namespace DigitalLearningSolutions.Data.Models.RoleProfiles +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { - using System; using System.ComponentModel.DataAnnotations; - public class RoleProfileBase + public class CompetencyAssessmentBase { public int ID { get; set; } [StringLength(255, MinimumLength = 3)] [Required] - public string RoleProfileName { get; set; } = string.Empty; + public string CompetencyAssessmentName { get; set; } = string.Empty; public string? Description { get; set; } public int BrandID { get; set; } - public int? ParentRoleProfileID { get; set; } + public int CategoryID { get; set; } + public int? ParentCompetencyAssessmentID { get; set; } public bool National { get; set; } public bool Public { get; set; } public int OwnerAdminID { get; set; } @@ -19,6 +19,8 @@ public class RoleProfileBase 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/RoleProfiles/NRPProfessionalGroups.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPProfessionalGroups.cs similarity index 81% rename from DigitalLearningSolutions.Data/Models/RoleProfiles/NRPProfessionalGroups.cs rename to DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPProfessionalGroups.cs index de1f9e4588..bdc4f6942a 100644 --- a/DigitalLearningSolutions.Data/Models/RoleProfiles/NRPProfessionalGroups.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPProfessionalGroups.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Data.Models.RoleProfiles +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { using System.ComponentModel.DataAnnotations; public class NRPProfessionalGroups @@ -10,3 +10,4 @@ public class NRPProfessionalGroups public bool Active { get; set; } } } + diff --git a/DigitalLearningSolutions.Data/Models/RoleProfiles/NRPRoles.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPRoles.cs similarity index 67% rename from DigitalLearningSolutions.Data/Models/RoleProfiles/NRPRoles.cs rename to DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPRoles.cs index f404bfb243..22cba2ada8 100644 --- a/DigitalLearningSolutions.Data/Models/RoleProfiles/NRPRoles.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPRoles.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Data.Models.RoleProfiles +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { using System.ComponentModel.DataAnnotations; public class NRPRoles @@ -7,7 +7,7 @@ public class NRPRoles public int NRPSubGroupID { get; set; } [StringLength(255, MinimumLength = 3)] [Required] - public string RoleProfile { get; set; } = string.Empty; + public string ProfileName { get; set; } = string.Empty; public bool Active { get; set; } } } diff --git a/DigitalLearningSolutions.Data/Models/RoleProfiles/NRPSubGroups.cs b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPSubGroups.cs similarity index 71% rename from DigitalLearningSolutions.Data/Models/RoleProfiles/NRPSubGroups.cs rename to DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPSubGroups.cs index 6d43b936a2..f100a6b2e2 100644 --- a/DigitalLearningSolutions.Data/Models/RoleProfiles/NRPSubGroups.cs +++ b/DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPSubGroups.cs @@ -1,10 +1,9 @@ -namespace DigitalLearningSolutions.Data.Models.RoleProfiles +namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments { using System.ComponentModel.DataAnnotations; public class NRPSubGroups { public int ID { get; set; } - public int NRPProfessionalGroupID { get; set; } [StringLength(255, MinimumLength = 3)] [Required] public string SubGroup { get; set; } = string.Empty; diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs b/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs index f49b526831..5ba38617ac 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs @@ -2,6 +2,8 @@ { public class BrandedFramework : BaseFramework { + public string? Description { get; set; } + public string? Vocabulary { get; set; } public string? Brand { get => brand; diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/DashboardData.cs b/DigitalLearningSolutions.Data/Models/Frameworks/DashboardData.cs index f5d28bd284..207e61079c 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/DashboardData.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/DashboardData.cs @@ -4,7 +4,7 @@ public class DashboardData { public int FrameworksCount { get; set; } public int MyFrameworksCount { get; set; } - public int RoleProfileCount { get; set; } - public int MyRoleProfileCount { get; set; } + public int CompetencyAssessmentCount { get; set; } + public int MyCompetencyAssessmentCount { get; set; } } } diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/DashboardToDoItem.cs b/DigitalLearningSolutions.Data/Models/Frameworks/DashboardToDoItem.cs index 96ee4e8326..dc7e6b0386 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/DashboardToDoItem.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/DashboardToDoItem.cs @@ -4,7 +4,7 @@ public class DashboardToDoItem { public int? FrameworkID { get; set; } - public int? RoleProfileID { get; set; } + public int? CompetencyAssessmentID { get; set; } public string ItemName { get; set; } = string.Empty; public string RequestorName { get; set; } = string.Empty; public bool SignOffRequired { get; set; } diff --git a/DigitalLearningSolutions.Data/Models/SessionData/CompetencyAssessments/SessionNewCompetencyAssessment.cs b/DigitalLearningSolutions.Data/Models/SessionData/CompetencyAssessments/SessionNewCompetencyAssessment.cs new file mode 100644 index 0000000000..b8d572404f --- /dev/null +++ b/DigitalLearningSolutions.Data/Models/SessionData/CompetencyAssessments/SessionNewCompetencyAssessment.cs @@ -0,0 +1,15 @@ +namespace DigitalLearningSolutions.Data.Models.SessionData.CompetencyAssessments +{ + using System; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + public class SessionNewCompetencyAssessment + { + public SessionNewCompetencyAssessment() + { + Id = new Guid(); + CompetencyAssessmentBase = new CompetencyAssessmentBase(); + } + public Guid Id { get; set; } + public CompetencyAssessmentBase CompetencyAssessmentBase { get; set; } + } +} diff --git a/DigitalLearningSolutions.Data/Models/SessionData/RoleProfiles/SessionNewRoleProfile.cs b/DigitalLearningSolutions.Data/Models/SessionData/RoleProfiles/SessionNewRoleProfile.cs deleted file mode 100644 index 617c8ebb64..0000000000 --- a/DigitalLearningSolutions.Data/Models/SessionData/RoleProfiles/SessionNewRoleProfile.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace DigitalLearningSolutions.Data.Models.SessionData.RoleProfiles -{ - using System; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - public class SessionNewRoleProfile - { - public SessionNewRoleProfile() - { - Id = new Guid(); - RoleProfileBase = new RoleProfileBase(); - } - public Guid Id { get; set; } - public RoleProfileBase RoleProfileBase { get; set; } - } -} diff --git a/DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnRoleProfile.cs b/DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnCompetencyAssessment.cs similarity index 84% rename from DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnRoleProfile.cs rename to DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnCompetencyAssessment.cs index 29b7b1b261..1fd5fee129 100644 --- a/DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnRoleProfile.cs +++ b/DigitalLearningSolutions.Data/Models/SessionData/Supervisor/SessionEnrolOnCompetencyAssessment.cs @@ -1,7 +1,7 @@ namespace DigitalLearningSolutions.Data.Models.SessionData.Supervisor { using System; - public class SessionEnrolOnRoleProfile + public class SessionEnrolOnCompetencyAssessment { public int? SelfAssessmentID { get; set; } public DateTime? CompleteByDate { get; set; } diff --git a/DigitalLearningSolutions.Data/Models/Supervisor/DelegateSelfAssessment.cs b/DigitalLearningSolutions.Data/Models/Supervisor/DelegateSelfAssessment.cs index 51ddb99a85..212089f305 100644 --- a/DigitalLearningSolutions.Data/Models/Supervisor/DelegateSelfAssessment.cs +++ b/DigitalLearningSolutions.Data/Models/Supervisor/DelegateSelfAssessment.cs @@ -22,11 +22,12 @@ public class DelegateSelfAssessment public string? DescriptionLabel { get; set; } public string? ReviewerCommentsLabel { get; set; } public string? SubGroup { get; set; } - public string? RoleProfile { get; set; } + public string? CompetencyAssessment { get; set; } public int SignOffRequested { get; set; } public int ResultsVerificationRequests { get; set; } public bool IsSupervisorResultsReviewed { get; set; } public bool IsAssignedToSupervisor { get; set; } public bool NonReportable { get; set; } + public string? Vocabulary { get; set; } } } diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/PromoteToAdminControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/PromoteToAdminControllerTests.cs index 5b84a3c962..9abc93259d 100644 --- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/PromoteToAdminControllerTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/PromoteToAdminControllerTests.cs @@ -94,7 +94,7 @@ public void Summary_post_registers_delegate_with_expected_values() A._, A._, A._, A._, A._, A._, A._, A._, A._, A._, A._, A._, - A._, A._ + A._, A._, A._ )).Returns(adminRolesEmail); // When diff --git a/DigitalLearningSolutions.Web.Tests/Services/EmailGenerationServiceTests.cs b/DigitalLearningSolutions.Web.Tests/Services/EmailGenerationServiceTests.cs index 96178e2220..47cb0eff9d 100644 --- a/DigitalLearningSolutions.Web.Tests/Services/EmailGenerationServiceTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Services/EmailGenerationServiceTests.cs @@ -45,6 +45,7 @@ bool isCmsManager const string supervisorFirstName = "TestAdminFirstName"; const string supervisorLastName = "TestAdminFirstName"; const string supervisorEmail = "admin@example.com"; + const string categoryName = "Digital Workplace"; const string centreName = "Test Centre Name"; @@ -65,7 +66,8 @@ bool isCmsManager isCmsAdministrator, isCmsManager, delegateEmail, - centreName + centreName, + categoryName ); // Then @@ -164,6 +166,11 @@ bool isCmsManager returnedEmail.Body.HtmlBody.Should().NotContain("
  • CMS manager
  • "); returnedEmail.Body.TextBody.Should().NotContain("CMS manager"); } + if (!string.IsNullOrEmpty(categoryName)) + { + returnedEmail.Body.HtmlBody.Should().Contain("In the Digital Workplace category."); + returnedEmail.Body.TextBody.Should().Contain("In the Digital Workplace category."); + } returnedEmail.Body.HtmlBody.Should().Contain("the next time you log in to " + centreName + "."); returnedEmail.Body.TextBody.Should().Contain("the next time you log in to " + centreName + "."); diff --git a/DigitalLearningSolutions.Web.Tests/TestHelpers/SupervisorTagTestHelper.cs b/DigitalLearningSolutions.Web.Tests/TestHelpers/SupervisorTagTestHelper.cs index e55cc5fe1a..ba437edd2d 100644 --- a/DigitalLearningSolutions.Web.Tests/TestHelpers/SupervisorTagTestHelper.cs +++ b/DigitalLearningSolutions.Web.Tests/TestHelpers/SupervisorTagTestHelper.cs @@ -101,7 +101,7 @@ public static DelegateSelfAssessment CreateDefaultDelegateSelfAssessment( string? descriptionLabel = null, string? reviewerCommentsLabel = null, string? subGroup = null, - string? roleProfile = null, + string? competencyAssessment = null, int signOffRequested =1, int resultsVerificationRequests =1, bool isSupervisorResultsReviewed =false, @@ -116,7 +116,7 @@ public static DelegateSelfAssessment CreateDefaultDelegateSelfAssessment( ResultsVerificationRequests = resultsVerificationRequests, ReviewerCommentsLabel = reviewerCommentsLabel, SubGroup = subGroup, - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SignOffRequested = signOffRequested, SupervisorResultsReview = supervisorResultsReview, SupervisorSelfAssessmentReview= supervisorSelfAssessmentReview, diff --git a/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs new file mode 100644 index 0000000000..aee8442d14 --- /dev/null +++ b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs @@ -0,0 +1,393 @@ +namespace DigitalLearningSolutions.Web.Controllers.CompetencyAssessmentsController +{ + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments; + using Microsoft.AspNetCore.Mvc; + using Microsoft.Extensions.Logging; + using System.Collections.Generic; + using DigitalLearningSolutions.Data.Enums; + using DigitalLearningSolutions.Web.Attributes; + using DigitalLearningSolutions.Web.Models.Enums; + using DigitalLearningSolutions.Web.Helpers; + using System.Linq; + using AspNetCoreGeneratedDocument; + using Microsoft.AspNetCore.Mvc.Rendering; + using DigitalLearningSolutions.Data.Models.Centres; + using DigitalLearningSolutions.Data.Models.Frameworks; + using Microsoft.CodeAnalysis.CSharp.Syntax; + + public partial class CompetencyAssessmentsController + { + [Route("/CompetencyAssessments/View/{tabname}/{page=1:int}")] + [SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))] + public IActionResult ViewCompetencyAssessments(string tabname, string? searchString = null, + string sortBy = CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentName, + string sortDirection = BaseCompetencyAssessmentsPageViewModel.AscendingText, + int page = 1 + ) + { + var adminId = GetAdminID(); + var isWorkforceManager = GetIsWorkforceManager() | GetIsFrameworkDeveloper(); + var isWorkforceContributor = GetIsWorkforceContributor() | GetIsFrameworkContributor(); + IEnumerable competencyAssessments; + if (tabname == "All") + { + competencyAssessments = competencyAssessmentService.GetAllCompetencyAssessments(adminId); + } + else + { + if (!isWorkforceContributor && !isWorkforceManager) + { + return RedirectToAction("ViewCompetencyAssessments", "CompetencyAssessments", new { tabname = "All" }); + } + competencyAssessments = competencyAssessmentService.GetCompetencyAssessmentsForAdminId(adminId); + } + if (competencyAssessments == null) + { + logger.LogWarning($"Attempt to display competency assessments for admin {adminId} returned null."); + return StatusCode(403); + } + MyCompetencyAssessmentsViewModel myCompetencyAssessments; + AllCompetencyAssessmentsViewModel allCompetencyAssessments; + if (tabname == "Mine") + { + myCompetencyAssessments = new MyCompetencyAssessmentsViewModel( + competencyAssessments, + searchString, + sortBy, + sortDirection, + page, + isWorkforceManager); + allCompetencyAssessments = new AllCompetencyAssessmentsViewModel( + new List(), + searchString, + sortBy, + sortDirection, + page + ); + } + else + { + allCompetencyAssessments = new AllCompetencyAssessmentsViewModel( + competencyAssessments, + searchString, + sortBy, + sortDirection, + page); + myCompetencyAssessments = new MyCompetencyAssessmentsViewModel( + new List(), + searchString, + sortBy, + sortDirection, + page, + isWorkforceManager + ); + } + + var currentTab = tabname == "All" ? CompetencyAssessmentsTab.AllCompetencyAssessments : CompetencyAssessmentsTab.MyCompetencyAssessments; + CompetencyAssessmentsViewModel? model = new CompetencyAssessmentsViewModel( + isWorkforceManager, + isWorkforceContributor, + allCompetencyAssessments, + myCompetencyAssessments, + currentTab + ); + return View("Index", model); + } + + [Route("/CompetencyAssessments/{actionName}/Name/{competencyAssessmentId}")] + [Route("/CompetencyAssessments/Framework/{frameworkId}/{actionName}/Name")] + [Route("/CompetencyAssessments/{actionName}/Name")] + [SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))] + public IActionResult CompetencyAssessmentName(string actionName, int competencyAssessmentId = 0, int? frameworkId = null) + { + var adminId = GetAdminID(); + var competencyAssessmentBase = new CompetencyAssessmentBase(); + if (competencyAssessmentId > 0) + { + 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); + } + } + else if (frameworkId != null) + { + var framework = frameworkService.GetBaseFrameworkByFrameworkId((int)frameworkId, adminId); + if (framework != null) + { + competencyAssessmentBase.CompetencyAssessmentName = framework.FrameworkName; + } + } + return View("Name", competencyAssessmentBase); + } + + [HttpPost] + [Route("/CompetencyAssessments/{actionName}/Name/{competencyAssessmentId}")] + [Route("/CompetencyAssessments/Framework/{frameworkId}/{actionName}/Name")] + [Route("/CompetencyAssessments/{actionName}/Name")] + [SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))] + public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessmentBase, string actionName, int competencyAssessmentId = 0, int? frameworkId = null) + { + if (!ModelState.IsValid) + { + ModelState.Remove(nameof(CompetencyAssessmentBase.CompetencyAssessmentName)); + ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Please enter a valid competency assessment name (between 3 and 255 characters)"); + return View("Name", competencyAssessmentBase); + } + else + { + var userCentreId = (int)GetCentreId(); + var adminId = GetAdminID(); + if (actionName == "New") + { + var sameItems = competencyAssessmentService.GetCompetencyAssessmentBaseByName(competencyAssessmentBase.CompetencyAssessmentName, GetAdminID()); + if (sameItems != null) + { + ModelState.Remove(nameof(CompetencyAssessmentBase.CompetencyAssessmentName)); + ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name."); + return View("Name", competencyAssessmentBase); + } + competencyAssessmentId = competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId); + } + else + { + + var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentName(competencyAssessmentBase.ID, adminId, competencyAssessmentBase.CompetencyAssessmentName); + if (!isUpdated) + { + ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name."); + return View("Name", competencyAssessmentBase); + } + } + 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/{competencyAssessmentId}/NationalRoleProfileLinks/{actionName}")] + [SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))] + public IActionResult EditRoleProfileLinks(int competencyAssessmentId = 0, string actionName = "EditGroup") + { + var adminId = GetAdminID(); + CompetencyAssessmentBase? competencyAssessmentBase; + if (competencyAssessmentId > 0) + { + competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + if (competencyAssessmentBase == null) + { + logger.LogWarning($"Failed to load Professional Group page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}"); + return StatusCode(500); + } + if (competencyAssessmentBase.UserRole < 2) + { + return StatusCode(403); + } + } + else + { + competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + } + var professionalGroups = competencyAssessmentService.GetNRPProfessionalGroups(); + var subGroups = competencyAssessmentService.GetNRPSubGroups(competencyAssessmentBase.NRPProfessionalGroupID); + var roles = competencyAssessmentService.GetNRPRoles(competencyAssessmentBase.NRPSubGroupID); + var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null); + var model = new EditRoleProfileLinksViewModel(competencyAssessmentBase, professionalGroups, subGroups, roles, actionName, competencyAssessmentTaskStatus.NationalRoleProfileTaskStatus); + return View(model); + } + + [HttpPost] + [Route("/CompetencyAssessments/{competencyAssessmentId}/NationalRoleProfileLinks/{actionName}")] + public IActionResult EditRoleProfileLinks(EditRoleProfileLinksViewModel model, string actionName, int competencyAssessmentId = 0) + { + var adminId = GetAdminID(); + var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + competencyAssessmentService.UpdateRoleProfileLinksTaskStatus(model.ID, model.TaskStatus ?? false); + if (competencyAssessmentBase == null) + { + logger.LogWarning($"Failed to submit role links page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}"); + return StatusCode(500); + } + if (competencyAssessmentBase.UserRole < 2) + { + return StatusCode(403); + } + if (competencyAssessmentBase.NRPProfessionalGroupID != model.ProfessionalGroupId) + { + model.SubGroupId = null; + model.RoleId = null; + } + if (competencyAssessmentBase.NRPSubGroupID != model.SubGroupId) + { + model.RoleId = null; + } + var isUpdated = competencyAssessmentService.UpdateCompetencyRoleProfileLinks(model.ID, adminId, model.ProfessionalGroupId, model.SubGroupId, model.RoleId); + if (model.ActionName == "EditGroup") + { + if (model.ProfessionalGroupId == null) + { + return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId }); + } + else + { + return RedirectToAction("EditRoleProfileLinks", new { actionName = "EditSubGroup", competencyAssessmentId }); + } + } + else if (model.ActionName == "EditSubGroup") + { + if (model.SubGroupId == null) + { + return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId }); + } + else + { + return RedirectToAction("EditRoleProfileLinks", new { actionName = "EditRole", competencyAssessmentId }); + } + } + else if (model.ActionName == "EditRole") + { + return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId }); + } + else + { + return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId }); + } + } + + [Route("/CompetencyAssessments/SubGroup/{actionName}/{competencyAssessmentId}")] + [Route("/CompetencyAssessments/SubGroup/{actionName}")] + [SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))] + public IActionResult CompetencyAssessmentSubGroup(string actionName, int competencyAssessmentId = 0) + { + return View("SubGroup"); + } + + [Route("/CompetencyAssessments/{competencyAssessmentId}/Description/")] + public IActionResult EditDescription(int competencyAssessmentId) + { + var adminId = GetAdminID(); + CompetencyAssessmentBase? competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + if (competencyAssessmentBase == null) + { + logger.LogWarning($"Failed to load description page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}"); + return StatusCode(500); + } + if (competencyAssessmentBase.UserRole < 2) + { + return StatusCode(403); + } + var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null); + var model = new EditDescriptionViewModel(competencyAssessmentBase, competencyAssessmentTaskStatus.IntroductoryTextTaskStatus); + return View(model); + } + [HttpPost] + [Route("/CompetencyAssessments/{competencyAssessmentId}/Description/")] + public IActionResult SaveDescription(EditDescriptionViewModel model) + { + if (!ModelState.IsValid) + { + return View("EditDescription", model); + } + var adminId = GetAdminID(); + var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentDescription(model.ID, adminId, SanitizerHelper.SanitizeHtmlData(model.Description)); + competencyAssessmentService.UpdateIntroductoryTextTaskStatus(model.ID, model.TaskStatus ?? false); + return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID }); + } + [Route("/CompetencyAssessments/{competencyAssessmentId}/Branding/")] + public IActionResult EditBranding(int competencyAssessmentId) + { + var centreId = GetCentreId(); + var adminId = GetAdminID(); + var brandsList = commonService.GetBrandListForCentre((int)centreId).Select(b => new { b.BrandID, b.BrandName }).ToList(); + var categoryList = commonService.GetCategoryListForCentre((int)centreId).Select(c => new { c.CourseCategoryID, c.CategoryName }).ToList(); + var brandSelectList = new SelectList(brandsList, "BrandID", "BrandName"); + var categorySelectList = new SelectList(categoryList, "CourseCategoryID", "CategoryName"); + var competencyAssessment = competencyAssessmentService.GetCompetencyAssessmentById(competencyAssessmentId, adminId); + var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null); + var model = new EditBrandingViewModel(competencyAssessment, brandSelectList, categorySelectList, competencyAssessmentTaskStatus.BrandingTaskStatus); + return View(model); + } + [HttpPost] + [Route("/CompetencyAssessments/{competencyAssessmentId}/Branding/")] + public IActionResult EditBranding(EditBrandingViewModel model) + { + var adminId = GetAdminID(); + var centreId = GetCentreId(); + if (!ModelState.IsValid) + { + var brandsList = commonService.GetBrandListForCentre((int)centreId).Select(b => new { b.BrandID, b.BrandName }).ToList(); + var categoryList = commonService.GetCategoryListForCentre((int)centreId).Select(c => new { c.CourseCategoryID, c.CategoryName }).ToList(); + var brandSelectList = new SelectList(brandsList, "BrandID", "BrandName"); + var categorySelectList = new SelectList(categoryList, "CourseCategoryID", "CategoryName"); + model.BrandSelectList = brandSelectList; + model.CategorySelectList = categorySelectList; + return View("EditBranding", model); + } + if (model.BrandID == 0) + { + model.BrandID = commonService.InsertBrandAndReturnId(model.Brand, (int)centreId); + } + if (model.CategoryID == 0) + { + model.CategoryID = commonService.InsertCategoryAndReturnId(model.Category, (int)centreId); + } + var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentBranding(model.ID, adminId, model.BrandID, model.CategoryID); + competencyAssessmentService.UpdateBrandingTaskStatus(model.ID, model.TaskStatus ?? false); + return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID }); + } + [Route("/CompetencyAssessments/{competencyAssessmentId}/Vocabulary/")] + public IActionResult EditVocabulary(int competencyAssessmentId) + { + var adminId = GetAdminID(); + CompetencyAssessmentBase? competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + if (competencyAssessmentBase == null) + { + logger.LogWarning($"Failed to load Vocabulary page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}"); + return StatusCode(500); + } + if (competencyAssessmentBase.UserRole < 2) + { + return StatusCode(403); + } + var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null); + var model = new EditVocabularyViewModel(competencyAssessmentBase, competencyAssessmentTaskStatus.VocabularyTaskStatus); + return View(model); + } + [HttpPost] + [Route("/CompetencyAssessments/{competencyAssessmentId}/Vocabulary/")] + public IActionResult SaveVocabulary(EditVocabularyViewModel model) + { + if (!ModelState.IsValid) + { + return View("EditVocabulary", model); + } + var adminId = GetAdminID(); + var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentVocabulary(model.ID, adminId, model.Vocabulary); + competencyAssessmentService.UpdateVocabularyTaskStatus(model.ID, model.TaskStatus ?? false); + return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID }); + } + } +} diff --git a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessmentsController.cs similarity index 58% rename from DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs rename to DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessmentsController.cs index 9a3173289f..c057b43776 100644 --- a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs +++ b/DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessmentsController.cs @@ -1,54 +1,67 @@ -namespace DigitalLearningSolutions.Web.Controllers.RoleProfilesController -{ - using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.Services; - using Microsoft.AspNetCore.Authorization; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.Logging; - - [Authorize(Policy = CustomPolicies.UserFrameworksAdminOnly)] - public partial class RoleProfilesController : Controller - { - private readonly IRoleProfileService roleProfileService; - private readonly ICommonService commonService; - private readonly IFrameworkNotificationService frameworkNotificationService; - private readonly ILogger logger; - private readonly IConfiguration config; - public RoleProfilesController( - IRoleProfileService roleProfileService, - ICommonService commonService, - IFrameworkNotificationService frameworkNotificationService, - ILogger logger, - IConfiguration config) - { - this.roleProfileService = roleProfileService; - this.commonService = commonService; - this.frameworkNotificationService = frameworkNotificationService; - this.logger = logger; - this.config = config; - } - public IActionResult Index() - { - return View(); - } - private int? GetCentreId() - { - return User.GetCustomClaimAsInt(CustomClaimTypes.UserCentreId); - } - private int GetAdminID() - { - return User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserAdminId); - } - private bool GetIsWorkforceManager() - { - var isWorkforceManager = User.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceManager); - return isWorkforceManager != null && (bool)isWorkforceManager; - } - private bool GetIsWorkforceContributor() - { - var isWorkforceContributor = User.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceContributor); - return isWorkforceContributor != null && (bool)isWorkforceContributor; - } - } -} +namespace DigitalLearningSolutions.Web.Controllers.CompetencyAssessmentsController +{ + using DigitalLearningSolutions.Web.Helpers; + using DigitalLearningSolutions.Web.Services; + using Microsoft.AspNetCore.Authorization; + using Microsoft.AspNetCore.Mvc; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.Logging; + + [Authorize(Policy = CustomPolicies.UserFrameworksAdminOnly)] + public partial class CompetencyAssessmentsController : Controller + { + private readonly ICompetencyAssessmentService competencyAssessmentService; + private readonly IFrameworkService frameworkService; + private readonly ICommonService commonService; + private readonly IFrameworkNotificationService frameworkNotificationService; + private readonly ILogger logger; + private readonly IConfiguration config; + public CompetencyAssessmentsController( + ICompetencyAssessmentService competencyAssessmentService, + IFrameworkService frameworkService, + ICommonService commonService, + IFrameworkNotificationService frameworkNotificationService, + ILogger logger, + IConfiguration config) + { + this.competencyAssessmentService = competencyAssessmentService; + this.frameworkService = frameworkService; + this.commonService = commonService; + this.frameworkNotificationService = frameworkNotificationService; + this.logger = logger; + this.config = config; + } + public IActionResult Index() + { + return View(); + } + private int? GetCentreId() + { + return User.GetCustomClaimAsInt(CustomClaimTypes.UserCentreId); + } + private int GetAdminID() + { + return User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserAdminId); + } + private bool GetIsWorkforceManager() + { + var isWorkforceManager = User.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceManager); + return isWorkforceManager != null && (bool)isWorkforceManager; + } + private bool GetIsWorkforceContributor() + { + var isWorkforceContributor = User.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceContributor); + return isWorkforceContributor != null && (bool)isWorkforceContributor; + } + private bool GetIsFrameworkDeveloper() + { + var isFrameworkDeveloper = User.GetCustomClaimAsBool(CustomClaimTypes.IsFrameworkDeveloper); + return isFrameworkDeveloper != null && (bool)isFrameworkDeveloper; + } + private bool GetIsFrameworkContributor() + { + var isFrameworkContributor = User.GetCustomClaimAsBool(CustomClaimTypes.IsFrameworkContributor); + return isFrameworkContributor != null && (bool)isFrameworkContributor; + } + } +} diff --git a/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs b/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs index de09607df3..b2f67f73e5 100644 --- a/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs +++ b/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs @@ -136,18 +136,18 @@ public IActionResult StartNewFrameworkSession() MultiPageFormDataFeature.AddNewFramework, TempData ); - return RedirectToAction("CreateNewFramework", "Frameworks", new { actionname = "New" }); + return RedirectToAction("CreateNewFramework", "Frameworks", new { actionName = "New" }); } - [Route("/Frameworks/Name/{actionname}/{frameworkId}")] - [Route("/Frameworks/Name/{actionname}")] + [Route("/Frameworks/Name/{actionName}/{frameworkId}")] + [Route("/Frameworks/Name/{actionName}")] [SetSelectedTab(nameof(NavMenuTab.Frameworks))] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult CreateNewFramework(string actionname, int frameworkId = 0) + public IActionResult CreateNewFramework(string actionName, int frameworkId = 0) { var adminId = GetAdminId(); DetailFramework? detailFramework; @@ -173,15 +173,15 @@ public IActionResult CreateNewFramework(string actionname, int frameworkId = 0) return View("Developer/Name", detailFramework); } [HttpPost] - [Route("/Frameworks/Name/{actionname}/{frameworkId}")] - [Route("/Frameworks/Name/{actionname}")] + [Route("/Frameworks/Name/{actionName}/{frameworkId}")] + [Route("/Frameworks/Name/{actionName}")] [SetSelectedTab(nameof(NavMenuTab.Frameworks))] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult CreateNewFramework(DetailFramework detailFramework, string actionname, int frameworkId = 0) + public IActionResult CreateNewFramework(DetailFramework detailFramework, string actionName, int frameworkId = 0) { if (!ModelState.IsValid) { @@ -189,7 +189,7 @@ public IActionResult CreateNewFramework(DetailFramework detailFramework, string ModelState.AddModelError(nameof(BaseFramework.FrameworkName), "Please enter a valid framework name (between 3 and 255 characters)"); return View("Developer/Name", detailFramework); } - if (actionname == "New") + if (actionName == "New") { SessionNewFramework sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); sessionNewFramework.DetailFramework = detailFramework; @@ -198,7 +198,7 @@ public IActionResult CreateNewFramework(DetailFramework detailFramework, string MultiPageFormDataFeature.AddNewFramework, TempData ); - return RedirectToAction("SetNewFrameworkName", new { frameworkname = detailFramework.FrameworkName, actionname }); + return RedirectToAction("SetNewFrameworkName", new { frameworkname = detailFramework.FrameworkName, actionName }); } var adminId = GetAdminId(); var isUpdated = frameworkService.UpdateFrameworkName(detailFramework.ID, adminId, detailFramework.FrameworkName); @@ -207,10 +207,10 @@ public IActionResult CreateNewFramework(DetailFramework detailFramework, string return View("Developer/Name", detailFramework); } - [Route("/Frameworks/Similar/{actionname}")] - public IActionResult SetNewFrameworkName(string frameworkname, string actionname) + [Route("/Frameworks/Similar/{actionName}")] + public IActionResult SetNewFrameworkName(string frameworkname, string actionName) { - if (actionname == "New") + if (actionName == "New") { var sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); multiPageFormService.SetMultiPageFormData( @@ -241,14 +241,14 @@ public IActionResult SetNewFrameworkName(string frameworkname, string actionname }; return View("Developer/Similar", model); } - return RedirectToAction("SaveNewFramework", "Frameworks", new { frameworkname, actionname }); + return RedirectToAction("SaveNewFramework", "Frameworks", new { frameworkname, actionName }); } - public IActionResult SaveNewFramework(string frameworkname, string actionname) + public IActionResult SaveNewFramework(string frameworkname, string actionName) { //var framework = frameworkService.CreateFramework(frameworkname, GetAdminID()); //need to create framework and move to next step. - if (actionname != "New") + if (actionName != "New") { return StatusCode(500); } @@ -258,23 +258,23 @@ public IActionResult SaveNewFramework(string frameworkname, string actionname) MultiPageFormDataFeature.AddNewFramework, TempData ); - return RedirectToAction("FrameworkDescription", "Frameworks", new { actionname }); + return RedirectToAction("FrameworkDescription", "Frameworks", new { actionName }); } - [Route("/Frameworks/Description/{actionname}/")] - [Route("/Frameworks/Description/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Description/{actionName}/")] + [Route("/Frameworks/Description/{actionName}/{frameworkId}/")] [SetSelectedTab(nameof(NavMenuTab.Frameworks))] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult FrameworkDescription(string actionname, int frameworkId = 0) + public IActionResult FrameworkDescription(string actionName, int frameworkId = 0) { var adminId = GetAdminId(); var centreId = GetCentreId(); DetailFramework? framework; - if (actionname == "New") + if (actionName == "New") { var sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); framework = sessionNewFramework.DetailFramework; @@ -298,16 +298,16 @@ public IActionResult FrameworkDescription(string actionname, int frameworkId = 0 } [HttpPost] - [Route("/Frameworks/Description/{actionname}/")] - [Route("/Frameworks/Description/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Description/{actionName}/")] + [Route("/Frameworks/Description/{actionName}/{frameworkId}/")] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult FrameworkDescription(DetailFramework detailFramework, string actionname, int frameworkId = 0) + public IActionResult FrameworkDescription(DetailFramework detailFramework, string actionName, int frameworkId = 0) { - if (actionname == "New") + if (actionName == "New") { var sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); sessionNewFramework.DetailFramework = detailFramework; @@ -316,7 +316,7 @@ public IActionResult FrameworkDescription(DetailFramework detailFramework, strin MultiPageFormDataFeature.AddNewFramework, TempData ); - return RedirectToAction("FrameworkType", "Frameworks", new { actionname }); + return RedirectToAction("FrameworkType", "Frameworks", new { actionName }); } detailFramework.Description = SanitizerHelper.SanitizeHtmlData(detailFramework.Description); frameworkService.UpdateFrameworkDescription(frameworkId, GetAdminId(), detailFramework.Description); @@ -324,20 +324,20 @@ public IActionResult FrameworkDescription(DetailFramework detailFramework, strin } - [Route("/Frameworks/Type/{actionname}/")] - [Route("/Frameworks/Type/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Type/{actionName}/")] + [Route("/Frameworks/Type/{actionName}/{frameworkId}/")] [SetSelectedTab(nameof(NavMenuTab.Frameworks))] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult FrameworkType(string actionname, int frameworkId = 0) + public IActionResult FrameworkType(string actionName, int frameworkId = 0) { var adminId = GetAdminId(); var centreId = GetCentreId(); DetailFramework? framework; - if (actionname == "New") + if (actionName == "New") { var sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); framework = sessionNewFramework.DetailFramework; @@ -361,16 +361,16 @@ public IActionResult FrameworkType(string actionname, int frameworkId = 0) } [HttpPost] - [Route("/Frameworks/Type/{actionname}/")] - [Route("/Frameworks/Type/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Type/{actionName}/")] + [Route("/Frameworks/Type/{actionName}/{frameworkId}/")] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult FrameworkType(DetailFramework detailFramework, string actionname, int frameworkId = 0) + public IActionResult FrameworkType(DetailFramework detailFramework, string actionName, int frameworkId = 0) { - if (actionname == "New") + if (actionName == "New") { var sessionNewFramework = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewFramework, TempData).GetAwaiter().GetResult(); sessionNewFramework.DetailFramework = detailFramework; @@ -379,26 +379,26 @@ public IActionResult FrameworkType(DetailFramework detailFramework, string actio MultiPageFormDataFeature.AddNewFramework, TempData ); - return RedirectToAction("SetNewFrameworkBrand", "Frameworks", new { actionname }); + return RedirectToAction("SetNewFrameworkBrand", "Frameworks", new { actionName }); } frameworkService.UpdateFrameworkConfig(frameworkId, GetAdminId(), detailFramework.FrameworkConfig); return RedirectToAction("ViewFramework", new { tabname = "Details", frameworkId }); } - [Route("/Frameworks/Categorise/{actionname}/")] - [Route("/Frameworks/Categorise/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Categorise/{actionName}/")] + [Route("/Frameworks/Categorise/{actionName}/{frameworkId}/")] [SetSelectedTab(nameof(NavMenuTab.Frameworks))] [ResponseCache(CacheProfileName = "Never")] [TypeFilter( typeof(RedirectToErrorEmptySessionData), Arguments = new object[] { nameof(MultiPageFormDataFeature.AddNewFramework) } )] - public IActionResult SetNewFrameworkBrand(string actionname, int frameworkId = 0) + public IActionResult SetNewFrameworkBrand(string actionName, int frameworkId = 0) { var adminId = GetAdminId(); var centreId = GetCentreId(); DetailFramework? framework; - if (actionname == "New") + if (actionName == "New") { if (TempData[MultiPageFormDataFeature.AddNewFramework.TempDataKey] == null) { @@ -443,13 +443,13 @@ public IActionResult SetNewFrameworkBrand(string actionname, int frameworkId = 0 } [HttpPost] - [Route("/Frameworks/Categorise/{actionname}/")] - [Route("/Frameworks/Categorise/{actionname}/{frameworkId}/")] - public IActionResult SetNewFrameworkBrand(DetailFramework? detailFramework, string actionname, int frameworkId = 0) + [Route("/Frameworks/Categorise/{actionName}/")] + [Route("/Frameworks/Categorise/{actionName}/{frameworkId}/")] + public IActionResult SetNewFrameworkBrand(DetailFramework? detailFramework, string actionName, int frameworkId = 0) { var adminId = GetAdminId(); var centreId = GetCentreId(); - if (actionname != "New" && frameworkId > 0) + if (actionName != "New" && frameworkId > 0) { detailFramework = InsertBrandingCategoryTopicIfRequired(detailFramework); if (detailFramework == null) return RedirectToAction("SetNewFrameworkBrand", "Frameworks", new { frameworkId }); @@ -577,12 +577,12 @@ public IActionResult RemoveFrameworkFlag(RemoveCustomFlagConfirmationViewModel m } [HttpPost] - [Route("/Frameworks/Flags/{actionname}/{frameworkId}/{flagId}")] - public IActionResult EditFrameworkFlag(CustomFlagViewModel model, int frameworkId, string actionname, int flagId) + [Route("/Frameworks/Flags/{actionName}/{frameworkId}/{flagId}")] + public IActionResult EditFrameworkFlag(CustomFlagViewModel model, int frameworkId, string actionName, int flagId) { if (ModelState.IsValid) { - if (actionname == "Edit") + if (actionName == "Edit") { frameworkService.UpdateFrameworkCustomFlag(frameworkId, model.Id, model.FlagName, model.FlagGroup, model.FlagTagClass); } @@ -596,11 +596,11 @@ public IActionResult EditFrameworkFlag(CustomFlagViewModel model, int frameworkI } [HttpGet] - [Route("/Frameworks/Flags/{actionname:regex(Edit|New)}/{frameworkId}/{flagId}")] - public IActionResult EditFrameworkFlag(int frameworkId, string actionname, int flagId) + [Route("/Frameworks/Flags/{actionName:regex(Edit|New)}/{frameworkId}/{flagId}")] + public IActionResult EditFrameworkFlag(int frameworkId, string actionName, int flagId) { var model = new CustomFlagViewModel(); - if (actionname == "Edit") + if (actionName == "Edit") { var flag = frameworkService.GetCustomFlagsByFrameworkId(frameworkId, (int?)flagId).FirstOrDefault(); model = new CustomFlagViewModel() @@ -614,9 +614,9 @@ public IActionResult EditFrameworkFlag(int frameworkId, string actionname, int f return View("Developer/EditCustomFlag", model); } - [Route("/Frameworks/Collaborators/{actionname}/{frameworkId}/")] + [Route("/Frameworks/Collaborators/{actionName}/{frameworkId}/")] [ResponseCache(CacheProfileName = "Never")] - public IActionResult AddCollaborators(string actionname, int frameworkId, bool error = false) + public IActionResult AddCollaborators(string actionName, int frameworkId, bool error = false) { var adminId = GetAdminId(); var collaborators = frameworkService.GetCollaboratorsForFrameworkId(frameworkId); @@ -638,15 +638,15 @@ public IActionResult AddCollaborators(string actionname, int frameworkId, bool e } [HttpPost] - [Route("/Frameworks/Collaborators/{actionname}/{frameworkId}/")] - public IActionResult AddCollaborator(string actionname, string userEmail, bool canModify, int frameworkId) + [Route("/Frameworks/Collaborators/{actionName}/{frameworkId}/")] + public IActionResult AddCollaborator(string actionName, string userEmail, bool canModify, int frameworkId) { int? centreID = GetCentreId(); var collaboratorId = frameworkService.AddCollaboratorToFramework(frameworkId, userEmail, canModify, centreID); if (collaboratorId > 0) { frameworkNotificationService.SendFrameworkCollaboratorInvite(collaboratorId, GetAdminId()); - return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionname }); + return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionName }); } else { @@ -671,15 +671,15 @@ public IActionResult AddCollaborator(string actionname, string userEmail, bool c { TempData["FrameworkError"] = "User not added,Kindly try again;"; } - return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionname }); + return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionName }); } } - public IActionResult RemoveCollaborator(int frameworkId, string actionname, int id) + public IActionResult RemoveCollaborator(int frameworkId, string actionName, int id) { frameworkService.RemoveCollaboratorFromFramework(frameworkId, id); - return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionname }); + return RedirectToAction("AddCollaborators", "Frameworks", new { frameworkId, actionName }); } [Route("/Framework/{frameworkId}/{tabname}/{frameworkCompetencyGroupId}/{frameworkCompetencyId}")] @@ -751,7 +751,7 @@ public IActionResult InsertFramework() detailFramework.Description = SanitizerHelper.SanitizeHtmlData(detailFramework.Description); var newFramework = frameworkService.CreateFramework(detailFramework, adminId); TempData.Clear(); - return RedirectToAction("AddCollaborators", "Frameworks", new { actionname = "New", frameworkId = newFramework.ID }); + return RedirectToAction("AddCollaborators", "Frameworks", new { actionName = "New", frameworkId = newFramework.ID }); } } } diff --git a/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs b/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs index 886c0800f5..752befe216 100644 --- a/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs +++ b/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs @@ -200,7 +200,7 @@ public IActionResult AddAssessmentQuestions(AddAssessmentQuestionsFormData model public IActionResult AddQuestionsToWhichCompetencies() { var data = GetBulkUploadData(); - if (data.DefaultQuestionIDs.Count ==0 && data.CustomAssessmentQuestionID == null) + if (data.DefaultQuestionIDs.Count == 0 && data.CustomAssessmentQuestionID == null) { return RedirectToAction("ImportSummary", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName }); } diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs index 2234f7d9eb..4947c6bd75 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs @@ -1565,7 +1565,18 @@ ManageOptionalCompetenciesViewModel model } } - + + if (!selfAssessmentService.HasMinimumOptionalCompetencies(selfAssessmentId, delegateUserId)) + { + var supervisorsSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(selfAssessmentId, delegateUserId); + + if (supervisorsSignOffs.FirstOrDefault() is { Verified: null, Removed: null }) + { + selfAssessmentService.RemoveSignoffRequestById(supervisorsSignOffs.FirstOrDefault().ID); + } + } + + return RedirectToAction("SelfAssessmentOverview", new { selfAssessmentId, vocabulary }); } @@ -1577,9 +1588,9 @@ public IActionResult RequestSignOff(int selfAssessmentId) var delegateId = User.GetCandidateIdKnownNotNull(); var recentResults = selfAssessmentService.GetMostRecentResults(selfAssessmentId, delegateId).ToList(); var competencySummaries = CertificateHelper.CompetencySummation(recentResults); - - if (competencySummaries.QuestionsCount != competencySummaries.VerifiedCount) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); - + + if (competencySummaries.QuestionsCount != competencySummaries.VerifiedCount) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); + var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId); var supervisors = selfAssessmentService.GetSignOffSupervisorsForSelfAssessmentId(selfAssessmentId, delegateUserId); @@ -1591,7 +1602,7 @@ public IActionResult RequestSignOff(int selfAssessmentId) NumberOfSelfAssessedOptionalCompetencies = optionalCompetencies.Count(x => x.IncludedInSelfAssessment) }; if (model.NumberOfSelfAssessedOptionalCompetencies < model.SelfAssessment.MinimumOptionalCompetencies) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 }); - + return View("SelfAssessments/RequestSignOff", model); } diff --git a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfiles.cs b/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfiles.cs deleted file mode 100644 index dfcae3b8ef..0000000000 --- a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfiles.cs +++ /dev/null @@ -1,306 +0,0 @@ -namespace DigitalLearningSolutions.Web.Controllers.RoleProfilesController -{ - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using DigitalLearningSolutions.Web.ViewModels.RoleProfiles; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Logging; - using DigitalLearningSolutions.Web.Extensions; - using DigitalLearningSolutions.Data.Models.SessionData.RoleProfiles; - using Microsoft.AspNetCore.Http; - using System; - using System.Collections.Generic; - using DigitalLearningSolutions.Data.Enums; - using DigitalLearningSolutions.Web.Attributes; - using DigitalLearningSolutions.Web.Models.Enums; - - public partial class RoleProfilesController - { - private const string CookieName = "DLSFrameworkService"; - [Route("/RoleProfiles/View/{tabname}/{page=1:int}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult ViewRoleProfiles(string tabname, string? searchString = null, - string sortBy = RoleProfileSortByOptionTexts.RoleProfileName, - string sortDirection = BaseRoleProfilesPageViewModel.AscendingText, - int page = 1 - ) - { - var adminId = GetAdminID(); - var isWorkforceManager = GetIsWorkforceManager(); - var isWorkforceContributor = GetIsWorkforceContributor(); - IEnumerable roleProfiles; - if (tabname == "All") - { - roleProfiles = roleProfileService.GetAllRoleProfiles(adminId); - } - else - { - if (!isWorkforceContributor && !isWorkforceManager) - { - return RedirectToAction("ViewRoleProfiles", "RoleProfiles", new { tabname = "All" }); - } - roleProfiles = roleProfileService.GetRoleProfilesForAdminId(adminId); - } - if (roleProfiles == null) - { - logger.LogWarning($"Attempt to display role profiles for admin {adminId} returned null."); - return StatusCode(403); - } - MyRoleProfilesViewModel myRoleProfiles; - AllRoleProfilesViewModel allRoleProfiles; - if (tabname == "Mine") - { - myRoleProfiles = new MyRoleProfilesViewModel( - roleProfiles, - searchString, - sortBy, - sortDirection, - page, - isWorkforceManager); - allRoleProfiles = new AllRoleProfilesViewModel( - new List(), - searchString, - sortBy, - sortDirection, - page - ); - } - else - { - allRoleProfiles = new AllRoleProfilesViewModel( - roleProfiles, - searchString, - sortBy, - sortDirection, - page); - myRoleProfiles = new MyRoleProfilesViewModel( - new List(), - searchString, - sortBy, - sortDirection, - page, - isWorkforceManager - ); - } - - var currentTab = tabname == "All" ? RoleProfilesTab.AllRoleProfiles : RoleProfilesTab.MyRoleProfiles; - RoleProfilesViewModel? model = new RoleProfilesViewModel( - isWorkforceManager, - isWorkforceContributor, - allRoleProfiles, - myRoleProfiles, - currentTab - ); - return View("Index", model); - } - public IActionResult StartNewRoleProfileSession() - { - var adminId = GetAdminID(); - TempData.Clear(); - var sessionNewRoleProfile = new SessionNewRoleProfile(); - if (!Request.Cookies.ContainsKey(CookieName)) - { - var id = Guid.NewGuid(); - - Response.Cookies.Append( - CookieName, - id.ToString(), - new CookieOptions - { - Expires = DateTimeOffset.UtcNow.AddDays(30) - }); - - sessionNewRoleProfile.Id = id; - } - else - { - if (Request.Cookies.TryGetValue(CookieName, out string idString)) - { - sessionNewRoleProfile.Id = Guid.Parse(idString); - } - else - { - var id = Guid.NewGuid(); - - Response.Cookies.Append( - CookieName, - id.ToString(), - new CookieOptions - { - Expires = DateTimeOffset.UtcNow.AddDays(30) - }); - sessionNewRoleProfile.Id = id; - } - } - RoleProfileBase roleProfileBase = new RoleProfileBase() - { - BrandID = 6, - OwnerAdminID = adminId, - National = true, - Public = true, - PublishStatusID = 1, - UserRole = 3 - }; - sessionNewRoleProfile.RoleProfileBase = roleProfileBase; - TempData.Set(sessionNewRoleProfile); - return RedirectToAction("RoleProfileName", "RoleProfiles", new { actionname = "New" }); - } - - [Route("/RoleProfiles/Name/{actionname}/{roleProfileId}")] - [Route("/RoleProfiles/Name/{actionname}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult RoleProfileName(string actionname, int roleProfileId = 0) - { - var adminId = GetAdminID(); - RoleProfileBase? roleProfileBase; - if (roleProfileId > 0) - { - roleProfileBase = roleProfileService.GetRoleProfileBaseById(roleProfileId, adminId); - if (roleProfileBase == null) - { - logger.LogWarning($"Failed to load name page for roleProfileId: {roleProfileId} adminId: {adminId}"); - return StatusCode(500); - } - if (roleProfileBase.UserRole < 2) - { - return StatusCode(403); - } - } - else - { - SessionNewRoleProfile sessionNewRoleProfile = TempData.Peek(); - TempData.Set(sessionNewRoleProfile); - roleProfileBase = sessionNewRoleProfile.RoleProfileBase; - TempData.Set(sessionNewRoleProfile); - } - return View("Name", roleProfileBase); - } - - [HttpPost] - [Route("/RoleProfiles/Name/{actionname}/{roleProfileId}")] - [Route("/RoleProfiles/Name/{actionname}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult SaveProfileName(RoleProfileBase roleProfileBase, string actionname, int roleProfileId = 0) - { - if (!ModelState.IsValid) - { - ModelState.Remove(nameof(RoleProfileBase.RoleProfileName)); - ModelState.AddModelError(nameof(RoleProfileBase.RoleProfileName), "Please enter a valid role profile name (between 3 and 255 characters)"); - // do something - return View("Name", roleProfileBase); - } - else - { - if (actionname == "New") - { - var sameItems = roleProfileService.GetRoleProfileByName(roleProfileBase.RoleProfileName, GetAdminID()); - if (sameItems != null) - { - ModelState.Remove(nameof(RoleProfileBase.RoleProfileName)); - ModelState.AddModelError(nameof(RoleProfileBase.RoleProfileName), "Another role profile exists with that name. Please choose a different name."); - // do something - return View("Name", roleProfileBase); - } - SessionNewRoleProfile sessionNewRoleProfile = TempData.Peek(); - sessionNewRoleProfile.RoleProfileBase = roleProfileBase; - TempData.Set(sessionNewRoleProfile); - return RedirectToAction("RoleProfileProfessionalGroup", "RoleProfiles", new { actionname }); - } - else - { - var adminId = GetAdminID(); - var isUpdated = roleProfileService.UpdateRoleProfileName(roleProfileBase.ID, adminId, roleProfileBase.RoleProfileName); - if (isUpdated) - { - return RedirectToAction("ViewRoleProfile", new { tabname = "Details", roleProfileId }); - } - else - { - ModelState.AddModelError(nameof(RoleProfileBase.RoleProfileName), "Another role profile exists with that name. Please choose a different name."); - // do something - return View("Name", roleProfileBase); - } - } - - } - } - - [Route("/RoleProfiles/ProfessionalGroup/{actionname}/{roleProfileId}")] - [Route("/RoleProfiles/ProfessionalGroup/{actionname}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult RoleProfileProfessionalGroup(string actionname, int roleProfileId = 0) - { - var adminId = GetAdminID(); - RoleProfileBase? roleProfileBase; - if (roleProfileId > 0) - { - roleProfileBase = roleProfileService.GetRoleProfileBaseById(roleProfileId, adminId); - if (roleProfileBase == null) - { - logger.LogWarning($"Failed to load Professional Group page for roleProfileId: {roleProfileId} adminId: {adminId}"); - return StatusCode(500); - } - if (roleProfileBase.UserRole < 2) - { - return StatusCode(403); - } - } - else - { - SessionNewRoleProfile sessionNewRoleProfile = TempData.Peek(); - TempData.Set(sessionNewRoleProfile); - roleProfileBase = sessionNewRoleProfile.RoleProfileBase; - TempData.Set(sessionNewRoleProfile); - } - var professionalGroups = roleProfileService.GetNRPProfessionalGroups(); - var model = new ProfessionalGroupViewModel() - { - NRPProfessionalGroups = professionalGroups, - RoleProfileBase = roleProfileBase - }; - return View("ProfessionalGroup", model); - } - - [HttpPost] - [Route("/RoleProfiles/ProfessionalGroup/{actionname}/{roleProfileId}")] - [Route("/RoleProfiles/ProfessionalGroup/{actionname}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult SaveProfessionalGroup(RoleProfileBase roleProfileBase, string actionname, int roleProfileId = 0) - { - if (roleProfileBase.NRPProfessionalGroupID == null) - { - ModelState.Remove(nameof(RoleProfileBase.NRPProfessionalGroupID)); - ModelState.AddModelError(nameof(RoleProfileBase.NRPProfessionalGroupID), "Please choose a professional group" + (roleProfileId == 0 ? "or Skip this step" : "") + "."); - // do something - return View("Name", roleProfileBase); - } - if (actionname == "New") - { - SessionNewRoleProfile sessionNewRoleProfile = TempData.Peek(); - sessionNewRoleProfile.RoleProfileBase = roleProfileBase; - TempData.Set(sessionNewRoleProfile); - return RedirectToAction("RoleProfileSubGroup", "RoleProfiles", new { actionname }); - } - else - { - var adminId = GetAdminID(); - var isUpdated = roleProfileService.UpdateRoleProfileProfessionalGroup(roleProfileBase.ID, adminId, roleProfileBase.NRPProfessionalGroupID); - if (isUpdated) - { - return RedirectToAction("RoleProfileSubGroup", "RoleProfiles", new { actionname, roleProfileId }); - } - else - { - return RedirectToAction("ViewRoleProfile", new { tabname = "Details", roleProfileId }); - } - } - } - - [Route("/RoleProfiles/SubGroup/{actionname}/{roleProfileId}")] - [Route("/RoleProfiles/SubGroup/{actionname}")] - [SetSelectedTab(nameof(NavMenuTab.RolesProfiles))] - public IActionResult RoleProfileSubGroup(string actionname, int roleProfileId = 0) - { - return View("SubGroup"); - } - } -} diff --git a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs index 22eb2ddf41..21b555391c 100644 --- a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs +++ b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs @@ -699,9 +699,9 @@ public IActionResult StartEnrolDelegateOnProfileAssessment(int supervisorDelegat { TempData.Clear(); - var sessionEnrolOnRoleProfile = new SessionEnrolOnRoleProfile(); + var sessionEnrolOnCompetencyAssessment = new SessionEnrolOnCompetencyAssessment(); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -719,12 +719,12 @@ public IActionResult StartEnrolDelegateOnProfileAssessment(int supervisorDelegat )] public IActionResult EnrolDelegateOnProfileAssessment(int supervisorDelegateId) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData( + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData( MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ).GetAwaiter().GetResult(); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -732,25 +732,25 @@ public IActionResult EnrolDelegateOnProfileAssessment(int supervisorDelegateId) var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfiles = supervisorService.GetAvailableRoleProfilesForDelegate( + var competencyAssessments = supervisorService.GetAvailableCompetencyAssessmentsForDelegate( (int)supervisorDelegate.DelegateUserID, GetCentreId(), loggedInAdmin.CategoryId ); var model = new EnrolDelegateOnProfileAssessmentViewModel() { - SessionEnrolOnRoleProfile = sessionEnrolOnRoleProfile, + SessionEnrolOnCompetencyAssessment = sessionEnrolOnCompetencyAssessment, SupervisorDelegateDetail = supervisorDelegate, - RoleProfiles = roleProfiles + CompetencyAssessments = competencyAssessments }; return View("EnrolDelegateOnProfileAssessment", model); } [HttpPost] [Route("/Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/Enrol/Profile")] - public IActionResult EnrolSetRoleProfile(int supervisorDelegateId, int selfAssessmentID) + public IActionResult EnrolSetCompetencyAssessment(int supervisorDelegateId, int selfAssessmentID) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData( + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData( MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ).GetAwaiter().GetResult(); @@ -761,29 +761,29 @@ public IActionResult EnrolSetRoleProfile(int supervisorDelegateId, int selfAsses { ModelState.AddModelError("selfAssessmentId", "You must select a self assessment"); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfiles = supervisorService.GetAvailableRoleProfilesForDelegate( + var competencyAssessments = supervisorService.GetAvailableCompetencyAssessmentsForDelegate( (int)supervisorDelegate.DelegateUserID, GetCentreId(), loggedInAdmin.CategoryId ); var model = new EnrolDelegateOnProfileAssessmentViewModel() { - SessionEnrolOnRoleProfile = sessionEnrolOnRoleProfile, + SessionEnrolOnCompetencyAssessment = sessionEnrolOnCompetencyAssessment, SupervisorDelegateDetail = supervisorDelegate, - RoleProfiles = roleProfiles + CompetencyAssessments = competencyAssessments }; return View("EnrolDelegateOnProfileAssessment", model); } - sessionEnrolOnRoleProfile.SelfAssessmentID = selfAssessmentID; + sessionEnrolOnCompetencyAssessment.SelfAssessmentID = selfAssessmentID; multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -802,23 +802,23 @@ public IActionResult EnrolSetRoleProfile(int supervisorDelegateId, int selfAsses )] public IActionResult EnrolDelegateCompleteBy(int supervisorDelegateId, int? day, int? month, int? year) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData( + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData( MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ).GetAwaiter().GetResult(); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfile = supervisorService.GetRoleProfileById((int)sessionEnrolOnRoleProfile.SelfAssessmentID); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById((int)sessionEnrolOnCompetencyAssessment.SelfAssessmentID); var model = new EnrolDelegateSetCompletByDateViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, - CompleteByDate = sessionEnrolOnRoleProfile.CompleteByDate + CompetencyAssessment = competencyAssessment, + CompleteByDate = sessionEnrolOnCompetencyAssessment.CompleteByDate }; if (day != null && month != null && year != null) { @@ -835,7 +835,7 @@ public IActionResult EnrolDelegateSetCompleteBy(int supervisorDelegateId, int da TempData["completeByDate"] = day; TempData["completeByMonth"] = month; TempData["completeByYear"] = year; - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); if (day != 0 | month != 0 | year != 0) { var validationResult = OldDateValidator.ValidateDate(day, month, year); @@ -846,9 +846,9 @@ public IActionResult EnrolDelegateSetCompleteBy(int supervisorDelegateId, int da else { var completeByDate = new DateTime(year, month, day); - sessionEnrolOnRoleProfile.CompleteByDate = completeByDate; + sessionEnrolOnCompetencyAssessment.CompleteByDate = completeByDate; multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -856,7 +856,7 @@ public IActionResult EnrolDelegateSetCompleteBy(int supervisorDelegateId, int da } var supervisorRoles = - supervisorService.GetSupervisorRolesBySelfAssessmentIdForSupervisor(sessionEnrolOnRoleProfile.SelfAssessmentID.Value); + supervisorService.GetSupervisorRolesBySelfAssessmentIdForSupervisor(sessionEnrolOnCompetencyAssessment.SelfAssessmentID.Value); if (supervisorRoles.Count() > 1) { TempData["navigatedFrom"] = "EnrolDelegateSupervisorRole"; @@ -868,9 +868,9 @@ public IActionResult EnrolDelegateSetCompleteBy(int supervisorDelegateId, int da } else if (supervisorRoles.Count() == 1) { - sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId = supervisorRoles.First().ID; + sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId = supervisorRoles.First().ID; multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -891,21 +891,21 @@ public IActionResult EnrolDelegateSetCompleteBy(int supervisorDelegateId, int da )] public IActionResult EnrolDelegateSupervisorRole(int supervisorDelegateId) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfile = supervisorService.GetRoleProfileById((int)sessionEnrolOnRoleProfile.SelfAssessmentID); - var supervisorRoles = supervisorService.GetSupervisorRolesForSelfAssessment(sessionEnrolOnRoleProfile.SelfAssessmentID.Value); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById((int)sessionEnrolOnCompetencyAssessment.SelfAssessmentID); + var supervisorRoles = supervisorService.GetSupervisorRolesForSelfAssessment(sessionEnrolOnCompetencyAssessment.SelfAssessmentID.Value); var model = new EnrolDelegateSupervisorRoleViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, - SelfAssessmentSupervisorRoleId = sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId, + CompetencyAssessment = competencyAssessment, + SelfAssessmentSupervisorRoleId = sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId, SelfAssessmentSupervisorRoles = supervisorRoles }; ViewBag.completeByDate = TempData["completeByDate"]; @@ -922,24 +922,24 @@ public IActionResult EnrolDelegateSetSupervisorRole( int selfAssessmentSupervisorRoleId ) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); if (!ModelState.IsValid) { ModelState.ClearErrorsForAllFieldsExcept("SelfAssessmentSupervisorRoleId"); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfile = supervisorService.GetRoleProfileById((int)sessionEnrolOnRoleProfile.SelfAssessmentID); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById((int)sessionEnrolOnCompetencyAssessment.SelfAssessmentID); var supervisorRoles = - supervisorService.GetSupervisorRolesForSelfAssessment(sessionEnrolOnRoleProfile.SelfAssessmentID.Value); + supervisorService.GetSupervisorRolesForSelfAssessment(sessionEnrolOnCompetencyAssessment.SelfAssessmentID.Value); model.SupervisorDelegateDetail = supervisorDelegate; - model.RoleProfile = roleProfile; + model.CompetencyAssessment = competencyAssessment; model.SelfAssessmentSupervisorRoles = supervisorRoles; return View("EnrolDelegateSupervisorRole", model); } - sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId = selfAssessmentSupervisorRoleId; + sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId = selfAssessmentSupervisorRoleId; multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); @@ -958,32 +958,32 @@ int selfAssessmentSupervisorRoleId )] public IActionResult EnrolDelegateSummary(int supervisorDelegateId) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfile = supervisorService.GetRoleProfileById((int)sessionEnrolOnRoleProfile.SelfAssessmentID); - var supervisorRoleName = (sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId == null + var competencyAssessment = supervisorService.GetCompetencyAssessmentById((int)sessionEnrolOnCompetencyAssessment.SelfAssessmentID); + var supervisorRoleName = (sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId == null ? "Supervisor" : supervisorService - .GetSupervisorRoleById(sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId.Value).RoleName); - var supervisorRoleCount = (sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId == null + .GetSupervisorRoleById(sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId.Value).RoleName); + var supervisorRoleCount = (sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId == null ? 0 : supervisorService - .GetSupervisorRolesForSelfAssessment(sessionEnrolOnRoleProfile.SelfAssessmentID.Value).Count()); - var allowSupervisorRoleSelection = (sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId == null + .GetSupervisorRolesForSelfAssessment(sessionEnrolOnCompetencyAssessment.SelfAssessmentID.Value).Count()); + var allowSupervisorRoleSelection = (sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId == null ? false : supervisorService - .GetSupervisorRolesForSelfAssessment(sessionEnrolOnRoleProfile.SelfAssessmentID.Value).FirstOrDefault().AllowSupervisorRoleSelection); + .GetSupervisorRolesForSelfAssessment(sessionEnrolOnCompetencyAssessment.SelfAssessmentID.Value).FirstOrDefault().AllowSupervisorRoleSelection); var model = new EnrolDelegateSummaryViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SupervisorRoleName = supervisorRoleName, - CompleteByDate = sessionEnrolOnRoleProfile.CompleteByDate, + CompleteByDate = sessionEnrolOnCompetencyAssessment.CompleteByDate, SupervisorRoleCount = supervisorRoleCount, AllowSupervisorRoleSelection = allowSupervisorRoleSelection }; @@ -996,10 +996,10 @@ public IActionResult EnrolDelegateSummary(int supervisorDelegateId) public IActionResult EnrolDelegateConfirm(int delegateUserId, int supervisorDelegateId) { - var sessionEnrolOnRoleProfile = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); - var selfAssessmentId = sessionEnrolOnRoleProfile.SelfAssessmentID; - var completeByDate = sessionEnrolOnRoleProfile.CompleteByDate; - var selfAssessmentSupervisorRoleId = sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId; + var sessionEnrolOnCompetencyAssessment = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData).GetAwaiter().GetResult(); + var selfAssessmentId = sessionEnrolOnCompetencyAssessment.SelfAssessmentID; + var completeByDate = sessionEnrolOnCompetencyAssessment.CompleteByDate; + var selfAssessmentSupervisorRoleId = sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId; var loggedInUserId = User.GetUserId(); var candidateAssessmentId = supervisorService.EnrolDelegateOnAssessment( delegateUserId, @@ -1031,7 +1031,7 @@ public IActionResult QuickAddSupervisor(int selfAssessmentId, int supervisorDele { var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); - var roleProfile = supervisorService.GetRoleProfileById(selfAssessmentId); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById(selfAssessmentId); var supervisorRoles = supervisorService.GetSupervisorRolesBySelfAssessmentIdForSupervisor(selfAssessmentId); if (supervisorRoles.Any() && supervisorRoles.Count() > 1) @@ -1039,7 +1039,7 @@ public IActionResult QuickAddSupervisor(int selfAssessmentId, int supervisorDele var model = new EnrolDelegateSupervisorRoleViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SelfAssessmentSupervisorRoleId = null, SelfAssessmentSupervisorRoles = supervisorRoles }; @@ -1059,25 +1059,25 @@ public IActionResult QuickAddSupervisor(int selfAssessmentId, int supervisorDele } } - var sessionEnrolOnRoleProfile = new SessionEnrolOnRoleProfile() + var sessionEnrolOnCompetencyAssessment = new SessionEnrolOnCompetencyAssessment() { - SelfAssessmentID = supervisorRoles.FirstOrDefault().SelfAssessmentID, - SelfAssessmentSupervisorRoleId = supervisorRoles.FirstOrDefault().ID + SelfAssessmentID = supervisorRoles.FirstOrDefault() != null ? supervisorRoles.FirstOrDefault().SelfAssessmentID : selfAssessmentId, + SelfAssessmentSupervisorRoleId = supervisorRoles.FirstOrDefault() != null ? supervisorRoles.FirstOrDefault().ID : 0 }; multiPageFormService.SetMultiPageFormData( - sessionEnrolOnRoleProfile, + sessionEnrolOnCompetencyAssessment, MultiPageFormDataFeature.EnrolDelegateOnProfileAssessment, TempData ); - var supervisorRoleName = supervisorRoles.FirstOrDefault().RoleName; + var supervisorRoleName = supervisorRoles.FirstOrDefault() != null ? supervisorRoles.FirstOrDefault().RoleName : ""; var model = new EnrolDelegateSummaryViewModel { - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SupervisorDelegateDetail = supervisorDelegate, SupervisorRoleName = supervisorRoleName }; - return View("SelectDelegateSupervisorRoleSummary", new Tuple(model, sessionEnrolOnRoleProfile.SelfAssessmentSupervisorRoleId)); + return View("SelectDelegateSupervisorRoleSummary", new Tuple(model, sessionEnrolOnCompetencyAssessment.SelfAssessmentSupervisorRoleId)); } @@ -1087,7 +1087,7 @@ public IActionResult QuickAddSupervisor(int selfAssessmentId, int supervisorDele [HttpPost] public IActionResult QuickAddSupervisor(EnrolDelegateSupervisorRoleViewModel supervisorRole, int selfAssessmentId, int supervisorDelegateId, int delegateUserId) { - var roleProfile = supervisorService.GetRoleProfileById(selfAssessmentId); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById(selfAssessmentId); var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); if (supervisorRole.SelfAssessmentSupervisorRoleId == null) @@ -1096,7 +1096,7 @@ public IActionResult QuickAddSupervisor(EnrolDelegateSupervisorRoleViewModel sup var model = new EnrolDelegateSupervisorRoleViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SelfAssessmentSupervisorRoleId = null, SelfAssessmentSupervisorRoles = supervisorRoles }; @@ -1107,7 +1107,7 @@ public IActionResult QuickAddSupervisor(EnrolDelegateSupervisorRoleViewModel sup var model = new EnrolDelegateSummaryViewModel { - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SupervisorDelegateDetail = supervisorDelegate, SupervisorRoleName = supervisorRole.SelfAssessmentSupervisorRoleId == null ? "Supervisor" : supervisorService.GetSupervisorRoleById((int)supervisorRole.SelfAssessmentSupervisorRoleId).RoleName, @@ -1126,12 +1126,12 @@ public IActionResult QuickAddSupervisorConfirm(int? selfAssessmentSupervisorRole var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, GetAdminId(), 0); if (!selfAssessmentSupervisorRoleId.HasValue) { - var roleProfile = supervisorService.GetRoleProfileById(selfAssessmentId); + var competencyAssessment = supervisorService.GetCompetencyAssessmentById(selfAssessmentId); var supervisorRoles = supervisorService.GetSupervisorRolesForSelfAssessment(selfAssessmentId); var model = new EnrolDelegateSupervisorRoleViewModel() { SupervisorDelegateDetail = supervisorDelegate, - RoleProfile = roleProfile, + CompetencyAssessment = competencyAssessment, SelfAssessmentSupervisorRoleId = null, SelfAssessmentSupervisorRoles = supervisorRoles }; @@ -1328,6 +1328,9 @@ public IActionResult ConfirmNominateSupervisor(SupervisorDelegateViewModel super { registrationService.PromoteDelegateToAdmin(adminRoles, supervisorDelegate.SelfAssessmentCategory, (int)supervisorDelegateDetail.DelegateUserID, (int)User.GetCentreId(), true); + int? learningCategory = supervisorDelegate.SelfAssessmentCategory == 0 ? null : supervisorDelegate.SelfAssessmentCategory; + var learningCategoryName = courseCategoriesService.GetCourseCategoryName(learningCategory); + if (delegateUser != null && adminUser != null) { var adminRolesEmail = emailGenerationService.GenerateDelegateAdminRolesNotificationEmail( @@ -1344,7 +1347,8 @@ public IActionResult ConfirmNominateSupervisor(SupervisorDelegateViewModel super isCmsAdmin: adminRoles.IsCmsAdministrator, isCmsManager: adminRoles.IsCmsManager, primaryEmail: delegateUser.EmailAddress, - centreName: centreName + centreName: centreName, + learningCategoryName ); emailService.SendEmail(adminRolesEmail); diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index 317eec01ad..57fa350f35 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -177,8 +177,10 @@ public IActionResult EditAdminRoles(AdminRolesFormData model, int adminId) adminRoles, AdminCategoryHelper.AdminCategoryToCategoryId(model.LearningCategory) ); + int? learningCategory = model.LearningCategory == 0 ? null : model.LearningCategory; + var learningCategoryName = courseCategoriesService.GetCourseCategoryName(learningCategory); - SendNotificationEmail(adminId, adminRoles); + SendNotificationEmail(adminId, adminRoles, learningCategoryName); return RedirectToAction( "Index", @@ -190,7 +192,8 @@ public IActionResult EditAdminRoles(AdminRolesFormData model, int adminId) private void SendNotificationEmail( int adminIdToPromote, - AdminRoles adminRoles + AdminRoles adminRoles, + string learningCategoryName ) { var adminId = User.GetAdminId(); @@ -215,7 +218,8 @@ AdminRoles adminRoles isCmsAdmin: adminRoles.IsCmsAdministrator, isCmsManager: adminRoles.IsCmsManager, primaryEmail: delegateUserEmailDetails.EmailAddress, - centreName: centreName + centreName: centreName, + learningCategoryName ); emailService.SendEmail(adminRolesEmail); diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/SelfAssessmentReports/SelfAssessmentReportsController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/SelfAssessmentReports/SelfAssessmentReportsController.cs index 7af1d2f4ca..0491429fd3 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/SelfAssessmentReports/SelfAssessmentReportsController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/SelfAssessmentReports/SelfAssessmentReportsController.cs @@ -8,11 +8,9 @@ using DigitalLearningSolutions.Web.Attributes; using DigitalLearningSolutions.Web.Models.Enums; using DigitalLearningSolutions.Data.Enums; - using System; using DigitalLearningSolutions.Data.Utilities; using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Reports; using DigitalLearningSolutions.Web.Helpers.ExternalApis; - using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using DigitalLearningSolutions.Data.Extensions; using DigitalLearningSolutions.Web.Services; @@ -75,8 +73,9 @@ public IActionResult DownloadDigitalCapabilityToExcel() public IActionResult DownloadSelfAssessmentReport(int selfAssessmentId) { var centreId = User.GetCentreId(); + var selfAssessmentName = selfAssessmentService.GetSelfAssessmentNameById(selfAssessmentId); var dataFile = selfAssessmentReportService.GetSelfAssessmentExcelExportForCentre((int)centreId, selfAssessmentId); - var fileName = $"Competency Self Assessment Report - Centre {centreId} - downloaded {DateTime.Today:yyyy-MM-dd}.xlsx"; + var fileName = $"{((selfAssessmentName.Length > 50) ? selfAssessmentName.Substring(0, 50) : selfAssessmentName)} Report - Centre {centreId} - downloaded {clockUtility.UtcNow:yyyy-MM-dd}.xlsx"; return File( dataFile, FileHelper.GetContentTypeFromFileName(fileName), diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs index 775e52ecdb..93eb9dc09e 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs @@ -365,7 +365,8 @@ public IActionResult SetCourseOptions(EditCourseOptionsFormData model) data!.CourseOptionsData = model.ToCourseOptionsTempData(); multiPageFormService.SetMultiPageFormData(data, MultiPageFormDataFeature.AddNewCourse, TempData); - return RedirectToAction("SetCourseContent", false); + bool editCourseContent = data?.EditCourseContent ?? false; + return RedirectToAction("SetCourseContent", editCourseContent); } [HttpGet("AddCourse/SetCourseContent")] @@ -381,7 +382,7 @@ public IActionResult SetCourseContent(bool editCourseContent) { return RedirectToAction("Summary"); } - data.EditCourseContent = editCourseContent; + data.EditCourseContent = data.EditCourseContent || editCourseContent; multiPageFormService.SetMultiPageFormData(data, MultiPageFormDataFeature.AddNewCourse, TempData); var model = data!.CourseContentData != null @@ -459,17 +460,15 @@ public IActionResult SetSectionContent(int sectionIndex) } var showDiagnostic = data.Application!.DiagAssess; - if (data.EditCourseContent) + var tutorial = GetTutorialsFromSectionContentData(data.SectionContentData, tutorials); + if (tutorial.Count() == 0) { - var tutorial = GetTutorialsFromSectionContentData(data.SectionContentData, tutorials); - var model = new SetSectionContentViewModel(section, sectionIndex, showDiagnostic, tutorial); - return View("AddNewCentreCourse/SetSectionContent", model); - } - else - { - var model = new SetSectionContentViewModel(section, sectionIndex, showDiagnostic, tutorials); - return View("AddNewCentreCourse/SetSectionContent", model); + var models = new SetSectionContentViewModel(section, sectionIndex, showDiagnostic, tutorials); + return View("AddNewCentreCourse/SetSectionContent", models); } + var model = new SetSectionContentViewModel(section, sectionIndex, showDiagnostic, tutorial); + return View("AddNewCentreCourse/SetSectionContent", model); + } @@ -500,6 +499,21 @@ string action public IActionResult Summary() { var data = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.AddNewCourse, TempData).GetAwaiter().GetResult(); + var updatedSections = new List(); + foreach (var item in data.CourseContentData.SelectedSectionIds) + { + var tutorialsForSection = tutorialService.GetTutorialsForSection(item).ToList(); + + var matchingSections = data.SectionContentData + .Where(section => section.Tutorials.Any(t => tutorialsForSection.Any(tf => tf.TutorialId == t.TutorialId))) + .ToList(); + + updatedSections.AddRange(matchingSections); + } + + updatedSections = updatedSections.Distinct().ToList(); + data.SectionContentData = updatedSections; + multiPageFormService.SetMultiPageFormData(data, MultiPageFormDataFeature.AddNewCourse, TempData); var model = new SummaryViewModel(data!); @@ -651,11 +665,23 @@ private IActionResult SaveSectionAndRedirect(SetSectionContentViewModel model) { data.SectionContentData = new List(); } - if (data.EditCourseContent) + var sectionsToRemove = new List(); + foreach (var section in data.SectionContentData) { - return RedirectToNextSectionOrSummary( - model.Index, - new SetCourseContentViewModel(data.CourseContentData!)); + section.Tutorials = section.Tutorials + .Where(t => !model.Tutorials.Any(newT => newT.TutorialId == t.TutorialId)) + .ToList(); + if (!section.Tutorials.Any()) + { + sectionsToRemove.Add(section); + } + } + if (sectionsToRemove.Count > 0) + { + foreach (var section in sectionsToRemove) + { + data.SectionContentData.Remove(section); + } } data!.SectionContentData!.Add( new SectionContentTempData( @@ -732,18 +758,19 @@ private static IEnumerable UpdateC private IEnumerable GetTutorialsFromSectionContentData(List sectionContentData, List sectionTutorial) { if (sectionContentData == null || sectionTutorial == null) return new List(); - var updatedRecords = sectionContentData - .SelectMany(data => data.Tutorials) - .Join(sectionTutorial, - tempData => new { tempData.TutorialId, tempData.TutorialName }, // Match on both TutorialId and TutorialName - index => new { index.TutorialId, index.TutorialName }, - (tempData, index) => new Tutorial + var updatedRecords = sectionTutorial + .GroupJoin( + sectionContentData.SelectMany(data => data.Tutorials), + tutorial => new { tutorial.TutorialId, tutorial.TutorialName }, + tempData => new { tempData.TutorialId, tempData.TutorialName }, + (tutorial, matchingTempData) => new Tutorial { - TutorialId = index.TutorialId, - TutorialName = index.TutorialName, - Status = tempData.LearningEnabled, // Updated from sectionContentData - DiagStatus = tempData.DiagnosticEnabled // Updated from sectionContentData - }) + TutorialId = tutorial.TutorialId, + TutorialName = tutorial.TutorialName, + Status = matchingTempData.Any() ? matchingTempData.First().LearningEnabled : tutorial.Status, + DiagStatus = matchingTempData.Any() ? matchingTempData.First().DiagnosticEnabled : tutorial.DiagStatus + } + ) .ToList(); return updatedRecords; diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/PromoteToAdminController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/PromoteToAdminController.cs index c579516102..21d02d0ef5 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/PromoteToAdminController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/PromoteToAdminController.cs @@ -139,6 +139,9 @@ public IActionResult Index(AdminRolesFormData formData, int delegateId) var delegateUserEmailDetails = userService.GetDelegateById(delegateId); + int? learningCategory = formData.LearningCategory == 0 ? null : formData.LearningCategory; + var learningCategoryName = courseCategoriesService.GetCourseCategoryName(learningCategory); + if (delegateUserEmailDetails != null) { var adminRolesEmail = emailGenerationService.GenerateDelegateAdminRolesNotificationEmail( @@ -155,7 +158,8 @@ public IActionResult Index(AdminRolesFormData formData, int delegateId) isCmsAdmin: adminRoles.IsCmsAdministrator, isCmsManager: adminRoles.IsCmsManager, primaryEmail: delegateUserEmailDetails.EmailForCentreNotifications, - centreName: centreName + centreName: centreName, + categoryName: learningCategoryName ); emailService.SendEmail(adminRolesEmail); diff --git a/DigitalLearningSolutions.Web/Helpers/SearchHelper.cs b/DigitalLearningSolutions.Web/Helpers/SearchHelper.cs index 381be134dd..9b3dc5acf8 100644 --- a/DigitalLearningSolutions.Web/Helpers/SearchHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/SearchHelper.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using DigitalLearningSolutions.Data.Helpers; - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using FuzzySharp; using FuzzySharp.SimilarityRatio; using FuzzySharp.SimilarityRatio.Scorer.StrategySensitive; @@ -29,8 +29,8 @@ public static class SearchHelper "profile", "job", "role", }; - public static IEnumerable FilterRoleProfiles( - IEnumerable roleProfiles, + public static IEnumerable FilterCompetencyAssessments( + IEnumerable competencyAssessments, string? searchString, int minMatchScore, bool stripStopWords @@ -38,7 +38,7 @@ bool stripStopWords { if (searchString == null) { - return roleProfiles; + return competencyAssessments; } if (stripStopWords) @@ -46,16 +46,16 @@ bool stripStopWords searchString = CleanSearchedWords(searchString); } - var query = new RoleProfile + var query = new CompetencyAssessment { - RoleProfileName = searchString.ToLower(), + CompetencyAssessmentName = searchString.ToLower(), }; if (stripStopWords) { var results = Process.ExtractSorted( query, - roleProfiles, - roleProfile => roleProfile.RoleProfileName.ToLower(), + competencyAssessments, + competencyAssessment => competencyAssessment.CompetencyAssessmentName.ToLower(), ScorerCache.Get(), minMatchScore ); @@ -65,8 +65,8 @@ bool stripStopWords { var results = Process.ExtractSorted( query, - roleProfiles, - roleProfile => roleProfile.RoleProfileName.ToLower(), + competencyAssessments, + competencyAssessment => competencyAssessment.CompetencyAssessmentName.ToLower(), ScorerCache.Get(), minMatchScore ); diff --git a/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs b/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs index e630a9ea9b..2a4cd083b8 100644 --- a/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; using System.Linq; using DigitalLearningSolutions.Data.Helpers; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using DigitalLearningSolutions.Web.ViewModels.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments; /// /// This is the older version of the SortingHelper. For future search/sort implementations we should @@ -13,36 +13,36 @@ /// public static class SortingHelper { - public static IEnumerable SortRoleProfileItems( - IEnumerable roleProfiles, + public static IEnumerable SortCompetencyAssessmentItems( + IEnumerable competencyAssessments, string sortBy, string sortDirection ) { return sortBy switch { - RoleProfileSortByOptionTexts.RoleProfileName => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.RoleProfileName) - : roleProfiles.OrderBy(roleProfile => roleProfile.RoleProfileName), - RoleProfileSortByOptionTexts.RoleProfileOwner => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Owner) - : roleProfiles.OrderBy(roleProfile => roleProfile.Owner), - RoleProfileSortByOptionTexts.RoleProfileCreatedDate => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.CreatedDate) - : roleProfiles.OrderBy(roleProfile => roleProfile.CreatedDate), - RoleProfileSortByOptionTexts.RoleProfilePublishStatus => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.PublishStatusID) - : roleProfiles.OrderBy(roleProfile => roleProfile.PublishStatusID), - RoleProfileSortByOptionTexts.RoleProfileBrand => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Brand) - : roleProfiles.OrderBy(roleProfile => roleProfile.Brand), - RoleProfileSortByOptionTexts.RoleProfileNationalRoleProfile => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPRole) - : roleProfiles.OrderBy(roleProfile => roleProfile.NRPRole), - RoleProfileSortByOptionTexts.RoleProfileNationalRoleGroup => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPProfessionalGroup) - : roleProfiles.OrderBy(roleProfile => roleProfile.NRPProfessionalGroup), - _ => roleProfiles + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentName => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.CompetencyAssessmentName) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.CompetencyAssessmentName), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentOwner => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.Owner) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.Owner), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentCreatedDate => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.CreatedDate) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.CreatedDate), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentPublishStatus => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.PublishStatusID) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.PublishStatusID), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentBrand => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.Brand) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.Brand), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentNationalCompetencyAssessment => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.NRPRole) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.NRPRole), + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentNationalRoleGroup => sortDirection == BaseCompetencyAssessmentsPageViewModel.DescendingText + ? competencyAssessments.OrderByDescending(competencyAssessment => competencyAssessment.NRPProfessionalGroup) + : competencyAssessments.OrderBy(competencyAssessment => competencyAssessment.NRPProfessionalGroup), + _ => competencyAssessments }; } } diff --git a/DigitalLearningSolutions.Web/Models/Enums/CompetencyAssessmentsTab.cs b/DigitalLearningSolutions.Web/Models/Enums/CompetencyAssessmentsTab.cs new file mode 100644 index 0000000000..c77a640c7e --- /dev/null +++ b/DigitalLearningSolutions.Web/Models/Enums/CompetencyAssessmentsTab.cs @@ -0,0 +1,39 @@ +namespace DigitalLearningSolutions.Web.Models.Enums +{ + using System.Collections.Generic; + + public class CompetencyAssessmentsTab : BaseTabEnumeration + { + public static CompetencyAssessmentsTab MyCompetencyAssessments = new CompetencyAssessmentsTab( + 1, + nameof(MyCompetencyAssessments), + "CompetencyAssessments", + "ViewCompetencyAssessments", + "My Competency Assessments", + new Dictionary { { "tabName", "Mine" } } + ); + + public static CompetencyAssessmentsTab AllCompetencyAssessments = new CompetencyAssessmentsTab( + 2, + nameof(AllCompetencyAssessments), + "CompetencyAssessments", + "ViewCompetencyAssessments", + "All Competency Assessments", + new Dictionary { { "tabName", "All" } } + ); + + private CompetencyAssessmentsTab( + int id, + string name, + string controller, + string action, + string linkText, + Dictionary staticRouteData + ) : base(id, name, controller, action, linkText, staticRouteData) { } + + public override IEnumerable GetAllTabs() + { + return GetAll(); + } + } +} diff --git a/DigitalLearningSolutions.Web/Models/Enums/RoleProfilesTab.cs b/DigitalLearningSolutions.Web/Models/Enums/RoleProfilesTab.cs deleted file mode 100644 index 3d599ce5d0..0000000000 --- a/DigitalLearningSolutions.Web/Models/Enums/RoleProfilesTab.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace DigitalLearningSolutions.Web.Models.Enums -{ - using System.Collections.Generic; - - public class RoleProfilesTab : BaseTabEnumeration - { - public static RoleProfilesTab MyRoleProfiles = new RoleProfilesTab( - 1, - nameof(MyRoleProfiles), - "RoleProfiles", - "ViewRoleProfiles", - "My Role Profiles", - new Dictionary { { "tabName", "Mine" } } - ); - - public static RoleProfilesTab AllRoleProfiles = new RoleProfilesTab( - 2, - nameof(AllRoleProfiles), - "RoleProfiles", - "ViewRoleProfiles", - "All Role Profiles", - new Dictionary { { "tabName", "All" } } - ); - - private RoleProfilesTab( - int id, - string name, - string controller, - string action, - string linkText, - Dictionary staticRouteData - ) : base(id, name, controller, action, linkText, staticRouteData) { } - - public override IEnumerable GetAllTabs() - { - return GetAll(); - } - } -} diff --git a/DigitalLearningSolutions.Web/ServiceFilter/RedirectToErrorEmptySessionData.cs b/DigitalLearningSolutions.Web/ServiceFilter/RedirectToErrorEmptySessionData.cs index 1a50a20ae6..ef5a5e36a0 100644 --- a/DigitalLearningSolutions.Web/ServiceFilter/RedirectToErrorEmptySessionData.cs +++ b/DigitalLearningSolutions.Web/ServiceFilter/RedirectToErrorEmptySessionData.cs @@ -34,7 +34,7 @@ public void OnActionExecuting(ActionExecutingContext context) return; } - if (context.ActionArguments.ContainsKey("actionname") && context.ActionArguments["actionname"].ToString() == "Edit") + if (context.ActionArguments.ContainsKey("actionName") && context.ActionArguments["actionName"].ToString() == "Edit") { return; } diff --git a/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs b/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs new file mode 100644 index 0000000000..7e8cf37fdb --- /dev/null +++ b/DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs @@ -0,0 +1,153 @@ +using DigitalLearningSolutions.Data.DataServices; +using DigitalLearningSolutions.Data.Models.Common; +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace DigitalLearningSolutions.Web.Services +{ + public interface ICompetencyAssessmentService + { + //GET DATA + IEnumerable GetAllCompetencyAssessments(int adminId); + + IEnumerable GetCompetencyAssessmentsForAdminId(int adminId); + + CompetencyAssessmentBase? GetCompetencyAssessmentBaseById(int competencyAssessmentId, int adminId); + + CompetencyAssessmentBase? GetCompetencyAssessmentBaseByName(string competencyAssessmentName, int adminId); + CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId); + + IEnumerable GetNRPProfessionalGroups(); + IEnumerable GetNRPSubGroups(int? nRPProfessionalGroupID); + IEnumerable GetNRPRoles(int? nRPSubGroupID); + + CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId); + + //UPDATE DATA + bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName); + bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId); + bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus); + bool UpdateCompetencyAssessmentDescription(int assessmentId, int adminId, string description); + bool UpdateCompetencyAssessmentBranding(int assessmentId, int adminId, int brandID, int categoryID); + bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus); + bool UpdateCompetencyAssessmentVocabulary(int assessmentId, int adminId, string vocabulary); + bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus); + bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus); + + //INSERT DATA + int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId); + } + public class CompetencyAssessmentService : ICompetencyAssessmentService + { + private readonly ICompetencyAssessmentDataService competencyAssessmentDataService; + private readonly IFrameworkDataService frameworkDataService; + public CompetencyAssessmentService(ICompetencyAssessmentDataService competencyAssessmentDataService, IFrameworkDataService frameworkDataService) + { + this.competencyAssessmentDataService = competencyAssessmentDataService; + this.frameworkDataService = frameworkDataService; + } + public IEnumerable GetAllCompetencyAssessments(int adminId) + { + return competencyAssessmentDataService.GetAllCompetencyAssessments(adminId); + } + + public IEnumerable GetNRPProfessionalGroups() + { + return competencyAssessmentDataService.GetNRPProfessionalGroups(); + } + + public CompetencyAssessmentBase? GetCompetencyAssessmentBaseById(int competencyAssessmentId, int adminId) + { + return competencyAssessmentDataService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId); + } + + public CompetencyAssessmentBase? GetCompetencyAssessmentBaseByName(string competencyAssessmentName, int adminId) + { + return competencyAssessmentDataService.GetCompetencyAssessmentBaseByName(competencyAssessmentName, adminId); + } + + public IEnumerable GetCompetencyAssessmentsForAdminId(int adminId) + { + return competencyAssessmentDataService.GetCompetencyAssessmentsForAdminId(adminId); + } + public int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId) + { + var assessmentId = competencyAssessmentDataService.InsertCompetencyAssessment(adminId, centreId, competencyAssessmentName); + if (assessmentId > 0 && frameworkId != null) + { + var framework = frameworkDataService.GetBrandedFrameworkByFrameworkId((int)frameworkId, adminId); + if (framework != null) + { + 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; + } + + public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName) + { + return competencyAssessmentDataService.UpdateCompetencyAssessmentName(competencyAssessmentId, adminId, competencyAssessmentName); + } + + public bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId) + { + return competencyAssessmentDataService.UpdateCompetencyRoleProfileLinks(competencyAssessmentId, adminId, professionalGroupId, subGroupId, roleId); + } + public CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId) + { + return competencyAssessmentDataService.GetOrInsertAndReturnAssessmentTaskStatus(assessmentId, (frameworkId != null)); + } + public bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string description) + { + return competencyAssessmentDataService.UpdateCompetencyAssessmentDescription(competencyAssessmentId, adminId, description); + } + public bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus) + { + return competencyAssessmentDataService.UpdateIntroductoryTextTaskStatus(assessmentId, taskStatus); + } + + public CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId) + { + return competencyAssessmentDataService.GetCompetencyAssessmentById(competencyAssessmentId, adminId); + } + + public bool UpdateCompetencyAssessmentBranding(int assessmentId, int adminId, int brandID, int categoryID) + { + return competencyAssessmentDataService.UpdateCompetencyAssessmentBranding(assessmentId, adminId, brandID, categoryID); + } + + public bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus) + { + return competencyAssessmentDataService.UpdateBrandingTaskStatus(assessmentId, taskStatus); + } + + bool ICompetencyAssessmentService.UpdateCompetencyAssessmentVocabulary(int assessmentId, int adminId, string vocabulary) + { + return competencyAssessmentDataService.UpdateCompetencyAssessmentVocabulary(assessmentId, adminId, vocabulary); + } + + bool ICompetencyAssessmentService.UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus) + { + return competencyAssessmentDataService.UpdateVocabularyTaskStatus(assessmentId, taskStatus); + } + + public IEnumerable GetNRPSubGroups(int? nRPProfessionalGroupID) + { + return competencyAssessmentDataService.GetNRPSubGroups(nRPProfessionalGroupID); + } + + public IEnumerable GetNRPRoles(int? nRPSubGroupID) + { + return competencyAssessmentDataService.GetNRPRoles(nRPSubGroupID); + } + + public bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus) + { + return competencyAssessmentDataService.UpdateRoleProfileLinksTaskStatus(assessmentId, taskStatus); + } + } +} diff --git a/DigitalLearningSolutions.Web/Services/CourseCategoriesService.cs b/DigitalLearningSolutions.Web/Services/CourseCategoriesService.cs index fc136f598e..9b475e9286 100644 --- a/DigitalLearningSolutions.Web/Services/CourseCategoriesService.cs +++ b/DigitalLearningSolutions.Web/Services/CourseCategoriesService.cs @@ -7,7 +7,7 @@ namespace DigitalLearningSolutions.Web.Services public interface ICourseCategoriesService { IEnumerable GetCategoriesForCentreAndCentrallyManagedCourses(int centreId); - string? GetCourseCategoryName(int categoryId); + string? GetCourseCategoryName(int? categoryId); } public class CourseCategoriesService : ICourseCategoriesService { @@ -22,7 +22,7 @@ public IEnumerable GetCategoriesForCentreAndCentrallyManagedCourses(in return courseCategoriesDataService.GetCategoriesForCentreAndCentrallyManagedCourses(centreId); } - public string? GetCourseCategoryName(int categoryId) + public string? GetCourseCategoryName(int? categoryId) { return courseCategoriesDataService.GetCourseCategoryName(categoryId); } diff --git a/DigitalLearningSolutions.Web/Services/EmailGenerationService.cs b/DigitalLearningSolutions.Web/Services/EmailGenerationService.cs index b631d48adc..ff7a924f82 100644 --- a/DigitalLearningSolutions.Web/Services/EmailGenerationService.cs +++ b/DigitalLearningSolutions.Web/Services/EmailGenerationService.cs @@ -19,7 +19,8 @@ Email GenerateDelegateAdminRolesNotificationEmail( bool isCmsAdmin, bool isCmsManager, string primaryEmail, - string centreName + string centreName, + string categoryName ); } @@ -39,7 +40,8 @@ public Email GenerateDelegateAdminRolesNotificationEmail( bool isCmsAdmin, bool isCmsManager, string primaryEmail, - string centreName + string centreName, + string categoryName ) { const string emailSubjectLine = "New Digital Learning Solutions permissions granted"; @@ -101,6 +103,13 @@ string centreName builder.HtmlBody += ""; + if (!string.IsNullOrEmpty(categoryName)) + { + builder.TextBody += $@"In the {categoryName} category."; + builder.HtmlBody += $@" +

    In the {categoryName} category.

    "; + } + builder.TextBody += $@"You will be able to access the Digital Learning Solutions platform with these new access permissions the next time you log in to {centreName}."; builder.HtmlBody += $@"You will be able to access the Digital Learning Solutions platform with these new access permissions the next time you log in to {centreName}."; diff --git a/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs b/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs index 092f38c15d..d0cfdb0a0f 100644 --- a/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs +++ b/DigitalLearningSolutions.Web/Services/FrameworkNotificationService.cs @@ -34,7 +34,7 @@ public class FrameworkNotificationService : IFrameworkNotificationService private readonly IConfigDataService configDataService; private readonly IEmailService emailService; private readonly IFrameworkService frameworkService; - private readonly IRoleProfileService roleProfileService; + private readonly ICompetencyAssessmentService competencyAssessmentService; private readonly ISupervisorService supervisorService; private readonly ISelfAssessmentDataService selfAssessmentDataService; private readonly ICentresDataService centresDataService; @@ -42,7 +42,7 @@ public FrameworkNotificationService( IFrameworkService frameworkService, IConfigDataService configDataService, IEmailService emailService, - IRoleProfileService roleProfileService, + ICompetencyAssessmentService competencyAssessmentService, ISupervisorService supervisorService, ISelfAssessmentDataService selfAssessmentDataService, ICentresDataService centresDataService @@ -51,7 +51,7 @@ ICentresDataService centresDataService this.frameworkService = frameworkService; this.configDataService = configDataService; this.emailService = emailService; - this.roleProfileService = roleProfileService; + this.competencyAssessmentService = competencyAssessmentService; this.supervisorService = supervisorService; this.selfAssessmentDataService = selfAssessmentDataService; this.centresDataService = centresDataService; @@ -221,8 +221,8 @@ public void SendSupervisorDelegateInvite(int supervisorDelegateId, int adminId, builder.TextBody = $@"Dear colleague, You have been invited to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}) ({centreName}). To register, visit {dlsUrlBuilder.Uri.ToString()}. - Registering using this link will confirm your acceptance of the invite. Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results."; - builder.HtmlBody = $@"

    Dear colleague,

    You have been invited to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({centreName}).

    Click here to register and confirm your acceptance of the invite.

    Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.

    "; + Registering using this link will confirm your acceptance of the invite. Your supervisor will then be able to assign competency assessments and view and validate your self assessment results."; + builder.HtmlBody = $@"

    Dear colleague,

    You have been invited to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({centreName}).

    Click here to register and confirm your acceptance of the invite.

    Your supervisor will then be able to assign competency assessments and view and validate your self assessment results.

    "; emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail)); } } @@ -240,7 +240,7 @@ public void SendSupervisorDelegateConfirmed(int supervisorDelegateId, int adminI You are already registered as a delegate at the supervisor's DLS centre so they can now assign competency self assessments and view and validate your self assessment results. If this looks like a mistake, please contact {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}) ({centreName}) directly to correct."; - builder.HtmlBody = $@"

    Dear {supervisorDelegate.FirstName}

    {supervisorDelegate.SupervisorName} ({centreName}) has accepted your request to be your supervisor for profile asessment activities in the NHS England, Digital Learning Solutions platform.

    Click here to access your role profile assessments.

    "; + builder.HtmlBody = $@"

    Dear {supervisorDelegate.FirstName}

    {supervisorDelegate.SupervisorName} ({centreName}) has accepted your request to be your supervisor for profile asessment activities in the NHS England, Digital Learning Solutions platform.

    Click here to access your competency assessments.

    "; string toEmail = (@adminId == 0 ? supervisorDelegate.DelegateEmail : supervisorDelegate.SupervisorEmail); emailService.SendEmail(new Email(emailSubjectLine, builder, toEmail)); } @@ -410,8 +410,8 @@ public void SendSupervisorDelegateReminder(int supervisorDelegateId, int adminId builder.TextBody = $@"Dear colleague, This is a reminder to to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}) ({centreName}). To register, visit {dlsUrlBuilder.Uri.ToString()}. - Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results."; - builder.HtmlBody = $@"

    Dear colleague,

    This is a reminder to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({centreName}).

    Click here to register.

    Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.

    "; + Your supervisor will then be able to assign competency assessments and view and validate your self assessment results."; + builder.HtmlBody = $@"

    Dear colleague,

    This is a reminder to register to access the NHS England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({centreName}).

    Click here to register.

    Your supervisor will then be able to assign competency assessments and view and validate your self assessment results.

    "; emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail)); } } diff --git a/DigitalLearningSolutions.Web/Services/FrameworkService.cs b/DigitalLearningSolutions.Web/Services/FrameworkService.cs index 78510692db..74bbde1d0f 100644 --- a/DigitalLearningSolutions.Web/Services/FrameworkService.cs +++ b/DigitalLearningSolutions.Web/Services/FrameworkService.cs @@ -674,7 +674,7 @@ public int UpdateCompetencyFlags(int frameworkId, int competencyId, int[] select } public void UpdateFrameworkCompetency(int frameworkCompetencyId, string name, string? description, int adminId, bool? alwaysShowDescription) - { + { frameworkDataService.UpdateFrameworkCompetency(frameworkCompetencyId, name, description, adminId, alwaysShowDescription); } diff --git a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs index 02b8affac1..45828f985f 100644 --- a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs +++ b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs @@ -135,7 +135,7 @@ internal ImportCompetenciesResult ProcessCompetenciesTable(IXLTable table, int a var existingGroups = frameworkService.GetFrameworkCompetencyGroups(frameworkId).Select(row => new { row.ID, row.Name }) .Distinct() .ToList(); - var placesToMove = Math.Abs(existingGroups.FindIndex(group => group.Name == distinctCompetencyGroups[i])-i); + var placesToMove = Math.Abs(existingGroups.FindIndex(group => group.Name == distinctCompetencyGroups[i]) - i); if (placesToMove > 0) { var thisGroup = existingGroups.FirstOrDefault(group => group.Name == distinctCompetencyGroups[i]); @@ -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); @@ -295,7 +295,7 @@ CompetencyTableRow competencyRow } } - + return maxFrameworkCompetencyGroupId; } diff --git a/DigitalLearningSolutions.Web/Services/RoleProfileService.cs b/DigitalLearningSolutions.Web/Services/RoleProfileService.cs deleted file mode 100644 index 7983b2afa4..0000000000 --- a/DigitalLearningSolutions.Web/Services/RoleProfileService.cs +++ /dev/null @@ -1,68 +0,0 @@ -using DigitalLearningSolutions.Data.DataServices; -using DigitalLearningSolutions.Data.Models.RoleProfiles; -using System.Collections.Generic; - -namespace DigitalLearningSolutions.Web.Services -{ - public interface IRoleProfileService - { - //GET DATA - IEnumerable GetAllRoleProfiles(int adminId); - - IEnumerable GetRoleProfilesForAdminId(int adminId); - - RoleProfileBase? GetRoleProfileBaseById(int roleProfileId, int adminId); - - RoleProfileBase? GetRoleProfileByName(string roleProfileName, int adminId); - - IEnumerable GetNRPProfessionalGroups(); - - //UPDATE DATA - bool UpdateRoleProfileName(int roleProfileId, int adminId, string roleProfileName); - - bool UpdateRoleProfileProfessionalGroup(int roleProfileId, int adminId, int? nrpProfessionalGroupID); - - } - public class RoleProfileService : IRoleProfileService - { - private readonly IRoleProfileDataService roleProfileDataService; - public RoleProfileService(IRoleProfileDataService roleProfileDataService) - { - this.roleProfileDataService = roleProfileDataService; - } - public IEnumerable GetAllRoleProfiles(int adminId) - { - return roleProfileDataService.GetAllRoleProfiles(adminId); - } - - public IEnumerable GetNRPProfessionalGroups() - { - return roleProfileDataService.GetNRPProfessionalGroups(); - } - - public RoleProfileBase? GetRoleProfileBaseById(int roleProfileId, int adminId) - { - return roleProfileDataService.GetRoleProfileBaseById(roleProfileId, adminId); - } - - public RoleProfileBase? GetRoleProfileByName(string roleProfileName, int adminId) - { - return roleProfileDataService.GetRoleProfileByName(roleProfileName, adminId); - } - - public IEnumerable GetRoleProfilesForAdminId(int adminId) - { - return roleProfileDataService.GetRoleProfilesForAdminId(adminId); - } - - public bool UpdateRoleProfileName(int roleProfileId, int adminId, string roleProfileName) - { - return roleProfileDataService.UpdateRoleProfileName(roleProfileId, adminId, roleProfileName); - } - - public bool UpdateRoleProfileProfessionalGroup(int roleProfileId, int adminId, int? nrpProfessionalGroupID) - { - return roleProfileDataService.UpdateRoleProfileProfessionalGroup(roleProfileId, adminId, nrpProfessionalGroupID); - } - } -} diff --git a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs index ce7afea305..c9a50014fa 100644 --- a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs +++ b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs @@ -27,6 +27,7 @@ public interface ISelfAssessmentService void UpdateLastAccessed(int selfAssessmentId, int delegateUserId); void RemoveSignoffRequests(int selfAssessmentId, int delegateUserId, int competencyGroupsId); + void RemoveSignoffRequestById(int candidateAssessmentSupervisorVerificationsId); void IncrementLaunchCount(int selfAssessmentId, int delegateUserId); void SetCompleteByDate(int selfAssessmentId, int delegateUserId, DateTime? completeByDate); @@ -160,7 +161,7 @@ public IEnumerable GetSelfAssessmentResultswithSupervisorV int selfAssessmentId, int competencyId ); - void RemoveReviewCandidateAssessmentOptionalCompetencies(int id); + void RemoveReviewCandidateAssessmentOptionalCompetencies(int id); } public class SelfAssessmentService : ISelfAssessmentService @@ -201,6 +202,10 @@ public void RemoveSignoffRequests(int selfAssessmentId, int delegateUserId, int { selfAssessmentDataService.RemoveSignoffRequests(selfAssessmentId, delegateUserId, competencyGroupId); } + public void RemoveSignoffRequestById(int candidateAssessmentSupervisorVerificationsId) + { + selfAssessmentDataService.RemoveSignoffRequestById(candidateAssessmentSupervisorVerificationsId); + } public void IncrementLaunchCount(int selfAssessmentId, int delegateUserId) { selfAssessmentDataService.IncrementLaunchCount(selfAssessmentId, delegateUserId); @@ -467,10 +472,10 @@ public void RemoveEnrolment(int selfAssessmentId, int delegateUserId) var selfAssessmentCategoryId = selfAssessmentDataService.GetSelfAssessmentCategoryId((int)selfAssessmentId); - if (adminCategoryId > 0 && adminCategoryId != selfAssessmentCategoryId) + if (adminCategoryId > 0 && adminCategoryId != selfAssessmentCategoryId) { // return null variants of the object when the categoryID mismatches - return (new SelfAssessmentDelegatesData(), null); + return (new SelfAssessmentDelegatesData(), null); } (var delegateselfAssessments, int resultCount) = selfAssessmentDataService.GetSelfAssessmentDelegates(searchString, offSet, itemsPerPage, sortBy, sortDirection, @@ -603,7 +608,7 @@ int competencyId } public void RemoveReviewCandidateAssessmentOptionalCompetencies(int id) { - selfAssessmentDataService.RemoveReviewCandidateAssessmentOptionalCompetencies(id); + selfAssessmentDataService.RemoveReviewCandidateAssessmentOptionalCompetencies(id); } } } diff --git a/DigitalLearningSolutions.Web/Services/SupervisorService.cs b/DigitalLearningSolutions.Web/Services/SupervisorService.cs index 8cd8d2e16e..5a6dd5685f 100644 --- a/DigitalLearningSolutions.Web/Services/SupervisorService.cs +++ b/DigitalLearningSolutions.Web/Services/SupervisorService.cs @@ -1,5 +1,5 @@ using DigitalLearningSolutions.Data.DataServices; -using DigitalLearningSolutions.Data.Models.RoleProfiles; +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.SelfAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using System; @@ -20,8 +20,8 @@ public interface ISupervisorService IEnumerable GetSupervisorDashboardToDoItemsForRequestedSignOffs(int adminId); IEnumerable GetSupervisorDashboardToDoItemsForRequestedReviews(int adminId); DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId, int? adminIdCategoryId); - IEnumerable GetAvailableRoleProfilesForDelegate(int candidateId, int centreId, int? categoryId); - RoleProfile? GetRoleProfileById(int selfAssessmentId); + IEnumerable GetAvailableCompetencyAssessmentsForDelegate(int candidateId, int centreId, int? categoryId); + CompetencyAssessment? GetCompetencyAssessmentById(int selfAssessmentId); IEnumerable GetSupervisorRolesForSelfAssessment(int selfAssessmentId); IEnumerable GetSupervisorRolesBySelfAssessmentIdForSupervisor(int selfAssessmentId); IEnumerable GetDelegateNominatableSupervisorRolesForSelfAssessment(int selfAssessmentId); @@ -80,9 +80,9 @@ public int EnrolDelegateOnAssessment(int delegateUserId, int supervisorDelegateI return supervisorDataService.EnrolDelegateOnAssessment(delegateUserId, supervisorDelegateId, selfAssessmentId, completeByDate, selfAssessmentSupervisorRoleId, adminId, centreId, isLoggedInUser); } - public IEnumerable GetAvailableRoleProfilesForDelegate(int candidateId, int centreId, int? categoryId) + public IEnumerable GetAvailableCompetencyAssessmentsForDelegate(int candidateId, int centreId, int? categoryId) { - return supervisorDataService.GetAvailableRoleProfilesForDelegate(candidateId, centreId, categoryId); + return supervisorDataService.GetAvailableCompetencyAssessmentsForDelegate(candidateId, centreId, categoryId); } public CandidateAssessmentSupervisor? GetCandidateAssessmentSupervisor(int candidateAssessmentID, int supervisorDelegateId, int selfAssessmentSupervisorRoleId) @@ -110,9 +110,9 @@ public IEnumerable GetDelegateNominatableSuperviso return supervisorDataService.GetDelegateNominatableSupervisorRolesForSelfAssessment(selfAssessmentId); } - public RoleProfile? GetRoleProfileById(int selfAssessmentId) + public CompetencyAssessment? GetCompetencyAssessmentById(int selfAssessmentId) { - return supervisorDataService.GetRoleProfileById(selfAssessmentId); + return supervisorDataService.GetCompetencyAssessmentById(selfAssessmentId); } public DelegateSelfAssessment? GetSelfAssessmentBaseByCandidateAssessmentId(int candidateAssessmentId, int? adminIdCategoryId) diff --git a/DigitalLearningSolutions.Web/Startup.cs b/DigitalLearningSolutions.Web/Startup.cs index bdc34b4d79..9443817b2d 100644 --- a/DigitalLearningSolutions.Web/Startup.cs +++ b/DigitalLearningSolutions.Web/Startup.cs @@ -434,7 +434,7 @@ private static void RegisterServices(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -507,7 +507,7 @@ private static void RegisterDataServices(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/AllCompetencyAssessmentsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/AllCompetencyAssessmentsViewModel.cs new file mode 100644 index 0000000000..a858706127 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/AllCompetencyAssessmentsViewModel.cs @@ -0,0 +1,42 @@ +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + using System.Collections.Generic; + using System.Linq; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using DigitalLearningSolutions.Web.Helpers; + using Microsoft.AspNetCore.Mvc.Rendering; + public class AllCompetencyAssessmentsViewModel : BaseCompetencyAssessmentsPageViewModel + { + public readonly IEnumerable CompetencyAssessments; + public readonly bool IsWorkforceManager; + public override SelectList CompetencyAssessmentSortByOptions { get; } = new SelectList(new[] + { + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentName, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentOwner, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentCreatedDate, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentPublishStatus, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentBrand, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentNationalRoleGroup, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentNationalCompetencyAssessment + }); + public AllCompetencyAssessmentsViewModel( + IEnumerable competencyAssessments, + string? searchString, + string sortBy, + string sortDirection, + int page + ) : base(searchString, sortBy, sortDirection, page) + { + var sortedItems = SortingHelper.SortCompetencyAssessmentItems( + competencyAssessments, + sortBy, + sortDirection + ); + var filteredItems = SearchHelper.FilterCompetencyAssessments(sortedItems, SearchString, 60, false).ToList(); + MatchingSearchResults = filteredItems.Count; + SetTotalPages(); + CompetencyAssessments = PaginateItems(filteredItems).Cast(); + } + } +} + diff --git a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/BaseRoleProfileViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/BaseCompetencyAssessmentsPageViewModel.cs similarity index 61% rename from DigitalLearningSolutions.Web/ViewModels/RoleProfiles/BaseRoleProfileViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/BaseCompetencyAssessmentsPageViewModel.cs index 0b5fa8d753..01a65ba1ca 100644 --- a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/BaseRoleProfileViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/BaseCompetencyAssessmentsPageViewModel.cs @@ -1,71 +1,71 @@ -namespace DigitalLearningSolutions.Web.ViewModels.RoleProfiles -{ - using System; - using System.Collections.Generic; - using System.Linq; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using Microsoft.AspNetCore.Mvc; - using Microsoft.AspNetCore.Mvc.Rendering; - - public abstract class BaseRoleProfilesPageViewModel - { - [BindProperty] public string SortDirection { get; set; } - [BindProperty] public string SortBy { get; set; } - public int Page { get; protected set; } - public int TotalPages { get; protected set; } - public int MatchingSearchResults; - public abstract SelectList RoleProfileSortByOptions { get; } - - public const string DescendingText = "Descending"; - public const string AscendingText = "Ascending"; - - private const int ItemsPerPage = 12; - - public readonly string? SearchString; - - protected BaseRoleProfilesPageViewModel( - string? searchString, - string sortBy, - string sortDirection, - int page - ) - { - SortBy = sortBy; - SortDirection = sortDirection; - SearchString = searchString; - Page = page; - } - protected IEnumerable PaginateItems(IList items) - { - if (items.Count > ItemsPerPage) - { - items = items.Skip(OffsetFromPageNumber(Page)).Take(ItemsPerPage).ToList(); - } - - return items; - } - protected void SetTotalPages() - { - TotalPages = (int)Math.Ceiling(MatchingSearchResults / (double)ItemsPerPage); - if (Page < 1 || Page > TotalPages) - { - Page = 1; - } - } - - private int OffsetFromPageNumber(int pageNumber) => - (pageNumber - 1) * ItemsPerPage; - } - - public static class RoleProfileSortByOptionTexts - { - public const string - RoleProfileName = "Profile Name", - RoleProfileOwner = "Owner", - RoleProfileCreatedDate = "Created Date", - RoleProfilePublishStatus = "Publish Status", - RoleProfileBrand = "Brand", - RoleProfileNationalRoleGroup = "National Job Group", - RoleProfileNationalRoleProfile = "National Job Profile"; - } -} +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + using System; + using System.Collections.Generic; + using System.Linq; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using Microsoft.AspNetCore.Mvc; + using Microsoft.AspNetCore.Mvc.Rendering; + + public abstract class BaseCompetencyAssessmentsPageViewModel + { + [BindProperty] public string SortDirection { get; set; } + [BindProperty] public string SortBy { get; set; } + public int Page { get; protected set; } + public int TotalPages { get; protected set; } + public int MatchingSearchResults; + public abstract SelectList CompetencyAssessmentSortByOptions { get; } + + public const string DescendingText = "Descending"; + public const string AscendingText = "Ascending"; + + private const int ItemsPerPage = 12; + + public readonly string? SearchString; + + protected BaseCompetencyAssessmentsPageViewModel( + string? searchString, + string sortBy, + string sortDirection, + int page + ) + { + SortBy = sortBy; + SortDirection = sortDirection; + SearchString = searchString; + Page = page; + } + protected IEnumerable PaginateItems(IList items) + { + if (items.Count > ItemsPerPage) + { + items = items.Skip(OffsetFromPageNumber(Page)).Take(ItemsPerPage).ToList(); + } + + return items; + } + protected void SetTotalPages() + { + TotalPages = (int)Math.Ceiling(MatchingSearchResults / (double)ItemsPerPage); + if (Page < 1 || Page > TotalPages) + { + Page = 1; + } + } + + private int OffsetFromPageNumber(int pageNumber) => + (pageNumber - 1) * ItemsPerPage; + } + + public static class CompetencyAssessmentSortByOptionTexts + { + public const string + CompetencyAssessmentName = "Competency Assessment", + CompetencyAssessmentOwner = "Owner", + CompetencyAssessmentCreatedDate = "Created Date", + CompetencyAssessmentPublishStatus = "Publish Status", + CompetencyAssessmentBrand = "Brand", + CompetencyAssessmentNationalRoleGroup = "National Job Group", + CompetencyAssessmentNationalCompetencyAssessment = "National Job Profile"; + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/CompetencyAssessmentsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/CompetencyAssessmentsViewModel.cs new file mode 100644 index 0000000000..f091a7dd76 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/CompetencyAssessmentsViewModel.cs @@ -0,0 +1,29 @@ +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + using DigitalLearningSolutions.Web.Models.Enums; + using DigitalLearningSolutions.Web.ViewModels.Common; + + public class CompetencyAssessmentsViewModel + { + public CompetencyAssessmentsViewModel( + bool isWorkforceManager, + bool isWorkforceContributor, + AllCompetencyAssessmentsViewModel allCompetencyAssessments, + MyCompetencyAssessmentsViewModel myCompetencyAssessments, + CompetencyAssessmentsTab currentTab + ) + { + IsWorkforceManager = isWorkforceManager; + IsWorkforceContributor = isWorkforceContributor; + MyCompetencyAssessmentsViewModel = myCompetencyAssessments; + AllCompetencyAssessmentsViewModel = allCompetencyAssessments; + TabNavLinks = new TabsNavViewModel(currentTab); + } + + public bool IsWorkforceManager { get; set; } + public bool IsWorkforceContributor { get; set; } + public MyCompetencyAssessmentsViewModel MyCompetencyAssessmentsViewModel { get; set; } + public AllCompetencyAssessmentsViewModel AllCompetencyAssessmentsViewModel { get; set; } + public TabsNavViewModel TabNavLinks { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditBrandingViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditBrandingViewModel.cs new file mode 100644 index 0000000000..b9b671c7d1 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditBrandingViewModel.cs @@ -0,0 +1,33 @@ +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; +using Microsoft.AspNetCore.Mvc.Rendering; + +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + public class EditBrandingViewModel + { + public EditBrandingViewModel() { } + public EditBrandingViewModel(CompetencyAssessment competencyAssessment, SelectList brandSelectList, SelectList categorySelectList, bool? taskStatus) + { + ID = competencyAssessment.ID; + CompetencyAssessmentName = competencyAssessment.CompetencyAssessmentName; + BrandID = competencyAssessment.BrandID; + CategoryID = competencyAssessment.CategoryID; + Brand = competencyAssessment.Brand; + Category = competencyAssessment.Category; + UserRole = competencyAssessment.UserRole; + BrandSelectList = brandSelectList; + CategorySelectList = categorySelectList; + TaskStatus = taskStatus; + } + public int ID { get; set; } + public string CompetencyAssessmentName { get; set; } + public int BrandID { get; set; } + public int CategoryID { get; set; } + public string? Brand { get; set; } + public string? Category { get; set; } + public int UserRole { get; set; } + public bool? TaskStatus { get; set; } + public SelectList? BrandSelectList { get; set; } + public SelectList? CategorySelectList { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditDescriptionViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditDescriptionViewModel.cs new file mode 100644 index 0000000000..fcb36e370f --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditDescriptionViewModel.cs @@ -0,0 +1,22 @@ +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + public class EditDescriptionViewModel + { + public EditDescriptionViewModel() { } + public EditDescriptionViewModel(CompetencyAssessmentBase competencyAssessmentBase, bool? taskStatus) + { + ID = competencyAssessmentBase.ID; + CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName; + Description = competencyAssessmentBase.Description; + UserRole = competencyAssessmentBase.UserRole; + TaskStatus = taskStatus; + } + public int ID { get; set; } + public string CompetencyAssessmentName { get; set; } = string.Empty; + public string? Description { get; set; } + public int UserRole { get; set; } + public bool? TaskStatus { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditRoleProfileLinksViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditRoleProfileLinksViewModel.cs new file mode 100644 index 0000000000..54ddd177b5 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditRoleProfileLinksViewModel.cs @@ -0,0 +1,43 @@ +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using Humanizer; + using System.Collections.Generic; + using System.Linq; + + public class EditRoleProfileLinksViewModel + { + public EditRoleProfileLinksViewModel() { } + public EditRoleProfileLinksViewModel(CompetencyAssessmentBase competencyAssessmentBase, IEnumerable professionalGroups, IEnumerable subGroups, IEnumerable roles, string actionName, bool? taskStatus) + { + ID = competencyAssessmentBase.ID; + CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName; + ProfessionalGroupId = competencyAssessmentBase.NRPProfessionalGroupID; + SubGroupId = competencyAssessmentBase.NRPSubGroupID; + RoleId = competencyAssessmentBase.NRPRoleID; + UserRole = competencyAssessmentBase.UserRole; + TaskStatus = taskStatus; + ProfessionalGroups = professionalGroups; + SubGroups = subGroups; + Roles = roles; + ActionName = actionName; + RoleName = Roles.FirstOrDefault(r => r.ID == RoleId)?.ProfileName ?? "Don't link assessment to a role."; + SubGroupName = SubGroups.FirstOrDefault(s => s.ID == SubGroupId)?.SubGroup ?? "Don't link assessment to a sub group."; + GroupName = ProfessionalGroups.FirstOrDefault(p => p.ID == ProfessionalGroupId)?.ProfessionalGroup ?? "Don't link assessment to a professional group."; + } + public IEnumerable ProfessionalGroups { get; set; } + public IEnumerable SubGroups { get; set; } + public IEnumerable Roles { get; set; } + public int ID { get; set; } + public string CompetencyAssessmentName { get; set; } + public string ActionName { get; set; } + public int? ProfessionalGroupId { get; set; } + public int? SubGroupId { get; set; } + public int? RoleId { get; set; } + public int UserRole { get; set; } + public bool? TaskStatus { get; set; } + public string? GroupName { get; set; } + public string? SubGroupName { get; set; } + public string? RoleName { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditVocabularyViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditVocabularyViewModel.cs new file mode 100644 index 0000000000..c68c90f85e --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/EditVocabularyViewModel.cs @@ -0,0 +1,24 @@ +using DigitalLearningSolutions.Data.Models.CompetencyAssessments; +using System.ComponentModel.DataAnnotations; + +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + public class EditVocabularyViewModel + { + public EditVocabularyViewModel() { } + public EditVocabularyViewModel(CompetencyAssessmentBase competencyAssessmentBase, bool? taskStatus) + { + ID = competencyAssessmentBase.ID; + CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName; + Vocabulary = competencyAssessmentBase.Vocabulary; + UserRole = competencyAssessmentBase.UserRole; + TaskStatus = taskStatus; + } + public int ID { get; set; } + public string CompetencyAssessmentName { get; set; } = string.Empty; + [Required(ErrorMessage = "Select a vocabulary option")] + public string Vocabulary { get; set; } + public int UserRole { get; set; } + public bool? TaskStatus { get; set; } + } +} 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/ViewModels/CompetencyAssessments/MyCompetencyAssessmentsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/MyCompetencyAssessmentsViewModel.cs new file mode 100644 index 0000000000..ec2cf74500 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/MyCompetencyAssessmentsViewModel.cs @@ -0,0 +1,43 @@ +namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +{ + using System.Collections.Generic; + using System.Linq; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; + using DigitalLearningSolutions.Web.Helpers; + using Microsoft.AspNetCore.Mvc.Rendering; + + public class MyCompetencyAssessmentsViewModel : BaseCompetencyAssessmentsPageViewModel + { + public readonly IEnumerable CompetencyAssessments; + public readonly bool IsWorkforceManager; + + public override SelectList CompetencyAssessmentSortByOptions { get; } = new SelectList(new[] + { + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentName, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentOwner, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentCreatedDate, + CompetencyAssessmentSortByOptionTexts.CompetencyAssessmentPublishStatus + }); + + public MyCompetencyAssessmentsViewModel( + IEnumerable competencyAssessments, // Renamed parameter to avoid shadowing + string? searchString, + string sortBy, + string sortDirection, + int page, + bool isWorkforceManager + ) : base(searchString, sortBy, sortDirection, page) + { + var sortedItems = SortingHelper.SortCompetencyAssessmentItems( + competencyAssessments, + sortBy, + sortDirection + ); + var filteredItems = SearchHelper.FilterCompetencyAssessments(sortedItems, SearchString, 60, false).ToList(); + MatchingSearchResults = filteredItems.Count; + SetTotalPages(); + CompetencyAssessments = PaginateItems(filteredItems).Cast(); // Assign to the field + IsWorkforceManager = isWorkforceManager; + } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/AllRoleProfilesViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/AllRoleProfilesViewModel.cs deleted file mode 100644 index bad699149f..0000000000 --- a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/AllRoleProfilesViewModel.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace DigitalLearningSolutions.Web.ViewModels.RoleProfiles -{ - using System.Collections.Generic; - using System.Linq; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using DigitalLearningSolutions.Web.Helpers; - using Microsoft.AspNetCore.Mvc.Rendering; - public class AllRoleProfilesViewModel : BaseRoleProfilesPageViewModel - { - public readonly IEnumerable RoleProfiles; - public readonly bool IsWorkforceManager; - public override SelectList RoleProfileSortByOptions { get; } = new SelectList(new[] - { - RoleProfileSortByOptionTexts.RoleProfileName, - RoleProfileSortByOptionTexts.RoleProfileOwner, - RoleProfileSortByOptionTexts.RoleProfileCreatedDate, - RoleProfileSortByOptionTexts.RoleProfilePublishStatus, - RoleProfileSortByOptionTexts.RoleProfileBrand, - RoleProfileSortByOptionTexts.RoleProfileNationalRoleGroup, - RoleProfileSortByOptionTexts.RoleProfileNationalRoleProfile - }); - public AllRoleProfilesViewModel( - IEnumerable roleProfiles, - string? searchString, - string sortBy, - string sortDirection, - int page - ) : base(searchString, sortBy, sortDirection, page) - { - var sortedItems = SortingHelper.SortRoleProfileItems( - roleProfiles, - sortBy, - sortDirection - ); - var filteredItems = SearchHelper.FilterRoleProfiles(sortedItems, SearchString, 60, false).ToList(); - MatchingSearchResults = filteredItems.Count; - SetTotalPages(); - var paginatedItems = PaginateItems(filteredItems); - RoleProfiles = paginatedItems.Cast(); - } - } -} diff --git a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/MyRoleProfilesViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/MyRoleProfilesViewModel.cs deleted file mode 100644 index 7657922974..0000000000 --- a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/MyRoleProfilesViewModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace DigitalLearningSolutions.Web.ViewModels.RoleProfiles -{ - using System.Collections.Generic; - using System.Linq; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using DigitalLearningSolutions.Web.Helpers; - using Microsoft.AspNetCore.Mvc.Rendering; - public class MyRoleProfilesViewModel : BaseRoleProfilesPageViewModel - { - public readonly IEnumerable RoleProfiles; - public readonly bool IsWorkforceManager; - public override SelectList RoleProfileSortByOptions { get; } = new SelectList(new[] - { - RoleProfileSortByOptionTexts.RoleProfileName, - RoleProfileSortByOptionTexts.RoleProfileOwner, - RoleProfileSortByOptionTexts.RoleProfileCreatedDate, - RoleProfileSortByOptionTexts.RoleProfilePublishStatus - }); - public MyRoleProfilesViewModel( - IEnumerable roleProfiles, - string? searchString, - string sortBy, - string sortDirection, - int page, - bool isWorkforceManager - ) : base(searchString, sortBy, sortDirection, page) - { - var sortedItems = SortingHelper.SortRoleProfileItems( - roleProfiles, - sortBy, - sortDirection - ); - var filteredItems = SearchHelper.FilterRoleProfiles(sortedItems, SearchString, 60, false).ToList(); - MatchingSearchResults = filteredItems.Count; - SetTotalPages(); - var paginatedItems = PaginateItems(filteredItems); - RoleProfiles = paginatedItems.Cast(); - IsWorkforceManager = isWorkforceManager; - } - } -} diff --git a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/ProfessionalGroupViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/ProfessionalGroupViewModel.cs deleted file mode 100644 index 67701b8d15..0000000000 --- a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/ProfessionalGroupViewModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace DigitalLearningSolutions.Web.ViewModels.RoleProfiles -{ - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using System.Collections.Generic; - - public class ProfessionalGroupViewModel - { - public IEnumerable NRPProfessionalGroups { get; set; } - public RoleProfileBase RoleProfileBase { get; set; } - } -} diff --git a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/RoleProfilesViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/RoleProfilesViewModel.cs deleted file mode 100644 index 9154eeee6b..0000000000 --- a/DigitalLearningSolutions.Web/ViewModels/RoleProfiles/RoleProfilesViewModel.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace DigitalLearningSolutions.Web.ViewModels.RoleProfiles -{ - using DigitalLearningSolutions.Web.Models.Enums; - using DigitalLearningSolutions.Web.ViewModels.Common; - - public class RoleProfilesViewModel - { - public RoleProfilesViewModel( - bool isWorkforceManager, - bool isWorkforceContributor, - AllRoleProfilesViewModel allRoleProfiles, - MyRoleProfilesViewModel myRoleProfiles, - RoleProfilesTab currentTab - ) - { - IsWorkforceManager = isWorkforceManager; - IsWorkforceContributor = isWorkforceContributor; - MyRoleProfilesViewModel = myRoleProfiles; - AllRoleProfilesViewModel = allRoleProfiles; - TabNavLinks = new TabsNavViewModel(currentTab); - } - - public bool IsWorkforceManager { get; set; } - public bool IsWorkforceContributor { get; set; } - public MyRoleProfilesViewModel MyRoleProfilesViewModel { get; set; } - public AllRoleProfilesViewModel AllRoleProfilesViewModel { get; set; } - public TabsNavViewModel TabNavLinks { get; set; } - } -} diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateOnProfileAssessmentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateOnProfileAssessmentViewModel.cs index ed6e40e583..1b70330bbe 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateOnProfileAssessmentViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateOnProfileAssessmentViewModel.cs @@ -1,13 +1,13 @@ namespace DigitalLearningSolutions.Web.ViewModels.Supervisor { - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.SessionData.Supervisor; using DigitalLearningSolutions.Data.Models.Supervisor; using System.Collections.Generic; public class EnrolDelegateOnProfileAssessmentViewModel { - public SessionEnrolOnRoleProfile SessionEnrolOnRoleProfile { get; set; } + public SessionEnrolOnCompetencyAssessment SessionEnrolOnCompetencyAssessment { get; set; } public SupervisorDelegateDetail SupervisorDelegateDetail { get; set; } - public IEnumerable RoleProfiles { get; set; } + public IEnumerable CompetencyAssessments { get; set; } } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSetCompletByDateViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSetCompletByDateViewModel.cs index cac66da25f..e8582ca012 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSetCompletByDateViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSetCompletByDateViewModel.cs @@ -1,6 +1,6 @@ namespace DigitalLearningSolutions.Web.ViewModels.Supervisor { - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using DigitalLearningSolutions.Web.Helpers; using System; @@ -8,7 +8,7 @@ public class EnrolDelegateSetCompletByDateViewModel { public SupervisorDelegateDetail SupervisorDelegateDetail { get; set; } - public RoleProfile RoleProfile { get; set; } + public CompetencyAssessment CompetencyAssessment { get; set; } public DateTime? CompleteByDate { get; set; } public OldDateValidator.ValidationResult? CompleteByValidationResult { get; set; } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSummaryViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSummaryViewModel.cs index 3b36eef8a2..ad66e71ac8 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSummaryViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSummaryViewModel.cs @@ -1,16 +1,17 @@ namespace DigitalLearningSolutions.Web.ViewModels.Supervisor { - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using System; public class EnrolDelegateSummaryViewModel { public SupervisorDelegateDetail SupervisorDelegateDetail { get; set; } - public RoleProfile RoleProfile { get; set; } + public CompetencyAssessment CompetencyAssessment { get; set; } public DateTime? CompleteByDate { get; set; } public string SupervisorRoleName { get; set; } public int SupervisorRoleCount { get; set; } public bool AllowSupervisorRoleSelection { get; set; } + public bool HasSupervisorRoles => !string.IsNullOrWhiteSpace(SupervisorRoleName); } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSupervisorRoleViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSupervisorRoleViewModel.cs index 0c988b9457..4b15b66edf 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSupervisorRoleViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Supervisor/EnrolDelegateSupervisorRoleViewModel.cs @@ -1,6 +1,6 @@ namespace DigitalLearningSolutions.Web.ViewModels.Supervisor { - using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Data.Models.CompetencyAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using System; using System.Collections.Generic; @@ -9,7 +9,7 @@ public class EnrolDelegateSupervisorRoleViewModel { public SupervisorDelegateDetail? SupervisorDelegateDetail { get; set; } - public RoleProfile? RoleProfile { get; set; } + public CompetencyAssessment? CompetencyAssessment { get; set; } [Required(ErrorMessage = "Please choose a supervisor role")] public int? SelfAssessmentSupervisorRoleId { get; set; } public IEnumerable? SelfAssessmentSupervisorRoles { get; set; } diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/ReviewSelfAssessmentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Supervisor/ReviewSelfAssessmentViewModel.cs index ea19f92d35..9a6463e28f 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/ReviewSelfAssessmentViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Supervisor/ReviewSelfAssessmentViewModel.cs @@ -1,6 +1,5 @@ namespace DigitalLearningSolutions.Web.ViewModels.Supervisor { - using DigitalLearningSolutions.Data.Models.Frameworks; using DigitalLearningSolutions.Data.Models.SelfAssessments; using DigitalLearningSolutions.Data.Models.Supervisor; using DigitalLearningSolutions.Web.Helpers; @@ -15,9 +14,9 @@ public class ReviewSelfAssessmentViewModel public IEnumerable? SupervisorSignOffs { get; set; } public bool IsSupervisorResultsReviewed { get; set; } public SearchSupervisorCompetencyViewModel SearchViewModel { get; set; } - public string VocabPlural(string vocabulary) + public string VocabPlural() { - return FrameworkVocabularyHelper.VocabularyPlural(vocabulary); + return FrameworkVocabularyHelper.VocabularyPlural(DelegateSelfAssessment.Vocabulary); } public int CandidateAssessmentId { get; set; } public bool ExportToExcelHide { get; set; } diff --git a/DigitalLearningSolutions.Web/Views/ApplicationSelector/Index.cshtml b/DigitalLearningSolutions.Web/Views/ApplicationSelector/Index.cshtml index 8200e11d84..11c835815f 100644 --- a/DigitalLearningSolutions.Web/Views/ApplicationSelector/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/ApplicationSelector/Index.cshtml @@ -126,7 +126,7 @@

    Supervise

    -

    Assign and review staff profile assessments and arrange supervision sessions.

    +

    Assign and review staff competency assessments and arrange supervision sessions.

    Frameworks -

    Create and distribute competency frameworks and role profiles.

    +

    Create and distribute competency frameworks and assessments.

    +} +@section NavBreadcrumbs { + +} + +

    Edit @Model.CompetencyAssessmentName provider and category

    +

    This will be visible to users when they browse assessments. It wiull help them to identify where the assessment is from and what it contains.

    +
    + @if (!ViewData.ModelState.IsValid) + { + + } + + + +
    + + +
    +
    + + + +
    + + +
    +
    + + + + + + + + + + + +@section scripts { + +} diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditDescription.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditDescription.cshtml new file mode 100644 index 0000000000..6cab75b552 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditDescription.cshtml @@ -0,0 +1,62 @@ +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model EditDescriptionViewModel; +@{ + ViewData["Title"] = "Edit Introductory Text"; + ViewData["Application"] = "Framework Service"; +} + + +@section NavMenuItems { + +} + +@section NavBreadcrumbs { + +} + +

    Edit @Model.CompetencyAssessmentName introductory text

    +
    + @if (!ViewData.ModelState.IsValid) + { + + } + + + + + + + + + + + + +@section scripts { + +} diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditRoleProfileLinks.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditRoleProfileLinks.cshtml new file mode 100644 index 0000000000..b5faad6214 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditRoleProfileLinks.cshtml @@ -0,0 +1,256 @@ +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments; +@model EditRoleProfileLinksViewModel; +@{ + ViewData["Title"] = "Edit National Role Profile Links"; + ViewData["Application"] = "Framework Service"; +} + +@section NavMenuItems { + +} + +@section NavBreadcrumbs { + +} + +

    Edit @Model.CompetencyAssessmentName national NHS role profile links

    +@if (Model.TaskStatus != null | Model.ActionName != "EditGroup") +{ +
    + +
    +
    + Professional group +
    +
    + @Model.GroupName +
    +
    + + Change professional group link + +
    +
    + @if (Model.ProfessionalGroupId != null && Model.ActionName != "EditSubGroup") + { +
    +
    + Sub group +
    +
    + @Model.SubGroupName +
    +
    + + Change sub group link + +
    +
    + } + @if (Model.SubGroupId != null && Model.ActionName == "Summary") + { +
    +
    + Role +
    +
    + @Model.RoleName +
    +
    + + Change role profile link + +
    +
    + } +
    +} +@if (Model.ActionName == "EditGroup") +{ +
    + @if (!ViewData.ModelState.IsValid) + { + + } + +
    + +

    + Choose the NHS national role profile professional group to associate with this assessment. +

    +
    + +
    + @foreach (var professionalGroup in Model.ProfessionalGroups) + { +
    + + +
    + } +
    + +
    + + +
    +
    +
    +
    + + + + + + + + + + + + +} +else if (Model.ActionName == "EditSubGroup" && Model.ProfessionalGroupId != null) +{ +
    + @if (!ViewData.ModelState.IsValid) + { + + } + +
    + +

    + Choose the role sub group to associate with this assessment. +

    +
    + +
    + @foreach (var subGroup in Model.SubGroups) + { +
    + + +
    + } +
    + +
    + + +
    +
    +
    +
    + + + + + + + + + + + +} +else if (Model.ActionName == "EditRole" && Model.SubGroupId != null) +{ +
    + @if (!ViewData.ModelState.IsValid) + { + + } + +
    + +

    + Choose the role to associate with this assessment. +

    +
    + +
    + @foreach (var role in Model.Roles) + { +
    + + +
    + } +
    + +
    + + +
    +
    +
    +
    + + + + + + + + + + + +} +else if (Model.ActionName == "Summary") +{ +
    + + + + + + + + + + + + + + +
    +} + diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditVocabulary.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditVocabulary.cshtml new file mode 100644 index 0000000000..3b32db2a58 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/EditVocabulary.cshtml @@ -0,0 +1,98 @@ +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model EditVocabularyViewModel +@{ + ViewData["Title"] = "Assessment Branding"; + ViewData["Application"] = "Framework Service"; + ViewData["HeaderPathName"] = "Framework Service"; +} + +@section NavMenuItems { + +} +@section NavBreadcrumbs { + +} + +

    Edit @Model.CompetencyAssessmentName vocabulary

    +
    + @if (!ViewData.ModelState.IsValid) + { + + } + +
    + +

    + Choose assessment vocabulary - the name given to the building blocks of your assessment. +

    +
    +
    +
    + + +
    + The attributes (skills, knowledge and behaviours) which individuals bring to the workplace. +
    +
    + +
    + + +
    + Defined standards of performance, focused on the outputs of work and observable performance. +
    +
    +
    + + +
    + The knowledge and skills that registered nurses must demonstrate when caring for people of all ages and across all care settings. +
    +
    +
    + + +
    + The same as capability | capabilities.
    + The term capabilities is recommended to make a clear distinction from competences. +
    +
    +
    +
    + +
    + + + + + + + + + diff --git a/DigitalLearningSolutions.Web/Views/RoleProfiles/Index.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Index.cshtml similarity index 65% rename from DigitalLearningSolutions.Web/Views/RoleProfiles/Index.cshtml rename to DigitalLearningSolutions.Web/Views/CompetencyAssessments/Index.cshtml index 89477e0ff7..0c6f91d80a 100644 --- a/DigitalLearningSolutions.Web/Views/RoleProfiles/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Index.cshtml @@ -1,8 +1,8 @@ -@using DigitalLearningSolutions.Web.ViewModels.RoleProfiles -@model RoleProfilesViewModel +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model CompetencyAssessmentsViewModel @{ - ViewData["Title"] = (string)ViewContext.RouteData.Values["tabname"] == "Mine" ? "My Role Profiles" : "All Role Profiles"; + ViewData["Title"] = (string)ViewContext.RouteData.Values["tabname"] == "Mine" ? "My Competency Assessments" : "All Competency Assessments"; ViewData["Application"] = "Framework Service"; } @@ -13,7 +13,7 @@ @@ -26,11 +26,11 @@
    @if ((string)ViewContext.RouteData.Values["tabname"] == "Mine") { - + } else if ((string)ViewContext.RouteData.Values["tabname"] == "All") { - + }
    diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml new file mode 100644 index 0000000000..3e4f9f34be --- /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 new file mode 100644 index 0000000000..69feaf3825 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml @@ -0,0 +1,109 @@ +@using DigitalLearningSolutions.Data.Models.CompetencyAssessments; +@model CompetencyAssessmentBase; +@{ + ViewData["Title"] = "New Competency Assessments"; + ViewData["Application"] = "Framework Service"; +} + +@section NavMenuItems { + +} + @if ((string)ViewContext.RouteData.Values["actionname"] == "New") +{ + @section NavBreadcrumbs { + + } +} +else +{ + @section NavBreadcrumbs { + + } +} +@if ((string)ViewContext.RouteData.Values["actionName"] == "New") +{ +

    Create a new competency assessment

    +} +else +{ +

    Edit competency assessment name

    +} +
    + @if (!ViewData.ModelState.IsValid) + { + + } + + +
    + Choose a title that identifies scope of capabilities covered and/or the roles or levels the assessment targets. +
    + + +
    + + + + + + + + + + + + + + @if ((string)ViewContext.RouteData.Values["actionName"] == "New") + { + + + } + else + { + @if (Model.PublishStatusID == 3) + { + + } + + + } + + diff --git a/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_AssessmentsGrid.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_AssessmentsGrid.cshtml new file mode 100644 index 0000000000..c9c5deba92 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_AssessmentsGrid.cshtml @@ -0,0 +1,85 @@ +@using DigitalLearningSolutions.Data.Models.CompetencyAssessments; +@model IEnumerable; + + + + + + + + + + + + + + @foreach (var competencyAssessment in Model) + { + + + + + + + + + } + +
    + Frameworks +
    + Competency Assessment + + Framework Links + + Created + + Status + + Owner + + Actions +
    + Competency Assessment + + @competencyAssessment.Brand + + / + + @competencyAssessment.CompetencyAssessmentName + + + Framework links + + @competencyAssessment.LinkedFrameworks + + + Created + + @competencyAssessment.CreatedDate.ToShortDateString() + + + Status + + + + + Owner + + @competencyAssessment.Owner + + + Actions + @if (competencyAssessment.UserRole > 1) + { + + Manage + + } + else + { + + View + + } +
    diff --git a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_RoleProfilesSearchAndSort.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_CompetencyAssessmentsSearchAndSort.cshtml similarity index 66% rename from DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_RoleProfilesSearchAndSort.cshtml rename to DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_CompetencyAssessmentsSearchAndSort.cshtml index d6aa3c18d1..c3e030727f 100644 --- a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_RoleProfilesSearchAndSort.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_CompetencyAssessmentsSearchAndSort.cshtml @@ -1,11 +1,11 @@ -@using DigitalLearningSolutions.Web.ViewModels.RoleProfiles -@model BaseRoleProfilesPageViewModel - -
    -
    - -
    -
    - -
    -
    +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model BaseCompetencyAssessmentsPageViewModel + +
    +
    + +
    +
    + +
    +
    diff --git a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSearch.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSearch.cshtml similarity index 87% rename from DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSearch.cshtml rename to DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSearch.cshtml index 6edb778960..ab254994c8 100644 --- a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSearch.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSearch.cshtml @@ -1,13 +1,13 @@ -@using DigitalLearningSolutions.Web.ViewModels.RoleProfiles -@model BaseRoleProfilesPageViewModel - - +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model BaseCompetencyAssessmentsPageViewModel + + diff --git a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSort.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSort.cshtml similarity index 80% rename from DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSort.cshtml rename to DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSort.cshtml index a8b403f8d2..a13027eeb5 100644 --- a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_PageSort.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_PageSort.cshtml @@ -1,26 +1,26 @@ -@using DigitalLearningSolutions.Web.ViewModels.RoleProfiles -@model BaseRoleProfilesPageViewModel - - -
    - - -
    - - - -
    -
    +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model BaseCompetencyAssessmentsPageViewModel + + +
    + + +
    + + + +
    +
    diff --git a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_Pagination.cshtml b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_Pagination.cshtml similarity index 94% rename from DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_Pagination.cshtml rename to DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_Pagination.cshtml index 3f43b6aee8..012e103877 100644 --- a/DigitalLearningSolutions.Web/Views/RoleProfiles/Shared/_Pagination.cshtml +++ b/DigitalLearningSolutions.Web/Views/CompetencyAssessments/Shared/_Pagination.cshtml @@ -1,5 +1,5 @@ -@using DigitalLearningSolutions.Web.ViewModels.RoleProfiles -@model BaseRoleProfilesPageViewModel +@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments +@model BaseCompetencyAssessmentsPageViewModel