Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,15 @@ public void DeactivateDelegateUser(int delegateId)
new { delegateId }
);
}

public void DeactivateAdminAccount(int userId ,int centreId)
{
connection.Execute(
@"UPDATE AdminAccounts
SET Active =0
WHERE UserID = @userId AND CentreID = @centreId",
new { userId, centreId }
);
}
public void ActivateDelegateUser(int delegateId)
{
connection.Execute(
Expand Down Expand Up @@ -419,7 +427,15 @@ FROM Candidates
new { delegateId }
).Single();
}

public int? CheckDelegateIsActive(int delegateId)
{
return connection.Query<int?>(
@"SELECT CandidateID
FROM Candidates
WHERE CandidateID = @delegateId AND Active =1",
new { delegateId }
).FirstOrDefault();
}
public void SetDelegateUserLearningHubAuthId(int delegateId, int learningHubAuthId)
{
connection.Execute(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,8 @@ int centreId
public bool PrimaryEmailInUseAtCentres(string email);

public int? GetUserIdFromLearningHubAuthId(int learningHubAuthId);
void DeactivateAdminAccount(int userId, int centreId);
int? CheckDelegateIsActive(int delegateId);
}

public partial class UserDataService : IUserDataService
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@


namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Delegates
{
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using DigitalLearningSolutions.Data.Enums;
using DigitalLearningSolutions.Data.Models.User;
using DigitalLearningSolutions.Web.Attributes;
using DigitalLearningSolutions.Web.Helpers;
using DigitalLearningSolutions.Web.Models.Enums;
using DigitalLearningSolutions.Web.ServiceFilter;
using DigitalLearningSolutions.Web.Services;
using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.DeactivateDelegate;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.FeatureManagement.Mvc;


[FeatureGate(FeatureFlags.RefactoredTrackingSystem)]
[Authorize(Policy = CustomPolicies.UserCentreAdmin)]
[ServiceFilter(typeof(VerifyAdminUserCanAccessDelegateUser))]
[Route("TrackingSystem/Delegates/{delegateId:int}/Deactivate")]
[SetDlsSubApplication(nameof(DlsSubApplication.TrackingSystem))]
[SetSelectedTab(nameof(NavMenuTab.Delegates))]
public class DeactivateDelegateController : Controller
{
private readonly IUserService userService;
public DeactivateDelegateController(
IUserService userService
)
{
this.userService = userService;
}
[HttpGet]
public IActionResult Index(int delegateId)
{
var checkDelegate = userService.CheckDelegateIsActive(delegateId);
if (checkDelegate != delegateId)
{
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 410 });
}
var centreId = User.GetCentreId();
var delegateEntity = userService.GetDelegateById(delegateId)!;
var userEntity = userService.GetUserById(delegateEntity.DelegateAccount.UserId);
var adminAccount = userEntity!.GetCentreAccountSet(centreId)?.AdminAccount;
var roles = GetRoles(adminAccount, userEntity);
var model = new DeactivateDelegateAccountViewModel
{
DelegateId = delegateId,
Name = delegateEntity.UserAccount.FirstName + " " + delegateEntity.UserAccount.LastName,
Roles = roles,
Email = delegateEntity.UserAccount.PrimaryEmail,
UserId = delegateEntity.UserAccount.Id
};
return View(model);
}

[HttpPost]
public IActionResult Index(DeactivateDelegateAccountViewModel deactivateDelegateAccountViewModel)
{
var centreId = User.GetCentreId();
if (!ModelState.IsValid)
{
var delegateEntity = userService.GetDelegateById(deactivateDelegateAccountViewModel.DelegateId)!;
var userEntity = userService.GetUserById(delegateEntity.DelegateAccount.UserId);
var adminAccount = userEntity!.GetCentreAccountSet(centreId)?.AdminAccount;
var roles = GetRoles(adminAccount, userEntity);
deactivateDelegateAccountViewModel.Roles = roles;
return View(deactivateDelegateAccountViewModel);
}

if (deactivateDelegateAccountViewModel.Deactivate == true )
{
userService.DeactivateDelegateUser(deactivateDelegateAccountViewModel.DelegateId);
return RedirectToAction("Index", "ViewDelegate", new { deactivateDelegateAccountViewModel.DelegateId });
}
userService.DeactivateDelegateUser(deactivateDelegateAccountViewModel.DelegateId);
userService.DeactivateAdminAccount(deactivateDelegateAccountViewModel.UserId, centreId.Value);
return RedirectToAction("Index", "ViewDelegate", new { deactivateDelegateAccountViewModel.DelegateId });

}
private List<string>? GetRoles(AdminAccount? adminAccount, UserEntity userEntity)
{
var roles = new List<string>();
if (adminAccount != null)
{
var adminentity = new AdminEntity(adminAccount, userEntity.UserAccount, null);
CultureInfo currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
roles = FilterableTagHelper.GetCurrentTagsForAdmin(adminentity).Where(s => s.Hidden == false)
.Select(d => d.DisplayText).ToList<string>();
}
return roles;
}
}
}
10 changes: 10 additions & 0 deletions DigitalLearningSolutions.Web/Services/UserService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ bool isWorkforceManager
string search, int offset, int rows, int jobGroupId, string userStatus, string emailStatus, int userId, int failedLoginThreshold
);
void UpdateUserDetailsAccount(string firstName, string lastName, string primaryEmail, int jobGroupId, string? prnNumber, DateTime? emailVerified, int userId);
void DeactivateAdminAccount(int userId, int centreId);
int? CheckDelegateIsActive(int delegateId);
}

public class UserService : IUserService
Expand Down Expand Up @@ -956,5 +958,13 @@ public void UpdateUserDetailsAccount(string firstName, string lastName, string p
{
userDataService.UpdateUserDetailsAccount(firstName, lastName, primaryEmail, jobGroupId, prnNumber, emailVerified, userId);
}
public void DeactivateAdminAccount(int userId, int centreId)
{
userDataService.DeactivateAdminAccount(userId, centreId);
}
public int? CheckDelegateIsActive(int delegateId)
{
return userDataService.CheckDelegateIsActive(delegateId);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using FluentMigrator.Infrastructure;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.DeactivateDelegate
{
public class DeactivateDelegateAccountViewModel
{
public int DelegateId { get; set; }
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public List<string> Roles { get; set; }
[Required(ErrorMessage = "Please select an account you want to deactivate.")]
public bool? Deactivate { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
@using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.DeactivateDelegate
@model DeactivateDelegateAccountViewModel


@{
var errorHasOccurred = !ViewData.ModelState.IsValid;
ViewData["Title"] = errorHasOccurred ? "Error: Deactivate account" : "Deactivate account";
}
<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full">
@if (errorHasOccurred)
{
<vc:error-summary order-of-property-names="@(new []{ nameof(Model.Name) })" />
}

<h2 class="nhsuk-heading-l word-break">Deactivate account - @Model.Name (@Model.Email)</h2>
<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full nhsuk-lede-text">
@Model.Name has an active admin account at your centre with following admin roles:
</div>
</div>
<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full nhsuk-lede-text">
<ul>
@foreach (var role in Model.Roles)
{
<li>@role</li>
}
</ul>
</div>
</div>

<form class="nhsuk-u-margin-bottom-3" method="post" novalidate asp-action="Index">
<fieldset class="nhsuk-fieldset">
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
<h2 class="nhsuk-fieldset__heading">
Which accounts would you like deactivate?
</h2>
</legend>

<nhs-form-group nhs-validation-for="Deactivate">
<div class="nhsuk-radios nhsuk-radios--inline">
<div class="nhsuk-radios__item">
<input class="nhsuk-radios__input" id="rb-accountonly" name="Deactivate" required="required" type="radio" value="true">
<label class="nhsuk-label nhsuk-radios__label" for="rb-accountonly">
Delegate account only
</label>
<div class="nhsuk-hint nhsuk-summary-list" id="cb-verify-item-hint">
The user will still be able to login to your centre with the above admin roles
</div>
</div>
<div class="nhsuk-radios__item">
<input class="nhsuk-radios__input" id="rb-accountandadmin" name="Deactivate" required="required" type="radio" value="false">
<label class="nhsuk-label nhsuk-radios__label" for="rb-accountandadmin">
Delegate account and Administrators accounts
</label>
<div class="nhsuk-hint nhsuk-summary-list" id="cb-verify-item-hint">
The user will no longer be able to login to your centre
</div>
</div>
<span asp-validation-for="Deactivate" class="text-danger"></span>
</div>
</nhs-form-group>
</fieldset>
<button name="action" class="nhsuk-button delete-button view-delegate-button" value="save">Deactivate account</button>
<input type="hidden" asp-for="DelegateId" />
<input type="hidden" asp-for="Name" />
<input type="hidden" asp-for="Email" />
<input type="hidden" asp-for="Roles" />
<input type="hidden" asp-for="UserId" />
</form>
<div class="nhsuk-back-link">
<a class="nhsuk-back-link__link"
asp-controller="ViewDelegate"
asp-action="Index"
asp-route-delegateId="@Model.DelegateId">
<svg class="nhsuk-icon nhsuk-icon__chevron-left" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M13.41 12l5.3-5.29a1 1 0 1 0-1.42-1.42L12 10.59l-5.29-5.3a1 1 0 0 0-1.42 1.42l5.3 5.29-5.3 5.29a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l5.29-5.3 5.29 5.3a1 1 0 0 0 1.42 0 1 1 0 0 0 0-1.42z"></path>
</svg>
Cancel
</a>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -103,48 +103,60 @@
@if (Model.DelegateInfo.IsActive)
{
<a class="nhsuk-button view-delegate-button"
role="button"
asp-controller="EditDelegate"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id">
role="button"
asp-controller="EditDelegate"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id">
Edit details
</a>
<a class="nhsuk-button nhsuk-button--secondary view-delegate-button"
role="button"
asp-controller="SetDelegatePassword"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id"
asp-route-isFromViewDelegatePage="true">
role="button"
asp-controller="SetDelegatePassword"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id"
asp-route-isFromViewDelegatePage="true">
Set password
</a>
@if (User.HasCentreManagerPermissions() && !Model.DelegateInfo.IsAdmin
&& !string.IsNullOrWhiteSpace(Model.DelegateInfo.Email) && !string.IsNullOrWhiteSpace(Model.DelegateInfo.Name))
{
<a class="nhsuk-button nhsuk-button--secondary view-delegate-button"
role="button"
asp-controller="PromoteToAdmin"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id">
role="button"
asp-controller="PromoteToAdmin"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id">
Promote to admin
</a>
}
if (Model.DelegateInfo.RegistrationConfirmationHash != null)
{
<form asp-action="DeleteAccount" asp-route-delegateId="@Model.DelegateInfo.Id">
<button class="nhsuk-button delete-button view-delegate-button"
type="submit">
type="submit">
Delete account
</button>
</form>
}
else
{
<form asp-action="DeactivateDelegate" asp-route-delegateId="@Model.DelegateInfo.Id">
<button class="nhsuk-button delete-button view-delegate-button"
type="submit">
if (Model.DelegateInfo.IsAdmin)
{
<a class="nhsuk-button delete-button view-delegate-button" role="button"
asp-controller="DeactivateDelegate"
asp-action="Index"
asp-route-delegateId="@Model.DelegateInfo.Id">
Deactivate account
</button>
</form>
</a>
}
else
{
<form asp-action="DeactivateDelegate" asp-route-asp-route-delegateId="@Model.DelegateInfo.Id">
<button class="nhsuk-button delete-button view-delegate-button"
type="submit">
Deactivate account
</button>
</form>
}
}
}
else
Expand All @@ -153,7 +165,7 @@
{
<form asp-action="DeleteAccount" asp-route-delegateId="@Model.DelegateInfo.Id">
<button class="nhsuk-button delete-button view-delegate-button"
type="submit">
type="submit">
Delete account
</button>
</form>
Expand Down Expand Up @@ -186,7 +198,7 @@
if (delegateCourseInfoViewModel.ProgressId != null)
{
<partial name="_DelegateCourseInfoCard" model="delegateCourseInfoViewModel" />
}
}
}
@foreach (var delegateSelfAssessmentInfoViewModel in Model.SelfAssessments)
{
Expand All @@ -199,12 +211,12 @@
@if (Model.DelegateInfo.IsActive && !string.IsNullOrEmpty(Model.DelegateInfo.Email))
{
<a class="nhsuk-button nhsuk-button--secondary"
role="button"
asp-controller="Enrol"
asp-action="StartEnrolProcess"
asp-route-delegateId="@Model.DelegateInfo.Id"
asp-route-delegateUserId="@Model.DelegateInfo.UserId"
asp-route-delegateName="@Model.DelegateInfo.Name">
role="button"
asp-controller="Enrol"
asp-action="StartEnrolProcess"
asp-route-delegateId="@Model.DelegateInfo.Id"
asp-route-delegateUserId="@Model.DelegateInfo.UserId"
asp-route-delegateName="@Model.DelegateInfo.Name">
Enrol on activity
</a>
}
Expand Down