Files
2026-03-17 09:53:09 -05:00

174 lines
6.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LCU.Library.Internal.IncentiveApiModels.Entities;
using LCU.Library.Internal.IncentiveApiModels.Enums;
using LCU.API.Internal.Operations.IncentiveApiLib.Persistence;
using Microsoft.EntityFrameworkCore;
using Serilog;
using LCU.Library.Internal.IncentiveApiModels.Common;
using LCU.Library.Internal.IncentiveApiModels.Results;
using LCU.Library.Internal.IncentiveApiModels.Requests;
namespace LCU.API.Internal.Operations.IncentiveApiLib.Repositories;
public class DepartmentRepository : BaseRepository, IDepartmentRepository
{
private const string BranchStr = "branch";
public DepartmentRepository(IApplicationDbContext context) : base(context)
{
}
public async Task<IReadOnlyCollection<Department>> GetAllDepartmentsAsync()
{
return await _context.Departments.OrderBy(x => x.DepartmentName).ToListAsync();
}
public async Task<Department> FindDepartmentByIdAsync(int id)
{
return await _context.Departments.FindAsync(id);
}
public async Task<Department> SaveDepartmentAsync(Department department)
{
await _context.Departments.AddAsync(department);
return department;
}
public async Task<Department> FindOrCreateDepartment(ActiveEmployeeResult employee)
{
var departmentName = DetermineDepartmentName(employee.OrgUnit);
var orgCode = employee.OrgCode.ToLower();
var businessLine = BusinessLine.TryLookup(employee.OrgUnit);
var department = await _context.Departments.FirstOrDefaultAsync(x =>
x.DayForceGlCode.ToLower() == orgCode || x.DepartmentName.ToLower() == departmentName.ToLower());
if (department == null)
{
department = new Department()
{
BusinessLineCode = businessLine.Code,
State = DepartmentState.Active,
DepartmentName = departmentName,
DayforceDepartmentName = employee.OrgUnit,
DayForceGlCode = employee.OrgCode,
DnaOrgNbr = employee.GetDnaOrgCode()
};
await SaveDepartmentAsync(department);
}
department.DepartmentName = departmentName;
return department;
}
public static string DetermineDepartmentName(string employeeOrgUnit)
{
if (string.IsNullOrWhiteSpace(employeeOrgUnit))
{
return null;
}
if (employeeOrgUnit.Contains("-"))
{
var unitNames = employeeOrgUnit.Split("-");
var leftHalf = unitNames.First().Trim();
var rightHalf = unitNames.ElementAt(1).Trim();
if (string.Equals(rightHalf, BranchStr, StringComparison.CurrentCultureIgnoreCase))
{
return leftHalf;
}
return rightHalf;
}
return employeeOrgUnit.Trim();
}
public async Task<List<AppUser>> FindDepartmentAssignments(DepartmentPersonnelSearchRequest searchRequest)
{
var userDepartments = await _context.DepartmentAssignments
.Include(x => x.Employee)
.ThenInclude(x => x.AdditionalPermissions)
.Where(x => x.DepartmentId == searchRequest.DepartmentId)
.ToListAsync();
var range = new MonthRange(searchRequest.Year, searchRequest.Month);
var usersInRange = userDepartments
.Where(x =>
x.StartDate.Date <= range.EndTime.Date &&
(x.EndDate == null || x.EndDate.Value.Date >= range.StartTime.Date));
var users = usersInRange.Where(x => searchRequest.IncludeAllPersonnel ||
x.Role.Permissions.Any(p =>
p == Permission.HaveSalesGoals) ||
x.Employee.AdditionalPermissions.Any(p =>
p.Permission == Permission.HaveSalesGoals));
return users.Select(x => x.Employee).ToList();
}
public async Task<Department> FindUserHomeDepartment(AppUser appUser)
{
try
{
var userDepartment = await _context.DepartmentAssignments.Include(x => x.Department)
.Where(x => x.IsHome == true && x.EndDate == null
&& x.Employee.EmployeeId.Equals(appUser.EmployeeId)).SingleOrDefaultAsync();
return userDepartment?.Department;
}
catch (Exception ex)
{
Log.Error(ex,
$"Error Finding User Home Department. User with EmployeeId {appUser.EmployeeId} may have no or multiple home assignments.");
return null;
}
}
public async Task<Department> FindDepartmentByBranchName(string name)
{
return await _context.Departments.SingleOrDefaultAsync(x => x.DepartmentName.ToLower() == name.ToLower());
}
public async Task<Department> GetDepartmentByDayforceGlCode(int glCode)
{
return await _context.Departments.AsNoTracking().FirstOrDefaultAsync(x => x.DayForceGlCode == glCode.ToString());
}
public async Task<IReadOnlyCollection<Department>> FindDepartmentsByRegionAsync(Region region)
{
return await _context.Departments
.Where(x => x.RegionCode == region.Code)
.OrderBy(x => x.DepartmentName)
.ToListAsync();
}
public async Task<IReadOnlyCollection<Department>> FindDepartmentsByBusinessLineAsync(BusinessLine businessLine)
{
return await _context.Departments
.Where(x => x.BusinessLineCode == businessLine.Code)
.OrderBy(x => x.DepartmentName)
.ToListAsync();
}
public async Task<IReadOnlyCollection<UserDepartment>> FindCurrentDepartmentAssignments(int departmentId)
{
return await FindDepartmentAssignmentsForRange(departmentId, new MonthRange());
}
public async Task<IReadOnlyCollection<UserDepartment>> FindDepartmentAssignmentsForRange(int departmentId,
MonthRange monthRange)
{
return await _context.DepartmentAssignments
.AsNoTracking()
.Include(assignment => assignment.Employee)
.Where(assignment => assignment.DepartmentId == departmentId &&
assignment.StartDate.Date <= monthRange.EndTime.Date &&
(assignment.EndDate == null ||
assignment.EndDate.Value.Date >= monthRange.StartTime.Date))
.ToListAsync();
}
}