Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@


namespace DigitalLearningSolutions.Data.Migrations
{
using FluentMigrator;

[Migration(202511241125)]
public class Alter_usp_MoveCompetencyInSelfAssessment : Migration
{
public override void Up()
{
Execute.Sql(Properties.Resources.TD_483_Alter_usp_MoveCompetencyInSelfAssessment_Up);
}
public override void Down()
{
Execute.Sql(Properties.Resources.TD_483_Alter_usp_MoveCompetencyInSelfAssessment_Down);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -520,4 +520,10 @@
<data name="TD_5552_Alter_SendRetiringSelfAssessmentNotification_Up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-5552-Alter_SendRetiringSelfAssessmentNotification_Up.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="TD_483_Alter_usp_MoveCompetencyInSelfAssessment_Down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-483-Alter_usp_MoveCompetencyInSelfAssessment_Down.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="TD_483_Alter_usp_MoveCompetencyInSelfAssessment_Up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-483-Alter_usp_MoveCompetencyInSelfAssessment_Up.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
</root>
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptio
//DELETE DATA
bool RemoveFrameworkCompetenciesFromAssessment(int competencyAssessmentId, int frameworkId);
bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int competencyId);
bool RemoveCompetencyGroupFromAssessment(int competencyAssessmentId, int competencyGroupId);
IEnumerable<CompetencyAssessmentCollaboratorDetail> GetCollaboratorsForCompetencyAssessmentId(int competencyAssessmentId);
int AddCollaboratorToCompetencyAssessment(int competencyAssessmentId, string? userEmail, bool canModify, int? centreID);
void RemoveCollaboratorFromCompetencyAssessment(int competencyAssessmentId, int id);
Expand Down Expand Up @@ -676,7 +677,7 @@ public IEnumerable<Competency> GetCompetenciesForCompetencyAssessment(int compet
return connection.Query<Competency>(
@"SELECT sas.ID AS StructureId, sas.CompetencyID, f.ID AS FrameworkId, f.FrameworkName, cg.ID AS GroupId, cg.Name AS GroupName, c.Name AS CompetencyName, c.Description AS CompetencyDescription, sas.Optional
FROM SelfAssessmentStructure AS sas INNER JOIN
Competencies AS c ON sas.CompetencyID = c.ID INNER JOIN
Competencies AS c ON sas.CompetencyID = c.ID LEFT JOIN
CompetencyGroups AS cg ON sas.CompetencyGroupID = cg.ID INNER JOIN
FrameworkCompetencies ON c.ID = FrameworkCompetencies.CompetencyID INNER JOIN
Frameworks AS f ON FrameworkCompetencies.FrameworkID = f.ID INNER JOIN
Expand Down Expand Up @@ -719,6 +720,7 @@ FROM SelfAssessmentStructure AS sas INNER JOIN

public bool InsertCompetenciesIntoAssessmentFromFramework(int[] selectedCompetencyIds, int frameworkId, int competencyAssessmentId)
{

var currentMaxOrdering = connection.ExecuteScalar<int>(
@"SELECT ISNULL(MAX(Ordering), 0) FROM SelfAssessmentStructure WHERE SelfAssessmentID = @competencyAssessmentId",
new { competencyAssessmentId }
Expand All @@ -731,7 +733,7 @@ public bool InsertCompetenciesIntoAssessmentFromFramework(int[] selectedCompeten
ROW_NUMBER() OVER (ORDER BY FCG.Ordering, FC.Ordering) + @currentMaxOrdering,
FCG.CompetencyGroupID
FROM FrameworkCompetencies AS FC
INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID
LEFT JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID
WHERE FC.FrameworkID = @frameworkId
AND FC.CompetencyID IN @selectedCompetencyIds AND FC.CompetencyID NOT IN (SELECT CompetencyID FROM SelfAssessmentStructure WHERE SelfAssessmentID = @competencyAssessmentId)",
new { selectedCompetencyIds, frameworkId, competencyAssessmentId, currentMaxOrdering }
Expand Down Expand Up @@ -764,6 +766,24 @@ public bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int compe
return true;
}

public bool RemoveCompetencyGroupFromAssessment(int competencyAssessmentId, int competencyGroupId)
{
var numberOfAffectedRows = connection.Execute(
@"DELETE FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @competencyAssessmentId AND CompetencyGroupId = @competencyGroupId",
new { competencyAssessmentId, competencyGroupId }
);
if (numberOfAffectedRows < 1)
{
logger.LogWarning(
"Not removing competency from assessment as db update failed. " +
$"assessmentId: {competencyAssessmentId}, competencyGroupId: {competencyGroupId}"
);
return false;
}
return true;
}

public void MoveCompetencyInSelfAssessment(int competencyAssessmentId, int competencyId, string direction)
{
connection.Execute(
Expand Down Expand Up @@ -879,43 +899,43 @@ FROM FrameworkCompetencies AS FC

return true;
}

public bool UpdatePrimaryFrameworkCompetencies(int assessmentId, int frameworkId)
{
connection.EnsureOpen();
using (var transaction = connection.BeginTransaction())
{
var numberOfAffectedRows = connection.Execute(
@"UPDATE SelfAssessmentFrameworks
var numberOfAffectedRows = connection.Execute(
@"UPDATE SelfAssessmentFrameworks
SET IsPrimary = 0
WHERE (SelfAssessmentId = @assessmentId)
AND (RemovedDate IS NULL)",
new { assessmentId },
transaction: transaction
);
new { assessmentId },
transaction: transaction
);

var numberOfAffectedRow = connection.Execute(
@"UPDATE SelfAssessmentFrameworks
var numberOfAffectedRow = connection.Execute(
@"UPDATE SelfAssessmentFrameworks
SET IsPrimary = 1
WHERE (SelfAssessmentId = @assessmentId)
AND (FrameworkId = @frameworkId)
AND (RemovedDate IS NULL)",
new { assessmentId, frameworkId },
transaction: transaction
);
new { assessmentId, frameworkId },
transaction: transaction
);

if ((numberOfAffectedRow < 1) || (numberOfAffectedRows < 1))
{
logger.LogWarning(
"Not updating SelfAssessmentFrameworks as db update failed. " +
$"assessmentId: {assessmentId}, frameworkId: {frameworkId}"
);
transaction.Rollback();
return false;
}
if ((numberOfAffectedRow < 1) || (numberOfAffectedRows < 1))
{
logger.LogWarning(
"Not updating SelfAssessmentFrameworks as db update failed. " +
$"assessmentId: {assessmentId}, frameworkId: {frameworkId}"
);
transaction.Rollback();
return false;
}

transaction.Commit();
return true;
transaction.Commit();
return true;
}
}
public int? GetSelfAssessmentStructure(int competencyAssessmentId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,33 @@ public IActionResult DeleteCompetency(int competencyAssessmentId, int competency
competencyAssessmentService.RemoveCompetencyFromAssessment(competencyAssessmentId, competencyId);
return RedirectToAction("ViewSelectedCompetencies", new { competencyAssessmentId });
}

[Route("/CompetencyAssessments/{competencyAssessmentId}/CompetencyGroup/Delete/{competencyGroupId}/{competencyCount}/Confirm")]
public IActionResult DeleteCompetencyGroupConfirm(int competencyAssessmentId, int competencyGroupId, int competencyCount)
{
var adminId = GetAdminID();
CompetencyAssessmentBase? competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
if (competencyAssessmentBase == null)
{
logger.LogWarning($"Failed to load DeleteCompetencyGroupConfirm page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}");
return StatusCode(500);
}
if (competencyAssessmentBase.UserRole < 2)
{
return StatusCode(403);
}
var model = new CompetencyGroupDeleteViewModel(competencyAssessmentId, competencyGroupId, competencyCount, competencyAssessmentBase.Vocabulary);

return View("RemoveCompetencyGroupConfirm", model);
}

public IActionResult DeleteCompetencyGroup(int competencyAssessmentId, int competencyGroupId)
{
competencyAssessmentService.RemoveCompetencyGroupFromAssessment(competencyAssessmentId, competencyGroupId);
return RedirectToAction("ViewSelectedCompetencies", new { competencyAssessmentId });
}


public IActionResult MoveCompetencyInSelfAssessment(int competencyAssessmentId, int competencyId, string direction)
{
var adminId = GetAdminID();
Expand Down Expand Up @@ -712,11 +739,11 @@ public IActionResult CompetencyAssessmentSummary(CompetencyAssessmentFeaturesVie
[Route("/CompetencyAssessments/{competencyAssessmentId}/Frameworks/{frameworkId}/Make")]
public IActionResult ConfirmMaKePrimaryFramework(int frameworkId, int competencyAssessmentId)
{
var adminId = GetAdminID();
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminId);
var model = new ConfirmMakePrimaryFrameworkViewModel(competencyAssessmentBase, framework);
return View("ConfirmMaKePrimaryFramework", model);
var adminId = GetAdminID();
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminId);
var model = new ConfirmMakePrimaryFrameworkViewModel(competencyAssessmentBase, framework);
return View("ConfirmMaKePrimaryFramework", model);
}
[HttpPost]
[Route("/CompetencyAssessments/{competencyAssessmentId}/Frameworks/{frameworkId}/Make")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus
//DELETE DATA
bool RemoveFrameworkCompetenciesFromAssessment(int competencyAssessmentId, int frameworkId);
bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int competencyId);
bool RemoveCompetencyGroupFromAssessment(int competencyAssessmentId, int competencyGroupId);
IEnumerable<CompetencyAssessmentCollaboratorDetail> GetCollaboratorsForCompetencyAssessmentId(int competencyAssessmentId);
int AddCollaboratorToCompetencyAssessment(int competencyAssessmentId, string? userEmail, bool canModify, int? centreID);
void RemoveCollaboratorFromCompetencyAssessment(int competencyAssessmentId, int id);
Expand Down Expand Up @@ -269,6 +270,10 @@ public bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int compe
{
return competencyAssessmentDataService.RemoveCompetencyFromAssessment(competencyAssessmentId, competencyId);
}
public bool RemoveCompetencyGroupFromAssessment(int competencyAssessmentId, int competencyGroupId)
{
return competencyAssessmentDataService.RemoveCompetencyGroupFromAssessment(competencyAssessmentId, competencyGroupId);
}

public void MoveCompetencyInSelfAssessment(int competencyAssessmentId, int competencyId, string direction)
{
Expand Down Expand Up @@ -297,7 +302,7 @@ public void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? framewo
{
competencyAssessmentDataService.UpdateSelfAssessmentFromFramework(selfAssessmentId, frameworkId);
}
public bool UpdatePrimaryFrameworkCompetencies(int assessmentId, int frameworkId)
public bool UpdatePrimaryFrameworkCompetencies(int assessmentId, int frameworkId)
{
return competencyAssessmentDataService.UpdatePrimaryFrameworkCompetencies(assessmentId, frameworkId);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
using DigitalLearningSolutions.Web.Helpers;

namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
{
public class CompetencyGroupDeleteViewModel
{
public CompetencyGroupDeleteViewModel(int competencyAssessmentId, int competencyGroupId, int competencyCount, string? Vocabulary)
{
CompetencyAssessmentId = competencyAssessmentId;
CompetencyGroupId = competencyGroupId;
CompetencyCount = competencyCount;
VocabularySingular = FrameworkVocabularyHelper.VocabularySingular(Vocabulary);
VocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(Vocabulary);
}
public int CompetencyAssessmentId { get; set; }
public int CompetencyGroupId { get; set; }
public int CompetencyCount { get; set; }
public string? Vocabulary { get; set; }
public string VocabularySingular { get; set; }
public string VocabularyPlural { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<ol class="nhsuk-breadcrumb__list">
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewCompetencyAssessments" asp-route-tabname="Mine">Competency Assessments</a></li>
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">Manage Competency Assessment</a></li>
<li class="nhsuk-breadcrumb__item">Select framework sources</li>
<li class="nhsuk-breadcrumb__item">Select Framework Sources</li>
</ol>
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">Back to manage competency assessment</a></p>
</div>
Expand All @@ -35,7 +35,7 @@
{
@foreach (var competencyGroup in Model.GroupedCompetencies)
{
@if (competencyGroup.FrameworkCompetencies.Count() > 1)
@if (competencyGroup.FrameworkCompetencies.Count() > 0)
{
<div class="nhsuk-u-margin-bottom-6">
<h3>
Expand Down Expand Up @@ -92,7 +92,7 @@
{

<div class="nhsuk-checkboxes__item">
<input class="nhsuk-checkboxes__input select-all-checkbox" data-group="0" id="[email protected]" name="IncludedSelfAssessmentStructureIds" checked="@(Model.SelectedCompetencyIds != null ? Model.SelectedCompetencyIds.Contains((int)competency.CompetencyID) : false)" type="checkbox" value="@competency.CompetencyID">
<input class="nhsuk-checkboxes__input select-all-checkbox" data-group="0" id="[email protected]" name="SelectedCompetencyIds" checked="@(Model.SelectedCompetencyIds != null ? Model.SelectedCompetencyIds.Contains((int)competency.CompetencyID) : false)" type="checkbox" value="@competency.CompetencyID">
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
@foreach (var flag in competency.CompetencyFlags)
{
Expand Down
Loading
Loading