Add NodaTime package and update LeaveRequestController to use LocalDate for date calculations

#2324
This commit is contained in:
Suphonchai Phoonsawat 2026-02-19 14:06:59 +07:00
parent c42aaa38f6
commit b8df2d4024
2 changed files with 25 additions and 17 deletions

View file

@ -45,6 +45,7 @@
<PackageReference Include="Microsoft.IdentityModel.Logging" Version="6.31.0" /> <PackageReference Include="Microsoft.IdentityModel.Logging" Version="6.31.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
<PackageReference Include="NEST" Version="7.17.5" /> <PackageReference Include="NEST" Version="7.17.5" />
<PackageReference Include="NodaTime" Version="3.3.0" />
<PackageReference Include="runtime.osx.10.10-x64.CoreCompat.System.Drawing" Version="6.0.5.128" /> <PackageReference Include="runtime.osx.10.10-x64.CoreCompat.System.Drawing" Version="6.0.5.128" />
<PackageReference Include="Serilog.AspNetCore" Version="7.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />

View file

@ -17,6 +17,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NodaTime;
using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.Pkcs;
using Sentry; using Sentry;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
@ -986,6 +987,13 @@ namespace BMA.EHR.Leave.Service.Controllers
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); // var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
var profile = await _userProfileRepository.GetProfileByKeycloakIdNewAsync(userId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdNewAsync(userId, AccessToken);
var govAge = (profile?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date); var govAge = (profile?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
var date1Raw = profile?.DateStart?.Date ?? DateTime.Now.Date;
var date1 = new LocalDate(date1Raw.Year, date1Raw.Month, date1Raw.Day);
var date2 = new LocalDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
Period period = Period.Between(date1, date2);
var govAgeMonth = period.Months;
var govAgeYear = period.Years;
var thisYear = DateTime.Now.Year; var thisYear = DateTime.Now.Year;
var message = string.Empty; var message = string.Empty;
@ -1055,12 +1063,11 @@ namespace BMA.EHR.Leave.Service.Controllers
case "LV-002": case "LV-002":
// fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณียื่นขอลาเกิน 45 วัน/ปี) #829 // fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณียื่นขอลาเกิน 45 วัน/ปี) #829
// fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณีผู้เข้ารับราชการไม่เกิน 1 ปี ยื่นขอลาเกิน 15 วัน/ปี) #831 // fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณีผู้เข้ารับราชการไม่เกิน 1 ปี ยื่นขอลาเกิน 15 วัน/ปี) #831
if (govAge <= 365) if (govAgeYear <= 1)
{ {
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 15; isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 15;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
} }
else else
{ {
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 45; isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 45;
@ -1084,13 +1091,14 @@ namespace BMA.EHR.Leave.Service.Controllers
// fix issue : ระบบลา (ขรก.) >> ลาพักผ่อน (กรณีรับราชการไม่ถึง 6 เดือน) #838 // fix issue : ระบบลา (ขรก.) >> ลาพักผ่อน (กรณีรับราชการไม่ถึง 6 เดือน) #838
//var leavePrevYear = (await _leaveRequestRepository.GetSumApproveLeaveAsync(fiscalYear - 1)).Where(x => x.LeaveTypeCode == "LV-005" && x.KeycloakUserId == userId).FirstOrDefault(); //var leavePrevYear = (await _leaveRequestRepository.GetSumApproveLeaveAsync(fiscalYear - 1)).Where(x => x.LeaveTypeCode == "LV-005" && x.KeycloakUserId == userId).FirstOrDefault();
//var leavePrevYearRemain = 10 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน //var leavePrevYearRemain = 10 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
if (profile.IsProbation! == true) // if (profile.IsProbation! == true)
{ // {
isLeave = false; // isLeave = false;
if (!isLeave) message = "ยังอยู่ในช่วงทดลองปฏิบัติราชการ ไม่สามารถลาพักผ่อนได้"; // if (!isLeave) message = "ยังอยู่ในช่วงทดลองปฏิบัติราชการ ไม่สามารถลาพักผ่อนได้";
} // }
//else if (govAge >= 180) // else
else if (govAgeMonth >= 6)
//else
{ {
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= (limitDay); isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= (limitDay);
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
@ -1112,17 +1120,16 @@ namespace BMA.EHR.Leave.Service.Controllers
// isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain); // isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain);
// if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; // if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
// } // }
else
// else {
// { isLeave = false;
// isLeave = false; if (!isLeave) message = "อายุราชการน้อยกว่า 6 เดือนหรือ 180 วัน";
// if (!isLeave) message = "อายุราชการน้อยกว่า 6 เดือนหรือ 180 วัน"; }
// }
break; break;
case "LV-006": case "LV-006":
// fix issue : ระบบลา(ขรก.) >> ลาอุปสมบทหรือการลาประกอบพิธีฮัจย์ฯ(กรณีรับราชการน้อยกว่า 1 ปี) #840 // fix issue : ระบบลา(ขรก.) >> ลาอุปสมบทหรือการลาประกอบพิธีฮัจย์ฯ(กรณีรับราชการน้อยกว่า 1 ปี) #840
if (govAge < 365) if (govAgeYear < 1)
{ {
isLeave = false; isLeave = false;
if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน"; if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน";
@ -1148,7 +1155,7 @@ namespace BMA.EHR.Leave.Service.Controllers
break; break;
case "LV-008": case "LV-008":
case "LV-009": case "LV-009":
isLeave = govAge >= 365; isLeave = govAgeYear >= 1;
if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน"; if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน";
break; break;
case "LV-010": case "LV-010":