Compare commits
No commits in common. "445d02662a73102b7ffccab9e07f64890ebd15a4" and "90a2b23c1a53c4ca0bdffaabd14f99f22956eed7" have entirely different histories.
445d02662a
...
90a2b23c1a
@ -9,7 +9,6 @@ using Marco.Pms.Model.Projects;
|
|||||||
using Marco.Pms.Model.Utilities;
|
using Marco.Pms.Model.Utilities;
|
||||||
using Marco.Pms.Model.ViewModels.Activities;
|
using Marco.Pms.Model.ViewModels.Activities;
|
||||||
using Marco.Pms.Model.ViewModels.Employee;
|
using Marco.Pms.Model.ViewModels.Employee;
|
||||||
using Marco.Pms.Services.Helpers;
|
|
||||||
using Marco.Pms.Services.Hubs;
|
using Marco.Pms.Services.Hubs;
|
||||||
using Marco.Pms.Services.Service;
|
using Marco.Pms.Services.Service;
|
||||||
using Marco.Pms.Services.Service.ServiceInterfaces;
|
using Marco.Pms.Services.Service.ServiceInterfaces;
|
||||||
@ -37,7 +36,6 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
private readonly IEmailSender _emailSender;
|
private readonly IEmailSender _emailSender;
|
||||||
private readonly EmployeeHelper _employeeHelper;
|
private readonly EmployeeHelper _employeeHelper;
|
||||||
private readonly UserHelper _userHelper;
|
private readonly UserHelper _userHelper;
|
||||||
private readonly GeneralHelper _generalHelper;
|
|
||||||
private readonly IConfiguration _configuration;
|
private readonly IConfiguration _configuration;
|
||||||
private readonly ILoggingService _logger;
|
private readonly ILoggingService _logger;
|
||||||
private readonly IHubContext<MarcoHub> _signalR;
|
private readonly IHubContext<MarcoHub> _signalR;
|
||||||
@ -49,14 +47,13 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
|
|
||||||
public EmployeeController(UserManager<ApplicationUser> userManager, IEmailSender emailSender,
|
public EmployeeController(UserManager<ApplicationUser> userManager, IEmailSender emailSender,
|
||||||
ApplicationDbContext context, EmployeeHelper employeeHelper, UserHelper userHelper, IConfiguration configuration, ILoggingService logger,
|
ApplicationDbContext context, EmployeeHelper employeeHelper, UserHelper userHelper, IConfiguration configuration, ILoggingService logger,
|
||||||
IHubContext<MarcoHub> signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper, GeneralHelper generalHelper)
|
IHubContext<MarcoHub> signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_emailSender = emailSender;
|
_emailSender = emailSender;
|
||||||
_employeeHelper = employeeHelper;
|
_employeeHelper = employeeHelper;
|
||||||
_userHelper = userHelper;
|
_userHelper = userHelper;
|
||||||
_generalHelper = generalHelper;
|
|
||||||
_configuration = configuration;
|
_configuration = configuration;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_signalR = signalR;
|
_signalR = signalR;
|
||||||
@ -194,7 +191,6 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
var response = await employeeQuery.Take(10).Select(e => _mapper.Map<BasicEmployeeVM>(e)).ToListAsync();
|
var response = await employeeQuery.Take(10).Select(e => _mapper.Map<BasicEmployeeVM>(e)).ToListAsync();
|
||||||
return Ok(ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200));
|
return Ok(ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("search/{name}/{projectid?}")]
|
[Route("search/{name}/{projectid?}")]
|
||||||
public async Task<IActionResult> SearchEmployee(string name, Guid? projectid)
|
public async Task<IActionResult> SearchEmployee(string name, Guid? projectid)
|
||||||
@ -237,6 +233,11 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
return _userHelper.GetTenantId();
|
return _userHelper.GetTenantId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//[HttpPost("manage/quick")]
|
||||||
|
//public async Task<IActionResult> CreateQuickUser([FromBody] CreateQuickUserDto model)
|
||||||
|
//{
|
||||||
|
// return Ok("Pending implementation");
|
||||||
|
//}
|
||||||
|
|
||||||
[HttpPost("manage")]
|
[HttpPost("manage")]
|
||||||
public async Task<IActionResult> CreateUser([FromBody] CreateUserDto model)
|
public async Task<IActionResult> CreateUser([FromBody] CreateUserDto model)
|
||||||
@ -293,12 +294,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
TenantId = tenantId
|
TenantId = tenantId
|
||||||
|
|
||||||
};
|
};
|
||||||
var isSeatsAvaiable = await _generalHelper.CheckSeatsRemaningAsync(tenantId);
|
|
||||||
if (!isSeatsAvaiable)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Maximum number of users reached for Tenant {TenantId}", tenantId);
|
|
||||||
return BadRequest(ApiResponse<object>.ErrorResponse("Maximum number of users reached. Cannot add new user", "Maximum number of users reached. Cannot add new user", 400));
|
|
||||||
}
|
|
||||||
// Create Identity User
|
// Create Identity User
|
||||||
var result = await _userManager.CreateAsync(user, "User@123");
|
var result = await _userManager.CreateAsync(user, "User@123");
|
||||||
if (!result.Succeeded)
|
if (!result.Succeeded)
|
||||||
|
|||||||
@ -296,80 +296,5 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks whether the tenant still has available seats (MaxUsers not exceeded).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tenantId">The ID of the tenant to check.</param>
|
|
||||||
/// <returns>True if seats are available; otherwise false.</returns>
|
|
||||||
public async Task<bool> CheckSeatsRemainingAsync(Guid tenantId)
|
|
||||||
{
|
|
||||||
_logger.LogInfo("Checking seats remaining for TenantId: {TenantId}", tenantId);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Run both queries concurrently
|
|
||||||
var totalSeatsTask = GetMaxSeatsAsync(tenantId);
|
|
||||||
var totalSeatsTakenTask = GetActiveEmployeesCountAsync(tenantId);
|
|
||||||
|
|
||||||
await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask);
|
|
||||||
|
|
||||||
var totalSeats = await totalSeatsTask;
|
|
||||||
var totalSeatsTaken = await totalSeatsTakenTask;
|
|
||||||
|
|
||||||
_logger.LogInfo(
|
|
||||||
"TenantId: {TenantId} | TotalSeats: {TotalSeats} | SeatsTaken: {SeatsTaken}",
|
|
||||||
tenantId, totalSeats, totalSeatsTaken);
|
|
||||||
|
|
||||||
bool seatsAvailable = totalSeats >= totalSeatsTaken;
|
|
||||||
|
|
||||||
_logger.LogDebug("TenantId: {TenantId} | Seats Available: {SeatsAvailable}",
|
|
||||||
tenantId, seatsAvailable);
|
|
||||||
|
|
||||||
return seatsAvailable;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error checking seats for TenantId: {TenantId}", tenantId);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieves the maximum number of allowed seats (MaxUsers) for a tenant.
|
|
||||||
/// </summary>
|
|
||||||
private async Task<double> GetMaxSeatsAsync(Guid tenantId)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Fetching maximum seats for TenantId: {TenantId}", tenantId);
|
|
||||||
|
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
|
|
||||||
var maxSeats = await dbContext.TenantSubscriptions
|
|
||||||
.Where(ts => ts.TenantId == tenantId && !ts.IsCancelled)
|
|
||||||
.Select(ts => ts.MaxUsers)
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
_logger.LogDebug("TenantId: {TenantId} | MaxSeats: {MaxSeats}", tenantId, maxSeats);
|
|
||||||
|
|
||||||
return maxSeats;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Counts the number of active employees for a tenant.
|
|
||||||
/// </summary>
|
|
||||||
private async Task<int> GetActiveEmployeesCountAsync(Guid tenantId)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Counting active employees for TenantId: {TenantId}", tenantId);
|
|
||||||
|
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
|
|
||||||
var activeEmployees = await dbContext.Employees
|
|
||||||
.Where(e => e.TenantId == tenantId && e.IsActive)
|
|
||||||
.CountAsync();
|
|
||||||
|
|
||||||
_logger.LogDebug("TenantId: {TenantId} | ActiveEmployees: {ActiveEmployees}", tenantId, activeEmployees);
|
|
||||||
|
|
||||||
return activeEmployees;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user