Skip to content

Commit 1e5d9e2

Browse files
committed
Merge branch 'DLS-Release-v1.3.0' into Develop/Features/TD-5310-OptionalCompetencies
2 parents c449750 + 35c8e07 commit 1e5d9e2

File tree

19 files changed

+612
-102
lines changed

19 files changed

+612
-102
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);
@@ -756,5 +760,112 @@ public void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId, int
756760
commandType: CommandType.StoredProcedure
757761
);
758762
}
763+
764+
public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
765+
bool workingGroupStatus, bool AllframeworkCompetenciesStatus)
766+
{
767+
var numberOfAffectedRows = connection.Execute(
768+
@"IF EXISTS (SELECT 1 FROM SelfAssessmentTaskStatus WHERE SelfAssessmentId = @id)
769+
BEGIN
770+
UPDATE SelfAssessmentTaskStatus
771+
SET IntroductoryTextTaskStatus = CASE WHEN @descriptionStatus = 1 THEN 1 ELSE NULL END,
772+
BrandingTaskStatus = CASE WHEN @providerandCategoryStatus = 1 THEN 1 ELSE NULL END,
773+
VocabularyTaskStatus = CASE WHEN @vocabularyStatus = 1 THEN 1 ELSE NULL END,
774+
WorkingGroupTaskStatus = CASE WHEN @workingGroupStatus = 1 THEN 1 ELSE NULL END,
775+
FrameworkLinksTaskStatus = CASE WHEN @AllframeworkCompetenciesStatus = 1 THEN 1 ELSE NULL END
776+
WHERE SelfAssessmentId = @id;
777+
END
778+
ELSE
779+
BEGIN
780+
INSERT INTO SelfAssessmentTaskStatus
781+
(SelfAssessmentId, IntroductoryTextTaskStatus, BrandingTaskStatus, VocabularyTaskStatus, WorkingGroupTaskStatus, FrameworkLinksTaskStatus)
782+
VALUES
783+
(
784+
@id,
785+
CASE WHEN @descriptionStatus = 1 THEN 1 ELSE NULL END,
786+
CASE WHEN @providerandCategoryStatus = 1 THEN 1 ELSE NULL END,
787+
CASE WHEN @vocabularyStatus = 1 THEN 1 ELSE NULL END,
788+
CASE WHEN @workingGroupStatus = 1 THEN 1 ELSE NULL END,
789+
CASE WHEN @AllframeworkCompetenciesStatus = 1 THEN 1 ELSE NULL END
790+
);
791+
END",
792+
new { id, descriptionStatus, providerandCategoryStatus, vocabularyStatus, workingGroupStatus, AllframeworkCompetenciesStatus }
793+
);
794+
if (numberOfAffectedRows < 1)
795+
{
796+
logger.LogWarning(
797+
"Not updating SelfAssessmentTaskStatus as db update failed. " +
798+
$"SelfAssessmentId: {id}, IntroductoryTextTaskStatus: {descriptionStatus}, BrandingTaskStatus: {providerandCategoryStatus}, " +
799+
$"VocabularyTaskStatus: {vocabularyStatus}, WorkingGroupTaskStatus: {workingGroupStatus}, FrameworkLinksTaskStatus: {AllframeworkCompetenciesStatus}"
800+
);
801+
return false;
802+
}
803+
return true;
804+
}
805+
806+
public CompetencyAssessmentFeatures? GetCompetencyAssessmentFeaturesTaskStatus(int competencyAssessmentId)
807+
{
808+
return connection.QueryFirstOrDefault<CompetencyAssessmentFeatures>(
809+
@"SELECT s.ID, s.Name AS CompetencyAssessmentName, sts.IntroductoryTextTaskStatus AS DescriptionStatus, sts.BrandingTaskStatus AS ProviderandCategoryStatus,
810+
sts.VocabularyTaskStatus AS VocabularyStatus, sts.WorkingGroupTaskStatus AS WorkingGroupStatus, sts.FrameworkLinksTaskStatus AS AllframeworkCompetenciesStatus
811+
FROM SelfAssessments s INNER JOIN
812+
SelfAssessmentTaskStatus sts ON s.ID = sts.SelfAssessmentId
813+
WHERE s.ID = @competencyAssessmentId",
814+
new { competencyAssessmentId }
815+
);
816+
817+
}
818+
819+
public void UpdateSelfAssessmentFromFramework( int selfAssessmentId, int? frameworkId)
820+
{
821+
822+
var numberOfAffectedRows = connection.Execute(
823+
@"UPDATE s
824+
SET
825+
[Description] = COALESCE(F.[Description], 'No description provided'),
826+
BrandID = F.BrandID,
827+
CategoryID = F.CategoryID,
828+
CreatedByCentreID = AU.CentreID,
829+
CreatedByAdminID = F.OwnerAdminID
830+
FROM SelfAssessments s
831+
INNER JOIN Frameworks F ON F.ID = @frameworkId
832+
INNER JOIN AdminUsers AU ON F.OwnerAdminID = AU.AdminID
833+
WHERE s.id = @selfAssessmentId;"
834+
,
835+
new {selfAssessmentId, frameworkId }
836+
);
837+
}
838+
public bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId)
839+
{
840+
841+
var numberOfAffectedRows = connection.Execute(
842+
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
843+
SELECT s.ID, FC.CompetencyID, ROW_NUMBER() OVER( ORDER BY FCG.Ordering, FC.Ordering ), FCG.CompetencyGroupID
844+
FROM FrameworkCompetencies AS FC
845+
INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID INNER JOIN
846+
SelfAssessments s ON s.id = @selfAssessmentId
847+
WHERE FC.FrameworkID = @frameworkId"
848+
,
849+
new { selfAssessmentId, frameworkId }
850+
);
851+
if (numberOfAffectedRows < 1)
852+
{
853+
logger.LogWarning(
854+
"Not inserting SelfAssessmentStructure record as db insert failed. " +
855+
$"selfAssessmentId: {selfAssessmentId}, frameworkId: {frameworkId}"
856+
);
857+
return false;
858+
}
859+
860+
return true;
861+
}
862+
public int? GetSelfAssessmentStructure(int competencyAssessmentId)
863+
{
864+
return connection.QueryFirstOrDefault<int>(
865+
@"SELECT 1 from dbo.SelfAssessmentStructure where selfassessmentid = @competencyAssessmentId",
866+
new { competencyAssessmentId }
867+
);
868+
869+
}
759870
}
760871
}

DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ int adminId
8080

8181
IEnumerable<GenericSelectList> GetAssessmentQuestions(int frameworkId, int adminId);
8282

83-
FrameworkDefaultQuestionUsage? GetFrameworkDefaultQuestionUsage(int frameworkId, int assessmentQuestionId);
83+
FrameworkDefaultQuestionUsage GetFrameworkDefaultQuestionUsage(int frameworkId, int assessmentQuestionId);
8484

8585
IEnumerable<GenericSelectList> GetAssessmentQuestionsForCompetency(int frameworkCompetencyId, int adminId);
8686

87-
AssessmentQuestionDetail? GetAssessmentQuestionDetailById(int assessmentQuestionId, int adminId);
87+
AssessmentQuestionDetail GetAssessmentQuestionDetailById(int assessmentQuestionId, int adminId);
8888

89-
LevelDescriptor? GetLevelDescriptorForAssessmentQuestionId(int assessmentQuestionId, int adminId, int level);
89+
LevelDescriptor GetLevelDescriptorForAssessmentQuestionId(int assessmentQuestionId, int adminId, int level);
9090

9191
IEnumerable<CompetencyResourceAssessmentQuestionParameter>
9292
GetSignpostingResourceParametersByFrameworkAndCompetencyId(int frameworkId, int competencyId);
@@ -122,7 +122,7 @@ bool zeroBased
122122
FrameworkReviewOutcomeNotification? GetFrameworkReviewNotification(int reviewId);
123123

124124
//INSERT DATA
125-
BrandedFramework? CreateFramework(DetailFramework detailFramework, int adminId);
125+
BrandedFramework CreateFramework(DetailFramework detailFramework, int adminId);
126126

127127
int InsertCompetencyGroup(string groupName, string? groupDescription, int adminId, int? frameworkId);
128128

@@ -367,7 +367,7 @@ public FrameworkDataService(IDbConnection connection, ILogger<FrameworkDataServi
367367
);
368368
}
369369

370-
public BaseFramework? GetBaseFrameworkByFrameworkId(int frameworkId, int adminId)
370+
public BaseFramework GetBaseFrameworkByFrameworkId(int frameworkId, int adminId)
371371
{
372372
return connection.QueryFirstOrDefault<BaseFramework>(
373373
$@"SELECT {BaseFrameworkFields}
@@ -377,7 +377,7 @@ public FrameworkDataService(IDbConnection connection, ILogger<FrameworkDataServi
377377
);
378378
}
379379

380-
public BrandedFramework? GetBrandedFrameworkByFrameworkId(int frameworkId, int adminId)
380+
public BrandedFramework GetBrandedFrameworkByFrameworkId(int frameworkId, int adminId)
381381
{
382382
return connection.QueryFirstOrDefault<BrandedFramework>(
383383
$@"SELECT {BaseFrameworkFields} {BrandedFrameworkFields}
@@ -484,7 +484,7 @@ public IEnumerable<FrameworkCompetency> GetAllCompetenciesForAdminId(string name
484484
);
485485
}
486486

487-
public BrandedFramework? CreateFramework(DetailFramework detailFramework, int adminId)
487+
public BrandedFramework CreateFramework(DetailFramework detailFramework, int adminId)
488488
{
489489
string frameworkName = detailFramework.FrameworkName;
490490
var description = detailFramework.Description;
@@ -532,7 +532,7 @@ public IEnumerable<FrameworkCompetency> GetAllCompetenciesForAdminId(string name
532532
return new BrandedFramework();
533533
}
534534

535-
return connection.QueryFirstOrDefault<BrandedFramework?>(
535+
return connection.QueryFirstOrDefault<BrandedFramework>(
536536
$@"SELECT {BaseFrameworkFields}
537537
FROM {FrameworkTables}
538538
WHERE FrameworkName = @frameworkName AND OwnerAdminID = @adminId",
@@ -873,7 +873,7 @@ FROM SelfAssessmentStructure
873873
(SELECT COUNT(*) FROM CompetencyAssessmentQuestions caq WHERE caq.CompetencyID = c.ID) AS AssessmentQuestions
874874
,(SELECT COUNT(*) FROM CompetencyLearningResources clr WHERE clr.CompetencyID = c.ID AND clr.RemovedDate IS NULL) AS CompetencyLearningResourcesCount
875875
FROM FrameworkCompetencyGroups AS fcg INNER JOIN
876-
CompetencyGroups AS cg ON fcg.CompetencyGroupID = cg.ID INNER JOIN
876+
CompetencyGroups AS cg ON fcg.CompetencyGroupID = cg.ID LEFT OUTER JOIN
877877
FrameworkCompetencies AS fc ON fcg.ID = fc.FrameworkCompetencyGroupID LEFT OUTER JOIN
878878
Competencies AS c ON fc.CompetencyID = c.ID
879879
WHERE (fcg.FrameworkID = @frameworkId) {assessmentFilter}
@@ -1531,7 +1531,7 @@ FROM AssessmentQuestionInputTypes"
15311531
);
15321532
}
15331533

1534-
public FrameworkDefaultQuestionUsage? GetFrameworkDefaultQuestionUsage(int frameworkId, int assessmentQuestionId)
1534+
public FrameworkDefaultQuestionUsage GetFrameworkDefaultQuestionUsage(int frameworkId, int assessmentQuestionId)
15351535
{
15361536
return connection.QueryFirstOrDefault<FrameworkDefaultQuestionUsage>(
15371537
@"SELECT @assessmentQuestionId AS ID,
@@ -1632,7 +1632,7 @@ FROM CompetencyAssessmentQuestions INNER JOIN
16321632
}
16331633
}
16341634

1635-
public AssessmentQuestionDetail? GetAssessmentQuestionDetailById(int assessmentQuestionId, int adminId)
1635+
public AssessmentQuestionDetail GetAssessmentQuestionDetailById(int assessmentQuestionId, int adminId)
16361636
{
16371637
return connection.QueryFirstOrDefault<AssessmentQuestionDetail>(
16381638
$@"{AssessmentQuestionFields}{AssessmentQuestionDetailFields}
@@ -1642,7 +1642,7 @@ FROM CompetencyAssessmentQuestions INNER JOIN
16421642
);
16431643
}
16441644

1645-
public LevelDescriptor? GetLevelDescriptorForAssessmentQuestionId(
1645+
public LevelDescriptor GetLevelDescriptorForAssessmentQuestionId(
16461646
int assessmentQuestionId,
16471647
int adminId,
16481648
int level
@@ -2516,7 +2516,7 @@ FROM Flags AS f
25162516
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS FlagsCsv
25172517
FROM
25182518
Competencies AS c INNER JOIN
2519-
FrameworkCompetencies AS fc ON c.ID = fc.CompetencyID INNER JOIN
2519+
FrameworkCompetencies AS fc ON c.ID = fc.CompetencyID LEFT JOIN
25202520
FrameworkCompetencyGroups AS fcg ON fc.FrameworkCompetencyGroupID = fcg.ID LEFT JOIN
25212521
CompetencyGroups AS cg ON fcg.CompetencyGroupID = cg.ID
25222522
WHERE (fc.FrameworkID = @frameworkId)
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.Tests/Controllers/LearningPortal/SelfAssessmentTests.cs

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -871,28 +871,6 @@ public void SelfAssessmentOverview_Should_Return_View_With_Optional_Filter_Appli
871871
result.Should().BeViewResult().ModelAs<SelfAssessmentOverviewViewModel>().CompetencyGroups.ToList()[0].Count().Should().Be(1);
872872
}
873873

874-
[Test]
875-
public void SelfAssessment_should_return_process_agreement_view_when_not_agreed_and_supervised()
876-
{
877-
// Given
878-
var selfAssessment = SelfAssessmentTestHelper.CreateDefaultSelfAssessment();
879-
selfAssessment.IsSupervised = true;
880-
selfAssessment.SelfAssessmentProcessAgreed = false;
881-
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(DelegateUserId, SelfAssessmentId))
882-
.Returns(selfAssessment);
883-
A.CallTo(() => selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(SelfAssessmentId, DelegateUserId))
884-
.Returns(new List<SelfAssessmentSupervisor>());
885-
886-
// When
887-
var result = controller.SelfAssessment(SelfAssessmentId);
888-
889-
// Then
890-
result.Should().BeViewResult()
891-
.WithViewName("SelfAssessments/AgreeSelfAssessmentProcess")
892-
.Model.Should().BeOfType<SelfAssessmentProcessViewModel>()
893-
.Which.SelfAssessmentID.Should().Be(SelfAssessmentId);
894-
}
895-
896874
[Test]
897875
public void SelfAssessment_should_return_description_view_when_process_agreed_or_not_supervised()
898876
{
@@ -931,25 +909,25 @@ public void ProcessAgreed_should_return_agree_view_when_modelstate_invalid()
931909
}
932910

933911
[Test]
934-
public void ProcessAgreed_should_mark_progress_and_return_description_view()
912+
public void ProcessAgreed_should_mark_progress_and_redirect_to_self_assessment()
935913
{
936914
// Given
937915
var selfAssessment = SelfAssessmentTestHelper.CreateDefaultSelfAssessment();
938-
var supervisors = new List<SelfAssessmentSupervisor>();
939916
var model = new SelfAssessmentProcessViewModel { SelfAssessmentID = SelfAssessmentId };
940917
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(DelegateUserId, SelfAssessmentId))
941918
.Returns(selfAssessment);
942-
A.CallTo(() => selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(SelfAssessmentId, DelegateUserId))
943-
.Returns(supervisors);
944919

945920
// When
946921
var result = controller.ProcessAgreed(model);
947922

948923
// Then
949-
A.CallTo(() => selfAssessmentService.MarkProgressAgreed(SelfAssessmentId, DelegateUserId)).MustHaveHappened();
950-
result.Should().BeViewResult()
951-
.WithViewName("SelfAssessments/SelfAssessmentDescription")
952-
.Model.Should().BeEquivalentTo(new SelfAssessmentDescriptionViewModel(selfAssessment, supervisors));
924+
A.CallTo(() => selfAssessmentService.MarkProgressAgreed(SelfAssessmentId, DelegateUserId))
925+
.MustHaveHappenedOnceExactly();
926+
927+
result.Should().BeRedirectToActionResult()
928+
.WithActionName("SelfAssessment")
929+
.WithRouteValue("selfAssessmentId", SelfAssessmentId);
953930
}
931+
954932
}
955933
}

0 commit comments

Comments
 (0)