diff --git a/BMA.EHR.Leave/Controllers/LeaveReportController.cs b/BMA.EHR.Leave/Controllers/LeaveReportController.cs index 1cceb86f..83d3657b 100644 --- a/BMA.EHR.Leave/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveReportController.cs @@ -920,6 +920,189 @@ namespace BMA.EHR.Leave.Service.Controllers } } + + /// + /// LV2_035 - รายงานสำหรับการลางานของข้าราชการ-กรุงเทพมหานครสามัญ และลูกจ้างประจำกรุงเทพมหานคร + /// + /// + /// + /// เมื่อทำรายการสำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpPost("leavedayRetire")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetLeaveDayRetireReport([FromBody] GetLeaveDetailByNodeReportDto req) + { + try + { + var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT"); + var jsonData = JsonConvert.DeserializeObject(getPermission); + if (jsonData["status"]?.ToString() != "200") + { + return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); + } + var profile = new List(); + profile = await _userProfileRepository.GetProfileWithKeycloakAllOfficerRetireFilter(AccessToken, req.node, req.nodeId, jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD", req.isRetirement??true); + + // get leave day + var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); + var leaveTypes = await _leaveTypeRepository.GetAllAsync(); + + var count = 1; + var employees = new List(); + + foreach (var p in profile) + { + var keycloakUserId = p.Keycloak ?? Guid.Empty; + + var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); + var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0; + + var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); + var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0; + + var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); + var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0; + + var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); + var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0; + + var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); + var restDayCount = restDay != null ? restDay.SumLeaveDay : 0; + + var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); + var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0; + + var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007"); + var absentDayCount = absentDay != null ? absentDay.SumLeaveDay : 0; + + var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008"); + var studyDayCount = studyDay != null ? studyDay.SumLeaveDay : 0; + + var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009"); + var agencyDayCount = agencyDay != null ? agencyDay.SumLeaveDay : 0; + + var coupleDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-010"); + var coupleDayCount = coupleDay != null ? coupleDay.SumLeaveDay : 0; + + var therapyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-011"); + var therapyDayCount = therapyDay != null ? therapyDay.SumLeaveDay : 0; + + var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, + req.StartDate, + req.EndDate); + + 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; + + var processTimeStamps = timeStamps + .Select(d => new + { + d.Id, + CheckInStatus = DateTime.Parse(d.CheckIn.ToString("yyyy-MM-dd HH:mm")) > + DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.StartTimeMorning}") ? + "LATE" : + "NORMAL", + CheckOutStatus = d.CheckOut == null ? "" : + DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < + DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}") ? + "LATE" : + DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < + DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeMorning}") ? + "ABSENT" : + "NORMAL", + }); + + var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); + var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE"); + + var emp = new + { + no = count, + fullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + position = p.Position == null ? "" : p.Position, + positionLevel = p.PositionLevel == null ? "" : p.PositionLevel, + posNo = p.PosNo == null ? "" : p.PosNo, + reason = "", + sickDayCount = sickDayCount, + maternityDayCount = maternityDayCount, + wifeDayCount = wifeDayCount, + personalDayCount = personalDayCount, + restDayCount = restDayCount, + ordainDayCount = ordainDayCount, + absentDayCount = absentDayCount, + studyDayCount = studyDayCount, + agencyDayCount = agencyDayCount, + coupleDayCount = coupleDayCount, + therapyDayCount = therapyDayCount, + absentTotal = absentCount, + lateTotal = lateCount, + + leaveTotal = sickDayCount + + maternityDayCount + + wifeDayCount + + personalDayCount + + restDayCount + + ordainDayCount + + absentDayCount + + studyDayCount + + agencyDayCount + + coupleDayCount + + therapyDayCount + }; + + employees.Add(emp); + count++; + } + + var leaveTitleType = ""; + if (req.Type.Trim().ToUpper() == "FULL") + { + leaveTitleType = "หนึ่งปี"; + } + else if (req.Type.Trim().ToUpper() == "HAFT") + { + leaveTitleType = "ครึ่งปี"; + } + else if (req.Type.Trim().ToUpper() == "MONTH") + { + leaveTitleType = "หนึ่งเดือน"; + } + var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate().ToThaiNumber()}"; + var result = new + { + template = "LeaveYear-Officer", + reportName = "LeaveYear-Officer", + data = new + { + dateTimeStamp = $"วันที่ {req.StartDate.Date.ToThaiShortDate().ToThaiNumber()}{enddate}", + organizationName = profile?.FirstOrDefault()?.Oc ?? "", + headerText = "ข้าราชการสามัญ", + leaveTitleType = leaveTitleType, + employees = employees, + } + }; + + return Success(result); + } + catch (Exception ex) + { + return Error(ex); + } + } + /// /// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ ///