From b4931aafd6b9be2c74be8ee13de51935345dff58 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 12:54:49 +0530 Subject: [PATCH] Added an API to modify isActive parameter in Expense type master table for that tenant --- .../Controllers/MasterController.cs | 24 +++++-- Marco.Pms.Services/Service/MasterService.cs | 62 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 013c890..411a413 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -875,21 +875,31 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPost("expenses-type")] - public async Task CreateExpenseType(ExpensesTypeMasterDto dto) + public async Task CreateExpenseType([FromBody] ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreateExpenseTypeAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-type/edit/{id}")] - public async Task UpdateExpenseType(Guid id, ExpensesTypeMasterDto dto) + public async Task UpdateExpenseType(Guid id, [FromBody] ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdateExpenseTypeAsync(id, dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpDelete("expenses-type/delete/{id}")] + public async Task DeleteExpenseType(Guid id, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteExpenseTypeAsync(id, isActive, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Expenses Status APIs =================================================================== @@ -901,15 +911,17 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPost("expenses-status")] - public async Task CreateExpensesStatus(ExpensesStatusMasterDto dto) + public async Task CreateExpensesStatus([FromBody] ExpensesStatusMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreateExpensesStatusAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-status/edit/{id}")] - public async Task UpdateExpensesStatus(Guid id, ExpensesStatusMasterDto dto) + public async Task UpdateExpensesStatus(Guid id, [FromBody] ExpensesStatusMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdateExpensesStatusAsync(id, dto, loggedInEmployee, tenantId); @@ -929,7 +941,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPost("payment-mode")] - public async Task CreatePaymentMode(PaymentModeMatserDto dto) + public async Task CreatePaymentMode([FromBody] PaymentModeMatserDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreatePaymentModeAsync(dto, loggedInEmployee, tenantId); @@ -937,7 +949,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPut("payment-mode/edit/{id}")] - public async Task UpdatePaymentMode(Guid id, PaymentModeMatserDto dto) + public async Task UpdatePaymentMode(Guid id, [FromBody] PaymentModeMatserDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdatePaymentModeAsync(id, dto, loggedInEmployee, tenantId); diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 294b13c..a23a597 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -181,6 +181,68 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + string action = isActive ? "delete" : "restore"; + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to {Action} expense type in different tenant", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Checking permssion for managing masters + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPANSES TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var expensesType = await _context.ExpensesTypeMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if expense type exists + if (expensesType == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} expense type, but not found in database", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Expense Type not found", "Expense Type not found", 404); + } + + // Mapping ExpensesTypeMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesType); + + expensesType.IsActive = isActive; + await _context.SaveChangesAsync(); + + _logger.LogInfo("Expense Type {ExpensesTypeId} was {Action}d by employee {EmployeeId}", expensesType.Id, action, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = expensesType.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "ExpensesTypeMasterModificationLog"); + + // Mapping ExpensesTypeMaster to ExpensesTypeMasterVM + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, $"Expense type {action}d Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while {Action}ing expense type by employee {EmployeeId}", action, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while {Action}ing expense type by employee {EmployeeId}", action, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 24a26bf..774ac4a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -10,6 +10,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpenseTypeAsync(Guid id, ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Expenses Status APIs ===================================================================