From 97dd104429ff98d514197f533ff815036b451678 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Fri, 3 Oct 2025 20:28:49 +0700 Subject: [PATCH 1/5] fix #24 --- .../Leaves/TimeAttendants/ProcessUserTimeStampRepository.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/ProcessUserTimeStampRepository.cs b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/ProcessUserTimeStampRepository.cs index 3117a8b1..3847b9f7 100644 --- a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/ProcessUserTimeStampRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/ProcessUserTimeStampRepository.cs @@ -222,9 +222,12 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants public async Task> GetTimeStampHistoryAsync(Guid keycloakId, int year, int page = 1, int pageSize = 10, string keyword = "") { + var fiscalDateStart = new DateTime(year - 1, 10, 1); + var fiscalDateEnd = new DateTime(year, 9, 30); + var data = await _dbContext.Set() .Where(u => u.KeycloakUserId == keycloakId) - .Where(u => u.CheckIn.Year == year) + .Where(u => u.CheckIn.Date >= fiscalDateStart && u.CheckIn.Date <= fiscalDateEnd) .OrderByDescending(u => u.CheckIn.Date) .Skip((page - 1) * pageSize) .Take(pageSize) From 8529c3d8013bdbde795a0b6ac4db2c03db48b527 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Mon, 6 Oct 2025 11:30:06 +0700 Subject: [PATCH 2/5] fix #1835 --- BMA.EHR.Leave/Controllers/LeaveRequestController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs index 8113ba9f..27457ceb 100644 --- a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs @@ -2308,6 +2308,9 @@ namespace BMA.EHR.Leave.Service.Controllers } } var thisYear = DateTime.Now.Year; + var toDay = DateTime.Now.Date; + if(toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) + thisYear = thisYear + 1; //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken); From 946721ffb2e7a0bbad05ae09c9fcaa4ff41432c3 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Mon, 6 Oct 2025 12:30:48 +0700 Subject: [PATCH 3/5] fix report --- BMA.EHR.Leave/Controllers/LeaveReportController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/BMA.EHR.Leave/Controllers/LeaveReportController.cs b/BMA.EHR.Leave/Controllers/LeaveReportController.cs index 2913be5c..01bd6820 100644 --- a/BMA.EHR.Leave/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveReportController.cs @@ -283,7 +283,12 @@ namespace BMA.EHR.Leave.Service.Controllers var startFiscalYear = new DateTime(data.LeaveStartDate.Year - 1, 10, 1); var endFiscalYear = data.LeaveStartDate.Date.AddDays(-1); // นับจากวันที่ยื่นลา - var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(data.LeaveStartDate.Year, data.Type.Id, data.KeycloakUserId); + var thisYear = data.LeaveStartDate.Year; + var toDay = data.LeaveStartDate.Date; + if(toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) + thisYear = thisYear + 1; + + var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(thisYear, data.Type.Id, data.KeycloakUserId); //var sumLeave = leaveData == null ? 0 : leaveData.LeaveDaysUsed; var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); From 5efb1c99c60dced7804dbca5109425c8d45ec298 Mon Sep 17 00:00:00 2001 From: harid Date: Mon, 6 Oct 2025 15:12:40 +0700 Subject: [PATCH 4/5] sortBy #1814 --- .../Controllers/LeaveBeginningController.cs | 44 ++- BMA.EHR.Leave/Controllers/LeaveController.cs | 354 ++++++++++++++++-- .../GetAdditionalCheckRequestDto.cs | 3 + .../DTOs/ChangeRound/SearchProfileDto.cs | 4 + .../ChangeRound/SearchProfileResultDto.cs | 6 +- .../DTOs/CheckIn/CheckInHistoryForAdminDto.cs | 3 + .../CheckInProcessHistoryForAdminDto.cs | 3 + .../LeaveBeginnings/GetLeaveBeginningDto.cs | 4 + 8 files changed, 398 insertions(+), 23 deletions(-) diff --git a/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs b/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs index e37ab06a..e72c0c4f 100644 --- a/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveBeginningController.cs @@ -136,7 +136,49 @@ namespace BMA.EHR.Leave.Service.Controllers if (req.Keyword != "") result = result.Where(x => x.FullName!.Contains(req.Keyword)).ToList(); - + if (!string.IsNullOrWhiteSpace(req.sortBy)) + { + switch (req.sortBy.ToUpper()) + { + case "FULLNAME": + if (req.descending == true) + result = result.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + result = result.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "LEAVETYPE": + if (req.descending == true) + result = result.OrderByDescending(x => x.LeaveType).ToList(); + else + result = result.OrderBy(x => x.LeaveType).ToList(); + break; + case "LEAVEYEAR": + if (req.descending == true) + result = result.OrderByDescending(x => x.LeaveYear).ToList(); + else + result = result.OrderBy(x => x.LeaveYear).ToList(); + break; + case "LEAVEDAYS": + if (req.descending == true) + result = result.OrderByDescending(x => x.LeaveDays).ToList(); + else + result = result.OrderBy(x => x.LeaveDays).ToList(); + break; + case "LEAVEDAYSUSED": + if (req.descending == true) + result = result.OrderByDescending(x => x.LeaveDaysUsed).ToList(); + else + result = result.OrderBy(x => x.LeaveDaysUsed).ToList(); + break; + default: break; + } + } var pageResult = result.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); return Success(new { data = pageResult, total = result.Count }); diff --git a/BMA.EHR.Leave/Controllers/LeaveController.cs b/BMA.EHR.Leave/Controllers/LeaveController.cs index 43972a06..08ec712b 100644 --- a/BMA.EHR.Leave/Controllers/LeaveController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveController.cs @@ -14,10 +14,12 @@ using BMA.EHR.Leave.Service.DTOs.ChangeRound; using BMA.EHR.Leave.Service.DTOs.CheckIn; using BMA.EHR.Leave.Service.DTOs.DutyTime; using BMA.EHR.Leave.Service.DTOs.LeaveRequest; +using iTextSharp.text; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.ObjectPool; +using Nest; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RabbitMQ.Client; @@ -1257,7 +1259,7 @@ namespace BMA.EHR.Leave.Service.Controllers [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> LogRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string keyword = "", string profileType = "ALL") + public async Task> LogRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string keyword = "", string profileType = "ALL", string? sortBy = "", bool? descending = false) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN"); var jsonData = JsonConvert.DeserializeObject(getPermission); @@ -1305,6 +1307,9 @@ namespace BMA.EHR.Leave.Service.Controllers Id = d.Id, //FullName = _userProfileRepository.GetUserFullName(d.KeycloakUserId, AccessToken), FullName = $"{d.Prefix ?? ""}{d.FirstName ?? ""} {d.LastName ?? ""}", + Prefix = d.Prefix ?? "", + FirstName = d.FirstName ?? "", + LastName = d.LastName ?? "", ProfileType = d.ProfileType ?? "", CheckInDate = d.CheckIn.Date, @@ -1339,6 +1344,61 @@ namespace BMA.EHR.Leave.Service.Controllers if (profileType.Trim().ToUpper() != "ALL") data = data.Where(x => x.ProfileType == profileType.Trim().ToUpper()).ToList(); + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "FULLNAME": + if (descending == true) + data = data.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + data = data.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "CHECKINTIME": + if (descending == true) + data = data.OrderByDescending(x => x.CheckInTime).ToList(); + else + data = data.OrderBy(x => x.CheckInTime).ToList(); + break; + case "CHECKINLOCATION": + if (descending == true) + data = data.OrderByDescending(x => x.CheckInLocation) + .ThenByDescending(x => x.CheckInLat) + .ThenByDescending(x => x.CheckInLon) + .ToList(); + else + data = data.OrderBy(x => x.CheckInLocation) + .ThenBy(x => x.CheckInLat) + .ThenBy(x => x.CheckInLon) + .ToList(); + break; + case "CHECKOUTTIME": + if (descending == true) + data = data.OrderByDescending(x => x.CheckOutTime).ToList(); + else + data = data.OrderBy(x => x.CheckOutTime).ToList(); + break; + case "CHECKOUTLOCATION": + if (descending == true) + data = data.OrderByDescending(x => x.CheckOutLocation) + .ThenByDescending(x => x.CheckOutLat) + .ThenByDescending(x => x.CheckOutLon) + .ToList(); + else + data = data.OrderBy(x => x.CheckOutLocation) + .ThenBy(x => x.CheckOutLat) + .ThenBy(x => x.CheckOutLon) + .ToList(); + break; + default: break; + } + } var pageData = data .Skip((page - 1) * pageSize) .Take(pageSize) @@ -1470,7 +1530,7 @@ namespace BMA.EHR.Leave.Service.Controllers [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [AllowAnonymous] - public async Task> GetTimeRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string status = "NORMAL", string keyword = "", string profileType = "ALL") + public async Task> GetTimeRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string status = "NORMAL", string keyword = "", string profileType = "ALL", string? sortBy = "", bool? descending = false) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN"); var jsonData = JsonConvert.DeserializeObject(getPermission); @@ -1557,6 +1617,9 @@ namespace BMA.EHR.Leave.Service.Controllers { Id = d.Id, FullName = $"{d.Prefix ?? ""}{d.FirstName ?? ""} {d.LastName ?? ""}", + Prefix = d.Prefix ?? "", + FirstName = d.FirstName ?? "", + LastName = d.LastName ?? "", ProfileType = d.ProfileType ?? "", CheckInDate = d.CheckIn.Date, @@ -1656,6 +1719,61 @@ namespace BMA.EHR.Leave.Service.Controllers if (profileType.Trim().ToUpper() != "ALL") data = data.Where(x => x.ProfileType == profileType.Trim().ToUpper()).ToList(); + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "FULLNAME": + if (descending == true) + data = data.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + data = data.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "CHECKINTIME": + if (descending == true) + data = data.OrderByDescending(x => x.CheckInTime).ToList(); + else + data = data.OrderBy(x => x.CheckInTime).ToList(); + break; + case "CHECKINLOCATION": + if (descending == true) + data = data.OrderByDescending(x => x.CheckInLocation) + .ThenByDescending(x => x.CheckInLat) + .ThenByDescending(x => x.CheckInLon) + .ToList(); + else + data = data.OrderBy(x => x.CheckInLocation) + .ThenBy(x => x.CheckInLat) + .ThenBy(x => x.CheckInLon) + .ToList(); + break; + case "CHECKOUTTIME": + if (descending == true) + data = data.OrderByDescending(x => x.CheckOutTime).ToList(); + else + data = data.OrderBy(x => x.CheckOutTime).ToList(); + break; + case "CHECKOUTLOCATION": + if (descending == true) + data = data.OrderByDescending(x => x.CheckOutLocation) + .ThenByDescending(x => x.CheckOutLat) + .ThenByDescending(x => x.CheckOutLon) + .ToList(); + else + data = data.OrderBy(x => x.CheckOutLocation) + .ThenBy(x => x.CheckOutLat) + .ThenBy(x => x.CheckOutLon) + .ToList(); + break; + default: break; + } + } var pageData = data .Skip((page - 1) * pageSize) .Take(pageSize) @@ -1712,13 +1830,13 @@ namespace BMA.EHR.Leave.Service.Controllers } var profile = await _userProfileRepository.SearchProfile(req.CitizenId, req.FirstName, req.LastName, AccessToken ?? "", role, nodeId, profileAdmin?.Node); - var pagedProfile = profile.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + //var pagedProfile = profile.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync(); var resultSet = new List(); - foreach (var p in pagedProfile) + foreach (var p in profile) { var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); @@ -1738,8 +1856,46 @@ namespace BMA.EHR.Leave.Service.Controllers }; resultSet.Add(res); } + if (!string.IsNullOrWhiteSpace(req.sortBy)) + { + switch (req.sortBy.ToUpper()) + { + case "CITIZENID": + if (req.descending == true) + profile = profile.OrderByDescending(x => x.CitizenId).ToList(); + else + profile = profile.OrderBy(x => x.CitizenId).ToList(); + break; + case "FULLNAME": + if (req.descending == true) + profile = profile.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + profile = profile.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "STARTTIMEMORNING": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList(); + else + resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList(); + break; + case "EFFECTIVEDATE": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList(); + else + resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList(); + break; + default: break; + } + } + var pageResult = resultSet.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); - return Success(new { data = resultSet, total = profile.Count }); + return Success(new { data = pageResult, total = profile.Count }); } /// @@ -1813,7 +1969,7 @@ namespace BMA.EHR.Leave.Service.Controllers [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> GetChangeRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "") + public async Task> GetChangeRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false) { var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), "SYS_WORK_ROUND_EDIT"); if (getWorkflow == false) @@ -1834,7 +1990,7 @@ namespace BMA.EHR.Leave.Service.Controllers resultSet = data .GroupBy(item => item.ProfileId) .SelectMany(group => group - .OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ + //.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ .Select((item, index) => new ChangeRoundHistoryDto { Round = index + 1, @@ -1843,10 +1999,44 @@ namespace BMA.EHR.Leave.Service.Controllers EffectiveDate = item.EffectiveDate.Value, Remark = item.Remark })) - .Skip((page - 1) * pageSize) - .Take(pageSize) + //.Skip((page - 1) * pageSize) + //.Take(pageSize) .ToList(); - + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "ROUNT": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.Round).ToList(); + else + resultSet = resultSet.OrderBy(x => x.Round).ToList(); + break; + case "STARTTIMEMORNIONG": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList(); + else + resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList(); + break; + case "EFFECTIVEDATE": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList(); + else + resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList(); + break; + case "REMARK": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.Remark).ToList(); + else + resultSet = resultSet.OrderBy(x => x.Remark).ToList(); + break; + default: break; + } + } + resultSet = resultSet + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); } return Success(new { data = resultSet, total = data.Count }); @@ -1901,13 +2091,13 @@ namespace BMA.EHR.Leave.Service.Controllers } var profile = await _userProfileRepository.SearchProfileEmployee(req.CitizenId, req.FirstName, req.LastName, AccessToken ?? "", role, nodeId, profileAdmin?.Node); - var pagedProfile = profile.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + //var pagedProfile = profile.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync(); var resultSet = new List(); - foreach (var p in pagedProfile) + foreach (var p in profile) { var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); @@ -1927,8 +2117,45 @@ namespace BMA.EHR.Leave.Service.Controllers }; resultSet.Add(res); } - - return Success(new { data = resultSet, total = profile.Count }); + if (!string.IsNullOrWhiteSpace(req.sortBy)) + { + switch (req.sortBy.ToUpper()) + { + case "CITIZENID": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.CitizenId).ToList(); + else + resultSet = resultSet.OrderBy(x => x.CitizenId).ToList(); + break; + case "FULLNAME": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + resultSet = resultSet.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "STARTTIMEMORNING": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList(); + else + resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList(); + break; + case "EFFECTIVEDATE": + if (req.descending == true) + resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList(); + else + resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList(); + break; + default: break; + } + } + var pageResult = resultSet.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + return Success(new { data = pageResult, total = profile.Count }); } /// @@ -2001,7 +2228,7 @@ namespace BMA.EHR.Leave.Service.Controllers [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> GetChangeEmpRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "") + public async Task> GetChangeEmpRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false) { var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), "SYS_WORK_ROUND_EDIT"); if (getWorkflow == false) @@ -2022,7 +2249,7 @@ namespace BMA.EHR.Leave.Service.Controllers resultSet = data .GroupBy(item => item.ProfileId) .SelectMany(group => group - .OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ + //.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ .Select((item, index) => new ChangeRoundHistoryDto { Round = index + 1, @@ -2031,10 +2258,44 @@ namespace BMA.EHR.Leave.Service.Controllers EffectiveDate = item.EffectiveDate.Value, Remark = item.Remark })) - .Skip((page - 1) * pageSize) - .Take(pageSize) + //.Skip((page - 1) * pageSize) + //.Take(pageSize) .ToList(); - + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "ROUNT": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.Round).ToList(); + else + resultSet = resultSet.OrderBy(x => x.Round).ToList(); + break; + case "STARTTIMEMORNIONG": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList(); + else + resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList(); + break; + case "EFFECTIVEDATE": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList(); + else + resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList(); + break; + case "REMARK": + if (descending == true) + resultSet = resultSet.OrderByDescending(x => x.Remark).ToList(); + else + resultSet = resultSet.OrderBy(x => x.Remark).ToList(); + break; + default: break; + } + } + resultSet = resultSet + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); } return Success(new { data = resultSet, total = data.Count }); @@ -2175,7 +2436,7 @@ namespace BMA.EHR.Leave.Service.Controllers [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> GetAdditionalCheckRequestAsync([Required] int year, [Required] int month, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "") + public async Task> GetAdditionalCheckRequestAsync([Required] int year, [Required] int month, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN_SPECIAL"); var jsonData = JsonConvert.DeserializeObject(getPermission); @@ -2240,6 +2501,9 @@ namespace BMA.EHR.Leave.Service.Controllers { Id = data.Id, FullName = $"{data.Prefix}{data.FirstName} {data.LastName}", + Prefix = data.Prefix ?? "", + FirstName = data.FirstName ?? "", + LastName = data.LastName ?? "", //FullName = $"{profile.Prefix}{profile.FirstName} {profile.LastName}", CreatedAt = data.CreatedAt, CheckDate = data.CheckDate, @@ -2296,7 +2560,55 @@ namespace BMA.EHR.Leave.Service.Controllers { result = result.Where(x => x.FullName.Contains(keyword)).ToList(); } - + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "FULLNAME": + if (descending == true) + result = result.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + result = result.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "CREATEDAT": + if (descending == true) + result = result.OrderByDescending(x => x.CreatedAt).ToList(); + else + result = result.OrderBy(x => x.CreatedAt).ToList(); + break; + case "CHECKDATE": + if (descending == true) + result = result.OrderByDescending(x => x.CheckDate).ToList(); + else + result = result.OrderBy(x => x.CheckDate).ToList(); + break; + case "STARTTIMEMORNING": + if (descending == true) + result = result.OrderByDescending(x => x.StartTimeMorning).ToList(); + else + result = result.OrderBy(x => x.StartTimeMorning).ToList(); + break; + case "STARTTIMEAFTERNOON": + if (descending == true) + result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList(); + else + result = result.OrderBy(x => x.StartTimeAfternoon).ToList(); + break; + case "DESCRIPTION": + if (descending == true) + result = result.OrderByDescending(x => x.Description).ToList(); + else + result = result.OrderBy(x => x.Description).ToList(); + break; + default: break; + } + } var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize) .OrderBy(x => x.StatusSort) .ToList(); diff --git a/BMA.EHR.Leave/DTOs/AdditionalCheck/GetAdditionalCheckRequestDto.cs b/BMA.EHR.Leave/DTOs/AdditionalCheck/GetAdditionalCheckRequestDto.cs index 8c04223d..b315b1b5 100644 --- a/BMA.EHR.Leave/DTOs/AdditionalCheck/GetAdditionalCheckRequestDto.cs +++ b/BMA.EHR.Leave/DTOs/AdditionalCheck/GetAdditionalCheckRequestDto.cs @@ -5,6 +5,9 @@ public Guid Id { get; set; } public string FullName { get; set; } + public string? Prefix { get; set; } = string.Empty; + public string? FirstName { get; set; } = string.Empty; + public string? LastName { get; set; } = string.Empty; public DateTime CreatedAt { get; set; } diff --git a/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileDto.cs b/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileDto.cs index 52bb769c..3b05ad29 100644 --- a/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileDto.cs +++ b/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileDto.cs @@ -13,5 +13,9 @@ public int PageSize { get; set; } = 10; public string? Keyword { get; set; } + + public string? sortBy { get; set; } + + public bool? descending { get; set; } } } diff --git a/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileResultDto.cs b/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileResultDto.cs index 6c5bf334..83b4d7b9 100644 --- a/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileResultDto.cs +++ b/BMA.EHR.Leave/DTOs/ChangeRound/SearchProfileResultDto.cs @@ -6,7 +6,11 @@ public string CitizenId { get; set; } - public string FullName { get; set; } + public string FullName { get; set; } + + public string? Prefix { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } public string StartTimeMorning { get; set; } diff --git a/BMA.EHR.Leave/DTOs/CheckIn/CheckInHistoryForAdminDto.cs b/BMA.EHR.Leave/DTOs/CheckIn/CheckInHistoryForAdminDto.cs index ac4e0e9b..c6e13b54 100644 --- a/BMA.EHR.Leave/DTOs/CheckIn/CheckInHistoryForAdminDto.cs +++ b/BMA.EHR.Leave/DTOs/CheckIn/CheckInHistoryForAdminDto.cs @@ -5,6 +5,9 @@ public Guid Id { get; set; } = Guid.Empty; public string FullName { get; set; } = string.Empty; + public string? Prefix { get; set; } = string.Empty; + public string? FirstName { get; set; } = string.Empty; + public string? LastName { get; set; } = string.Empty; public DateTime? CheckInDate { get; set; } = DateTime.MinValue; diff --git a/BMA.EHR.Leave/DTOs/CheckIn/CheckInProcessHistoryForAdminDto.cs b/BMA.EHR.Leave/DTOs/CheckIn/CheckInProcessHistoryForAdminDto.cs index be150bdc..9ec96c35 100644 --- a/BMA.EHR.Leave/DTOs/CheckIn/CheckInProcessHistoryForAdminDto.cs +++ b/BMA.EHR.Leave/DTOs/CheckIn/CheckInProcessHistoryForAdminDto.cs @@ -5,6 +5,9 @@ public Guid Id { get; set; } = Guid.Empty; public string FullName { get; set; } = string.Empty; + public string? Prefix { get; set; } = string.Empty; + public string? FirstName { get; set; } = string.Empty; + public string? LastName { get; set; } = string.Empty; public DateTime? CheckInDate { get; set; } = DateTime.MinValue; diff --git a/BMA.EHR.Leave/DTOs/LeaveBeginnings/GetLeaveBeginningDto.cs b/BMA.EHR.Leave/DTOs/LeaveBeginnings/GetLeaveBeginningDto.cs index 3c3fe77d..587b99b3 100644 --- a/BMA.EHR.Leave/DTOs/LeaveBeginnings/GetLeaveBeginningDto.cs +++ b/BMA.EHR.Leave/DTOs/LeaveBeginnings/GetLeaveBeginningDto.cs @@ -16,5 +16,9 @@ namespace BMA.EHR.Leave.Service.DTOs.LeaveBeginnings public int PageSize { get; set; } = 10; public string Keyword { get; set; } = string.Empty; + + public string? sortBy { get; set; } + + public bool? descending { get; set; } } } From f9d1dd9f38be1676706b2c2b1f490d63527165ee Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Mon, 6 Oct 2025 15:37:13 +0700 Subject: [PATCH 5/5] #1838 --- .../LeaveRequests/LeaveRequestRepository.cs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index 18641ec8..bcd650ef 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -555,7 +555,14 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests // TODO : Update ไปตาราง beginning if (data.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว { - await _leaveBeginningRepository.UpdateLeaveUsageAsync(data.LeaveStartDate.Year, data.Type.Id, data.KeycloakUserId, -1 * data.LeaveTotal); + + var toDay = data.LeaveStartDate.Date; + var thisYear = data.LeaveStartDate.Year; + if(toDay >= new DateTime(thisYear,10,1) && toDay <= new DateTime(thisYear,12,31)) + { + thisYear = thisYear + 1; + } + await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, data.Type.Id, data.KeycloakUserId, -1 * data.LeaveTotal); var _baseAPI = _configuration["API"]; var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{data.Id}"; @@ -620,7 +627,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests // TODO : Update ไปตาราง beginning if (rawData.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว { - await _leaveBeginningRepository.UpdateLeaveUsageAsync(rawData.LeaveStartDate.Year, rawData.Type.Id, rawData.KeycloakUserId, -1 * rawData.LeaveTotal); + + var toDay = rawData.LeaveStartDate.Date; + var thisYear = rawData.LeaveStartDate.Year; + if(toDay >= new DateTime(thisYear,10,1) && toDay <= new DateTime(thisYear,12,31)) + { + thisYear = thisYear + 1; + } + + await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, -1 * rawData.LeaveTotal); var _baseAPI = _configuration["API"]; var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{rawData.Id}"; @@ -1079,8 +1094,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests await UpdateWithTrackingAsync(rawData); + var toDay = rawData.LeaveStartDate.Date; + var thisYear = rawData.LeaveStartDate.Year; + if(toDay >= new DateTime(thisYear,10,1) && toDay <= new DateTime(thisYear,12,31)) + { + thisYear = thisYear + 1; + } + // TODO : Update ไปตาราง beginning - await _leaveBeginningRepository.UpdateLeaveUsageAsync(rawData.LeaveStartDate.Year, rawData.Type.Id, rawData.KeycloakUserId, rawData.LeaveTotal); + await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, rawData.LeaveTotal); var _baseAPI = _configuration["API"];