From 34da86653fe16864c3cca759cfe47b82f8358af7 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Mon, 22 Jan 2024 12:09:36 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=E0=B8=A3=E0=B8=B2?= =?UTF-8?q?=E0=B8=A2=E0=B8=87=E0=B8=B2=E0=B8=99=E0=B8=81=E0=B8=B2=E0=B8=A3?= =?UTF-8?q?=E0=B9=81=E0=B8=AA=E0=B8=94=E0=B8=87=E0=B8=A7=E0=B8=B1=E0=B8=99?= =?UTF-8?q?=E0=B8=A5=E0=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LeaveRequests/LeaveRequestRepository.cs | 11 + .../Controllers/LeaveReportController.cs | 203 ++++++++++++++---- .../Controllers/LeaveRequestController.cs | 57 ++++- .../DTOs/Reports/GetLeaveDetailReportDto.cs | 2 +- 4 files changed, 224 insertions(+), 49 deletions(-) diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index e79e309f..9cca6fc0 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -602,6 +602,17 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests } } + public async Task GetLeavePeriodAsync(Guid keycloakUserId, DateTime date) + { + var data = await _dbContext.Set().AsQueryable() + .Include(x => x.Type) + .Where(x => x.KeycloakUserId == keycloakUserId) + .Where(x => x.LeaveStatus == "APPROVE") + .Where(x => x.LeaveStartDate.Date >= date.Date && x.LeaveEndDate <= date.Date) + .FirstOrDefaultAsync(); + return data; + } + #endregion } } diff --git a/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs b/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs index 78d7f7c9..5f910816 100644 --- a/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs @@ -3,6 +3,7 @@ using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.Commands; using BMA.EHR.Application.Repositories.Leaves.LeaveRequests; using BMA.EHR.Application.Repositories.Leaves.TimeAttendants; +using BMA.EHR.Application.Repositories.MetaData; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Leave.Requests; @@ -12,6 +13,7 @@ using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Leave.Service.DTOs.Reports; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Org.BouncyCastle.Utilities; using Swashbuckle.AspNetCore.Annotations; namespace BMA.EHR.Leave.Service.Controllers @@ -32,6 +34,8 @@ namespace BMA.EHR.Leave.Service.Controllers private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository; private readonly DutyTimeRepository _dutyTimeRepository; private readonly UserDutyTimeRepository _userDutyTimeRepository; + private readonly HolidayRepository _holidayRepository; + private readonly UserCalendarRepository _userCalendarRepository; #endregion @@ -43,7 +47,9 @@ namespace BMA.EHR.Leave.Service.Controllers LeaveTypeRepository leaveTypeRepository, ProcessUserTimeStampRepository processUserTimeStampRepository, DutyTimeRepository dutyTimeRepository, - UserDutyTimeRepository userDutyTimeRepository) + UserDutyTimeRepository userDutyTimeRepository, + HolidayRepository holidayRepository, + UserCalendarRepository userCalendarRepository) { _leaveRequestRepository = leaveRequestRepository; _userProfileRepository = userProfileRepository; @@ -52,6 +58,8 @@ namespace BMA.EHR.Leave.Service.Controllers _processUserTimeStampRepository = processUserTimeStampRepository; _dutyTimeRepository = dutyTimeRepository; _userDutyTimeRepository = userDutyTimeRepository; + _holidayRepository = holidayRepository; + _userCalendarRepository = userCalendarRepository; } #endregion @@ -1096,54 +1104,155 @@ namespace BMA.EHR.Leave.Service.Controllers var profile = await _userProfileRepository.GetProfileWithKeycloak(); var date = req.StartDate.Date; + var holidays = await _holidayRepository.GetHolidayAsync(req.StartDate.Date, req.EndDate.Date); + var weekend = _holidayRepository.GetWeekEnd(req.StartDate.Date, req.EndDate.Date); + var excludeDates = holidays.Union(weekend).ToList(); + + var dateList = new List(); + + for (DateTime i = req.StartDate.Date; i <= req.EndDate.Date; i = i.AddDays(1)) + { + if (!excludeDates.Contains(i)) + dateList.Add(i); + } + var employees = new List(); var count = 1; + + var restTotal = 0; + var sickTotal = 0; + var lateTotal = 0; + var wfhTotal = 0; + var studyTotal = 0; + + + foreach (var p in profile) { - var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(p.KeycloakId ?? Guid.Empty, date); - - var fullName = _userProfileRepository.GetUserFullName(p.KeycloakId ?? Guid.Empty); - - - var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); - if (defaultRound == null) + foreach (var dd in dateList) { - return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); + var keycloakUserId = p.KeycloakId ?? Guid.Empty; + + var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd); + + var fullName = _userProfileRepository.GetUserFullName(keycloakUserId); + + + var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); + if (defaultRound == null) + { + return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); + } + + //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); + var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); + var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; + var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); + + var duty = userRound ?? defaultRound; + + // check วันลาของแต่ละคน + var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd); + var remarkStr = string.Empty; + + if (leaveReq != null) + { + switch (leaveReq.Type.Code.ToUpper()) + { + case "LV-001": + case "LV-002": + case "LV-005": + remarkStr += leaveReq.Type.Name; + var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper(); + if (leaveRange == "MORNING") + remarkStr += "ครึ่งวันเช้า"; + else if (leaveRange == "AFTERNOON") + remarkStr += "ครึ่งวันบ่าย"; + break; + default: + remarkStr += leaveReq.Type.Name; + break; + } + } + else + { + if (timeStamps == null) + { + remarkStr = "ขาดราชการ"; + } + else + { + // check status ของการลงเวลา + if (timeStamps.CheckOutStatus == "ABSENT") + remarkStr = "ขาดราชการ"; + else if (timeStamps.CheckInStatus == "ABSENT") + remarkStr = "ขาดราชการ"; + else if (timeStamps.CheckInStatus == "LATE") + { + remarkStr = "สาย"; + lateTotal += 1; + } + else + remarkStr = ""; + } + } + + var emp = new + { + no = count, + fullName = fullName, + dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.", + checkInLocation = timeStamps == null ? "" : timeStamps.CheckInPOI, + checkInTime = timeStamps == null ? "" : $"{timeStamps.CheckIn.ToString("HH:mm")} น.", + + checkOutLocation = timeStamps == null ? "" : timeStamps.CheckOutPOI ?? "", + checkOutTime = timeStamps == null ? "" : + timeStamps.CheckOut != null ? + $"{timeStamps.CheckOut.Value.ToString("HH:mm")} น." : + "", + + //remark = timeStamps == null ? "ขาดราชการ" : "", + remark = remarkStr, + + checkInDate = timeStamps == null ? "" : timeStamps.CheckIn.Date.ToThaiFullDate2().ToThaiNumber(), + checkedOutDate = timeStamps == null ? "" : + timeStamps.CheckOut != null ? + timeStamps.CheckOut.Value.ToThaiFullDate2().ToThaiNumber() : + "", + }; + + if (timeStamps != null) + { + if (timeStamps.IsLocationCheckIn) + wfhTotal += 1; + else + { + if (leaveReq != null) + { + switch (leaveReq.Type.Code.ToUpper()) + { + case "LV-001": + case "LV-002": + sickTotal += 1; + break; + case "LV-005": + restTotal += 1; + break; + case "LV-008": + studyTotal += 1; + break; + } + + } + } + } + + + employees.Add(emp); + count++; + } - //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); - var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); - var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; - var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); - - var duty = userRound ?? defaultRound; - - var emp = new - { - no = count, - fullName = fullName, - dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.", - checkInLocation = timeStamps == null ? "" : timeStamps.CheckInPOI, - checkInTime = timeStamps == null ? "" : $"{timeStamps.CheckIn.ToString("HH:mm")} น.", - - checkOutLocation = timeStamps == null ? "" : timeStamps.CheckOutPOI ?? "", - checkOutTime = timeStamps == null ? "" : - timeStamps.CheckOut != null ? - $"{timeStamps.CheckOut.Value.ToString("HH:mm")} น." : - "", - - remark = timeStamps == null ? "ขาดราชการ" : "", - - checkInDate = timeStamps == null ? "" : timeStamps.CheckIn.Date.ToThaiFullDate2().ToThaiNumber(), - checkedOutDate = timeStamps == null ? "" : - timeStamps.CheckOut != null ? - timeStamps.CheckOut.Value.ToThaiFullDate2().ToThaiNumber() : - "", - }; - - employees.Add(emp); - count++; - } var item = new @@ -1151,11 +1260,11 @@ namespace BMA.EHR.Leave.Service.Controllers DateTimeStamp = date.Date.ToThaiFullDate(), officerTotal = profile.Count, workTotal = (count - 1), - restTotal = 0, - sickTotal = 0, - lateTotal = 0, - wfhTotal = 0, - studyTotal = 0, + restTotal = restTotal, + sickTotal = sickTotal, + lateTotal = lateTotal, + wfhTotal = wfhTotal, + studyTotal = studyTotal, employees = employees }; diff --git a/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs b/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs index 1b1ec9b6..4183f590 100644 --- a/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs +++ b/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs @@ -707,7 +707,62 @@ namespace BMA.EHR.Leave.Service.Controllers isLeave = govAge >= 365; break; case "LV-010": - var maxEnd = new DateTime(req.StartLeaveDate.Year + 2, req.StartLeaveDate.Month, req.StartLeaveDate.Day - 1); + int yy, mm, dd; + yy = req.StartLeaveDate.Year + 2; + if (req.StartLeaveDate.Day == 1) + { + if (req.StartLeaveDate.Month == 1) + { + mm = 12; + dd = 31; + } + else + { + mm = req.StartLeaveDate.Month - 1; + switch (mm) + { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + { + dd = 31; + break; + } + case 2: + { + if (DateTime.IsLeapYear(yy)) + { + dd = 29; + } + else + dd = 28; + break; + } + case 4: + case 6: + case 9: + case 11: + { + dd = 30; + break; + } + default: + dd = 1; + break; + } + } + } + else + { + mm = req.StartLeaveDate.Month; + dd = req.StartLeaveDate.Day - 1; + } + + var maxEnd = new DateTime(yy, mm, dd); isLeave = req.EndLeaveDate.Date <= maxEnd; break; case "LV-011": diff --git a/BMA.EHR.Leave.Service/DTOs/Reports/GetLeaveDetailReportDto.cs b/BMA.EHR.Leave.Service/DTOs/Reports/GetLeaveDetailReportDto.cs index 08c67851..4a12851a 100644 --- a/BMA.EHR.Leave.Service/DTOs/Reports/GetLeaveDetailReportDto.cs +++ b/BMA.EHR.Leave.Service/DTOs/Reports/GetLeaveDetailReportDto.cs @@ -4,7 +4,7 @@ namespace BMA.EHR.Leave.Service.DTOs.Reports { public DateTime StartDate { get; set; } = DateTime.MinValue; - //public DateTime EndDate { get; set; } = DateTime.MinValue; + public DateTime EndDate { get; set; } = DateTime.MinValue; } } \ No newline at end of file