Skip to content

Commit 7c72c5e

Browse files
committed
Begins to implement remove framework source
1 parent 3e92629 commit 7c72c5e

File tree

7 files changed

+190
-25
lines changed

7 files changed

+190
-25
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public interface ICompetencyAssessmentDataService
3030

3131
int[] GetLinkedFrameworkIds (int assessmentId);
3232

33+
int? GetPrimaryLinkedFrameworkId(int assessmentId);
34+
35+
int GetCompetencyCountByFrameworkId(int assessmentId, int frameworkId);
36+
3337
//UPDATE DATA
3438
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
3539

@@ -47,6 +51,8 @@ int categoryId
4751
bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus);
4852
bool UpdateRoleProfileLinksTaskStatus(int assessmentId, bool taskStatus);
4953
bool UpdateFrameworkLinksTaskStatus(int assessmentId, bool taskStatus);
54+
bool RemoveSelfAssessmentFramework(int assessmentId, int frameworkId, int adminId);
55+
5056
//INSERT DATA
5157
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
5258
bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId);
@@ -342,7 +348,7 @@ WHERE NOT EXISTS (SELECT 1 FROM SelfAssessmentFrameworks WHERE SelfAssessmentId
342348
{
343349
numberOfAffectedRows = connection.Execute(
344350
@"UPDATE SelfAssessmentFrameworks
345-
SET @selfAssessmentId, @frameworkId, @adminId
351+
SET RemovedDate = NULL, RemovedByAdminId = NULL, AmendedByAdminId = @adminId
346352
WHERE SelfAssessmentId = @selfAssessmentId AND FrameworkId = @frameworkId"
347353
,
348354
new { adminId, selfAssessmentId, frameworkId }
@@ -482,12 +488,41 @@ public int[] GetLinkedFrameworkIds(int assessmentId)
482488
return [.. connection.Query<int>(
483489
@"SELECT FrameworkId
484490
FROM SelfAssessmentFrameworks
485-
WHERE (SelfAssessmentId = @assessmentId) AND (RemovedDate IS NULL)
486-
ORDER BY CAST(IsPrimary AS Int) DESC, ID",
491+
WHERE (SelfAssessmentId = @assessmentId) AND (RemovedDate IS NULL) AND (IsPrimary = 0)
492+
ORDER BY ID",
487493
new { assessmentId }
488494
)];
489495
}
490496

497+
public bool RemoveSelfAssessmentFramework(int assessmentId, int frameworkId, int adminId)
498+
{
499+
var numberOfAffectedRows = connection.Execute(
500+
@"UPDATE SelfAssessmentFrameworks SET RemovedDate = @removedDate, RemovedByAdminId = @adminId
501+
WHERE SelfAssessmentId = @assessmentId AND FrameworkId = @frameworkId",
502+
new { removedDate = DateTime.Now, assessmentId, frameworkId, adminId }
503+
);
504+
if (numberOfAffectedRows < 1)
505+
{
506+
logger.LogWarning(
507+
"Not updating SelfAssessmentFrameworks as db update failed. " +
508+
$"assessmentId: {assessmentId}, frameworkId: {frameworkId}, adminId: {adminId}"
509+
);
510+
return false;
511+
}
512+
return true;
513+
}
514+
515+
public int? GetPrimaryLinkedFrameworkId(int assessmentId)
516+
{
517+
return connection.QuerySingleOrDefault<int?>(
518+
@"SELECT TOP(1) FrameworkId
519+
FROM SelfAssessmentFrameworks
520+
WHERE (SelfAssessmentId = @assessmentId) AND (RemovedDate IS NULL) AND (IsPrimary = 1)
521+
ORDER BY ID DESC",
522+
new { assessmentId }
523+
);
524+
}
525+
491526
public bool UpdateFrameworkLinksTaskStatus(int assessmentId, bool taskStatus)
492527
{
493528
var numberOfAffectedRows = connection.Execute(
@@ -505,5 +540,17 @@ public bool UpdateFrameworkLinksTaskStatus(int assessmentId, bool taskStatus)
505540
}
506541
return true;
507542
}
543+
544+
public int GetCompetencyCountByFrameworkId(int assessmentId, int frameworkId)
545+
{
546+
return connection.ExecuteScalar<int>(
547+
@"SELECT COUNT(sas.CompetencyID) AS Competencies
548+
FROM SelfAssessmentStructure AS sas INNER JOIN
549+
FrameworkCompetencies AS fc ON sas.CompetencyID = fc.CompetencyID INNER JOIN
550+
SelfAssessmentFrameworks AS saf ON fc.FrameworkID = saf.FrameworkId AND sas.SelfAssessmentID = saf.SelfAssessmentId
551+
WHERE (saf.SelfAssessmentId = @assessmentId) AND (saf.FrameworkId = @frameworkId)",
552+
new { assessmentId, frameworkId }
553+
);
554+
}
508555
}
509556
}

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,10 @@ public IActionResult SelectFrameworkSources(int competencyAssessmentId, string a
404404
{
405405
return StatusCode(403);
406406
}
407-
var selectedFrameworks = competencyAssessmentService.GetLinkedFrameworkIds(competencyAssessmentId);
407+
var primaryFrameworkId = competencyAssessmentService.GetPrimaryLinkedFrameworkId(competencyAssessmentId);
408+
var additionalFrameworks = competencyAssessmentService.GetLinkedFrameworkIds(competencyAssessmentId);
408409
var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null);
409-
var model = new SelectFrameworkSourcesViewModel(competencyAssessmentBase, frameworks, selectedFrameworks, competencyAssessmentTaskStatus.FrameworkLinksTaskStatus, actionName);
410+
var model = new SelectFrameworkSourcesViewModel(competencyAssessmentBase, frameworks, additionalFrameworks, primaryFrameworkId, competencyAssessmentTaskStatus.FrameworkLinksTaskStatus, actionName);
410411
return View(model);
411412
}
412413
[HttpPost]
@@ -417,7 +418,7 @@ public IActionResult SelectFrameworkSources(SelectFrameworkSourcesFormData model
417418
var competencyAssessmentId = model.CompetencyAssessmentId;
418419
if (!ModelState.IsValid)
419420
{
420-
421+
421422
var frameworks = frameworkService.GetAllFrameworks(adminId);
422423
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
423424
if (competencyAssessmentBase == null)
@@ -429,11 +430,12 @@ public IActionResult SelectFrameworkSources(SelectFrameworkSourcesFormData model
429430
{
430431
return StatusCode(403);
431432
}
432-
var selectedFrameworks = competencyAssessmentService.GetLinkedFrameworkIds(competencyAssessmentId);
433-
var viewModel = new SelectFrameworkSourcesViewModel(competencyAssessmentBase, frameworks, selectedFrameworks, model.TaskStatus, model.ActionName);
433+
var primaryFrameworkId = competencyAssessmentService.GetPrimaryLinkedFrameworkId(competencyAssessmentId);
434+
var additionalFrameworks = competencyAssessmentService.GetLinkedFrameworkIds(competencyAssessmentId);
435+
var viewModel = new SelectFrameworkSourcesViewModel(competencyAssessmentBase, frameworks, additionalFrameworks, primaryFrameworkId, model.TaskStatus, model.ActionName);
434436
return View("SelectFrameworkSources", viewModel);
435437
}
436-
if(actionName == "AddFramework")
438+
if (actionName == "AddFramework")
437439
{
438440
competencyAssessmentService.InsertSelfAssessmentFramework(adminId, competencyAssessmentId, model.FrameworkId);
439441
return RedirectToAction("SelectFrameworkSources", new { competencyAssessmentId, actionName = "Summary" });
@@ -444,5 +446,24 @@ public IActionResult SelectFrameworkSources(SelectFrameworkSourcesFormData model
444446
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.CompetencyAssessmentId });
445447
}
446448
}
449+
[Route("/CompetencyAssessments/{competencyAssessmentId}/Frameworks/{frameworkId}/Remove")]
450+
public IActionResult RemoveFramework(int frameworkId, int competencyAssessmentId)
451+
{
452+
var frameworkCompetencyCount = competencyAssessmentService.GetCompetencyCountByFrameworkId(competencyAssessmentId, frameworkId);
453+
if (frameworkCompetencyCount > 0)
454+
{
455+
var adminId = GetAdminID();
456+
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
457+
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminId);
458+
var model = new ConfirmRemoveFrameworkSourceViewModel(competencyAssessmentBase, framework, frameworkCompetencyCount);
459+
return View("ConfirmRemoveFrameworkSource", model);
460+
}
461+
else
462+
{
463+
var adminId = GetAdminID();
464+
competencyAssessmentService.RemoveSelfAssessmentFramework(competencyAssessmentId, frameworkId, adminId);
465+
}
466+
return RedirectToAction("SelectFrameworkSources", new { competencyAssessmentId, actionName = "Summary" });
467+
}
447468
}
448469
}

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public interface ICompetencyAssessmentService
2323
IEnumerable<NRPRoles> GetNRPRoles(int? nRPSubGroupID);
2424

2525
CompetencyAssessmentTaskStatus GetCompetencyAssessmentTaskStatus(int assessmentId, int? frameworkId);
26+
int[] GetLinkedFrameworkIds(int assessmentId);
27+
int? GetPrimaryLinkedFrameworkId(int assessmentId);
28+
29+
bool RemoveSelfAssessmentFramework(int assessmentId, int frameworkId, int adminId);
2630

2731
//UPDATE DATA
2832
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
@@ -39,8 +43,7 @@ public interface ICompetencyAssessmentService
3943
//INSERT DATA
4044
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
4145
bool InsertSelfAssessmentFramework(int adminId, int assessmentId, int frameworkId);
42-
int[] GetLinkedFrameworkIds(int assessmentId);
43-
46+
int GetCompetencyCountByFrameworkId(int competencyAssessmentId, int frameworkId);
4447
}
4548
public class CompetencyAssessmentService : ICompetencyAssessmentService
4649
{
@@ -168,5 +171,20 @@ public bool UpdateFrameworkLinksTaskStatus(int assessmentId, bool taskStatus)
168171
{
169172
return competencyAssessmentDataService.UpdateFrameworkLinksTaskStatus(assessmentId, taskStatus);
170173
}
174+
175+
public int? GetPrimaryLinkedFrameworkId(int assessmentId)
176+
{
177+
return competencyAssessmentDataService.GetPrimaryLinkedFrameworkId(assessmentId);
178+
}
179+
180+
public bool RemoveSelfAssessmentFramework(int assessmentId, int frameworkId, int adminId)
181+
{
182+
return competencyAssessmentDataService.RemoveSelfAssessmentFramework(assessmentId, frameworkId, adminId);
183+
}
184+
185+
public int GetCompetencyCountByFrameworkId(int competencyAssessmentId, int frameworkId)
186+
{
187+
return competencyAssessmentDataService.GetCompetencyCountByFrameworkId(competencyAssessmentId, frameworkId);
188+
}
171189
}
172190
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
2+
using DigitalLearningSolutions.Data.Models.Frameworks;
3+
using DigitalLearningSolutions.Web.Attributes;
4+
using DocumentFormat.OpenXml.Office2010.Excel;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using System.Threading.Tasks;
8+
9+
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
10+
{
11+
public class ConfirmRemoveFrameworkSourceViewModel
12+
{
13+
public ConfirmRemoveFrameworkSourceViewModel() { }
14+
public ConfirmRemoveFrameworkSourceViewModel(CompetencyAssessmentBase competencyAssessmentBase, DetailFramework framework, int competencyCount)
15+
{
16+
CompetencyCount = competencyCount;
17+
AssessmentName = competencyAssessmentBase.CompetencyAssessmentName;
18+
FrameworkName = framework.FrameworkName;
19+
FrameworkID = framework.ID;
20+
}
21+
public string? AssessmentName { get; set; }
22+
public string? FrameworkName { get; set; }
23+
public int FrameworkID { get; set; }
24+
public int CompetencyCount { get; set; }
25+
[BooleanMustBeTrue(ErrorMessage = "You must confirm that you wish to remove this framework")]
26+
public bool Confirm { get; set; }
27+
28+
}
29+
}

DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/SelectFrameworkSourcesViewModel.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@ namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
88
public class SelectFrameworkSourcesViewModel : SelectFrameworkSourcesFormData
99
{
1010
public SelectFrameworkSourcesViewModel() { }
11-
public SelectFrameworkSourcesViewModel(CompetencyAssessmentBase competencyAssessmentBase, IEnumerable<BrandedFramework> frameworks, int[] selectedFrameworksIds, bool? taskStatus, string actionName)
11+
public SelectFrameworkSourcesViewModel(CompetencyAssessmentBase competencyAssessmentBase, IEnumerable<BrandedFramework> frameworks, int[] additionalFrameworksIds, int? primaryFramework, bool? taskStatus, string actionName)
1212
{
1313
ID = competencyAssessmentBase.ID;
1414
CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName;
1515
UserRole = competencyAssessmentBase.UserRole;
1616
TaskStatus = taskStatus;
17+
PrimaryFramework = frameworks.FirstOrDefault(f => f.ID == primaryFramework);
1718
Frameworks = frameworks.OrderBy(f => f.FrameworkName);
18-
SelectedFrameworks = [.. selectedFrameworksIds.Select(id => frameworks.First(f => f.ID == id))];
19+
AdditionalFrameworks = [.. additionalFrameworksIds.Select(id => frameworks.First(f => f.ID == id))];
1920
ActionName = actionName;
2021
}
2122
public IEnumerable<BrandedFramework> Frameworks { get; set; }
22-
public IEnumerable<BrandedFramework> SelectedFrameworks { get; set; }
23+
public IEnumerable<BrandedFramework> AdditionalFrameworks { get; set; }
24+
public BrandedFramework? PrimaryFramework { get; set; }
2325
public IEnumerable<NRPRoles> Roles { get; set; }
2426
public int ID { get; set; }
2527
public string CompetencyAssessmentName { get; set; }
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
2+
@model ConfirmRemoveFrameworkSourceViewModel;
3+
@{
4+
var errorHasOccurred = !ViewData.ModelState.IsValid;
5+
ViewData["Title"] = "Competency Assessments - Remove source framework";
6+
}
7+
<div class="nhsuk-grid-row">
8+
<div class="nhsuk-grid-column-full">
9+
@if (errorHasOccurred)
10+
{
11+
<vc:error-summary order-of-property-names="@(new[] { nameof(Model.Confirm), nameof(Model.DeleteEnrolments) })" />
12+
}
13+
14+
<h1 class="nhsuk-heading-xl">Delete delegate group</h1>
15+
</div>
16+
</div>
17+
18+
<vc:field-name-value-display display-name="Group name" field-value="@Model.FrameworkName" />
19+
20+
<div class="nhsuk-grid-row">
21+
<div class="nhsuk-grid-column-full">
22+
<form class="nhsuk-u-margin-bottom-3" method="post" asp-action="ConfirmDeleteGroup">
23+
<input type="hidden" asp-for="GroupLabel" />
24+
<input type="hidden" asp-for="DelegateCount" />
25+
<input type="hidden" asp-for="CourseCount" />
26+
<input type="hidden" asp-for="ReturnPageQuery" />
27+
28+
<p>
29+
This group has @Model.DelegateCount delegate@(DisplayStringHelper.GetPluralitySuffix(Model.DelegateCount))
30+
and @Model.CourseCount course@(DisplayStringHelper.GetPluralitySuffix(Model.CourseCount)). Deleting this
31+
group will permanently remove all the delegates and courses from this group.
32+
</p>
33+
34+
<vc:single-checkbox asp-for="@nameof(Model.Confirm)"
35+
label="I am sure that I wish to delete this group and remove all delegates and courses from it."
36+
hint-text="" />
37+
38+
<vc:single-checkbox asp-for="@nameof(Model.DeleteEnrolments)"
39+
label="Remove all related enrolments where course has been started but is not yet complete"
40+
hint-text="Optionally all enrolments on courses that have been started but are incomplete and are associated with the group membership can also be removed." />
41+
42+
<button class="nhsuk-button delete-button" type="submit">Delete group</button>
43+
</form>
44+
45+
<vc:cancel-link-with-return-page-query asp-controller="DelegateGroups" asp-action="Index" return-page-query="@Model.ReturnPageQuery" />
46+
</div>
47+
</div>

DigitalLearningSolutions.Web/Views/CompetencyAssessments/SelectFrameworkSources.cshtml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,43 +24,44 @@
2424
}
2525

2626
<h1>Select framework sources for @Model.CompetencyAssessmentName</h1>
27-
@if (Model.SelectedFrameworks.Count() > 0)
27+
<dl class="nhsuk-summary-list">
28+
@if (Model.PrimaryFramework != null)
2829
{
29-
<dl class="nhsuk-summary-list">
3030
<div class="nhsuk-summary-list__row">
3131
<dt class="nhsuk-summary-list__key">
3232
Primary framework
3333
</dt>
3434
<dd class="nhsuk-summary-list__value">
35-
@Model.SelectedFrameworks.First().FrameworkName
35+
@Model.PrimaryFramework.FrameworkName
3636
</dd>
3737
<dd class="nhsuk-summary-list__actions">
38-
<a asp-action="RemoveFramework" asp-route-Id="@Model.SelectedFrameworks.First().ID">
39-
Remove<span class="nhsuk-u-visually-hidden"> @Model.SelectedFrameworks.First().FrameworkName</span>
38+
<a asp-action="RemoveFramework" asp-route-frameworkId="@Model.PrimaryFramework.ID" asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
39+
Remove<span class="nhsuk-u-visually-hidden"> @Model.PrimaryFramework.FrameworkName</span>
4040
</a>
4141
</dd>
4242
</div>
43-
@if (Model.SelectedFrameworks.Count() > 1)
43+
44+
@if (Model.AdditionalFrameworks.Count() > 0)
4445
{
45-
for (int i = 1; i < Model.SelectedFrameworks.Count(); i++)
46+
for (int i = 0; i < Model.AdditionalFrameworks.Count(); i++)
4647
{
4748
<div class="nhsuk-summary-list__row">
4849
<dt class="nhsuk-summary-list__key">
4950
Additional framework @i
5051
</dt>
5152
<dd class="nhsuk-summary-list__value">
52-
@Model.SelectedFrameworks.ElementAt(i).FrameworkName
53+
@Model.AdditionalFrameworks.ElementAt(i).FrameworkName
5354
</dd>
5455
<dd class="nhsuk-summary-list__actions">
55-
<a asp-action="RemoveFramework" asp-route-Id="@Model.SelectedFrameworks.ElementAt(i).ID">
56-
Remove<span class="nhsuk-u-visually-hidden"> @Model.SelectedFrameworks.ElementAt(i).FrameworkName</span>
56+
<a asp-action="RemoveFramework" asp-route-frameworkId="@Model.AdditionalFrameworks.ElementAt(i).ID" asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
57+
Remove<span class="nhsuk-u-visually-hidden"> @Model.AdditionalFrameworks.ElementAt(i).FrameworkName</span>
5758
</a>
5859
</dd>
5960
</div>
6061
}
6162
}
62-
</dl>
6363
}
64+
</dl>
6465
@if (Model.ActionName == "AddFramework")
6566
{
6667
<form method="post">

0 commit comments

Comments
 (0)