Skip to content

Commit cb5d0ad

Browse files
committed
Merge branch 'Release-2024.32' into Develop/Fix/TD-4232-Course-Certificate-Console-errors
2 parents ab84239 + 698ac7b commit cb5d0ad

File tree

14 files changed

+86
-45
lines changed

14 files changed

+86
-45
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace DigitalLearningSolutions.Data.Migrations
2+
{
3+
using FluentMigrator;
4+
5+
[Migration(202406140805)]
6+
public class UpdateProgressMarkSubmittedTimeAsNullable : Migration
7+
{
8+
public override void Up()
9+
{
10+
Alter.Table("Progress")
11+
.AlterColumn("SubmittedTime")
12+
.AsDateTime()
13+
.Nullable();
14+
}
15+
public override void Down()
16+
{
17+
Alter.Table("Progress")
18+
.AlterColumn("SubmittedTime")
19+
.AsDateTime()
20+
.NotNullable();
21+
}
22+
}
23+
}

DigitalLearningSolutions.Data/DataServices/CourseDataService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ public IEnumerable<CourseStatistics> GetNonArchivedCourseStatisticsAtCentreFilte
864864

865865
public IEnumerable<DelegateCourseInfo> GetDelegateCoursesInfo(int delegateId)
866866
{
867-
return connection.Query<DelegateCourseInfo>(
867+
return connection.Query<DelegateCourseInfo>(
868868
$@"{selectDelegateCourseInfoQuery}
869869
WHERE pr.CandidateID = @delegateId
870870
AND pr.RemovedDate IS NULL
@@ -910,7 +910,7 @@ AND ap.DefaultContentTypeID <> 4
910910
da.CentreID,
911911
ap.ArchivedDate",
912912
new { delegateId }
913-
);
913+
);
914914
}
915915

916916
public DelegateCourseInfo? GetDelegateCourseInfoByProgressId(int progressId)

DigitalLearningSolutions.Data/DataServices/ProgressDataService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ int CreateNewDelegateProgress(
2020
int delegateId,
2121
int customisationId,
2222
int customisationVersion,
23-
DateTime submittedTime,
23+
DateTime? submittedTime,
2424
int enrollmentMethodId,
2525
int? enrolledByAdminId,
2626
DateTime? completeByDate,
@@ -163,7 +163,7 @@ public int CreateNewDelegateProgress(
163163
int delegateId,
164164
int customisationId,
165165
int customisationVersion,
166-
DateTime submittedTime,
166+
DateTime? submittedTime,
167167
int enrollmentMethodId,
168168
int? enrolledByAdminId,
169169
DateTime? completeByDate,

DigitalLearningSolutions.Data/Models/Courses/DelegateCourseInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public DelegateCourseInfo(
6868
string? supervisorSurname,
6969
bool? supervisorAdminActive,
7070
DateTime enrolled,
71-
DateTime lastUpdated,
71+
DateTime? lastUpdated,
7272
DateTime? completeBy,
7373
DateTime? completed,
7474
DateTime? evaluated,
@@ -145,7 +145,7 @@ bool isDelegateActive
145145
public bool AllCentresCourse { get; set; }
146146
public int ProgressId { get; set; }
147147
public bool IsProgressLocked { get; set; }
148-
public DateTime LastUpdated { get; set; }
148+
public DateTime? LastUpdated { get; set; }
149149
public DateTime? CompleteBy { get; set; }
150150
public DateTime? RemovedDate { get; set; }
151151
public DateTime? Completed { get; set; }

DigitalLearningSolutions.Web.Tests/Controllers/SuperAdmin/UsersControllerTests.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using DigitalLearningSolutions.Data.DataServices;
2-
using DigitalLearningSolutions.Data.DataServices.UserDataService;
3-
using DigitalLearningSolutions.Data.Models.Support;
1+
using DigitalLearningSolutions.Data.Models.Support;
42
using DigitalLearningSolutions.Data.Utilities;
53
using DigitalLearningSolutions.Data.ViewModels.UserCentreAccount;
64
using DigitalLearningSolutions.Web.Controllers.SuperAdmin;
@@ -26,13 +24,11 @@ namespace DigitalLearningSolutions.Web.Tests.Controllers.SuperAdmin
2624
public class UsersControllerTests
2725
{
2826
private UsersController controller = null!;
29-
3027
private IUserService userService = null!;
3128
private IUserCentreAccountsService userCentreAccountsService = null!;
32-
private IUserDataService userDataService=null!;
33-
private ICentreRegistrationPromptsDataService centreRegistrationPromptsDataService=null!;
29+
private ICentreRegistrationPromptsService centreRegistrationPromptsService=null!;
3430
private ISearchSortFilterPaginateService searchSortFilterPaginateService=null!;
35-
private IJobGroupsDataService jobGroupsDataService=null!;
31+
private IJobGroupsService jobGroupsService=null!;
3632
private IClockUtility clockUtility=null!;
3733
private static readonly List<int> EmptyListOfCentreIds = new List<int>();
3834
[SetUp]
@@ -41,8 +37,8 @@ public void Setup()
4137
userService = A.Fake<IUserService>();
4238
userCentreAccountsService = A.Fake<IUserCentreAccountsService>();
4339

44-
controller = new UsersController(userDataService, centreRegistrationPromptsDataService,
45-
searchSortFilterPaginateService, jobGroupsDataService,userCentreAccountsService, userService, clockUtility)
40+
controller = new UsersController(centreRegistrationPromptsService,
41+
searchSortFilterPaginateService, jobGroupsService,userCentreAccountsService, userService, clockUtility)
4642
.WithDefaultContext()
4743
.WithMockHttpContextSession()
4844
.WithMockTempData();

DigitalLearningSolutions.Web/Controllers/SuperAdmin/Users/UsersController.cs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
namespace DigitalLearningSolutions.Web.Controllers.SuperAdmin.Users
22
{
3-
using DigitalLearningSolutions.Data.DataServices;
4-
using DigitalLearningSolutions.Data.DataServices.UserDataService;
53
using DigitalLearningSolutions.Data.Enums;
64
using DigitalLearningSolutions.Data.Helpers;
75
using DigitalLearningSolutions.Data.Models.SearchSortFilterPaginate;
@@ -28,20 +26,18 @@
2826
[SetSelectedTab(nameof(NavMenuTab.Admins))]
2927
public class UsersController : Controller
3028
{
31-
private readonly IUserDataService userDataService;
32-
private readonly ICentreRegistrationPromptsDataService centreRegistrationPromptsDataService;
29+
private readonly ICentreRegistrationPromptsService centreRegistrationPromptsService;
3330
private readonly ISearchSortFilterPaginateService searchSortFilterPaginateService;
34-
private readonly IJobGroupsDataService jobGroupsDataService;
31+
private readonly IJobGroupsService jobGroupsService;
3532
private const string UserAccountFilterCookieName = "UserAccountFilter";
3633
private readonly IUserService userService;
3734
private readonly IUserCentreAccountsService userCentreAccountsService;
3835
private readonly IClockUtility clockUtility;
39-
public UsersController(IUserDataService userDataService, ICentreRegistrationPromptsDataService centreRegistrationPromptsDataService, ISearchSortFilterPaginateService searchSortFilterPaginateService, IJobGroupsDataService jobGroupsDataService,IUserCentreAccountsService userCentreAccountsService, IUserService userService, IClockUtility clockUtility)
36+
public UsersController(ICentreRegistrationPromptsService centreRegistrationPromptsService, ISearchSortFilterPaginateService searchSortFilterPaginateService, IJobGroupsService jobGroupsService,IUserCentreAccountsService userCentreAccountsService, IUserService userService, IClockUtility clockUtility)
4037
{
41-
this.userDataService = userDataService;
42-
this.centreRegistrationPromptsDataService = centreRegistrationPromptsDataService;
38+
this.centreRegistrationPromptsService = centreRegistrationPromptsService;
4339
this.searchSortFilterPaginateService = searchSortFilterPaginateService;
44-
this.jobGroupsDataService = jobGroupsDataService;
40+
this.jobGroupsService = jobGroupsService;
4541
this.userService = userService;
4642
this.userCentreAccountsService = userCentreAccountsService;
4743
this.clockUtility = clockUtility;
@@ -52,7 +48,7 @@ public IActionResult InactivateUserConfirmation(int userId = 0)
5248
{
5349
InactivateUserViewModel inactivateUserViewModel = new InactivateUserViewModel();
5450
inactivateUserViewModel.UserId = userId;
55-
inactivateUserViewModel.DisplayName = this.userDataService.GetUserDisplayName(userId);
51+
inactivateUserViewModel.DisplayName = this.userService.GetUserDisplayName(userId);
5652

5753
if (TempData["SearchString"] != null)
5854
{
@@ -78,7 +74,7 @@ public IActionResult InactivateUserConfirmation(InactivateUserViewModel inactiva
7874
TempData["UserId"] = userId;
7975
if (inactivateUserViewModel.IsChecked)
8076
{
81-
this.userDataService.InactivateUser(userId);
77+
this.userService.InactivateUser(userId);
8278
return RedirectToAction("Index", "Users", new { UserId = userId });
8379
}
8480
else
@@ -156,9 +152,9 @@ public IActionResult Index(
156152
}
157153
}
158154

159-
(var UserAccounts, var ResultCount) = this.userDataService.GetUserAccounts(Search ?? string.Empty, offSet, itemsPerPage ?? 0, JobGroupId, UserStatus, EmailStatus, UserId, AuthHelper.FailedLoginThreshold);
155+
(var UserAccounts, var ResultCount) = this.userService.GetUserAccounts(Search ?? string.Empty, offSet, itemsPerPage ?? 0, JobGroupId, UserStatus, EmailStatus, UserId, AuthHelper.FailedLoginThreshold);
160156

161-
var jobGroups = jobGroupsDataService.GetJobGroupsAlphabetical().ToList();
157+
var jobGroups = jobGroupsService.GetJobGroupsAlphabetical().ToList();
162158
jobGroups.Insert(0, (0, "Any"));
163159

164160
var searchSortPaginationOptions = new SearchSortFilterAndPaginateOptions(
@@ -235,7 +231,7 @@ public List<string> GetEmailStatus()
235231
[Route("SuperAdmin/Users/{userId=0:int}/EditUserDetails")]
236232
public IActionResult EditUserDetails(int userId)
237233
{
238-
UserAccount userAccount = this.userDataService.GetUserAccountById(userId);
234+
UserAccount userAccount = this.userService.GetUserAccountById(userId);
239235
EditUserDetailsViewModel editUserDetailsViewModel = new EditUserDetailsViewModel(userAccount);
240236

241237
if (TempData["SearchString"] != null)
@@ -253,7 +249,7 @@ public IActionResult EditUserDetails(int userId)
253249
TempData["UserId"] = userId;
254250
TempData.Keep();
255251

256-
var jobGroups = jobGroupsDataService.GetJobGroupsAlphabetical().ToList();
252+
var jobGroups = jobGroupsService.GetJobGroupsAlphabetical().ToList();
257253
ViewBag.JobGroups = SelectListHelper.MapOptionsToSelectListItems(
258254
jobGroups, userAccount.JobGroupId
259255
);
@@ -266,9 +262,9 @@ public IActionResult EditUserDetails(EditUserDetailsViewModel editUserDetailsVie
266262
{
267263
if (ModelState.IsValid)
268264
{
269-
if (!this.userDataService.PrimaryEmailIsInUseByOtherUser(editUserDetailsViewModel.PrimaryEmail, editUserDetailsViewModel.Id))
265+
if (!this.userService.PrimaryEmailIsInUseByOtherUser(editUserDetailsViewModel.PrimaryEmail, editUserDetailsViewModel.Id))
270266
{
271-
this.userDataService.UpdateUserDetailsAccount(editUserDetailsViewModel.FirstName, editUserDetailsViewModel.LastName, editUserDetailsViewModel.PrimaryEmail, editUserDetailsViewModel.JobGroupId, editUserDetailsViewModel.ProfessionalRegistrationNumber,
267+
this.userService.UpdateUserDetailsAccount(editUserDetailsViewModel.FirstName, editUserDetailsViewModel.LastName, editUserDetailsViewModel.PrimaryEmail, editUserDetailsViewModel.JobGroupId, editUserDetailsViewModel.ProfessionalRegistrationNumber,
272268
((editUserDetailsViewModel.ResetEmailVerification) ? null : editUserDetailsViewModel.EmailVerified),
273269
editUserDetailsViewModel.Id);
274270
return RedirectToAction("Index", "Users", new { UserId = editUserDetailsViewModel.Id });
@@ -281,7 +277,7 @@ public IActionResult EditUserDetails(EditUserDetailsViewModel editUserDetailsVie
281277
);
282278
}
283279
}
284-
var jobGroups = jobGroupsDataService.GetJobGroupsAlphabetical().ToList();
280+
var jobGroups = jobGroupsService.GetJobGroupsAlphabetical().ToList();
285281
ViewBag.JobGroups = SelectListHelper.MapOptionsToSelectListItems(
286282
jobGroups, editUserDetailsViewModel.JobGroupId
287283
);
@@ -332,15 +328,15 @@ public IActionResult UnlockAccount(int userId, string RequestUrl= null)
332328
[Route("SuperAdmin/Users/{userId=0:int}/ActivateUser")]
333329
public IActionResult ActivateUser(int userId = 0)
334330
{
335-
userDataService.ActivateUser(userId);
331+
userService.ActivateUser(userId);
336332
TempData["UserId"] = userId;
337333
return RedirectToAction("Index", "Users", new { UserId = userId });
338334
}
339335

340336
[Route("SuperAdmin/Users/{userId=0:int}/{email='':string}/VerifyEmail")]
341337
public IActionResult VerifyEmail(int userId = 0,string email="")
342338
{
343-
userDataService.SetPrimaryEmailVerified(userId,email, clockUtility.UtcNow);
339+
userService.SetPrimaryEmailVerified(userId,email, clockUtility.UtcNow);
344340
TempData["UserId"] = userId;
345341
return RedirectToAction("Index", "Users", new { UserId = userId });
346342
}

DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/GroupDelegatesController.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,13 @@ public IActionResult SelectDelegateAllItems(int groupId)
158158
var jobGroups = jobGroupsService.GetJobGroupsAlphabetical();
159159
var customPrompts = promptsService.GetCentreRegistrationPrompts(centreId);
160160
var delegateUsers = userService.GetDelegatesNotRegisteredForGroupByGroupId(groupId, centreId);
161-
161+
var groups = groupsService.GetActiveGroups(centreId);
162162
var model = new SelectDelegateAllItemsViewModel(
163163
delegateUsers,
164164
jobGroups,
165165
customPrompts,
166-
groupId
166+
groupId,
167+
groups
167168
);
168169

169170
return View(model);

DigitalLearningSolutions.Web/Services/CourseDelegatesDownloadFileService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ DataRow row
547547
}
548548
row[DelegateId] = courseDelegate.CandidateNumber;
549549
row[Enrolled] = courseDelegate.Enrolled.Date;
550-
row[LastAccessed] = courseDelegate.LastUpdated.Date;
550+
row[LastAccessed] = courseDelegate.LastUpdated?.Date;
551551
row[CompleteBy] = courseDelegate.CompleteBy?.Date;
552552
row[CompletedDate] = courseDelegate.Completed?.Date;
553553
row[Logins] = courseDelegate.LoginCount;

DigitalLearningSolutions.Web/Services/CourseService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ public IEnumerable<AvailableCourse> GetAvailableCourses(int candidateId, int? ce
607607

608608
public void EnrolOnSelfAssessment(int selfAssessmentId, int delegateUserId, int centreId)
609609
{
610-
courseDataService.EnrolSelfAssessment(selfAssessmentId, delegateUserId, centreId);
610+
courseDataService.EnrolOnSelfAssessment(selfAssessmentId, delegateUserId, centreId);
611611
}
612612

613613
public int GetNumberOfActiveCoursesAtCentreFilteredByCategory(int centreId, int? categoryId)

DigitalLearningSolutions.Web/Services/EnrolService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public void EnrolDelegateOnCourse(int delegateId, int customisationId, int custo
114114
delegateId,
115115
customisationId,
116116
customisationVersion,
117-
clockUtility.UtcNow,
117+
null,
118118
2,
119119
enrolledByAdminId,
120120
completeByDate,

0 commit comments

Comments
 (0)