Skip to content

Commit d37970d

Browse files
authored
Merge pull request #3148 from TechnologyEnhancedLearning/Develop/Features/TD-5389-NRPLinks
TD-5389 implements NHS national role profile links form
2 parents 342740c + 36d1cd8 commit d37970d

File tree

9 files changed

+422
-189
lines changed

9 files changed

+422
-189
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ public interface ICompetencyAssessmentDataService
2323
CompetencyAssessmentBase? GetCompetencyAssessmentBaseByName(string competencyAssessmentName, int adminId);
2424
CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId);
2525
IEnumerable<NRPProfessionalGroups> GetNRPProfessionalGroups();
26+
IEnumerable<NRPSubGroups> GetNRPSubGroups(int? nRPProfessionalGroupID);
27+
IEnumerable<NRPRoles> GetNRPRoles(int? nRPSubGroupID);
2628

2729
CompetencyAssessmentTaskStatus GetOrInsertAndReturnAssessmentTaskStatus(int assessmentId, bool frameworkBased);
2830

2931
//UPDATE DATA
3032
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
3133

32-
bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID);
34+
bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId);
3335
bool UpdateCompetencyAssessmentBranding(
3436
int competencyAssessmentId,
3537
int adminId,
@@ -41,6 +43,7 @@ int categoryId
4143
bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus);
4244
bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus);
4345
bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus);
46+
bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus);
4447
//INSERT DATA
4548
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
4649
bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId);
@@ -225,11 +228,11 @@ ORDER BY ProfessionalGroup"
225228
).FirstOrDefault();
226229
}
227230

228-
public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID)
231+
public bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId)
229232
{
230233
var result = connection.ExecuteScalar(
231-
@"SELECT COUNT(*) FROM CompetencyAssessments WHERE ID = @competencyAssessmentId AND NRPProfessionalGroupID = @nrpProfessionalGroupID",
232-
new { competencyAssessmentId, nrpProfessionalGroupID }
234+
@"SELECT COUNT(*) FROM SelfAssessments WHERE ID = @competencyAssessmentId AND NRPProfessionalGroupID = @professionalGroupId AND NRPSubGroupID = @subGroupId AND NRPRoleID = @roleId",
235+
new { competencyAssessmentId, professionalGroupId, subGroupId, roleId }
233236
);
234237
int sameCount = Convert.ToInt32(result);
235238
if (sameCount > 0)
@@ -240,9 +243,9 @@ public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessment
240243

241244
//needs updating:
242245
var numberOfAffectedRows = connection.Execute(
243-
@"UPDATE SelfAssessments SET NRPProfessionalGroupID = @nrpProfessionalGroupID, NRPSubGroupID = NULL, NRPRoleID = NULL, UpdatedByAdminID = @adminId
246+
@"UPDATE SelfAssessments SET NRPProfessionalGroupID = @professionalGroupId, NRPSubGroupID = @subGroupId, NRPRoleID = @roleId, UpdatedByAdminID = @adminId
244247
WHERE ID = @competencyAssessmentId",
245-
new { nrpProfessionalGroupID, adminId, competencyAssessmentId }
248+
new { adminId, competencyAssessmentId, professionalGroupId, subGroupId, roleId }
246249
);
247250
if (numberOfAffectedRows > 0)
248251
{
@@ -418,5 +421,43 @@ public bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus)
418421
}
419422
return true;
420423
}
424+
425+
public IEnumerable<NRPSubGroups> GetNRPSubGroups(int? nRPProfessionalGroupID)
426+
{
427+
return connection.Query<NRPSubGroups>(
428+
@"SELECT ID, SubGroup, Active
429+
FROM NRPSubGroups
430+
WHERE (Active = 1) AND (NRPProfessionalGroupID = @nRPProfessionalGroupID)
431+
ORDER BY SubGroup", new { nRPProfessionalGroupID }
432+
);
433+
}
434+
435+
public IEnumerable<NRPRoles> GetNRPRoles(int? nRPSubGroupID)
436+
{
437+
return connection.Query<NRPRoles>(
438+
@"SELECT ID, RoleProfile AS ProfileName, Active
439+
FROM NRPRoles
440+
WHERE (Active = 1) AND (NRPSubGroupID = @nRPSubGroupID)
441+
ORDER BY RoleProfile", new { nRPSubGroupID }
442+
);
443+
}
444+
445+
public bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus)
446+
{
447+
var numberOfAffectedRows = connection.Execute(
448+
@"UPDATE SelfAssessmentTaskStatus SET NationalRoleProfileTaskStatus = @taskStatus
449+
WHERE SelfAssessmentId = @assessmentId",
450+
new { assessmentId, taskStatus }
451+
);
452+
if (numberOfAffectedRows < 1)
453+
{
454+
logger.LogWarning(
455+
"Not updating NationalRoleProfileTaskStatus as db update failed. " +
456+
$"assessmentId: {assessmentId}, taskStatus: {taskStatus}"
457+
);
458+
return false;
459+
}
460+
return true;
461+
}
421462
}
422463
}

DigitalLearningSolutions.Data/Models/CompetencyAssessments/NRPSubGroups.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
public class NRPSubGroups
55
{
66
public int ID { get; set; }
7-
public int NRPProfessionalGroupID { get; set; }
87
[StringLength(255, MinimumLength = 3)]
98
[Required]
109
public string SubGroup { get; set; } = string.Empty;

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using Microsoft.AspNetCore.Mvc.Rendering;
1515
using DigitalLearningSolutions.Data.Models.Centres;
1616
using DigitalLearningSolutions.Data.Models.Frameworks;
17+
using Microsoft.CodeAnalysis.CSharp.Syntax;
1718

1819
public partial class CompetencyAssessmentsController
1920
{
@@ -187,10 +188,9 @@ public IActionResult ManageCompetencyAssessment(int competencyAssessmentId, int?
187188
return View("ManageCompetencyAssessment", model);
188189
}
189190

190-
[Route("/CompetencyAssessments/ProfessionalGroup/{actionName}/{competencyAssessmentId}")]
191-
[Route("/CompetencyAssessments/ProfessionalGroup/{actionName}")]
191+
[Route("/CompetencyAssessments/{competencyAssessmentId}/NationalRoleProfileLinks/{actionName}")]
192192
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
193-
public IActionResult CompetencyAssessmentProfessionalGroup(string actionName, int competencyAssessmentId = 0)
193+
public IActionResult EditRoleProfileLinks(int competencyAssessmentId = 0, string actionName = "EditGroup")
194194
{
195195
var adminId = GetAdminID();
196196
CompetencyAssessmentBase? competencyAssessmentBase;
@@ -212,45 +212,68 @@ public IActionResult CompetencyAssessmentProfessionalGroup(string actionName, in
212212
competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
213213
}
214214
var professionalGroups = competencyAssessmentService.GetNRPProfessionalGroups();
215-
var model = new ProfessionalGroupViewModel()
216-
{
217-
NRPProfessionalGroups = professionalGroups,
218-
CompetencyAssessmentBase = competencyAssessmentBase
219-
};
220-
return View("ProfessionalGroup", model);
215+
var subGroups = competencyAssessmentService.GetNRPSubGroups(competencyAssessmentBase.NRPProfessionalGroupID);
216+
var roles = competencyAssessmentService.GetNRPRoles(competencyAssessmentBase.NRPSubGroupID);
217+
var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null);
218+
var model = new EditRoleProfileLinksViewModel(competencyAssessmentBase, professionalGroups, subGroups, roles, actionName, competencyAssessmentTaskStatus.NationalRoleProfileTaskStatus);
219+
return View(model);
221220
}
222221

223222
[HttpPost]
224-
[Route("/CompetencyAssessments/ProfessionalGroup/{actionName}/{competencyAssessmentId}")]
225-
[Route("/CompetencyAssessments/ProfessionalGroup/{actionName}")]
226-
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
227-
public IActionResult SaveProfessionalGroup(CompetencyAssessmentBase competencyAssessmentBase, string actionName, int competencyAssessmentId = 0)
223+
[Route("/CompetencyAssessments/{competencyAssessmentId}/NationalRoleProfileLinks/{actionName}")]
224+
public IActionResult EditRoleProfileLinks(EditRoleProfileLinksViewModel model, string actionName, int competencyAssessmentId = 0)
228225
{
229-
if (competencyAssessmentBase.NRPProfessionalGroupID == null)
226+
var adminId = GetAdminID();
227+
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
228+
competencyAssessmentService.UpdateRoleProfileLinksTaskStatus(model.ID, model.TaskStatus ?? false);
229+
if (competencyAssessmentBase == null)
230230
{
231-
ModelState.Remove(nameof(CompetencyAssessmentBase.NRPProfessionalGroupID));
232-
ModelState.AddModelError(nameof(CompetencyAssessmentBase.NRPProfessionalGroupID), "Please choose a professional group" + (competencyAssessmentId == 0 ? "or Skip this step" : "") + ".");
233-
// do something
234-
return View("Name", competencyAssessmentBase);
231+
logger.LogWarning($"Failed to submit role links page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}");
232+
return StatusCode(500);
235233
}
236-
if (actionName == "New")
234+
if (competencyAssessmentBase.UserRole < 2)
237235
{
238-
//TO DO Store to self assessment
239-
240-
return RedirectToAction("CompetencyAssessmentSubGroup", "CompetencyAssessments", new { actionName });
236+
return StatusCode(403);
241237
}
242-
else
238+
if (competencyAssessmentBase.NRPProfessionalGroupID != model.ProfessionalGroupId)
243239
{
244-
var adminId = GetAdminID();
245-
var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentProfessionalGroup(competencyAssessmentBase.ID, adminId, competencyAssessmentBase.NRPProfessionalGroupID);
246-
if (isUpdated)
240+
model.SubGroupId = null;
241+
model.RoleId = null;
242+
}
243+
if (competencyAssessmentBase.NRPSubGroupID != model.SubGroupId)
244+
{
245+
model.RoleId = null;
246+
}
247+
var isUpdated = competencyAssessmentService.UpdateCompetencyRoleProfileLinks(model.ID, adminId, model.ProfessionalGroupId, model.SubGroupId, model.RoleId);
248+
if (model.ActionName == "EditGroup")
249+
{
250+
if (model.ProfessionalGroupId == null)
247251
{
248-
return RedirectToAction("CompetencyAssessmentSubGroup", "CompetencyAssessments", new { actionName, competencyAssessmentId });
252+
return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId });
249253
}
250254
else
251255
{
252-
return RedirectToAction("ManageCompetencyAssessment", new { tabname = "Details", competencyAssessmentId });
256+
return RedirectToAction("EditRoleProfileLinks", new { actionName = "EditSubGroup", competencyAssessmentId });
257+
}
258+
}
259+
else if (model.ActionName == "EditSubGroup")
260+
{
261+
if (model.SubGroupId == null)
262+
{
263+
return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId });
253264
}
265+
else
266+
{
267+
return RedirectToAction("EditRoleProfileLinks", new { actionName = "EditRole", competencyAssessmentId });
268+
}
269+
}
270+
else if (model.ActionName == "EditRole")
271+
{
272+
return RedirectToAction("EditRoleProfileLinks", new { actionName = "Summary", competencyAssessmentId });
273+
}
274+
else
275+
{
276+
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId });
254277
}
255278
}
256279

@@ -323,11 +346,11 @@ public IActionResult EditBranding(EditBrandingViewModel model)
323346
model.CategorySelectList = categorySelectList;
324347
return View("EditBranding", model);
325348
}
326-
if(model.BrandID == 0)
349+
if (model.BrandID == 0)
327350
{
328351
model.BrandID = commonService.InsertBrandAndReturnId(model.Brand, (int)centreId);
329352
}
330-
if(model.CategoryID == 0)
353+
if (model.CategoryID == 0)
331354
{
332355
model.CategoryID = commonService.InsertCategoryAndReturnId(model.Category, (int)centreId);
333356
}

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using DigitalLearningSolutions.Data.Models.Common;
33
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
44
using System.Collections.Generic;
5+
using System.Threading.Tasks;
56

67
namespace DigitalLearningSolutions.Web.Services
78
{
@@ -18,23 +19,24 @@ public interface ICompetencyAssessmentService
1819
CompetencyAssessment? GetCompetencyAssessmentById(int competencyAssessmentId, int adminId);
1920

2021
IEnumerable<NRPProfessionalGroups> GetNRPProfessionalGroups();
22+
IEnumerable<NRPSubGroups> GetNRPSubGroups(int? nRPProfessionalGroupID);
23+
IEnumerable<NRPRoles> GetNRPRoles(int? nRPSubGroupID);
2124

2225
CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId);
2326

2427
//UPDATE DATA
2528
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
26-
27-
bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID);
29+
bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId);
2830
bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus);
2931
bool UpdateCompetencyAssessmentDescription(int assessmentId, int adminId, string description);
3032
bool UpdateCompetencyAssessmentBranding(int assessmentId, int adminId, int brandID, int categoryID);
3133
bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus);
3234
bool UpdateCompetencyAssessmentVocabulary(int assessmentId, int adminId, string vocabulary);
3335
bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus);
36+
bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus);
3437

3538
//INSERT DATA
3639
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
37-
3840
}
3941
public class CompetencyAssessmentService : ICompetencyAssessmentService
4042
{
@@ -91,9 +93,9 @@ public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int admin
9193
return competencyAssessmentDataService.UpdateCompetencyAssessmentName(competencyAssessmentId, adminId, competencyAssessmentName);
9294
}
9395

94-
public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID)
96+
public bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId)
9597
{
96-
return competencyAssessmentDataService.UpdateCompetencyAssessmentProfessionalGroup(competencyAssessmentId, adminId, nrpProfessionalGroupID);
98+
return competencyAssessmentDataService.UpdateCompetencyRoleProfileLinks(competencyAssessmentId, adminId, professionalGroupId, subGroupId, roleId);
9799
}
98100
public CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId)
99101
{
@@ -132,5 +134,20 @@ bool ICompetencyAssessmentService.UpdateVocabularyTaskStatus(int assessmentId, b
132134
{
133135
return competencyAssessmentDataService.UpdateVocabularyTaskStatus(assessmentId, taskStatus);
134136
}
137+
138+
public IEnumerable<NRPSubGroups> GetNRPSubGroups(int? nRPProfessionalGroupID)
139+
{
140+
return competencyAssessmentDataService.GetNRPSubGroups(nRPProfessionalGroupID);
141+
}
142+
143+
public IEnumerable<NRPRoles> GetNRPRoles(int? nRPSubGroupID)
144+
{
145+
return competencyAssessmentDataService.GetNRPRoles(nRPSubGroupID);
146+
}
147+
148+
public bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus)
149+
{
150+
return competencyAssessmentDataService.UpdateRoleProfileLinksTaskStatus(assessmentId, taskStatus);
151+
}
135152
}
136153
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
2+
{
3+
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
4+
using Humanizer;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
public class EditRoleProfileLinksViewModel
9+
{
10+
public EditRoleProfileLinksViewModel() { }
11+
public EditRoleProfileLinksViewModel(CompetencyAssessmentBase competencyAssessmentBase, IEnumerable<NRPProfessionalGroups> professionalGroups, IEnumerable<NRPSubGroups> subGroups, IEnumerable<NRPRoles> roles, string actionName, bool? taskStatus)
12+
{
13+
ID = competencyAssessmentBase.ID;
14+
CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName;
15+
ProfessionalGroupId = competencyAssessmentBase.NRPProfessionalGroupID;
16+
SubGroupId = competencyAssessmentBase.NRPSubGroupID;
17+
RoleId = competencyAssessmentBase.NRPRoleID;
18+
UserRole = competencyAssessmentBase.UserRole;
19+
TaskStatus = taskStatus;
20+
ProfessionalGroups = professionalGroups;
21+
SubGroups = subGroups;
22+
Roles = roles;
23+
ActionName = actionName;
24+
RoleName = Roles.FirstOrDefault(r => r.ID == RoleId)?.ProfileName ?? "Don't link assessment to a role.";
25+
SubGroupName = SubGroups.FirstOrDefault(s => s.ID == SubGroupId)?.SubGroup ?? "Don't link assessment to a sub group.";
26+
GroupName = ProfessionalGroups.FirstOrDefault(p => p.ID == ProfessionalGroupId)?.ProfessionalGroup ?? "Don't link assessment to a professional group.";
27+
}
28+
public IEnumerable<NRPProfessionalGroups> ProfessionalGroups { get; set; }
29+
public IEnumerable<NRPSubGroups> SubGroups { get; set; }
30+
public IEnumerable<NRPRoles> Roles { get; set; }
31+
public int ID { get; set; }
32+
public string CompetencyAssessmentName { get; set; }
33+
public string ActionName { get; set; }
34+
public int? ProfessionalGroupId { get; set; }
35+
public int? SubGroupId { get; set; }
36+
public int? RoleId { get; set; }
37+
public int UserRole { get; set; }
38+
public bool? TaskStatus { get; set; }
39+
public string? GroupName { get; set; }
40+
public string? SubGroupName { get; set; }
41+
public string? RoleName { get; set; }
42+
}
43+
}

DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/ProfessionalGroupViewModel.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)