Enhance LeaveController to implement check-out logic and status validation based on last check-in record
This commit is contained in:
parent
b8df2d4024
commit
d748308419
1 changed files with 128 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue