Merge pull request 'Added the API to get list of services according to the project and logged in employee' (#132) from Ashutosh_Task#1225 into Organization_Management

Reviewed-on: #132
This commit is contained in:
ashutosh.nehete 2025-09-19 08:53:59 +00:00
commit 86102ef70d
7 changed files with 109 additions and 9 deletions

View File

@ -1,15 +1,11 @@
using Marco.Pms.Model.ViewModels.Master;
namespace Marco.Pms.Model.ViewModels.Activities
namespace Marco.Pms.Model.ViewModels.Activities
{
public class ActivityVM
{
public Guid Id { get; set; }
public string? ActivityName { get; set; }
public string? UnitOfMeasurement { get; set; }
public List<CheckListVM>? CheckLists { get; set; }
public ActivityGroupMasterVM? ActivityGroup { get; set; }
public bool IsActive { get; set; } = true;
public bool IsSystem { get; set; } = false;
}

View File

@ -5,7 +5,6 @@
public Guid Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public ServiceMasterVM? Service { get; set; }
public bool IsSystem { get; set; }
public bool IsActive { get; set; }
}

View File

@ -256,6 +256,14 @@ namespace Marco.Pms.Services.Controllers
.Where(sp => model.ServiceIds.Contains(sp.ServiceId) && sp.ProjectId == model.ProjectId && sp.IsActive).ToListAsync();
});
var projectOrganizationsTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.ProjectOrgMappings
.Include(po => po.ProjectService)
.Where(po => po.ProjectService != null && model.ServiceIds.Contains(po.ProjectService.ServiceId) && po.ProjectService.ProjectId == model.ProjectId).ToListAsync();
});
var serviceTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
@ -299,13 +307,15 @@ namespace Marco.Pms.Services.Controllers
&& p.OrganizationTypeId == ServiceProvider);
});
await Task.WhenAll(organizationTask, parentorganizationTask, projectTask, projectServicesTask, isPMCTask, isServiceProviderTask, serviceTask, organizationTypeTask);
await Task.WhenAll(organizationTask, parentorganizationTask, projectTask, projectServicesTask, isPMCTask, isServiceProviderTask,
serviceTask, organizationTypeTask, projectOrganizationsTask);
var services = serviceTask.Result;
var organizationType = organizationTypeTask.Result;
var organization = organizationTask.Result;
var projectServices = projectServicesTask.Result;
var parentorganization = parentorganizationTask.Result;
var projectOrganizations = projectOrganizationsTask.Result;
var project = projectTask.Result;
var isPMC = isPMCTask.Result;
var isServiceProvider = isServiceProviderTask.Result;
@ -324,7 +334,7 @@ namespace Marco.Pms.Services.Controllers
}
var serviceProviderTenantMapping = await _context.TenantOrgMappings
.FirstOrDefaultAsync(spt => spt.OrganizationId == model.OrganizationId && spt.TenantId == project.TenantId);
.FirstOrDefaultAsync(spt => spt.OrganizationId == model.OrganizationId && spt.TenantId == project.TenantId && spt.IsActive);
if (serviceProviderTenantMapping == null)
{
@ -332,6 +342,7 @@ namespace Marco.Pms.Services.Controllers
{
OrganizationId = organization.Id,
SPRID = organization.SPRID,
AssignedDate = DateTime.UtcNow,
IsActive = true,
TenantId = project.TenantId
};
@ -374,7 +385,12 @@ namespace Marco.Pms.Services.Controllers
AssignedDate = DateTime.UtcNow,
TenantId = project.TenantId
};
projectOrgMappings.Add(projectOrgMapping);
var projectOrganization = projectOrganizations
.FirstOrDefault(po => po.ProjectService != null && po.ProjectService.ProjectId == project.Id && po.ProjectService.ServiceId == serviceId);
if (projectOrganization == null)
{
projectOrgMappings.Add(projectOrgMapping);
}
}
_context.ProjectOrgMappings.AddRange(projectOrgMappings);

View File

@ -502,6 +502,14 @@ namespace MarcoBMS.Services.Controllers
#region =================================================================== Assign Service APIs ===================================================================
[HttpGet("get/assigned/services/{projectId}")]
public async Task<IActionResult> AssignServiceToProject(Guid projectId)
{
Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _projectServices.GetAssignedServiceToProjectAsync(projectId, tenantId, loggedInEmployee);
return StatusCode(response.StatusCode, response);
}
[HttpPost("assign/service")]
public async Task<IActionResult> AssignServiceToProject([FromBody] AssignServiceDto model)
{

View File

@ -213,6 +213,7 @@ namespace Marco.Pms.Services.Service
//}
#endregion
#region =================================================================== Services APIs ===================================================================
public async Task<ApiResponse<object>> GetServicesAsync(Employee loggedInEmployee, Guid tenantId)
{

View File

@ -7,6 +7,7 @@ using Marco.Pms.Model.Dtos.Projects;
using Marco.Pms.Model.Dtos.Util;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.MongoDBModels.Project;
using Marco.Pms.Model.OrganizationModel;
using Marco.Pms.Model.Projects;
@ -1834,16 +1835,84 @@ namespace Marco.Pms.Services.Service
#region =================================================================== Assign Service APIs ===================================================================
public async Task<ApiResponse<object>> GetAssignedServiceToProjectAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee)
{
try
{
using var scope = _serviceScopeFactory.CreateScope();
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
var project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == projectId && p.TenantId == tenantId);
if (project == null)
{
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 404);
}
var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId);
if (!hasPermission)
{
_logger.LogWarning("Access DENIED for user {UserId} attempting to update project {ProjectId}.", loggedInEmployee.Id, projectId);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to modify this project.", 403);
}
List<ServiceMaster> services = new List<ServiceMaster>();
if (project.PromoterId == loggedInEmployee.OrganizationId && project.PMCId == loggedInEmployee.OrganizationId)
{
var projectServices = await _context.ProjectServiceMappings
.Include(ps => ps.Service)
.Where(ps => ps.ProjectId == projectId && ps.Service != null && ps.TenantId == tenantId && ps.IsActive)
.ToListAsync();
services = projectServices.Select(ps => ps.Service!).Distinct().ToList();
}
else
{
var orgProjectMapping = await _context.ProjectOrgMappings
.Include(po => po.ProjectService)
.ThenInclude(ps => ps!.Service)
.Where(po => po.OrganizationId == loggedInEmployee.OrganizationId && po.ProjectService != null
&& po.ProjectService.IsActive && po.ProjectService.ProjectId == projectId && po.ProjectService.Service != null)
.ToListAsync();
services = orgProjectMapping.Select(po => po.ProjectService!.Service!).Distinct().ToList();
}
var response = _mapper.Map<List<ServiceMasterVM>>(services);
return ApiResponse<object>.SuccessResponse(response, "Successfully fetched the services for this project", 200);
}
catch (DbUpdateException dbEx)
{
//await transaction.RollbackAsync();
_logger.LogError(dbEx, "Database Exception has been occured, While deassigning the sevice to the project");
return ApiResponse<object>.ErrorResponse("Internal error", "An database exception has been occured", 500);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception has been occured, While deassigning the sevice to the project");
return ApiResponse<object>.ErrorResponse("Internal error", "An internal exception has been occured", 500);
}
}
public async Task<ApiResponse<object>> AssignServiceToProjectAsync(AssignServiceDto model, Guid tenantId, Employee loggedInEmployee)
{
await using var transaction = await _context.Database.BeginTransactionAsync();
try
{
using var scope = _serviceScopeFactory.CreateScope();
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
var project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId);
if (project == null)
{
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 404);
}
var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, model.ProjectId);
if (!hasPermission)
{
_logger.LogWarning("Access DENIED for user {UserId} attempting to update project {ProjectId}.", loggedInEmployee.Id, model.ProjectId);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to modify this project.", 403);
}
var todaysDate = DateTime.UtcNow.Date;
var projectServicesTask = Task.Run(async () =>
@ -1915,11 +1984,21 @@ namespace Marco.Pms.Services.Service
await using var transaction = await _context.Database.BeginTransactionAsync();
try
{
using var scope = _serviceScopeFactory.CreateScope();
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
var project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId);
if (project == null)
{
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 404);
}
var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, model.ProjectId);
if (!hasPermission)
{
_logger.LogWarning("Access DENIED for user {UserId} attempting to update project {ProjectId}.", loggedInEmployee.Id, model.ProjectId);
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to modify this project.", 403);
}
var todaysDate = DateTime.UtcNow.Date;
var projectServicesTask = Task.Run(async () =>

View File

@ -43,6 +43,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
Task<ApiResponse<object>> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
Task<ApiResponse<object>> GetAllPermissionFroProjectAsync(Guid projectId, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> GetAssignedServiceToProjectAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
Task<ApiResponse<object>> AssignServiceToProjectAsync(AssignServiceDto model, Guid tenantId, Employee loggedInEmployee);
Task<ApiResponse<object>> DeassignServiceToProjectAsync(DeassignServiceDto model, Guid tenantId, Employee loggedInEmployee);