diff --git a/DigitalLearningSolutions.Data/Models/SessionData/Tracking/Delegate/Enrol/SessionEnrolDelegate.cs b/DigitalLearningSolutions.Data/Models/SessionData/Tracking/Delegate/Enrol/SessionEnrolDelegate.cs index 6f53abf300..307379493a 100644 --- a/DigitalLearningSolutions.Data/Models/SessionData/Tracking/Delegate/Enrol/SessionEnrolDelegate.cs +++ b/DigitalLearningSolutions.Data/Models/SessionData/Tracking/Delegate/Enrol/SessionEnrolDelegate.cs @@ -17,5 +17,6 @@ public class SessionEnrolDelegate public bool IsSelfAssessment { get; set; } public int AssessmentVersion { get; set; } public int? AssessmentCategoryID { get; set; } + public bool ActionConfirmed { get; set; } } } diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EnrolControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EnrolControllerTests.cs index bf5ec33761..60d5f7f65f 100644 --- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EnrolControllerTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EnrolControllerTests.cs @@ -22,6 +22,7 @@ public class EnrolControllerTests private ISupervisorService supervisorService = null!; private ICourseService courseService = null!; private IEnrolService enrolService = null!; + private ISelfAssessmentService selfAssessmentService = null!; private HttpRequest httpRequest = null!; private HttpResponse httpResponse = null!; private HttpContext httpContext = null!; @@ -35,6 +36,7 @@ public void Setup() supervisorService = A.Fake(); enrolService = A.Fake(); courseService = A.Fake(); + selfAssessmentService = A.Fake(); sessionEnrolDelegate = A.Fake(); httpRequest = A.Fake(); @@ -46,7 +48,8 @@ public void Setup() multiPageFormService, supervisorService, enrolService, - courseService) + courseService, + selfAssessmentService) .WithMockHttpContext(httpRequest, null, null, httpResponse) .WithMockTempData() .WithDefaultContext() diff --git a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs index 5776d27f5b..b4de042350 100644 --- a/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs +++ b/DigitalLearningSolutions.Web/Controllers/SupervisorController/Supervisor.cs @@ -12,6 +12,7 @@ using DigitalLearningSolutions.Web.Extensions; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ServiceFilter; + using DigitalLearningSolutions.Web.ViewModels.Common; using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.Supervisor; using GDS.MultiPageFormData.Enums; @@ -796,7 +797,7 @@ public IActionResult EnrolSetRoleProfile(int supervisorDelegateId, int selfAsses ); var retirementDate = selfAssessmentService.GetSelfAssessmentById(selfAssessmentID).RetirementDate; - if (CheckRetirementDate(retirementDate)) + if (SelfAssessmentHelper.CheckRetirementDate(retirementDate)) { return RedirectToAction("ConfirmRetiringSelfAssessment", "Supervisor", new { supervisorDelegateId }); } @@ -817,14 +818,14 @@ public IActionResult ConfirmRetiringSelfAssessment(int supervisorDelegateId) ).GetAwaiter().GetResult(); var retirementDate = selfAssessmentService.GetSelfAssessmentById((int)sessionEnrolOnRoleProfile.SelfAssessmentID).RetirementDate; - if (!CheckRetirementDate((retirementDate))) + if (!SelfAssessmentHelper.CheckRetirementDate((retirementDate))) { return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 }); } var model = new RetiringSelfAssessmentViewModel() { SelfAssessmentID = (int)sessionEnrolOnRoleProfile.SelfAssessmentID, - SupervisorDelegateID = supervisorDelegateId, + RouteID = supervisorDelegateId, RetirementDate = retirementDate, ActionConfirmed = sessionEnrolOnRoleProfile.ActionConfirmed }; @@ -853,7 +854,7 @@ public IActionResult ConfirmRetiringSelfAssessment(RetiringSelfAssessmentViewMod return RedirectToAction( "EnrolDelegateCompleteBy", "Supervisor", - new { supervisorDelegateId = retiringSelfAssessment.SupervisorDelegateID } + new { supervisorDelegateId = retiringSelfAssessment.RouteID } ); } else @@ -876,7 +877,7 @@ public IActionResult EnrolDelegateCompleteBy(int supervisorDelegateId, int? day, ).GetAwaiter().GetResult(); var retirementDate = selfAssessmentService.GetSelfAssessmentById((int)sessionEnrolOnRoleProfile.SelfAssessmentID).RetirementDate; - if (CheckRetirementDate(retirementDate) && !sessionEnrolOnRoleProfile.ActionConfirmed) + if (SelfAssessmentHelper.CheckRetirementDate(retirementDate) && !sessionEnrolOnRoleProfile.ActionConfirmed) { return RedirectToAction("ConfirmRetiringSelfAssessment", "Supervisor", new { supervisorDelegateId }); } @@ -1030,7 +1031,7 @@ public IActionResult EnrolDelegateSummary(int supervisorDelegateId) ); var retirementDate = selfAssessmentService.GetSelfAssessmentById((int)sessionEnrolOnRoleProfile.SelfAssessmentID).RetirementDate; - if (CheckRetirementDate(retirementDate) && !sessionEnrolOnRoleProfile.ActionConfirmed) + if (SelfAssessmentHelper.CheckRetirementDate(retirementDate) && !sessionEnrolOnRoleProfile.ActionConfirmed) { return RedirectToAction("ConfirmRetiringSelfAssessment", "Supervisor", new { supervisorDelegateId }); } @@ -1586,15 +1587,5 @@ private static string RenderRazorViewToString(Controller controller, string view return sw.GetStringBuilder().ToString(); } } - - private bool CheckRetirementDate(DateTime? date) - { - if (date == null) - return false; - - DateTime retirementOffsetDate = DateTime.Today.AddDays(14); - DateTime today = DateTime.Today; - return (date >= today && date <= retirementOffsetDate); - } } } diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EnrolController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EnrolController.cs index 146aebe824..5f01790de8 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EnrolController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EnrolController.cs @@ -16,8 +16,12 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Delegates { + using DigitalLearningSolutions.Data.Models.SessionData.Supervisor; + using DigitalLearningSolutions.Data.Models.Supervisor; using DigitalLearningSolutions.Data.Utilities; using DigitalLearningSolutions.Web.ServiceFilter; + using DigitalLearningSolutions.Web.ViewModels.Common; + using Pipelines.Sockets.Unofficial; [FeatureGate(FeatureFlags.RefactoredTrackingSystem)] [Authorize(Policy = CustomPolicies.UserCentreAdmin)] @@ -29,18 +33,21 @@ public partial class EnrolController : Controller private readonly ISupervisorService supervisorService; private readonly IEnrolService enrolService; private readonly ICourseService courseService; + private readonly ISelfAssessmentService selfAssessmentService; public EnrolController( IMultiPageFormService multiPageFormService, ISupervisorService supervisorService, IEnrolService enrolService, - ICourseService courseService + ICourseService courseService, + ISelfAssessmentService selfAssessmentService ) { this.multiPageFormService = multiPageFormService; this.supervisorService = supervisorService; this.enrolService = enrolService; this.courseService = courseService; + this.selfAssessmentService = selfAssessmentService; } public IActionResult StartEnrolProcess(int delegateId, int delegateUserId, string delegateName) @@ -116,6 +123,15 @@ public IActionResult Index(int delegateId, EnrolCurrentLearningViewModel enrolCu return View(model); } + if (sessionEnrol.AssessmentID.HasValue && sessionEnrol.AssessmentID != enrolCurrentLearningViewModel.SelectedActivity) + { + var delegateUserID = sessionEnrol.DelegateUserID; + var userName = sessionEnrol.DelegateName; + sessionEnrol = new SessionEnrolDelegate(); + sessionEnrol.DelegateID = delegateId; + sessionEnrol.DelegateName = userName; + sessionEnrol.DelegateUserID = delegateUserID; + } sessionEnrol.AssessmentID = enrolCurrentLearningViewModel.SelectedActivity; var availableCourse = selfAssessments as List; var selectedCourse = availableCourse.Find(x => x.Id == enrolCurrentLearningViewModel.SelectedActivity); @@ -126,10 +142,15 @@ public IActionResult Index(int delegateId, EnrolCurrentLearningViewModel enrolCu multiPageFormService.SetMultiPageFormData( sessionEnrol, - MultiPageFormDataFeature.EnrolDelegateInActivity, + MultiPageFormDataFeature.EnrolDelegateInActivity, TempData ); + if (HasNotConfirmedRetiring(sessionEnrol.IsSelfAssessment, (int)sessionEnrol.AssessmentID, delegateId, sessionEnrol.ActionConfirmed)) + { + return RedirectToAction("ConfirmRetiring", "Enrol", new { delegateId }); + } + return RedirectToAction( "EnrolCompleteBy", "Enrol", @@ -137,6 +158,58 @@ public IActionResult Index(int delegateId, EnrolCurrentLearningViewModel enrolCu ); } + public IActionResult ConfirmRetiring(int delegateId) + { + var sessionEnrol = multiPageFormService.GetMultiPageFormData( + MultiPageFormDataFeature.EnrolDelegateInActivity, + TempData + ).GetAwaiter().GetResult(); + + var retirementDate = selfAssessmentService.GetSelfAssessmentById((int)sessionEnrol.AssessmentID).RetirementDate; + if (!SelfAssessmentHelper.CheckRetirementDate((retirementDate))) + { + return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 }); + } + var model = new RetiringSelfAssessmentViewModel() + { + SelfAssessmentID = (int)sessionEnrol.AssessmentID, + RouteID = (int)sessionEnrol.DelegateID, + RetirementDate = retirementDate, + ActionConfirmed = sessionEnrol.ActionConfirmed + }; + return View("ConfirmRetiring", model); + } + + [HttpPost] + public IActionResult ConfirmRetiring(RetiringSelfAssessmentViewModel retiringSelfAssessment) + { + var sessionEnrol = multiPageFormService.GetMultiPageFormData( + MultiPageFormDataFeature.EnrolDelegateInActivity, + TempData + ).GetAwaiter().GetResult(); + + sessionEnrol.AssessmentID = retiringSelfAssessment.SelfAssessmentID; + sessionEnrol.ActionConfirmed = retiringSelfAssessment.ActionConfirmed; + multiPageFormService.SetMultiPageFormData( + sessionEnrol, + MultiPageFormDataFeature.EnrolDelegateInActivity, + TempData + ); + + if (ModelState.IsValid && retiringSelfAssessment.ActionConfirmed) + { + return RedirectToAction( + "EnrolCompleteBy", + "Enrol", + new { delegateId = retiringSelfAssessment.RouteID } + ); + } + else + { + return View("ConfirmRetiring", retiringSelfAssessment); + } + } + [HttpGet] [TypeFilter( typeof(RedirectToErrorEmptySessionData), @@ -145,9 +218,15 @@ public IActionResult Index(int delegateId, EnrolCurrentLearningViewModel enrolCu public IActionResult EnrolCompleteBy(int delegateId) { var sessionEnrol = multiPageFormService.GetMultiPageFormData( - MultiPageFormDataFeature.EnrolDelegateInActivity, - TempData - ).GetAwaiter().GetResult(); + MultiPageFormDataFeature.EnrolDelegateInActivity, + TempData + ).GetAwaiter().GetResult(); + + if (HasNotConfirmedRetiring(sessionEnrol.IsSelfAssessment, (int)sessionEnrol.AssessmentID, delegateId, sessionEnrol.ActionConfirmed)) + { + return RedirectToAction("ConfirmRetiring", "Enrol", new { delegateId }); + } + multiPageFormService.SetMultiPageFormData( sessionEnrol, MultiPageFormDataFeature.EnrolDelegateInActivity, @@ -202,6 +281,12 @@ public IActionResult EnrolDelegateSupervisor(int delegateId) var sessionEnrol = multiPageFormService.GetMultiPageFormData( MultiPageFormDataFeature.EnrolDelegateInActivity, TempData).GetAwaiter().GetResult(); + + if (HasNotConfirmedRetiring(sessionEnrol.IsSelfAssessment, (int)sessionEnrol.AssessmentID, delegateId, sessionEnrol.ActionConfirmed)) + { + return RedirectToAction("ConfirmRetiring", "Enrol", new { delegateId }); + } + var supervisorList = supervisorService.GetSupervisorForEnrolDelegate(centreId.Value, sessionEnrol.AssessmentCategoryID.Value); if (!sessionEnrol.IsSelfAssessment) { @@ -283,6 +368,12 @@ public IActionResult EnrolDelegateSupervisor(int delegateId, EnrolSupervisorView public IActionResult EnrolDelegateSummary(int delegateId) { var sessionEnrol = multiPageFormService.GetMultiPageFormData(MultiPageFormDataFeature.EnrolDelegateInActivity, TempData).GetAwaiter().GetResult(); + + if (HasNotConfirmedRetiring(sessionEnrol.IsSelfAssessment, (int)sessionEnrol.AssessmentID, delegateId, sessionEnrol.ActionConfirmed)) + { + return RedirectToAction("ConfirmRetiring", "Enrol", new { delegateId }); + } + var roles = supervisorService.GetSupervisorRolesBySelfAssessmentIdForSupervisor(sessionEnrol.AssessmentID.GetValueOrDefault()).ToArray(); var clockUtility = new ClockUtility(); var monthDiffrence = ""; @@ -303,6 +394,7 @@ public IActionResult EnrolDelegateSummary(int delegateId) model.IsSelfAssessment = sessionEnrol.IsSelfAssessment; model.SupervisorRoleName = sessionEnrol.SelfAssessmentSupervisorRoleName; model.RoleCount = roles.Count(); + ViewBag.actionConfirmed = sessionEnrol.ActionConfirmed; return View(model); } @@ -345,5 +437,15 @@ private int GetAdminID() { return User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserAdminId); } + + private bool HasNotConfirmedRetiring(bool IsSelfAssessment, int selfAssessmentId, int delegateId, bool actionConfirmed) + { + if (IsSelfAssessment) + { + var retirementDate = selfAssessmentService.GetSelfAssessmentById(selfAssessmentId).RetirementDate; + return SelfAssessmentHelper.CheckRetirementDate(retirementDate) && !actionConfirmed; + } + return false; + } } } diff --git a/DigitalLearningSolutions.Web/Helpers/SelfAssessmentHelper.cs b/DigitalLearningSolutions.Web/Helpers/SelfAssessmentHelper.cs new file mode 100644 index 0000000000..50a8d4e2fc --- /dev/null +++ b/DigitalLearningSolutions.Web/Helpers/SelfAssessmentHelper.cs @@ -0,0 +1,17 @@ +namespace DigitalLearningSolutions.Web.Helpers +{ + using System; + + public static class SelfAssessmentHelper + { + public static bool CheckRetirementDate(DateTime? date) + { + if (date == null) + return false; + + DateTime retirementOffsetDate = DateTime.Today.AddDays(14); + DateTime today = DateTime.Today; + return (date >= today && date <= retirementOffsetDate); + } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/Supervisor/RetiringSelfAssessmentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/RetiringSelfAssessmentViewModel.cs similarity index 77% rename from DigitalLearningSolutions.Web/ViewModels/Supervisor/RetiringSelfAssessmentViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/RetiringSelfAssessmentViewModel.cs index 06bab1bc50..9cf3603dc0 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Supervisor/RetiringSelfAssessmentViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/RetiringSelfAssessmentViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Supervisor +namespace DigitalLearningSolutions.Web.ViewModels.Common { using DigitalLearningSolutions.Web.Attributes; using System; @@ -6,7 +6,7 @@ public class RetiringSelfAssessmentViewModel { public int SelfAssessmentID { get; set; } - public int SupervisorDelegateID { get; set; } + public int RouteID { get; set; } public DateTime? RetirementDate { get; set; } [BooleanMustBeTrue(ErrorMessage = "Please tick the checkbox to confirm you wish to perform this action")] public bool ActionConfirmed { get; set; } diff --git a/DigitalLearningSolutions.Web/Views/Supervisor/ConfirmRetiringSelfAssessment.cshtml b/DigitalLearningSolutions.Web/Views/Supervisor/ConfirmRetiringSelfAssessment.cshtml index 1975ad33eb..635bcba1e1 100644 --- a/DigitalLearningSolutions.Web/Views/Supervisor/ConfirmRetiringSelfAssessment.cshtml +++ b/DigitalLearningSolutions.Web/Views/Supervisor/ConfirmRetiringSelfAssessment.cshtml @@ -1,5 +1,5 @@ @using DigitalLearningSolutions.Web.Extensions -@using DigitalLearningSolutions.Web.ViewModels.Supervisor +@using DigitalLearningSolutions.Web.ViewModels.Common @using Microsoft.Extensions.Configuration @model RetiringSelfAssessmentViewModel; @inject IConfiguration Configuration; @@ -40,12 +40,12 @@ Continue @Html.HiddenFor(m => m.SelfAssessmentID) - @Html.HiddenFor(m => m.SupervisorDelegateID) + @Html.HiddenFor(m => m.RouteID) @Html.HiddenFor(m => m.RetirementDate) + @if (ViewBag.actionConfirmed) + { +
+
+ Retiring confirmed +
+
+ Yes +
+
+
+
+ }
Complete by date @@ -101,7 +114,7 @@ Not Set } - @if (Model.RoleCount>1) + @if (Model.RoleCount > 1) {