using System; using System.Collections.Generic; using System.Linq; using LCU.Library.Internal.IncentiveApiModels.Common; namespace LCU.Library.Internal.IncentiveApiModels.Entities { public class AppUser : Auditable { public AppUser() { Departments = new List(); Assignments = new List(); Terminated = null; } public Guid Id { get; set; } public string AdEmail { get; set; } public int PersonId { get; set; } public string EmployeeId { get; set; } public string HomeDepartment { get; set; } public string BaseRole { get; set; } public string? ManagerKey { get; set; } [Obsolete("Start referring to UserDepartment.Role when possible. 09/08/2021")] public Role Role { get; set; } public List AdditionalPermissions { get; set; } public string FullName { get; set; } public List Departments { get; set; } public List Assignments { get; set; } public DateTime? Terminated { get; set; } public bool UserHasPermission(Permission perm) { var departments = ActiveDepartmentsForRange(new MonthRange()); foreach (var userDepartment in departments) { if (userDepartment.Role.Permissions.Any(x => x.Code == perm.Code)) { return true; } } return (AdditionalPermissions ?? new List()).Any(x => x.Permission.Code == perm.Code); } public bool UserHasPermission(string permissionCode) { var departments = ActiveDepartmentsForRange(new MonthRange()); foreach (var userDepartment in departments) { if (userDepartment.Role.Permissions.Any(x => x.Code == permissionCode)) { return true; } } return (AdditionalPermissions ?? new List()).Any(x => x.Permission.Code == permissionCode); } public IEnumerable ActiveDepartmentsForRange(MonthRange monthRange) { return Departments.Where(department => department.StartDate.Date <= monthRange.EndTime.Date && (department.EndDate == null || monthRange.StartTime.Date <= department.EndDate.Value.Date)); } public UserDepartment FindDepartmentForRole(Role role) { var departments = ActiveDepartmentsForRange(new MonthRange()); return departments.FirstOrDefault(x => x.Role == role); } public UserDepartment FindHomeDepartment() { return Departments.FirstOrDefault(x => x.IsHome == true && x.StartDate.Date <= DateTime.Today.Date && (x.EndDate == null || DateTime.Today.Date <= x.EndDate.Value.Date)); } public bool HasDepartment(int departmentId) { return ActiveDepartmentsForRange(new MonthRange()).Any(x => x.DepartmentId == departmentId); } public bool HasRoleAnywhere(Role role) { var departments = ActiveDepartmentsForRange(new MonthRange()); return departments.Any(userDepartment => userDepartment.Role == role); } public bool HasAnyRoleForActiveDepartment(int departmentId, Role[] roles) { var departments = ActiveDepartmentsForRange(new MonthRange()); return departments.Any(userDepartment => roles.Contains(userDepartment.Role) && userDepartment.DepartmentId == departmentId); } public string AppUserFullNameInFromContextFormat() { if (!string.IsNullOrWhiteSpace(FullName)) { var nameParts = FullName.Split(","); return $"{nameParts[1]} {nameParts[0]}"; } return null; } } }