Optimized the get list of payment request API
This commit is contained in:
parent
bb14204d65
commit
93ff8aefb5
@ -7,6 +7,7 @@
|
|||||||
public List<Guid>? CreatedByIds { get; set; }
|
public List<Guid>? CreatedByIds { get; set; }
|
||||||
public List<Guid>? CurrencyIds { get; set; }
|
public List<Guid>? CurrencyIds { get; set; }
|
||||||
public List<Guid>? ExpenseCategoryIds { get; set; }
|
public List<Guid>? ExpenseCategoryIds { get; set; }
|
||||||
|
public List<string>? Payees { get; set; }
|
||||||
public DateTime? StartDate { get; set; }
|
public DateTime? StartDate { get; set; }
|
||||||
public DateTime? EndDate { get; set; }
|
public DateTime? EndDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1096,9 +1096,14 @@ namespace Marco.Pms.Services.Service
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region =================================================================== Payment Request Functions ===================================================================
|
#region =================================================================== Payment Request Functions ===================================================================
|
||||||
|
|
||||||
public async Task<ApiResponse<object>> GetPaymentRequestListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId)
|
public async Task<ApiResponse<object>> GetPaymentRequestListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId)
|
||||||
{
|
{
|
||||||
|
_logger.LogInfo("Start GetPaymentRequestListAsync: TenantId={TenantId}, PageNumber={PageNumber}, PageSize={PageSize}, EmployeeId={EmployeeId}",
|
||||||
|
tenantId, pageNumber, pageSize, loggedInEmployee.Id);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Initial query including the necessary navigation properties and basic multi-tenant/security constraints
|
||||||
var paymentRequestQuery = _context.PaymentRequests
|
var paymentRequestQuery = _context.PaymentRequests
|
||||||
.Include(pr => pr.Currency)
|
.Include(pr => pr.Currency)
|
||||||
.Include(pr => pr.Project)
|
.Include(pr => pr.Project)
|
||||||
@ -1115,52 +1120,105 @@ namespace Marco.Pms.Services.Service
|
|||||||
pr.CreatedBy != null &&
|
pr.CreatedBy != null &&
|
||||||
pr.CreatedBy.JobRole != null);
|
pr.CreatedBy.JobRole != null);
|
||||||
|
|
||||||
//PaymentRequestFilter? paymentRequestFilter = TryDeserializePaymentRequestFilter(filter);
|
// Deserialize and apply advanced filter if provided
|
||||||
|
PaymentRequestFilter? paymentRequestFilter = TryDeserializePaymentRequestFilter(filter);
|
||||||
|
|
||||||
//if (paymentRequestFilter != null)
|
if (paymentRequestFilter != null)
|
||||||
//{
|
{
|
||||||
// if (paymentRequestFilter.ProjectIds?.Any() ?? false)
|
if (paymentRequestFilter.ProjectIds?.Any() ?? false)
|
||||||
// {
|
{
|
||||||
// paymentRequestQuery = paymentRequestQuery
|
paymentRequestQuery = paymentRequestQuery
|
||||||
// .Where(pr => pr.ProjectId.HasValue &&
|
.Where(pr => pr.ProjectId.HasValue && paymentRequestFilter.ProjectIds.Contains(pr.ProjectId.Value));
|
||||||
// paymentRequestFilter.ProjectIds.Contains(pr.ProjectId.Value));
|
}
|
||||||
// }
|
if (paymentRequestFilter.StatusIds?.Any() ?? false)
|
||||||
// if (paymentRequestFilter.StatusIds?.Any() ?? false)
|
{
|
||||||
// {
|
paymentRequestQuery = paymentRequestQuery
|
||||||
// paymentRequestQuery = paymentRequestQuery
|
.Where(pr => paymentRequestFilter.StatusIds.Contains(pr.ExpenseStatusId));
|
||||||
// .Where(pr => paymentRequestFilter.StatusIds.Contains(pr.ExpenseStatusId));
|
}
|
||||||
// }
|
if (paymentRequestFilter.CreatedByIds?.Any() ?? false)
|
||||||
// if (paymentRequestFilter.CreatedByIds?.Any() ?? false)
|
{
|
||||||
// {
|
paymentRequestQuery = paymentRequestQuery
|
||||||
// paymentRequestQuery = paymentRequestQuery
|
.Where(pr => paymentRequestFilter.CreatedByIds.Contains(pr.CreatedById));
|
||||||
// .Where(pr => paymentRequestFilter.CreatedByIds.Contains(pr.CreatedById));
|
}
|
||||||
// }
|
if (paymentRequestFilter.CurrencyIds?.Any() ?? false)
|
||||||
// if (paymentRequestFilter.ExpenseCategoryIds?.Any() ?? false)
|
{
|
||||||
// {
|
paymentRequestQuery = paymentRequestQuery
|
||||||
// paymentRequestQuery = paymentRequestQuery
|
.Where(pr => paymentRequestFilter.CurrencyIds.Contains(pr.CurrencyId));
|
||||||
// .Where(pr => paymentRequestFilter.ExpenseCategoryIds.Contains(pr.ExpenseCategoryId));
|
}
|
||||||
// }
|
if (paymentRequestFilter.ExpenseCategoryIds?.Any() ?? false)
|
||||||
//}
|
{
|
||||||
|
paymentRequestQuery = paymentRequestQuery
|
||||||
|
.Where(pr => pr.ExpenseCategoryId.HasValue && paymentRequestFilter.ExpenseCategoryIds.Contains(pr.ExpenseCategoryId.Value));
|
||||||
|
}
|
||||||
|
if (paymentRequestFilter.Payees?.Any() ?? false)
|
||||||
|
{
|
||||||
|
paymentRequestQuery = paymentRequestQuery
|
||||||
|
.Where(pr => paymentRequestFilter.Payees.Contains(pr.Payee));
|
||||||
|
}
|
||||||
|
if (paymentRequestFilter.StartDate.HasValue && paymentRequestFilter.EndDate.HasValue)
|
||||||
|
{
|
||||||
|
DateTime startDate = paymentRequestFilter.StartDate.Value.Date;
|
||||||
|
DateTime endDate = paymentRequestFilter.EndDate.Value.Date;
|
||||||
|
|
||||||
var totalEntites = await paymentRequestQuery.CountAsync();
|
paymentRequestQuery = paymentRequestQuery
|
||||||
|
.Where(pr => pr.CreatedAt.Date >= startDate && pr.CreatedAt.Date <= endDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full-text search by payee, title, or UID
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchString))
|
||||||
|
{
|
||||||
|
paymentRequestQuery = paymentRequestQuery
|
||||||
|
.Where(pr =>
|
||||||
|
pr.Payee.Contains(searchString) ||
|
||||||
|
pr.Title.Contains(searchString) ||
|
||||||
|
($"{pr.UIDPrefix}/{pr.UIDPostfix:D5}").Contains(searchString)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get total count for pagination
|
||||||
|
var totalEntities = await paymentRequestQuery.CountAsync();
|
||||||
|
|
||||||
|
// Fetch paginated result set
|
||||||
var paymentRequests = await paymentRequestQuery
|
var paymentRequests = await paymentRequestQuery
|
||||||
.OrderByDescending(e => e.CreatedAt)
|
.OrderByDescending(e => e.CreatedAt)
|
||||||
.Skip((pageNumber - 1) * pageSize)
|
.Skip((pageNumber - 1) * pageSize)
|
||||||
.Take(pageSize).ToListAsync();
|
.Take(pageSize)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
var totalPages = (int)Math.Ceiling((double)totalEntities / pageSize);
|
||||||
|
|
||||||
var totalPages = (int)Math.Ceiling((double)totalEntites / pageSize);
|
var results = paymentRequests.Select(pr =>
|
||||||
|
|
||||||
var response = paymentRequests.Select(pr =>
|
|
||||||
{
|
{
|
||||||
var result = _mapper.Map<PaymentRequestVM>(pr);
|
var result = _mapper.Map<PaymentRequestVM>(pr);
|
||||||
result.PaymentRequestUID = $"{pr.UIDPrefix}/{pr.UIDPostfix:D5}";
|
result.PaymentRequestUID = $"{pr.UIDPrefix}/{pr.UIDPostfix:D5}";
|
||||||
return result;
|
return result;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
return ApiResponse<object>.SuccessResponse(response, $"{0} Payment request fetched successfully", 200);
|
var response = new
|
||||||
|
{
|
||||||
|
CurrentPage = pageNumber,
|
||||||
|
TotalPages = totalPages,
|
||||||
|
TotalEntities = totalEntities,
|
||||||
|
Data = results,
|
||||||
|
};
|
||||||
|
|
||||||
|
_logger.LogInfo("GetPaymentRequestListAsync: {ResultCount} payment requests fetched successfully for TenantId={TenantId} Page={PageNumber}/{TotalPages}",
|
||||||
|
results.Count, tenantId, pageNumber, totalPages);
|
||||||
|
|
||||||
|
return ApiResponse<object>.SuccessResponse(response, $"{results.Count} payment requests fetched successfully.", 200);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error occurred in GetPaymentRequestListAsync for TenantId={TenantId}, EmployeeId={EmployeeId}: {Message}", tenantId, loggedInEmployee.Id, ex.Message);
|
||||||
|
return ApiResponse<object>.ErrorResponse("An error occurred while fetching payment requests.", ex.Message, 500);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_logger.LogInfo("End GetPaymentRequestListAsync for TenantId={TenantId}, EmployeeId={EmployeeId}", tenantId, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<ApiResponse<object>> CreatePaymentRequestAsync(PaymentRequestDto model, Employee loggedInEmployee, Guid tenantId)
|
public async Task<ApiResponse<object>> CreatePaymentRequestAsync(PaymentRequestDto model, Employee loggedInEmployee, Guid tenantId)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user