Compare commits

..

3 commits

Author SHA1 Message Date
Suphonchai Phoonsawat
0cb199d0ee #2587
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 2m3s
2026-07-03 11:17:17 +07:00
Suphonchai Phoonsawat
b05e7cc3ab #2585 , #2588 2026-07-03 10:53:27 +07:00
Suphonchai Phoonsawat
2f2d7fe74c ปรับการคำนวน ขาด มาสาย ปกติ ถ้ามีการลาครึ่งวัน เช้า หรือ บ่าย ในส่วนตอนการปผระมวล และอนุมัติการลา
#2584
2026-07-03 10:08:34 +07:00
3 changed files with 139 additions and 17 deletions

View file

@ -32,6 +32,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
private readonly LeaveBeginningRepository _leaveBeginningRepository;
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
private readonly UserDutyTimeRepository _userDutyTimeRepository;
private readonly DutyTimeRepository _dutyTimeRepository;
private readonly string URL = string.Empty;
@ -48,7 +51,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
IApplicationDBContext appDbContext,
MinIOLeaveService minIOService,
LeaveBeginningRepository leaveBeginningRepository,
ProcessUserTimeStampRepository processUserTimeStampRepository) : base(dbContext, httpContextAccessor)
ProcessUserTimeStampRepository processUserTimeStampRepository,
UserDutyTimeRepository userDutyTimeRepository,
DutyTimeRepository dutyTimeRepository) : base(dbContext, httpContextAccessor)
{
_dbContext = dbContext;
_httpContextAccessor = httpContextAccessor;
@ -58,6 +63,10 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
_emailSenderService = emailSenderService;
_appDbContext = appDbContext;
_userDutyTimeRepository = userDutyTimeRepository;
_dutyTimeRepository = dutyTimeRepository;
URL = (_configuration["VITE_URL_MGT"]).Replace("/api/v1", "");
Console.WriteLine($"URL : {URL}");
_minIOService = minIOService;
@ -1331,6 +1340,20 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await _appDbContext.SaveChangesAsync();
// ปรับสถานะการลงเวลา
var currentDate = rawData.LeaveStartDate;
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
if (defaultRound is null)
{
throw new Exception("ไม่พบรอบการลงเวลาทำงาน Default");
}
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(profile.Id, currentDate);
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
// TODO : รอดุึงรอบที่ผูกกับ user
var duty = userRound ?? defaultRound;
if (rawData.LeaveStartDate.Date == rawData.LeaveEndDate.Date)
{
var processCheckIn = await _dbContext.Set<ProcessUserTimeStamp>()
@ -1341,13 +1364,39 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
if (processCheckIn is not null)
{
var startTimeMorning = duty.StartTimeMorning;
var endTimeMorning = duty.EndTimeMorning;
var startTimeAfterNoon = duty.StartTimeAfternoon;
var endTimeAfterNoon = duty.EndTimeAfternoon;
// var currentDateTime = DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm"));
// var dutyEndTimeAfternoon = DateTime.Parse($"{checkout.CheckIn.ToString("yyyy-MM-dd")} {endTime1}");
// var dutyEndTimeMorning = DateTime.Parse($"{checkout.CheckIn.ToString("yyyy-MM-dd")} {endTimeMorning1}");
switch (rawData.LeaveRange.Trim().ToUpper())
{
case "MORNING":
processCheckIn.CheckInStatus = "NORMAL";
var checkIn = DateTime.Parse(processCheckIn.CheckIn.ToString("yyyy-MM-dd HH:mm"));
var startAfternoon = DateTime.Parse($"{processCheckIn.CheckIn.ToString("yyyy-MM-dd")} {startTimeAfterNoon}");
if (checkIn <= startAfternoon)
processCheckIn.CheckInStatus = "NORMAL";
else
{
processCheckIn.CheckInStatus = "LATE";
}
break;
case "AFTERNOON":
processCheckIn.CheckOutStatus = "NORMAL";
if (processCheckIn.CheckOut is not null)
{
var checkOut = DateTime.Parse(processCheckIn.CheckOut.Value.ToString("yyyy-MM-dd HH:mm"));
var endMorning = DateTime.Parse($"{processCheckIn.CheckIn.ToString("yyyy-MM-dd")} {endTimeMorning}");
if(checkOut >= endMorning)
processCheckIn.CheckOutStatus = "NORMAL";
else
{
processCheckIn.CheckOutStatus = "ABSENT";
}
}
break;
case "ALL":
processCheckIn.CheckInStatus = "NORMAL";
@ -1361,6 +1410,11 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
}
else
{
var startTimeMorning = duty.StartTimeMorning;
var endTimeMorning = duty.EndTimeMorning;
var startTimeAfterNoon = duty.StartTimeAfternoon;
var endTimeAfterNoon = duty.EndTimeAfternoon;
var from = rawData.LeaveStartDate.Date;
var to = rawData.LeaveEndDate.Date;
for (var day = from.Date; day <= to.Date; day = day.AddDays(1))
@ -1375,14 +1429,34 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
switch (rawData.LeaveRange.Trim().ToUpper())
{
case "MORNING":
processCheckIn.CheckInStatus = "NORMAL";
var checkIn = DateTime.Parse(processCheckIn.CheckIn.ToString("yyyy-MM-dd HH:mm"));
var startAfternoon = DateTime.Parse($"{processCheckIn.CheckIn.ToString("yyyy-MM-dd")} {startTimeAfterNoon}");
if (checkIn <= startAfternoon)
processCheckIn.CheckInStatus = "NORMAL";
else
{
processCheckIn.CheckInStatus = "LATE";
}
break;
case "AFTERNOON":
processCheckIn.CheckOutStatus = "NORMAL";
if (processCheckIn.CheckOut is not null)
{
var checkOut = DateTime.Parse(processCheckIn.CheckOut.Value.ToString("yyyy-MM-dd HH:mm"));
var endMorning = DateTime.Parse($"{processCheckIn.CheckIn.ToString("yyyy-MM-dd")} {endTimeMorning}");
if (checkOut >= endMorning)
processCheckIn.CheckOutStatus = "NORMAL";
else
{
processCheckIn.CheckOutStatus = "ABSENT";
}
}
break;
case "ALL":
processCheckIn.CheckInStatus = "NORMAL";
processCheckIn.CheckOutStatus = "NORMAL";
if (processCheckIn.CheckOut is not null)
{
processCheckIn.CheckOutStatus = "NORMAL";
}
break;
default:
break;

View file

@ -1436,9 +1436,18 @@ namespace BMA.EHR.Leave.Service.Controllers
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(userId, currentDate.Date);
if (leaveReq != null)
{
var startTimeAfternoon = duty.StartTimeAfternoon;
var endTimeAfterNoon = duty.EndTimeAfternoon;
var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper();
if (leaveRange == "MORNING" || leaveRange == "ALL")
checkInStatus = "NORMAL";
if(DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm")) >
DateTime.Parse($"{currentDate.ToString("yyyy-MM-dd")} {startTimeAfternoon}"))
checkInStatus = "LATE";
else if(DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm")) >
DateTime.Parse($"{currentDate.ToString("yyyy-MM-dd")} {endTimeAfterNoon}"))
checkInStatus = "ABSENT";
else
checkInStatus = "NORMAL";
else
{
checkInStatus = DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm")) >
@ -3299,8 +3308,6 @@ namespace BMA.EHR.Leave.Service.Controllers
return Error("ไม่สามารถขอลงเวลากรณีพิเศษในวันที่มากกว่าวันที่ปัจจุบันได้", StatusCodes.Status400BadRequest);
}
var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty;
var checkin = await _userTimeStampRepository.GetTimestampByDateAsync(userId, req.CheckDate.Date);
@ -3560,9 +3567,21 @@ namespace BMA.EHR.Leave.Service.Controllers
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
var checkInData = await _userTimeStampRepository.GetTimestampByDateAsync(data.KeycloakUserId, data.CheckDate);
var duty = userRound ?? getDefaultRound;
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(data.KeycloakUserId, data.CheckDate.Date);
var startTimeMorning = leaveReq is null ? duty.StartTimeMorning :
leaveReq.LeaveRange == "MORNING" ? duty.StartTimeAfternoon : duty.StartTimeMorning;
var endTimeMorning = leaveReq is null ? duty.EndTimeMorning :
leaveReq.LeaveRange == "MORNING" ? duty.StartTimeAfternoon : duty.EndTimeMorning;
var startTimeAfterNoon = duty.StartTimeAfternoon;
var endTimeAfterNoon = duty.EndTimeAfternoon;
//var duty = getDefaultRound;
// create result object to return
@ -3603,10 +3622,15 @@ namespace BMA.EHR.Leave.Service.Controllers
"ABSENT" :
"NORMAL",
StartTimeMorning = duty.StartTimeMorning,
EndTimeMorning = duty.EndTimeMorning,
StartTimeAfternoon = duty.StartTimeAfternoon,
EndTimeAfternoon = duty.EndTimeAfternoon,
// StartTimeMorning = duty.StartTimeMorning,
// EndTimeMorning = duty.EndTimeMorning,
// StartTimeAfternoon = duty.StartTimeAfternoon,
// EndTimeAfternoon = duty.EndTimeAfternoon,
StartTimeMorning = startTimeMorning,
EndTimeMorning = endTimeMorning,
StartTimeAfternoon = startTimeAfterNoon,
EndTimeAfternoon = endTimeAfterNoon,
Reason = data.Comment ?? "",
Status = data.Status,
@ -4184,11 +4208,22 @@ namespace BMA.EHR.Leave.Service.Controllers
DateTime? resultCheckInDate, resultCheckOutDate, resultCheckInDateAndTime, resultCheckOutDateAndTime;
string resultCheckInTime, resultCheckOutTime;
string resultCheckInLocation = "", resultCheckOutLocation = "";
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(data.KeycloakUserId, data.CheckDate.Date);
var startTimeMorning = leaveReq is null ? duty.StartTimeMorning :
leaveReq.LeaveRange == "MORNING" ? duty.StartTimeAfternoon : duty.StartTimeMorning;
var endTimeMorning = leaveReq is null ? duty.EndTimeMorning :
leaveReq.LeaveRange == "MORNING" ? duty.StartTimeAfternoon : duty.EndTimeMorning;
var startTimeAfterNoon = duty.StartTimeAfternoon;
var endTimeAfterNoon = duty.EndTimeAfternoon;
if (data.CheckInEdit)
{
resultCheckInDate = data.CheckDate.Date;
resultCheckInTime = duty.StartTimeMorning;
//resultCheckInTime = duty.StartTimeMorning;
resultCheckInTime = startTimeMorning;
resultCheckInLocation = data.POI ?? "";
}
else

View file

@ -1111,9 +1111,22 @@ namespace BMA.EHR.Leave.Service.Controllers
x.KeycloakUserId == userId)
.ToListAsync();
isBetween = existingLeaves.Any(leave =>
req.StartLeaveDate.Date <= leave.LeaveEndDate.Date &&
req.EndLeaveDate.Date >= leave.LeaveStartDate.Date);
if (req.StartLeaveDate.Date == req.EndLeaveDate.Date)
{
isBetween = existingLeaves.Any(leave =>
req.StartLeaveDate.Date == leave.LeaveEndDate.Date &&
req.EndLeaveDate.Date == leave.LeaveStartDate.Date &&
req.LeaveRange == leave.LeaveRange);
}
else
{
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") &&