diff --git a/Marco.Pms.Services/Controllers/ServiceProjectController.cs b/Marco.Pms.Services/Controllers/ServiceProjectController.cs index b7ce48b..96feef3 100644 --- a/Marco.Pms.Services/Controllers/ServiceProjectController.cs +++ b/Marco.Pms.Services/Controllers/ServiceProjectController.cs @@ -38,11 +38,11 @@ namespace Marco.Pms.Services.Controllers var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList(); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } - Employee LoggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _serviceProject.CreateServiceProject(serviceProject, tenantId, LoggedInEmploee); + Employee loggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _serviceProject.CreateServiceProjectAsync(serviceProject, loggedInEmploee, tenantId); if (response.Success) { - var notification = new { LoggedInUserId = LoggedInEmploee.Id, Keyword = "Create_ServiceProject", Response = response.Data }; + var notification = new { LoggedInUserId = loggedInEmploee.Id, Keyword = "Service_Project", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); @@ -58,31 +58,49 @@ namespace Marco.Pms.Services.Controllers var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList(); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } - Employee LoggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _serviceProject.GetServiceProjectList(pageNumber, pageSize, LoggedInEmploee, tenantId); + Employee loggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _serviceProject.GetServiceProjectListAsync(pageNumber, pageSize, loggedInEmploee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPut("edit/{id}")] - public async Task UpdateProject(Guid id, [FromBody] ServiceProjectDto serviceProject) + public async Task UpdateServicecProject(Guid id, [FromBody] ServiceProjectDto serviceProject) { if (!ModelState.IsValid) { var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList(); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } - Employee LoggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _serviceProject.UpdateServiceProject(id, serviceProject, tenantId, LoggedInEmploee); + Employee loggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _serviceProject.UpdateServiceProjectAsync(id, serviceProject, loggedInEmploee, tenantId); if (response.Success) { - var notification = new { LoggedInUserId = LoggedInEmploee.Id, Keyword = "Create_ServiceProject", Response = response.Data }; + var notification = new { LoggedInUserId = loggedInEmploee.Id, Keyword = "Service_Project", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } + [HttpDelete("delete/{id}")] + public async Task DeActivateServiceProject(Guid id, bool isActive = false) + { + if (!ModelState.IsValid) + { + var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList(); + return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); + } + Employee loggedInEmploee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _serviceProject.DeActivateServiceProjectAsync(id, isActive, loggedInEmploee, tenantId); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmploee.Id, Keyword = "Service_Project", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } + return StatusCode(response.StatusCode, response); + } + } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IServiceProject.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IServiceProject.cs index 65557de..aa99f85 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IServiceProject.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IServiceProject.cs @@ -7,10 +7,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces public interface IServiceProject { - Task> CreateServiceProject(ServiceProjectDto serviceProject, Guid TenantId, Employee loggedInEmployee); - Task> GetServiceProjectList(int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId); - Task> UpdateServiceProject(Guid id, ServiceProjectDto serviceProject, Guid tenantId, Employee loggedInEmployee); - + Task> CreateServiceProjectAsync(ServiceProjectDto serviceProject, Employee loggedInEmployee, Guid TenantId); + Task> GetServiceProjectListAsync(int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId); + Task> UpdateServiceProjectAsync(Guid id, ServiceProjectDto serviceProject, Employee loggedInEmployee, Guid tenantId); + Task> DeActivateServiceProjectAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) } diff --git a/Marco.Pms.Services/Service/ServiceProjectService.cs b/Marco.Pms.Services/Service/ServiceProjectService.cs index 7d64db8..14ff9ab 100644 --- a/Marco.Pms.Services/Service/ServiceProjectService.cs +++ b/Marco.Pms.Services/Service/ServiceProjectService.cs @@ -41,7 +41,7 @@ namespace Marco.Pms.Services.Service } - public async Task> CreateServiceProject(ServiceProjectDto model, Guid tenantId, Employee loggedInEmployee) + public async Task> CreateServiceProjectAsync(ServiceProjectDto model, Employee loggedInEmployee, Guid tenantId) { var serviceIds = model.Services.Where(s => s.IsActive).Select(s => s.ServiceId).ToList(); var clientTask = Task.Run(async () => @@ -118,7 +118,7 @@ namespace Marco.Pms.Services.Service } - public async Task> GetServiceProjectList(int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId) + public async Task> GetServiceProjectListAsync(int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId) { try { @@ -164,7 +164,7 @@ namespace Marco.Pms.Services.Service } } - public async Task> UpdateServiceProject(Guid id, ServiceProjectDto model, Guid tenantId, Employee loggedInEmployee) + public async Task> UpdateServiceProjectAsync(Guid id, ServiceProjectDto model, Employee loggedInEmployee, Guid tenantId) { try { @@ -200,7 +200,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Project Status not found", "Project Status not found", 404); } - var serviceProject = await _context.ServiceProjects.Where(sp => sp.Id == id && sp.TenantId == tenantId).FirstOrDefaultAsync(); + var serviceProject = await _context.ServiceProjects.Where(sp => sp.Id == id && sp.TenantId == tenantId && sp.IsActive).FirstOrDefaultAsync(); if (serviceProject == null) { @@ -287,6 +287,35 @@ namespace Marco.Pms.Services.Service } } + public async Task> DeActivateServiceProjectAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + try + { + + var serviceProject = await _context.ServiceProjects + .Where(sp => sp.Id == id && sp.TenantId == tenantId).FirstOrDefaultAsync(); + + if (serviceProject == null) + { + _logger.LogWarning("Attempt to de-activate non-existent Service project with ID {ProjectId} by user {UserId}.", id, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Project not found.", $"No project found with ID {id}.", 404); + } + + serviceProject.IsActive = isActive; + + await _context.SaveChangesAsync(); + + _logger.LogInfo("Successfully de-activated service project {ProjectId}", id); + return ApiResponse.SuccessResponse(new { }, "Projects de-activated successfully.", 200); + + } + catch (Exception ex) + { + // --- Step 5: Graceful Error Handling --- + _logger.LogError(ex, "An unexpected error occurred in DeActivateServiceProject for tenant {TenantId}.", tenantId); + return ApiResponse.ErrorResponse("An internal server error occurred. Please try again later.", null, 500); + } + } } }