From b023883233d8269452392aef71f58a9bd578f983 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 11 Nov 2025 14:31:41 +0530 Subject: [PATCH] Added the APi to manage organization hierarchies --- .../Controllers/OrganizationController.cs | 13 +++- .../Service/OrganizationService.cs | 71 +++++++++++++++++++ .../ServiceInterfaces/IOrganizationService.cs | 2 +- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/OrganizationController.cs b/Marco.Pms.Services/Controllers/OrganizationController.cs index 18e9fbc..ec6f168 100644 --- a/Marco.Pms.Services/Controllers/OrganizationController.cs +++ b/Marco.Pms.Services/Controllers/OrganizationController.cs @@ -104,7 +104,18 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } - + [HttpPost("hierarchy/manage/{employeeId}")] + public async Task ManageOrganizationHierarchy(Guid employeeId, [FromBody] List 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 diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index 1d08336..bd5044e 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -780,8 +780,79 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal error", "An internal exception has occurred", 500); } } + public async Task> ManageOrganizationHierarchyAsync(Guid employeeId, List 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(); + var removeOrganizationHieraechies = new List(); + var orgHierarchyLogs = new List(); + 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>(organizationHieraechies); + return ApiResponse.SuccessResponse(response, $"{response.Count} superior fetched successfully", 200); + } #endregion #region =================================================================== Put Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs index b1087e4..bc9c612 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs @@ -16,7 +16,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> CreateOrganizationAsync(CreateOrganizationDto model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); Task> AssignOrganizationToProjectAsync(AssignOrganizationDto model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); Task> AssignOrganizationToTenantAsync(Guid organizationId, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); - + Task> ManageOrganizationHierarchyAsync(Guid employeeId, List model, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); #endregion #region =================================================================== Put Functions ===================================================================