Skip to content

Commit accd0ae

Browse files
authored
Merge pull request #3364 from TechnologyEnhancedLearning/Develop/Features/TD-5562-Promptuserstoaskwhichfeaturesoftheframeworktheywanttocopytoassessment
TD-5562 Prompt users to ask which features of the framework they want to copy to the assessment
2 parents 5f706f6 + 5e32b13 commit accd0ae

File tree

8 files changed

+451
-7
lines changed

8 files changed

+451
-7
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: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using DigitalLearningSolutions.Web.Helpers;
99
using DigitalLearningSolutions.Web.Models.Enums;
1010
using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments;
11+
using GDS.MultiPageFormData.Enums;
1112
using Microsoft.AspNetCore.Mvc;
1213
using Microsoft.AspNetCore.Mvc.Rendering;
1314
using Microsoft.Extensions.Logging;
@@ -82,7 +83,6 @@ public IActionResult ViewCompetencyAssessments(string tabname, string? searchStr
8283
isWorkforceManager
8384
);
8485
}
85-
8686
var currentTab = tabname == "All" ? CompetencyAssessmentsTab.AllCompetencyAssessments : CompetencyAssessmentsTab.MyCompetencyAssessments;
8787
CompetencyAssessmentsViewModel? model = new CompetencyAssessmentsViewModel(
8888
isWorkforceManager,
@@ -96,12 +96,18 @@ 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)
102103
{
103104
var adminId = GetAdminID();
104105
var competencyAssessmentBase = new CompetencyAssessmentBase();
106+
if ((frameworkId.HasValue && frameworkId.Value != 0 && actionName == "New"))
107+
{
108+
var data = new CompetencyAssessmentFeaturesViewModel();
109+
SetcompetencyAssessmentFeaturesData(data);
110+
}
105111
if (competencyAssessmentId > 0)
106112
{
107113
competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
@@ -129,6 +135,7 @@ public IActionResult CompetencyAssessmentName(string actionName, int competencyA
129135
[HttpPost]
130136
[Route("/CompetencyAssessments/{actionName}/Name/{competencyAssessmentId}")]
131137
[Route("/CompetencyAssessments/Framework/{frameworkId}/{actionName}/Name")]
138+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/{actionName}/Name")]
132139
[Route("/CompetencyAssessments/{actionName}/Name")]
133140
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
134141
public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessmentBase, string actionName, int competencyAssessmentId = 0, int? frameworkId = null)
@@ -153,6 +160,7 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme
153160
return View("Name", competencyAssessmentBase);
154161
}
155162
competencyAssessmentId = competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId);
163+
if(frameworkId.HasValue && frameworkId.Value != 0) return RedirectToAction("CompetencyAssessmentFeatures", new { competencyAssessmentId, frameworkId });
156164
}
157165
else
158166
{
@@ -163,6 +171,9 @@ public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessme
163171
ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name.");
164172
return View("Name", competencyAssessmentBase);
165173
}
174+
if (frameworkId.HasValue && frameworkId.Value != 0
175+
&& competencyAssessmentId != 0
176+
&& actionName == "Edit") return RedirectToAction("CompetencyAssessmentFeatures", new { competencyAssessmentId, frameworkId });
166177
}
167178
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId, frameworkId });
168179
}
@@ -640,5 +651,80 @@ public IActionResult ViewSelectedCompetencies(ViewSelectedCompetenciesFormData m
640651
competencyAssessmentService.UpdateSelectCompetenciesTaskStatus(model.ID, model.TaskStatus.Value, null);
641652
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID });
642653
}
654+
655+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Features")]
656+
public IActionResult CompetencyAssessmentFeatures(int competencyAssessmentId, int? frameworkId = null)
657+
{
658+
659+
var adminId = GetAdminID();
660+
var data = GetcompetencyAssessmentFeaturesData();
661+
if (!string.IsNullOrEmpty(data.CompetencyAssessmentName)) return View(data);
662+
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
663+
if (competencyAssessmentBase == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
664+
if (competencyAssessmentBase.UserRole < 2) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
665+
var baseModel = new CompetencyAssessmentFeaturesViewModel(competencyAssessmentBase.ID,
666+
competencyAssessmentBase.CompetencyAssessmentName,
667+
competencyAssessmentBase.UserRole,
668+
frameworkId);
669+
return View(baseModel);
670+
}
671+
[HttpPost]
672+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Features")]
673+
public IActionResult CompetencyAssessmentFeatures(CompetencyAssessmentFeaturesViewModel featuresViewModel)
674+
{
675+
if (featuresViewModel == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
676+
SetcompetencyAssessmentFeaturesData(featuresViewModel);
677+
return RedirectToAction("CompetencyAssessmentSummary", new { competencyAssessmentId = featuresViewModel.ID,featuresViewModel.FrameworkId });
678+
}
679+
680+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Summary")]
681+
public IActionResult CompetencyAssessmentSummary(int competencyAssessmentId, int? frameworkId = null)
682+
{
683+
if (competencyAssessmentService.GetSelfAssessmentStructure(competencyAssessmentId) != 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 });
684+
if (competencyAssessmentId == 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
685+
var data = GetcompetencyAssessmentFeaturesData();
686+
if (data == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
687+
SetcompetencyAssessmentFeaturesData(data);
688+
return View(data);
689+
}
690+
[HttpPost]
691+
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Summary")]
692+
public IActionResult CompetencyAssessmentSummary(CompetencyAssessmentFeaturesViewModel competency)
693+
{
694+
var data = GetcompetencyAssessmentFeaturesData();
695+
if (data.ID == 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
696+
if (competencyAssessmentService.GetSelfAssessmentStructure(data.ID) != 0) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 });
697+
var features = competencyAssessmentService.UpdateCompetencyAssessmentFeaturesTaskStatus(data.ID,
698+
data.DescriptionStatus,
699+
data.ProviderandCategoryStatus,
700+
data.VocabularyStatus,
701+
data.WorkingGroupStatus,
702+
data.AllframeworkCompetenciesStatus);
703+
if (!features) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
704+
competencyAssessmentService.UpdateSelfAssessmentFromFramework(data.ID , data.FrameworkId );
705+
var insertSelfAssessment = competencyAssessmentService.InsertSelfAssessmentStructure(data.ID, data.FrameworkId);
706+
if (!insertSelfAssessment) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 500 });
707+
multiPageFormService.ClearMultiPageFormData(MultiPageFormDataFeature.AddCustomWebForm("AssessmentFeaturesDataCWF"), TempData);
708+
TempData.Clear();
709+
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = competency.ID, competency.FrameworkId });
710+
}
711+
712+
private void SetcompetencyAssessmentFeaturesData(CompetencyAssessmentFeaturesViewModel data)
713+
{
714+
multiPageFormService.SetMultiPageFormData(
715+
data,
716+
MultiPageFormDataFeature.AddCustomWebForm("AssessmentFeaturesDataCWF"),
717+
TempData
718+
);
719+
}
720+
721+
private CompetencyAssessmentFeaturesViewModel GetcompetencyAssessmentFeaturesData()
722+
{
723+
var data = multiPageFormService.GetMultiPageFormData<CompetencyAssessmentFeaturesViewModel>(
724+
MultiPageFormDataFeature.AddCustomWebForm("AssessmentFeaturesDataCWF"),
725+
TempData
726+
).GetAwaiter().GetResult();
727+
return data;
728+
}
643729
}
644730
}

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessmentsController.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
using DigitalLearningSolutions.Web.Helpers;
44
using DigitalLearningSolutions.Web.Services;
5+
using GDS.MultiPageFormData;
56
using Microsoft.AspNetCore.Authorization;
67
using Microsoft.AspNetCore.Mvc;
78
using Microsoft.Extensions.Configuration;
@@ -16,20 +17,23 @@ public partial class CompetencyAssessmentsController : Controller
1617
private readonly IFrameworkNotificationService frameworkNotificationService;
1718
private readonly ILogger<CompetencyAssessmentsController> logger;
1819
private readonly IConfiguration config;
20+
private readonly IMultiPageFormService multiPageFormService;
1921
public CompetencyAssessmentsController(
2022
ICompetencyAssessmentService competencyAssessmentService,
2123
IFrameworkService frameworkService,
2224
ICommonService commonService,
2325
IFrameworkNotificationService frameworkNotificationService,
2426
ILogger<CompetencyAssessmentsController> logger,
25-
IConfiguration config)
27+
IConfiguration config,
28+
IMultiPageFormService multiPageFormService)
2629
{
2730
this.competencyAssessmentService = competencyAssessmentService;
2831
this.frameworkService = frameworkService;
2932
this.commonService = commonService;
3033
this.frameworkNotificationService = frameworkNotificationService;
3134
this.logger = logger;
3235
this.config = config;
36+
this.multiPageFormService = multiPageFormService;
3337
}
3438
public IActionResult Index()
3539
{

0 commit comments

Comments
 (0)