Skip to content

Commit 47d551e

Browse files
TD-5562 Prompt users to ask which features of the framework they want to copy to the assessment
1 parent 25fa3e0 commit 47d551e

File tree

7 files changed

+428
-5
lines changed

7 files changed

+428
-5
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 113 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Collections.Generic;
88
using System.Data;
99
using System.Linq;
10-
1110
public interface ICompetencyAssessmentDataService
1211
{
1312
//GET DATA
@@ -34,6 +33,8 @@ public interface ICompetencyAssessmentDataService
3433
IEnumerable<Competency> GetCompetenciesForCompetencyAssessment(int competencyAssessmentId);
3534
IEnumerable<LinkedFramework> GetLinkedFrameworksForCompetencyAssessment(int competencyAssessmentId);
3635
int[] GetLinkedFrameworkCompetencyIds(int competencyAssessmentId, int frameworkId);
36+
CompetencyAssessmentFeatures? GetCompetencyAssessmentFeaturesTaskStatus(int competencyAssessmentId);
37+
int? GetSelfAssessmentStructure(int competencyAssessmentId);
3738

3839
//UPDATE DATA
3940
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
@@ -64,12 +65,15 @@ void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId,
6465
int groupId,
6566
string direction
6667
);
68+
public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
69+
bool workingGroupStatus, bool AllframeworkCompetenciesStatus);
70+
void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId);
6771

6872
//INSERT DATA
6973
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
7074
bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId);
7175
bool InsertCompetenciesIntoAssessmentFromFramework(int[] selectedCompetencyIds, int frameworkId, int competencyAssessmentId);
72-
76+
bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId);
7377
//DELETE DATA
7478
bool RemoveFrameworkCompetenciesFromAssessment(int competencyAssessmentId, int frameworkId);
7579
bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int competencyId);
@@ -754,5 +758,112 @@ public void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId, int
754758
commandType: CommandType.StoredProcedure
755759
);
756760
}
761+
762+
public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
763+
bool workingGroupStatus, bool AllframeworkCompetenciesStatus)
764+
{
765+
var numberOfAffectedRows = connection.Execute(
766+
@"IF EXISTS (SELECT 1 FROM SelfAssessmentTaskStatus WHERE SelfAssessmentId = @id)
767+
BEGIN
768+
UPDATE SelfAssessmentTaskStatus
769+
SET IntroductoryTextTaskStatus = CASE WHEN @descriptionStatus = 1 THEN 1 ELSE NULL END,
770+
BrandingTaskStatus = CASE WHEN @providerandCategoryStatus = 1 THEN 1 ELSE NULL END,
771+
VocabularyTaskStatus = CASE WHEN @vocabularyStatus = 1 THEN 1 ELSE NULL END,
772+
WorkingGroupTaskStatus = CASE WHEN @workingGroupStatus = 1 THEN 1 ELSE NULL END,
773+
FrameworkLinksTaskStatus = CASE WHEN @AllframeworkCompetenciesStatus = 1 THEN 1 ELSE NULL END
774+
WHERE SelfAssessmentId = @id;
775+
END
776+
ELSE
777+
BEGIN
778+
INSERT INTO SelfAssessmentTaskStatus
779+
(SelfAssessmentId, IntroductoryTextTaskStatus, BrandingTaskStatus, VocabularyTaskStatus, WorkingGroupTaskStatus, FrameworkLinksTaskStatus)
780+
VALUES
781+
(
782+
@id,
783+
CASE WHEN @descriptionStatus = 1 THEN 1 ELSE NULL END,
784+
CASE WHEN @providerandCategoryStatus = 1 THEN 1 ELSE NULL END,
785+
CASE WHEN @vocabularyStatus = 1 THEN 1 ELSE NULL END,
786+
CASE WHEN @workingGroupStatus = 1 THEN 1 ELSE NULL END,
787+
CASE WHEN @AllframeworkCompetenciesStatus = 1 THEN 1 ELSE NULL END
788+
);
789+
END",
790+
new { id, descriptionStatus, providerandCategoryStatus, vocabularyStatus, workingGroupStatus, AllframeworkCompetenciesStatus }
791+
);
792+
if (numberOfAffectedRows < 1)
793+
{
794+
logger.LogWarning(
795+
"Not updating SelfAssessmentTaskStatus as db update failed. " +
796+
$"SelfAssessmentId: {id}, IntroductoryTextTaskStatus: {descriptionStatus}, BrandingTaskStatus: {providerandCategoryStatus}, " +
797+
$"VocabularyTaskStatus: {vocabularyStatus}, WorkingGroupTaskStatus: {workingGroupStatus}, FrameworkLinksTaskStatus: {AllframeworkCompetenciesStatus}"
798+
);
799+
return false;
800+
}
801+
return true;
802+
}
803+
804+
public CompetencyAssessmentFeatures? GetCompetencyAssessmentFeaturesTaskStatus(int competencyAssessmentId)
805+
{
806+
return connection.QueryFirstOrDefault<CompetencyAssessmentFeatures>(
807+
@"SELECT s.ID, s.Name AS CompetencyAssessmentName, sts.IntroductoryTextTaskStatus AS DescriptionStatus, sts.BrandingTaskStatus AS ProviderandCategoryStatus,
808+
sts.VocabularyTaskStatus AS VocabularyStatus, sts.WorkingGroupTaskStatus AS WorkingGroupStatus, sts.FrameworkLinksTaskStatus AS AllframeworkCompetenciesStatus
809+
FROM SelfAssessments s INNER JOIN
810+
SelfAssessmentTaskStatus sts ON s.ID = sts.SelfAssessmentId
811+
WHERE s.ID = @competencyAssessmentId",
812+
new { competencyAssessmentId }
813+
);
814+
815+
}
816+
817+
public void UpdateSelfAssessmentFromFramework( int selfAssessmentId, int? frameworkId)
818+
{
819+
820+
var numberOfAffectedRows = connection.Execute(
821+
@"UPDATE s
822+
SET
823+
[Description] = COALESCE(F.[Description], 'No description provided'),
824+
BrandID = F.BrandID,
825+
CategoryID = F.CategoryID,
826+
CreatedByCentreID = AU.CentreID,
827+
CreatedByAdminID = F.OwnerAdminID
828+
FROM SelfAssessments s
829+
INNER JOIN Frameworks F ON F.ID = @frameworkId
830+
INNER JOIN AdminUsers AU ON F.OwnerAdminID = AU.AdminID
831+
WHERE s.id = @selfAssessmentId;"
832+
,
833+
new {selfAssessmentId, frameworkId }
834+
);
835+
}
836+
public bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId)
837+
{
838+
839+
var numberOfAffectedRows = connection.Execute(
840+
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
841+
SELECT s.ID, FC.CompetencyID, ROW_NUMBER() OVER( ORDER BY FCG.Ordering, FC.Ordering ), FCG.CompetencyGroupID
842+
FROM FrameworkCompetencies AS FC
843+
INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID INNER JOIN
844+
SelfAssessments s ON s.id = @selfAssessmentId
845+
WHERE FC.FrameworkID = @frameworkId"
846+
,
847+
new { selfAssessmentId, frameworkId }
848+
);
849+
if (numberOfAffectedRows < 1)
850+
{
851+
logger.LogWarning(
852+
"Not inserting SelfAssessmentStructure record as db insert failed. " +
853+
$"selfAssessmentId: {selfAssessmentId}, frameworkId: {frameworkId}"
854+
);
855+
return false;
856+
}
857+
858+
return true;
859+
}
860+
public int? GetSelfAssessmentStructure(int competencyAssessmentId)
861+
{
862+
return connection.QueryFirstOrDefault<int>(
863+
@"SELECT 1 from dbo.SelfAssessmentStructure where selfassessmentid = @competencyAssessmentId",
864+
new { competencyAssessmentId }
865+
);
866+
867+
}
757868
}
758869
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments
8+
{
9+
public class CompetencyAssessmentFeatures
10+
{
11+
public int ID { get; set; }
12+
public string CompetencyAssessmentName { get; set; } = string.Empty;
13+
public int UserRole { get; set; }
14+
public bool DescriptionStatus { get; set; }
15+
public bool ProviderandCategoryStatus { get; set; }
16+
public bool VocabularyStatus { get; set; }
17+
public bool WorkingGroupStatus { get; set; }
18+
public bool AllframeworkCompetenciesStatus { get; set; }
19+
}
20+
}

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ public IActionResult ViewCompetencyAssessments(string tabname, string? searchStr
9696

9797
[Route("/CompetencyAssessments/{actionName}/Name/{competencyAssessmentId}")]
9898
[Route("/CompetencyAssessments/Framework/{frameworkId}/{actionName}/Name")]
99+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/{actionName}/Name")]
99100
[Route("/CompetencyAssessments/{actionName}/Name")]
100101
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
101102
public IActionResult CompetencyAssessmentName(string actionName, int competencyAssessmentId = 0, int? frameworkId = null)
@@ -129,6 +130,7 @@ public IActionResult CompetencyAssessmentName(string actionName, int competencyA
129130
[HttpPost]
130131
[Route("/CompetencyAssessments/{actionName}/Name/{competencyAssessmentId}")]
131132
[Route("/CompetencyAssessments/Framework/{frameworkId}/{actionName}/Name")]
133+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/{actionName}/Name")]
132134
[Route("/CompetencyAssessments/{actionName}/Name")]
133135
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
134136
public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessmentBase, string actionName, int competencyAssessmentId = 0, int? frameworkId = null)
@@ -153,6 +155,7 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme
153155
return View("Name", competencyAssessmentBase);
154156
}
155157
competencyAssessmentId = competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId);
158+
if(frameworkId.HasValue && frameworkId.Value != 0) return RedirectToAction("CompetencyAssessmentFeatures", new { competencyAssessmentId, frameworkId });
156159
}
157160
else
158161
{
@@ -163,6 +166,10 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme
163166
ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name.");
164167
return View("Name", competencyAssessmentBase);
165168
}
169+
if (frameworkId.HasValue && frameworkId.Value != 0
170+
&& competencyAssessmentId != 0
171+
&& actionName == "Edit") return RedirectToAction("CompetencyAssessmentFeatures", new { competencyAssessmentId, frameworkId });
172+
166173
}
167174
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId, frameworkId });
168175
}
@@ -640,5 +647,67 @@ public IActionResult ViewSelectedCompetencies(ViewSelectedCompetenciesFormData m
640647
competencyAssessmentService.UpdateSelectCompetenciesTaskStatus(model.ID, model.TaskStatus.Value, null);
641648
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID });
642649
}
650+
651+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Features")]
652+
public IActionResult CompetencyAssessmentFeatures(int competencyAssessmentId, int? frameworkId = null)
653+
{
654+
655+
var adminId = GetAdminID();
656+
if (competencyAssessmentId == 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
657+
var competencyAssessment = competencyAssessmentService.GetCompetencyAssessmentFeaturesTaskStatus(competencyAssessmentId);
658+
if (competencyAssessment != null)
659+
{
660+
var model = new CompetencyAssessmentFeaturesViewModel(competencyAssessment, frameworkId);
661+
return View(model);
662+
}
663+
664+
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
665+
if (competencyAssessmentBase == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
666+
if (competencyAssessmentBase.UserRole < 2) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
667+
668+
var baseModel = new CompetencyAssessmentFeaturesViewModel(competencyAssessmentBase.ID,
669+
competencyAssessmentBase.CompetencyAssessmentName,
670+
competencyAssessmentBase.UserRole,
671+
frameworkId);
672+
return View(baseModel);
673+
}
674+
[HttpPost]
675+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Features")]
676+
public IActionResult CompetencyAssessmentFeatures(CompetencyAssessmentFeaturesViewModel featuresViewModel)
677+
{
678+
if (featuresViewModel == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
679+
var competency = competencyAssessmentService.UpdateCompetencyAssessmentFeaturesTaskStatus(featuresViewModel.ID,
680+
featuresViewModel.DescriptionStatus,
681+
featuresViewModel.ProviderandCategoryStatus,
682+
featuresViewModel.VocabularyStatus,
683+
featuresViewModel.WorkingGroupStatus,
684+
featuresViewModel.AllframeworkCompetenciesStatus);
685+
if (!competency) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
686+
return RedirectToAction("CompetencyAssessmentSummary", new { competencyAssessmentId = featuresViewModel.ID,featuresViewModel.FrameworkId });
687+
688+
}
689+
690+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Summary")]
691+
public IActionResult CompetencyAssessmentSummary(int competencyAssessmentId, int? frameworkId = null)
692+
{
693+
if (competencyAssessmentService.GetSelfAssessmentStructure(competencyAssessmentId) != 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 });
694+
if (competencyAssessmentId == 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
695+
var competencyAssessment = competencyAssessmentService.GetCompetencyAssessmentFeaturesTaskStatus(competencyAssessmentId);
696+
if (competencyAssessment == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
697+
var model = new CompetencyAssessmentFeaturesViewModel(competencyAssessment, frameworkId);
698+
return View(model);
699+
}
700+
[HttpPost]
701+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Summary")]
702+
public IActionResult CompetencyAssessmentSummary(CompetencyAssessmentFeaturesViewModel competency)
703+
{
704+
if (competencyAssessmentService.GetSelfAssessmentStructure(competency.ID) != 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 });
705+
if (competency.ID == 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
706+
competencyAssessmentService.UpdateSelfAssessmentFromFramework(competency.ID , competency.FrameworkId );
707+
var insertSelfAssessment = competencyAssessmentService.InsertSelfAssessmentStructure(competency.ID, competency.FrameworkId);
708+
if (!insertSelfAssessment) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
709+
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = competency.ID, competency.FrameworkId });
710+
711+
}
643712
}
644713
}

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public interface ICompetencyAssessmentService
3030
bool RemoveSelfAssessmentFramework(int assessmentId, int frameworkId, int adminId);
3131

3232
int[] GetLinkedFrameworkCompetencyIds(int competencyAssessmentId, int frameworkId);
33-
33+
CompetencyAssessmentFeatures? GetCompetencyAssessmentFeaturesTaskStatus(int competencyAssessmentId);
34+
int? GetSelfAssessmentStructure(int competencyAssessmentId);
3435
//UPDATE DATA
3536
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
3637
bool UpdateCompetencyRoleProfileLinks(int competencyAssessmentId, int adminId, int? professionalGroupId, int? subGroupId, int? roleId);
@@ -53,13 +54,16 @@ void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId,
5354
int groupId,
5455
string direction
5556
);
57+
bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
58+
bool workingGroupStatus, bool AllframeworkCompetenciesStatus);
59+
void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId);
5660

5761
//INSERT DATA
5862
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
5963
bool InsertSelfAssessmentFramework(int adminId, int assessmentId, int frameworkId);
6064
int GetCompetencyCountByFrameworkId(int competencyAssessmentId, int frameworkId);
6165
bool InsertCompetenciesIntoAssessmentFromFramework(int[] selectedCompetencyIds, int frameworkId, int competencyAssessmentId);
62-
66+
bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId);
6367
//DELETE DATA
6468
bool RemoveFrameworkCompetenciesFromAssessment(int competencyAssessmentId, int frameworkId);
6569
bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int competencyId);
@@ -264,5 +268,27 @@ public void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId, int
264268
{
265269
competencyAssessmentDataService.MoveCompetencyGroupInSelfAssessment(competencyAssessmentId, groupId, direction);
266270
}
267-
}
271+
public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
272+
bool workingGroupStatus, bool AllframeworkCompetenciesStatus)
273+
{
274+
return competencyAssessmentDataService.UpdateCompetencyAssessmentFeaturesTaskStatus(id, descriptionStatus, providerandCategoryStatus, vocabularyStatus,
275+
workingGroupStatus, AllframeworkCompetenciesStatus);
276+
}
277+
public CompetencyAssessmentFeatures? GetCompetencyAssessmentFeaturesTaskStatus(int competencyAssessmentId)
278+
{
279+
return competencyAssessmentDataService.GetCompetencyAssessmentFeaturesTaskStatus(competencyAssessmentId);
280+
}
281+
public bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId)
282+
{
283+
return competencyAssessmentDataService.InsertSelfAssessmentStructure(selfAssessmentId, frameworkId);
284+
}
285+
public void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId)
286+
{
287+
competencyAssessmentDataService.UpdateSelfAssessmentFromFramework(selfAssessmentId, frameworkId);
288+
}
289+
public int? GetSelfAssessmentStructure(int competencyAssessmentId)
290+
{
291+
return competencyAssessmentDataService.GetSelfAssessmentStructure(competencyAssessmentId);
292+
}
293+
}
268294
}

0 commit comments

Comments
 (0)