Refactor leave date overlap check in LeaveRequestController for improved readability and performance
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m51s

This commit is contained in:
Suphonchai Phoonsawat 2026-03-26 14:10:37 +07:00
parent 19b79a162d
commit 3e3bfff7ba

View file

@ -1070,26 +1070,38 @@ namespace BMA.EHR.Leave.Service.Controllers
fiscalYear = req.StartLeaveDate.Year + 1;
var sumLeaveDay = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(fiscalYear, req.Type, userId);
var minLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type &&
(x.LeaveStatus == "PENDING" || x.LeaveStatus == "APPROVE") &&
x.KeycloakUserId == userId)
.OrderBy(x => x.LeaveStartDate)
.FirstOrDefaultAsync());
var maxLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type &&
(x.LeaveStatus == "PENDING" || x.LeaveStatus == "APPROVE") &&
x.KeycloakUserId == userId)
.OrderByDescending(x => x.LeaveEndDate)
.FirstOrDefaultAsync());
var isBetween = false;
if (minLeave != null && maxLeave != null)
{
isBetween = (req.StartLeaveDate.Date >= minLeave.LeaveStartDate.Date && req.StartLeaveDate.Date <= maxLeave.LeaveEndDate.Date) ||
(req.EndLeaveDate.Date >= minLeave.LeaveStartDate.Date && req.EndLeaveDate.Date <= maxLeave.LeaveEndDate.Date);
}
var existingLeaves = await _context.Set<LeaveRequest>()
.Where(x => x.Type.Id == req.Type &&
(x.LeaveStatus == "PENDING" || x.LeaveStatus == "APPROVE") &&
x.KeycloakUserId == userId)
.ToListAsync();
isBetween = existingLeaves.Any(leave =>
req.StartLeaveDate.Date <= leave.LeaveEndDate.Date &&
req.EndLeaveDate.Date >= leave.LeaveStartDate.Date);
// var minLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type &&
// (x.LeaveStatus == "PENDING" || x.LeaveStatus == "APPROVE") &&
// x.KeycloakUserId == userId)
// .OrderBy(x => x.LeaveStartDate)
// .FirstOrDefaultAsync());
// var maxLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type &&
// (x.LeaveStatus == "PENDING" || x.LeaveStatus == "APPROVE") &&
// x.KeycloakUserId == userId)
// .OrderByDescending(x => x.LeaveEndDate)
// .FirstOrDefaultAsync());
// var isBetween = false;
// if (minLeave != null && maxLeave != null)
// {
// // isBetween = (req.StartLeaveDate.Date >= minLeave.LeaveStartDate.Date && req.StartLeaveDate.Date <= maxLeave.LeaveEndDate.Date) ||
// // (req.EndLeaveDate.Date >= minLeave.LeaveStartDate.Date && req.EndLeaveDate.Date <= maxLeave.LeaveEndDate.Date);
// isBetween = req.StartLeaveDate.Date <= maxLeave.LeaveEndDate.Date &&
// req.EndLeaveDate.Date >= minLeave.LeaveStartDate.Date;
// }
var isLeave = false;
var approveDay = sumLeaveDay == null ? 0.0 : sumLeaveDay.LeaveDaysUsed;