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:
commit
86102ef70d
@ -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 class ActivityVM
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public string? ActivityName { get; set; }
|
public string? ActivityName { get; set; }
|
||||||
|
|
||||||
public string? UnitOfMeasurement { get; set; }
|
public string? UnitOfMeasurement { get; set; }
|
||||||
public List<CheckListVM>? CheckLists { get; set; }
|
public List<CheckListVM>? CheckLists { get; set; }
|
||||||
public ActivityGroupMasterVM? ActivityGroup { get; set; }
|
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
public bool IsSystem { get; set; } = false;
|
public bool IsSystem { get; set; } = false;
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public string? Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public string? Description { get; set; }
|
public string? Description { get; set; }
|
||||||
public ServiceMasterVM? Service { get; set; }
|
|
||||||
public bool IsSystem { get; set; }
|
public bool IsSystem { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
}
|
}
|
||||||
|
@ -256,6 +256,14 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
.Where(sp => model.ServiceIds.Contains(sp.ServiceId) && sp.ProjectId == model.ProjectId && sp.IsActive).ToListAsync();
|
.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 () =>
|
var serviceTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var context = await _dbContextFactory.CreateDbContextAsync();
|
await using var context = await _dbContextFactory.CreateDbContextAsync();
|
||||||
@ -299,13 +307,15 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
&& p.OrganizationTypeId == ServiceProvider);
|
&& 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 services = serviceTask.Result;
|
||||||
var organizationType = organizationTypeTask.Result;
|
var organizationType = organizationTypeTask.Result;
|
||||||
var organization = organizationTask.Result;
|
var organization = organizationTask.Result;
|
||||||
var projectServices = projectServicesTask.Result;
|
var projectServices = projectServicesTask.Result;
|
||||||
var parentorganization = parentorganizationTask.Result;
|
var parentorganization = parentorganizationTask.Result;
|
||||||
|
var projectOrganizations = projectOrganizationsTask.Result;
|
||||||
var project = projectTask.Result;
|
var project = projectTask.Result;
|
||||||
var isPMC = isPMCTask.Result;
|
var isPMC = isPMCTask.Result;
|
||||||
var isServiceProvider = isServiceProviderTask.Result;
|
var isServiceProvider = isServiceProviderTask.Result;
|
||||||
@ -324,7 +334,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
var serviceProviderTenantMapping = await _context.TenantOrgMappings
|
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)
|
if (serviceProviderTenantMapping == null)
|
||||||
{
|
{
|
||||||
@ -332,6 +342,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
{
|
{
|
||||||
OrganizationId = organization.Id,
|
OrganizationId = organization.Id,
|
||||||
SPRID = organization.SPRID,
|
SPRID = organization.SPRID,
|
||||||
|
AssignedDate = DateTime.UtcNow,
|
||||||
IsActive = true,
|
IsActive = true,
|
||||||
TenantId = project.TenantId
|
TenantId = project.TenantId
|
||||||
};
|
};
|
||||||
@ -374,8 +385,13 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
AssignedDate = DateTime.UtcNow,
|
AssignedDate = DateTime.UtcNow,
|
||||||
TenantId = project.TenantId
|
TenantId = project.TenantId
|
||||||
};
|
};
|
||||||
|
var projectOrganization = projectOrganizations
|
||||||
|
.FirstOrDefault(po => po.ProjectService != null && po.ProjectService.ProjectId == project.Id && po.ProjectService.ServiceId == serviceId);
|
||||||
|
if (projectOrganization == null)
|
||||||
|
{
|
||||||
projectOrgMappings.Add(projectOrgMapping);
|
projectOrgMappings.Add(projectOrgMapping);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_context.ProjectOrgMappings.AddRange(projectOrgMappings);
|
_context.ProjectOrgMappings.AddRange(projectOrgMappings);
|
||||||
|
|
||||||
|
@ -502,6 +502,14 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
|
|
||||||
#region =================================================================== Assign Service APIs ===================================================================
|
#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")]
|
[HttpPost("assign/service")]
|
||||||
public async Task<IActionResult> AssignServiceToProject([FromBody] AssignServiceDto model)
|
public async Task<IActionResult> AssignServiceToProject([FromBody] AssignServiceDto model)
|
||||||
{
|
{
|
||||||
|
@ -213,6 +213,7 @@ namespace Marco.Pms.Services.Service
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region =================================================================== Services APIs ===================================================================
|
#region =================================================================== Services APIs ===================================================================
|
||||||
public async Task<ApiResponse<object>> GetServicesAsync(Employee loggedInEmployee, Guid tenantId)
|
public async Task<ApiResponse<object>> GetServicesAsync(Employee loggedInEmployee, Guid tenantId)
|
||||||
{
|
{
|
||||||
|
@ -7,6 +7,7 @@ using Marco.Pms.Model.Dtos.Projects;
|
|||||||
using Marco.Pms.Model.Dtos.Util;
|
using Marco.Pms.Model.Dtos.Util;
|
||||||
using Marco.Pms.Model.Employees;
|
using Marco.Pms.Model.Employees;
|
||||||
using Marco.Pms.Model.Entitlements;
|
using Marco.Pms.Model.Entitlements;
|
||||||
|
using Marco.Pms.Model.Master;
|
||||||
using Marco.Pms.Model.MongoDBModels.Project;
|
using Marco.Pms.Model.MongoDBModels.Project;
|
||||||
using Marco.Pms.Model.OrganizationModel;
|
using Marco.Pms.Model.OrganizationModel;
|
||||||
using Marco.Pms.Model.Projects;
|
using Marco.Pms.Model.Projects;
|
||||||
@ -1834,16 +1835,84 @@ namespace Marco.Pms.Services.Service
|
|||||||
|
|
||||||
#region =================================================================== Assign Service APIs ===================================================================
|
#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)
|
public async Task<ApiResponse<object>> AssignServiceToProjectAsync(AssignServiceDto model, Guid tenantId, Employee loggedInEmployee)
|
||||||
{
|
{
|
||||||
await using var transaction = await _context.Database.BeginTransactionAsync();
|
await using var transaction = await _context.Database.BeginTransactionAsync();
|
||||||
try
|
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);
|
var project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId);
|
||||||
if (project == null)
|
if (project == null)
|
||||||
{
|
{
|
||||||
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 404);
|
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 todaysDate = DateTime.UtcNow.Date;
|
||||||
|
|
||||||
var projectServicesTask = Task.Run(async () =>
|
var projectServicesTask = Task.Run(async () =>
|
||||||
@ -1915,11 +1984,21 @@ namespace Marco.Pms.Services.Service
|
|||||||
await using var transaction = await _context.Database.BeginTransactionAsync();
|
await using var transaction = await _context.Database.BeginTransactionAsync();
|
||||||
try
|
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);
|
var project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId);
|
||||||
if (project == null)
|
if (project == null)
|
||||||
{
|
{
|
||||||
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 404);
|
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 todaysDate = DateTime.UtcNow.Date;
|
||||||
|
|
||||||
var projectServicesTask = Task.Run(async () =>
|
var projectServicesTask = Task.Run(async () =>
|
||||||
|
@ -43,6 +43,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
|
|||||||
Task<ApiResponse<object>> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
|
Task<ApiResponse<object>> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
|
||||||
Task<ApiResponse<object>> GetAllPermissionFroProjectAsync(Guid projectId, Employee loggedInEmployee, Guid tenantId);
|
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>> AssignServiceToProjectAsync(AssignServiceDto model, Guid tenantId, Employee loggedInEmployee);
|
||||||
Task<ApiResponse<object>> DeassignServiceToProjectAsync(DeassignServiceDto model, Guid tenantId, Employee loggedInEmployee);
|
Task<ApiResponse<object>> DeassignServiceToProjectAsync(DeassignServiceDto model, Guid tenantId, Employee loggedInEmployee);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user