From e1102c297808c47c3ac0ea46c554c7438abc611f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 10:26:29 +0530 Subject: [PATCH] Added an API to add new Expense type to master table for that tenant --- .../Controllers/MasterController.cs | 2 +- Marco.Pms.Services/Service/MasterService.cs | 47 ++++++++++++++----- .../ServiceInterfaces/IMasterService.cs | 13 ++++- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 6b059b1..0a5a7a8 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -879,7 +879,7 @@ namespace Marco.Pms.Services.Controllers public async Task CreateExpenseType(ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); + var response = await _masterService.CreateExpenseTypeAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 2705e43..5e816aa 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -58,21 +58,43 @@ namespace Marco.Pms.Services.Service } } - public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto, Employee loggedInEmployee, Guid tenantId) + public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId) { - var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); - if (!hasManagePermission) + try { - _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 Upload expenses for this project", 403); - } - var expensesType = _mapper.Map(dto); - _context.ExpensesTypeMaster.Add(expensesType); - await _context.SaveChangesAsync(); - _logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to add new expense type in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + 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 Upload expenses for this project", 403); + } + var expensesType = _mapper.Map(model); + expensesType.TenantId = tenantId; - var response = _mapper.Map(expensesType); - return ApiResponse.SuccessResponse(response, "Expense type craeted Successfully", 201); + _context.ExpensesTypeMaster.Add(expensesType); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, "Expense type craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new expense type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while adding new expense type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } } #endregion @@ -148,7 +170,6 @@ namespace Marco.Pms.Services.Service } } - #endregion #region =================================================================== Helper Function =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index e427fc4..13bdcbb 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -1,12 +1,23 @@ -using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Dtos.Master; +using Marco.Pms.Model.Employees; using Marco.Pms.Model.Utilities; namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IMasterService { + #region =================================================================== Expenses Type APIs =================================================================== Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); + + #endregion + #region =================================================================== Expenses Status APIs =================================================================== Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId); + + #endregion + #region =================================================================== Payment mode APIs =================================================================== Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); + + #endregion } }