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.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
<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="Serilog.AspNetCore" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />

View file

@ -17,6 +17,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NodaTime;
using Org.BouncyCastle.Asn1.Pkcs;
using Sentry;
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.GetProfileByKeycloakIdNewAsync(userId, AccessToken);
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 message = string.Empty;
@ -1055,12 +1063,11 @@ namespace BMA.EHR.Leave.Service.Controllers
case "LV-002":
// fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณียื่นขอลาเกิน 45 วัน/ปี) #829
// fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณีผู้เข้ารับราชการไม่เกิน 1 ปี ยื่นขอลาเกิน 15 วัน/ปี) #831
if (govAge <= 365)
if (govAgeYear <= 1)
{
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 15;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
}
else
{
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 45;
@ -1084,13 +1091,14 @@ namespace BMA.EHR.Leave.Service.Controllers
// fix issue : ระบบลา (ขรก.) >> ลาพักผ่อน (กรณีรับราชการไม่ถึง 6 เดือน) #838
//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); // หายอดวันลาที่เหลือของปีก่อน
if (profile.IsProbation! == true)
{
isLeave = false;
if (!isLeave) message = "ยังอยู่ในช่วงทดลองปฏิบัติราชการ ไม่สามารถลาพักผ่อนได้";
}
//else if (govAge >= 180)
else
// if (profile.IsProbation! == true)
// {
// isLeave = false;
// if (!isLeave) message = "ยังอยู่ในช่วงทดลองปฏิบัติราชการ ไม่สามารถลาพักผ่อนได้";
// }
// else
if (govAgeMonth >= 6)
//else
{
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= (limitDay);
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
@ -1112,17 +1120,16 @@ namespace BMA.EHR.Leave.Service.Controllers
// isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain);
// if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
// }
// else
// {
// isLeave = false;
// if (!isLeave) message = "อายุราชการน้อยกว่า 6 เดือนหรือ 180 วัน";
// }
else
{
isLeave = false;
if (!isLeave) message = "อายุราชการน้อยกว่า 6 เดือนหรือ 180 วัน";
}
break;
case "LV-006":
// fix issue : ระบบลา(ขรก.) >> ลาอุปสมบทหรือการลาประกอบพิธีฮัจย์ฯ(กรณีรับราชการน้อยกว่า 1 ปี) #840
if (govAge < 365)
if (govAgeYear < 1)
{
isLeave = false;
if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน";
@ -1148,7 +1155,7 @@ namespace BMA.EHR.Leave.Service.Controllers
break;
case "LV-008":
case "LV-009":
isLeave = govAge >= 365;
isLeave = govAgeYear >= 1;
if (!isLeave) message = "อายุราชการน้อยกว่า 1 ปีหรือ 365 วัน";
break;
case "LV-010":