diff --git a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs index c01d1ec1b1..c92e023863 100644 --- a/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs @@ -153,7 +153,7 @@ int delegateUserId void RemoveEnrolment(int selfAssessmentId, int delegateUserId); (IEnumerable, int) GetSelfAssessmentDelegates(string searchString, int offSet, int itemsPerPage, string sortBy, string sortDirection, - int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff); + int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, bool? started); IEnumerable GetDelegatesOnSelfAssessmentForExport(int? selfAssessmentId, int centreId); @@ -269,7 +269,7 @@ FROM SelfAssessments } public (IEnumerable, int) GetSelfAssessmentDelegates(string searchString, int offSet, int itemsPerPage, string sortBy, string sortDirection, - int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff) + int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, bool? started) { searchString = searchString == null ? string.Empty : searchString.Trim(); @@ -326,6 +326,7 @@ LEFT JOIN dbo.CandidateAssessmentSupervisorVerifications AS casv WITH (NOLOCK) O AND ((@isDelegateActive IS NULL) OR (@isDelegateActive = 1 AND (da.Active = 1)) OR (@isDelegateActive = 0 AND (da.Active = 0))) AND ((@removed IS NULL) OR (@removed = 1 AND (ca.RemovedDate IS NOT NULL)) OR (@removed = 0 AND (ca.RemovedDate IS NULL))) AND ((@submitted IS NULL) OR (@submitted = 1 AND (ca.SubmittedDate IS NOT NULL)) OR (@submitted = 0 AND (ca.SubmittedDate IS NULL))) + AND ((@started IS NULL) OR (@started = 1 AND (ca.LaunchCount >= 1)) OR (@started = 0 AND (ca.LaunchCount = 0))) AND COALESCE(ucd.Email, u.PrimaryEmail) LIKE '%_@_%' "; var groupBy = $@" GROUP BY @@ -393,7 +394,8 @@ LEFT JOIN dbo.CandidateAssessmentSupervisorVerifications AS casv WITH (NOLOCK) O isDelegateActive, removed, submitted, - signedOff + signedOff, + started }, commandTimeout: 3000 ); @@ -415,7 +417,8 @@ LEFT JOIN dbo.CandidateAssessmentSupervisorVerifications AS casv WITH (NOLOCK) O isDelegateActive, removed, submitted, - signedOff + signedOff, + started }, commandTimeout: 3000 ); diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/CourseDelegatesControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/CourseDelegatesControllerTests.cs index 9db876b8b9..619e905be9 100644 --- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/CourseDelegatesControllerTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/CourseDelegatesControllerTests.cs @@ -95,7 +95,7 @@ public void Index_shows_index_page_when_no_selfAssessmentId_supplied() var selfAssessmentDelegate = new SelfAssessmentDelegate(6, "Lname"); A.CallTo(() => selfAssessmentDelegatesService.GetSelfAssessmentDelegatesPerPage("", 0, 10, "SearchableName", "Ascending", - 6, UserCentreId, null, null, null, null, null)) + 6, UserCentreId, null, null, null, null, null, null)) .Returns((new SelfAssessmentDelegatesData( new List { selfAssessmentDelegate } ), 1) @@ -137,7 +137,7 @@ public void SelfAssessmentDelegates_Index_returns_ViewResult_with_EmptyDelegates var selfAssessmentDelegate = new SelfAssessmentDelegate(6, "Lname"); A.CallTo(() => selfAssessmentDelegatesService.GetSelfAssessmentDelegatesPerPage("", 0, 10, "SearchableName", "Ascending", - 10, UserCentreId, null, null, null, null, null)) + 10, UserCentreId, null, null, null, null, null, null)) .Returns((new SelfAssessmentDelegatesData( new List { selfAssessmentDelegate } ), 0) diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs index 3352b34d74..1ed86e9047 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs @@ -129,8 +129,8 @@ public IActionResult Index( var adminCategoryId = User.GetAdminCategoryId(); - bool? isDelegateActive, isProgressLocked, removed, hasCompleted, submitted, signedOff; - isDelegateActive = isProgressLocked = removed = hasCompleted = submitted = signedOff = null; + bool? isDelegateActive, isProgressLocked, removed, hasCompleted, submitted, signedOff, started; + isDelegateActive = isProgressLocked = removed = hasCompleted = submitted = signedOff = started =null; string? answer1, answer2, answer3; answer1 = answer2 = answer3 = null; @@ -181,6 +181,9 @@ public IActionResult Index( if (filter.Contains("Answer3")) answer3 = filterValue; + + if (filter.Contains("LearnerActivity")) + started = filterValue; } } } @@ -211,7 +214,7 @@ public IActionResult Index( else { (selfAssessmentDelegatesData, resultCount) = selfAssessmentService.GetSelfAssessmentDelegatesPerPage(searchString ?? string.Empty, offSet, itemsPerPage ?? 0, sortBy, sortDirection, - selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff, adminCategoryId); + selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff, adminCategoryId, started); if (selfAssessmentDelegatesData?.Delegates == null && resultCount == null) { @@ -223,7 +226,7 @@ public IActionResult Index( { page = 1; offSet = 0; (selfAssessmentDelegatesData, resultCount) = selfAssessmentService.GetSelfAssessmentDelegatesPerPage(searchString ?? string.Empty, offSet, itemsPerPage ?? 0, sortBy, sortDirection, - selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff, adminCategoryId); + selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff, adminCategoryId, started); } var adminId = User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserAdminId); diff --git a/DigitalLearningSolutions.Web/Helpers/FilterOptions/SelfAssessmentDelegateFilterOptions.cs b/DigitalLearningSolutions.Web/Helpers/FilterOptions/SelfAssessmentDelegateFilterOptions.cs index d00e8e297b..90bd3d41a8 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilterOptions/SelfAssessmentDelegateFilterOptions.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilterOptions/SelfAssessmentDelegateFilterOptions.cs @@ -72,5 +72,20 @@ public static class SelfAssessmentSignedOffFilterOptions FilterStatus.Default ); } + public static class SelfAssessmentLearnerActivityFilterOptions + { + private const string Group = "LearnerActivity"; + + public static readonly FilterOptionModel Started = new FilterOptionModel( + "Started", + FilteringHelper.BuildFilterValueString(Group, nameof(SelfAssessmentDelegate.LaunchCount), "true"), + FilterStatus.Success + ); + public static readonly FilterOptionModel NotStarted = new FilterOptionModel( + "Not started", + FilteringHelper.BuildFilterValueString(Group, nameof(SelfAssessmentDelegate.LaunchCount), "false"), + FilterStatus.Default + ); + } } diff --git a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs index 27ae5e3930..a981ed44c8 100644 --- a/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs +++ b/DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs @@ -132,7 +132,7 @@ int delegateUserId void RemoveEnrolment(int selfAssessmentId, int delegateUserId); public (SelfAssessmentDelegatesData, int?) GetSelfAssessmentDelegatesPerPage(string searchString, int offSet, int itemsPerPage, string sortBy, string sortDirection, - int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, int? adminCategoryId); + int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, int? adminCategoryId, bool? started); public SelfAssessmentDelegatesData GetSelfAssessmentActivityDelegatesExport(string searchString, int itemsPerPage, string sortBy, string sortDirection, int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, int currentRun, bool? submitted, bool? signedOff); public int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string sortBy, string sortDirection, @@ -480,7 +480,7 @@ public void RemoveEnrolment(int selfAssessmentId, int delegateUserId) } public (SelfAssessmentDelegatesData, int?) GetSelfAssessmentDelegatesPerPage(string searchString, int offSet, int itemsPerPage, string sortBy, string sortDirection, - int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, int? adminCategoryId) + int? selfAssessmentId, int centreId, bool? isDelegateActive, bool? removed, bool? submitted, bool? signedOff, int? adminCategoryId, bool? started) { var selfAssessmentCategoryId = selfAssessmentDataService.GetSelfAssessmentCategoryId((int)selfAssessmentId); @@ -492,7 +492,7 @@ public void RemoveEnrolment(int selfAssessmentId, int delegateUserId) } (var delegateselfAssessments, int resultCount) = selfAssessmentDataService.GetSelfAssessmentDelegates(searchString, offSet, itemsPerPage, sortBy, sortDirection, - selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff); + selfAssessmentId, centreId, isDelegateActive, removed, submitted, signedOff, started); List selfAssessmentDelegateList = new List(); foreach (var delegateInfo in delegateselfAssessments) diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Delegates/CourseDelegates/SelfAssessmentDelegateViewModelFilterOptions.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Delegates/CourseDelegates/SelfAssessmentDelegateViewModelFilterOptions.cs index c06c696d27..7f6f0f65af 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Delegates/CourseDelegates/SelfAssessmentDelegateViewModelFilterOptions.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Delegates/CourseDelegates/SelfAssessmentDelegateViewModelFilterOptions.cs @@ -29,6 +29,11 @@ public class SelfAssessmentDelegateViewModelFilterOptions SelfAssessmentSignedOffFilterOptions.SignedOff, SelfAssessmentSignedOffFilterOptions.NotSignedOff, }; + public static readonly IEnumerable LearnerActivityStatusOptions = new[] + { + SelfAssessmentLearnerActivityFilterOptions.Started, + SelfAssessmentLearnerActivityFilterOptions.NotStarted, + }; public static List GetAllSelfAssessmentDelegatesFilterViewModels() { @@ -38,6 +43,7 @@ public static List GetAllSelfAssessmentDelegatesFilterViewModels() new FilterModel("RemovedStatus", "Removed status", RemovedStatusOptions, "status"), new FilterModel("SubmittedStatus", "Submitted status", SubmittedStatusOptions,"status"), new FilterModel("SignedOffStatus", "Signed off status", SignedOffStatusOptions, "status"), + new FilterModel("LearnerActivityStatus", "Learner activity status", LearnerActivityStatusOptions, "status"), }; return filters; }