diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 502b726..7c45839 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -292,6 +292,15 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + + [HttpGet("get/advance-payment/employee/list")] + public async Task GetAdavncePaymentEmployeeList([FromQuery] string? searchString) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetAdvancePaymentEmployeeListAsync(searchString, loggedInEmployee, tenantId); + + return StatusCode(response.StatusCode, response); + } #endregion } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d4d8994..c7ddb49 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -3194,6 +3194,51 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("End GetAdvancePaymentTransactionAsync called by EmployeeId: {EmployeeId}", loggedInEmployee.Id); } } + 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 diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 3c1f637..3334054 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -39,6 +39,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Advance Payment Functions =================================================================== Task> GetAdvancePaymentTransactionAsync(Guid id, Employee loggedInEmployee, Guid tenantId); + Task> GetAdvancePaymentEmployeeListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId); #endregion