Added the APi to manage organization hierarchies

This commit is contained in:
ashutosh.nehete 2025-11-11 14:31:41 +05:30
parent 0b2ed71dab
commit b023883233
3 changed files with 84 additions and 2 deletions

View File

@ -104,7 +104,18 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(response.StatusCode, response);
}
[HttpPost("hierarchy/manage/{employeeId}")]
public async Task<IActionResult> ManageOrganizationHierarchy(Guid employeeId, [FromBody] List<OrganizationHierarchyDto> model)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _organizationService.ManageOrganizationHierarchyAsync(employeeId, model, loggedInEmployee, tenantId, loggedOrganizationId);
if (response.Success)
{
var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Hierarchy", Response = response.Data };
await _signalR.SendNotificationAsync(notification);
}
return StatusCode(response.StatusCode, response);
}
#endregion

View File

@ -780,8 +780,79 @@ namespace Marco.Pms.Services.Service
return ApiResponse<object>.ErrorResponse("Internal error", "An internal exception has occurred", 500);
}
}
public async Task<ApiResponse<object>> ManageOrganizationHierarchyAsync(Guid employeeId, List<OrganizationHierarchyDto> model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId)
{
var reportToIDs = model.Select(oh => oh.ReportToId).ToList();
var existingOrganizationHieraechies = await _context.OrganizationHierarchies
.AsNoTracking()
.Where(oh => oh.EmployeeId == employeeId && reportToIDs.Contains(oh.ReportToId) && oh.IsActive && oh.TenantId == tenantId)
.ToListAsync();
var newOrganizationHieraechies = new List<OrganizationHierarchy>();
var removeOrganizationHieraechies = new List<OrganizationHierarchy>();
var orgHierarchyLogs = new List<OrgHierarchyLog>();
foreach (var hierarchy in model)
{
var existingOrganizationHieraechy = existingOrganizationHieraechies.FirstOrDefault(oh => oh.EmployeeId == employeeId && oh.ReportToId == hierarchy.ReportToId);
if (hierarchy.IsActive && existingOrganizationHieraechy == null)
{
var newOrganizationHieraechy = new OrganizationHierarchy
{
Id = Guid.NewGuid(),
EmployeeId = employeeId,
ReportToId = hierarchy.ReportToId,
IsPrimary = hierarchy.IsPrimary,
IsActive = true,
AssignedAt = DateTime.UtcNow,
AssignedById = loggedInEmployee.Id,
TenantId = tenantId
};
newOrganizationHieraechies.Add(newOrganizationHieraechy);
}
else if (!hierarchy.IsActive && existingOrganizationHieraechy != null)
{
existingOrganizationHieraechy.IsActive = false;
removeOrganizationHieraechies.Add(existingOrganizationHieraechy);
orgHierarchyLogs.Add(new OrgHierarchyLog
{
Id = Guid.NewGuid(),
OrganizationHierarchyId = existingOrganizationHieraechy.Id,
ReAssignedAt = DateTime.UtcNow,
ReAssignedById = loggedInEmployee.Id,
TenantId = tenantId
});
}
}
if (newOrganizationHieraechies.Any())
{
_context.OrganizationHierarchies.AddRange(newOrganizationHieraechies);
}
if (removeOrganizationHieraechies.Any())
{
_context.OrganizationHierarchies.UpdateRange(removeOrganizationHieraechies);
}
if (orgHierarchyLogs.Any())
{
_context.OrgHierarchyLogs.AddRange(orgHierarchyLogs);
}
await _context.SaveChangesAsync();
var organizationHieraechies = await _context.OrganizationHierarchies
.Include(oh => oh.Employee).ThenInclude(e => e!.JobRole)
.Include(oh => oh.ReportTo).ThenInclude(e => e!.JobRole)
.Include(oh => oh.AssignedBy).ThenInclude(e => e!.JobRole)
.AsNoTracking()
.Where(oh => oh.EmployeeId == employeeId && oh.IsActive && oh.TenantId == tenantId)
.OrderByDescending(oh => oh.AssignedAt)
.ToListAsync();
var response = _mapper.Map<List<OrganizationHierarchyVM>>(organizationHieraechies);
return ApiResponse<object>.SuccessResponse(response, $"{response.Count} superior fetched successfully", 200);
}
#endregion
#region =================================================================== Put Functions ===================================================================

View File

@ -16,7 +16,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
Task<ApiResponse<object>> CreateOrganizationAsync(CreateOrganizationDto model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId);
Task<ApiResponse<object>> AssignOrganizationToProjectAsync(AssignOrganizationDto model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId);
Task<ApiResponse<object>> AssignOrganizationToTenantAsync(Guid organizationId, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId);
Task<ApiResponse<object>> ManageOrganizationHierarchyAsync(Guid employeeId, List<OrganizationHierarchyDto> model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId);
#endregion
#region =================================================================== Put Functions ===================================================================