diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index b0d367b..4c47fbe 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -297,7 +297,7 @@ namespace Marco.Pms.Services.Controllers public async Task GetAdavncePaymentEmployeeList([FromQuery] string? searchString) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _expensesService.GetAdavncePaymentEmployeeListAsync(searchString, loggedInEmployee, tenantId); + var response = await _expensesService.GetAdvancePaymentEmployeeListAsync(searchString, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index e1a7957..84370e0 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -3120,21 +3120,28 @@ namespace Marco.Pms.Services.Service #region =================================================================== Advance Payment Functions =================================================================== public async Task> GetAdvancePaymentTransactionAsync(Guid employeeId, Employee loggedInEmployee, Guid tenantId) { + _logger.LogInfo("Start GetAdvancePaymentTransactionAsync called by EmployeeId: {EmployeeId} for TenantId: {TenantId} and EmployeeId param: {ParamEmployeeId}", + loggedInEmployee.Id, tenantId, employeeId); + try { + // Fetch advance payment transactions for specified employee, including related navigation properties var transactions = await _context.AdvancePaymentTransactions .Include(apt => apt.Project) - .Include(apt => apt.Employee) - .ThenInclude(e => e!.JobRole) - .Include(apt => apt.CreatedBy) - .ThenInclude(e => e!.JobRole) - .Where(apt => apt.EmployeeId == employeeId && apt.IsActive) + .Include(apt => apt.Employee).ThenInclude(e => e!.JobRole) + .Include(apt => apt.CreatedBy).ThenInclude(e => e!.JobRole) + .Where(apt => apt.EmployeeId == employeeId && apt.TenantId == tenantId && apt.IsActive) .OrderByDescending(apt => apt.CreatedAt) .ToListAsync(); + // Check if any transactions found if (transactions == null || !transactions.Any()) + { + _logger.LogWarning("No advance payment transactions found for EmployeeId: {EmployeeId} in TenantId: {TenantId}.", employeeId, tenantId); return ApiResponse.ErrorResponse("No advance payment transactions found.", null, 404); + } + // Map transactions to view model with formatted FinanceUId var response = transactions.Select(transaction => { var result = _mapper.Map(transaction); @@ -3142,37 +3149,67 @@ namespace Marco.Pms.Services.Service return result; }).ToList(); + _logger.LogInfo("Fetched {Count} advance payment transactions for EmployeeId: {EmployeeId} in TenantId: {TenantId}.", response.Count, employeeId, tenantId); - - return ApiResponse.SuccessResponse(response, "Advance payment transaction fetched successfully", 200); + return ApiResponse.SuccessResponse(response, "Advance payment transactions fetched successfully.", 200); } catch (Exception ex) { - _logger.LogError(ex, "Exception occurred while fetching the list of Advance Payment Transactions."); + _logger.LogError(ex, "Exception occurred in GetAdvancePaymentTransactionAsync for EmployeeId: {EmployeeId} in TenantId: {TenantId}: {Message}", + employeeId, tenantId, ex.Message); return ApiResponse.ErrorResponse("Internal exception occurred.", ExceptionMapper(ex), 500); } - } - - public async Task> GetAdavncePaymentEmployeeListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId) - { - var employeeQuery = _context.AdvancePaymentTransactions - .Include(apt => apt.Employee) - .ThenInclude(e => e!.JobRole) - .Where(apt => apt.TenantId == tenantId && apt.Employee != null) - .Select(apt => apt.Employee); - - if (!string.IsNullOrWhiteSpace(searchString)) + finally { - employeeQuery = employeeQuery.Where(e => (e.FirstName + e.LastName).Contains(searchString)); + _logger.LogInfo("End GetAdvancePaymentTransactionAsync called by EmployeeId: {EmployeeId}", loggedInEmployee.Id); } - - var employees = await employeeQuery - .Distinct() - .ToListAsync(); - - var response = _mapper.Map>(employees); - return ApiResponse.SuccessResponse(response, "List of employee having advance payment fetched successfully", 200); } + public async Task> GetAdvancePaymentEmployeeListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("Start GetAdvancePaymentEmployeeListAsync called by EmployeeId: {EmployeeId} for TenantId: {TenantId} with SearchString: {SearchString}", + loggedInEmployee.Id, tenantId, string.IsNullOrWhiteSpace(searchString) ? "NULL or Empty" : searchString); + + try + { + // Base query: select employees who have advance payment transactions for the tenant + var employeeQuery = _context.AdvancePaymentTransactions + .Include(apt => apt.Employee) + .ThenInclude(e => e!.JobRole) + .Where(apt => apt.TenantId == tenantId && apt.Employee != null) + .Select(apt => apt.Employee!); + + // Apply search filter if provided (concatenate first and last name for full name search) + if (!string.IsNullOrWhiteSpace(searchString)) + { + employeeQuery = employeeQuery.Where(e => + (e.FirstName + " " + e.LastName).Contains(searchString)); + } + + // Fetch distinct employees matching criteria + var employees = await employeeQuery + .Distinct() + .ToListAsync(); + + // Map to response view model + var response = _mapper.Map>(employees); + + _logger.LogInfo("Fetched {Count} employees with advance payments for TenantId: {TenantId}", employees.Count, tenantId); + + return ApiResponse.SuccessResponse(response, "List of employees having advance payments fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error in GetAdvancePaymentEmployeeListAsync called by EmployeeId: {EmployeeId} for TenantId: {TenantId}: {Message}", + loggedInEmployee.Id, tenantId, ex.Message); + + return ApiResponse.ErrorResponse("An error occurred while fetching employees with advance payments.", ex.Message, 500); + } + finally + { + _logger.LogInfo("End GetAdvancePaymentEmployeeListAsync called by EmployeeId: {EmployeeId}", loggedInEmployee.Id); + } + } + #endregion #region =================================================================== Helper Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 201841b..c32c28b 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -39,7 +39,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Advance Payment Functions =================================================================== Task> GetAdvancePaymentTransactionAsync(Guid id, Employee loggedInEmployee, Guid tenantId); - Task> GetAdavncePaymentEmployeeListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId); + Task> GetAdvancePaymentEmployeeListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId); #endregion }