Enhance LeaveController to implement check-out logic and status validation based on last check-in record

This commit is contained in:
Suphonchai Phoonsawat 2026-02-19 15:07:04 +07:00
parent b8df2d4024
commit d748308419

View file

@ -957,15 +957,24 @@ namespace BMA.EHR.Leave.Service.Controllers
return Error(GlobalMessages.NoFileToUpload, StatusCodes.Status400BadRequest);
}
// last check-in record
var lastCheckIn = await _userTimeStampRepository.GetLastRecord(userId);
var check_status = data.CheckInId == null ? "check-in-picture" : "check-out-picture";
var check_out_status = "check-out-picture";
var fileName = $"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_status}/{data.CheckInFileName}";
var fileNameCheckOut = $"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_out_status}/{data.CheckInFileName}";
using (var ms = new MemoryStream(data.CheckInFileBytes ?? new byte[0]))
{
try
{
await _minIOService.UploadFileAsync(fileName, ms);
if (lastCheckIn != null && lastCheckIn.CheckOut == null)
{
// ยังไม่เคย check-out มาก่อน หรือ check-out เป็น null ให้ใช้ชื่อไฟล์แบบ check-out
await _minIOService.UploadFileAsync(fileNameCheckOut, ms);
}
}
catch (Exception ex)
{
@ -1015,6 +1024,124 @@ namespace BMA.EHR.Leave.Service.Controllers
// create check in object
if (data.CheckInId == null)
{
if (lastCheckIn != null && lastCheckIn.CheckOut == null)
{
var checkout = await _userTimeStampRepository.GetByIdAsync(lastCheckIn!.Id);
if(checkout != null)
{
var currentCheckInProcess = await _processUserTimeStampRepository.GetTimestampByDateAsync(userId, checkout.CheckIn.Date);
var checkout_process = await _processUserTimeStampRepository.GetByIdAsync(currentCheckInProcess!.Id);
var endTime1 = "";
var startTime1 = "";
var endTimeMorning1 = "";
if (!data.IsLocation && data.LocationName == "ไปประชุม / อบรม / สัมมนา")
{
startTime1 = "13:00";
endTime1 = "14:30";
endTimeMorning1 = "12:00";
}
else
{
endTime1 = duty.EndTimeAfternoon;
startTime1 = duty.StartTimeAfternoon;
endTimeMorning1 = duty.EndTimeMorning;
}
string checkOutStatus = "NORMAL";
var leaveReq1 = await _leaveRequestRepository.GetLeavePeriodAsync(userId, currentDate.Date);
if (leaveReq1 != null)
{
var leaveRange = leaveReq1.LeaveRangeEnd == null ? "" : leaveReq1.LeaveRangeEnd.ToUpper();
if (leaveRange == "AFTERNOON" || leaveRange == "ALL")
{
if(DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm")) <
DateTime.Parse($"{currentDate.ToString("yyyy-MM-dd")} {endTimeMorning1}"))
checkOutStatus = "ABSENT";
else
checkOutStatus = "NORMAL";
}
else
{
// fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลาเข้า-ออกงาน (กรณีลงเวลาออกอีกวัน) #921
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}");
if(currentDateTime.Date > checkout.CheckIn.Date)
{
// ถ้า check-out เป็นวันถัดไป สถานะปกติเสมอ
checkOutStatus = "NORMAL";
}
else
{
// ถ้า check-out เป็นวันเดียวกับ check-in
// ตรวจสอบเวลาว่าสิ้นสุดก่อนบ่ายหรือไม่
if(currentDateTime < dutyEndTimeMorning) // ถ้าออกก่อนเวลาสิ้นสุดตอนเช้า ขาดราชการ
{
checkOutStatus = "ABSENT";
}
else if(currentDateTime >= dutyEndTimeAfternoon) // ถ้าออกหลังเวลาสิ้นสุดตอนบ่าย ปกติ
{
checkOutStatus = "NORMAL";
}
else
{
checkOutStatus = "ABSENT";
}
}
}
}
else
{
// fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลาเข้า-ออกงาน (กรณีลงเวลาออกอีกวัน) #921
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}");
if(currentDateTime.Date > checkout.CheckIn.Date)
{
// ถ้า check-out เป็นวันถัดไป สถานะปกติเสมอ
checkOutStatus = "NORMAL";
}
else
{
// ถ้า check-out เป็นวันเดียวกับ check-in
// ตรวจสอบเวลาว่าสิ้นสุดก่อนบ่ายหรือไม่
if(currentDateTime < dutyEndTimeMorning) // ถ้าออกก่อนเวลาสิ้นสุดตอนเช้า ขาดราชการ
{
checkOutStatus = "ABSENT";
}
else if(currentDateTime >= dutyEndTimeAfternoon) // ถ้าออกหลังเวลาสิ้นสุดตอนบ่าย ปกติ
{
checkOutStatus = "NORMAL";
}
else
{
checkOutStatus = "ABSENT";
}
}
}
if (checkout_process != null)
{
checkout_process.CheckOutLat = data.Lat;
checkout_process.CheckOutLon = data.Lon;
checkout_process.IsLocationCheckOut = data.IsLocation;
checkout_process.CheckOutLocationName = data.LocationName;
checkout_process.CheckOutPOI = data.POI;
checkout_process.CheckOutRemark = data.Remark;
checkout_process.CheckOutImageUrl = fileNameCheckOut;
checkout_process.CheckOut = currentDate;
checkout_process.CheckOutStatus = checkOutStatus;
await _processUserTimeStampRepository.UpdateAsync(checkout_process);
}
}
}
// validate duplicate check in
var currentCheckIn = await _userTimeStampRepository.GetTimestampByDateAsync(userId, currentDate);
@ -1167,6 +1294,7 @@ namespace BMA.EHR.Leave.Service.Controllers
else
{
var checkout = await _userTimeStampRepository.GetByIdAsync(data.CheckInId.Value);
//var currentCheckIn = await _userTimeStampRepository.GetTimestampByDateAsync(userId, currentDate);
if (checkout == null)
{