From 6907607a06afbd07a425e21a4b497177b57c7a55 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Tue, 13 Jan 2026 17:01:20 +0700 Subject: [PATCH] refactor LeaveController to improve sorting and pagination logic #2192 --- .vscode/launch.json | 68 +++---- BMA.EHR.Leave/Controllers/LeaveController.cs | 191 ++++++++++++------- 2 files changed, 158 insertions(+), 101 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fd9cf53a..205e817c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,35 +1,35 @@ { - "version": "0.2.0", - "configurations": [ - { - // Use IntelliSense to find out which attributes exist for C# debugging - // Use hover for the description of the existing attributes - // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md. - "name": ".NET Core Launch (web)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/BMA.EHR.Leave.Service/bin/Debug/net7.0/BMA.EHR.Leave.Service.dll", - "args": [], - "cwd": "${workspaceFolder}/BMA.EHR.Leave.Service", - "stopAtEntry": false, - // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser - "serverReadyAction": { - "action": "openExternally", - "pattern": "\\bNow listening on:\\s+(https?://\\S+)" - }, - "env": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "sourceFileMap": { - "/Views": "${workspaceFolder}/Views" - } - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach" - } - ] -} \ No newline at end of file + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md. + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/BMA.EHR.Leave/bin/Debug/net7.0/BMA.EHR.Leave.dll", + "args": [], + "cwd": "${workspaceFolder}/BMA.EHR.Leave", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} diff --git a/BMA.EHR.Leave/Controllers/LeaveController.cs b/BMA.EHR.Leave/Controllers/LeaveController.cs index 7dafb605..3e0c1d54 100644 --- a/BMA.EHR.Leave/Controllers/LeaveController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveController.cs @@ -2591,6 +2591,8 @@ namespace BMA.EHR.Leave.Service.Controllers //var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequests(year, month); var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, role, nodeId, profileAdmin?.Node); + var total = rawData.Count; + var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (getDefaultRound == null) { @@ -2599,7 +2601,65 @@ namespace BMA.EHR.Leave.Service.Controllers var result = new List(); - foreach (var data in rawData) + + if (!string.IsNullOrWhiteSpace(sortBy)) + { + switch (sortBy.ToUpper()) + { + case "FULLNAME": + if (descending == true) + rawData = rawData.OrderByDescending(x => x.Prefix) + .ThenByDescending(x => x.FirstName) + .ThenByDescending(x => x.LastName) + .ToList(); + else + rawData = rawData.OrderBy(x => x.Prefix) + .ThenBy(x => x.FirstName) + .ThenBy(x => x.LastName) + .ToList(); + break; + case "CREATEDAT": + if (descending == true) + rawData = rawData.OrderByDescending(x => x.CreatedAt).ToList(); + else + rawData = rawData.OrderBy(x => x.CreatedAt).ToList(); + break; + case "CHECKDATE": + if (descending == true) + rawData = rawData.OrderByDescending(x => x.CheckDate).ToList(); + else + rawData = rawData.OrderBy(x => x.CheckDate).ToList(); + break; + // case "STARTTIMEMORNING": + // if (descending == true) + // rawData = rawData.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) + rawData = rawData.OrderByDescending(x => x.Description).ToList(); + else + rawData = rawData.OrderBy(x => x.Description).ToList(); + break; + default: + rawData = rawData.OrderBy(x => + x.Status.Trim().ToLower() == "pending" ? 1 : + x.Status.Trim().ToLower() == "approve" ? 2 : 3).ToList(); + break; + } + } + + var rawDataPaged = rawData.Skip((page - 1) * pageSize).Take(pageSize) + .ToList(); + + foreach (var data in rawDataPaged) { var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); if (profile == null) @@ -2678,69 +2738,69 @@ namespace BMA.EHR.Leave.Service.Controllers result.Add(resObj); } - if (keyword != "") - { - result = result.Where(x => x.FullName.Contains(keyword)).ToList(); - } - if (string.IsNullOrWhiteSpace(sortBy)) - { - sortBy = "default"; - } - 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: - result = result.OrderBy(x => x.StatusSort).ToList(); - break; - } - } - var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize) - .ToList(); + // if (keyword != "") + // { + // result = result.Where(x => x.FullName.Contains(keyword)).ToList(); + // } + // if (string.IsNullOrWhiteSpace(sortBy)) + // { + // sortBy = "default"; + // } + // 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: + // result = result.OrderBy(x => x.StatusSort).ToList(); + // break; + // } + // } + // var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize) + // .ToList(); - return Success(new { data = pageResult, total = result.Count }); + return Success(new { data = result, total = total }); } /// @@ -3170,10 +3230,7 @@ namespace BMA.EHR.Leave.Service.Controllers result.Add(resObj); } - if (keyword != "") - { - result = result.Where(x => x.EditReason!.Contains(keyword) || x.CheckInLocation!.Contains(keyword) || x.CheckOutLocation!.Contains(keyword)).ToList(); - } + var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize) .ToList();