fix LeaveBeggining Add รายการใหม่เมื่อมีการตรวจสอบ auto ไม่ต้องใช้ cronjob เพราะว่ารายการจะเขอะเกินไป

This commit is contained in:
Suphonchai Phoonsawat 2025-04-29 15:21:42 +07:00
parent 746f435ca8
commit 749b2b68a1
3 changed files with 172 additions and 83 deletions

View file

@ -1,6 +1,10 @@
using BMA.EHR.Application.Common.Interfaces; using Amazon.S3.Model;
using BMA.EHR.Application.Common.Interfaces;
using BMA.EHR.Application.Messaging; using BMA.EHR.Application.Messaging;
using BMA.EHR.Domain.Extensions;
using BMA.EHR.Domain.Models.Leave.Commons;
using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.Requests;
using BMA.EHR.Domain.Shared;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@ -64,9 +68,81 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task<LeaveBeginning?> GetByYearAndTypeIdAsync(int year, Guid typeId) public async Task<LeaveBeginning?> GetByYearAndTypeIdAsync(int year, Guid typeId)
{ {
return await _dbContext.Set<LeaveBeginning>() var data = await _dbContext.Set<LeaveBeginning>()
.Include(x => x.LeaveType) .Include(x => x.LeaveType)
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId); .FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId);
return data;
} }
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUserAsync(int year, Guid typeId, Guid userId)
{
var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
if (pf == null)
{
throw new Exception(GlobalMessages.DataNotFound);
}
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
var data = await _dbContext.Set<LeaveBeginning>()
.Include(x => x.LeaveType)
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
if (data == null)
{
var limit = 0.0;
var prev = await _dbContext.Set<LeaveBeginning>()
.Include(x => x.LeaveType)
.FirstOrDefaultAsync(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
var prevRemain = 0.0;
if (prev != null)
{
prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
}
if (govAge >= 180)
{
if (govAge >= 3650)
{
limit = 10 + prevRemain;
if (limit > 30) limit = 30;
}
else
{
limit = 10 + prevRemain;
if (limit > 20) limit = 20;
}
}
else
{
limit = 0.0;
}
data = new LeaveBeginning
{
LeaveYear = year,
LeaveTypeId = typeId,
ProfileId = pf.Id,
Prefix = pf.Prefix,
FirstName = pf.FirstName,
LastName = pf.LastName,
LeaveDaysUsed = 0,
LeaveDays = leaveType?.Code == "LV-005" ? limit : 0
};
_dbContext.Set<LeaveBeginning>().Add(data);
await _dbContext.SaveChangesAsync();
}
return data;
}
} }
} }

View file

@ -840,46 +840,52 @@ namespace BMA.EHR.Leave.Service.Controllers
if (profile.Root != null && profile.Root != "") if (profile.Root != null && profile.Root != "")
orgName += $" {profile.Root}"; orgName += $" {profile.Root}";
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(thisYear, req.Type, userId);
if (leaveType.Code.Trim().ToUpper() == "LV-005") if (leaveType.Code.Trim().ToUpper() == "LV-005")
{ {
var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, leaveType.Id); leaveLimit = leaveData == null ? 0 : leaveData.LeaveDays;
if (govAge >= 180)
{ //var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, leaveType.Id);
var leavePrevYear = (await _leaveRequestRepository.GetSumApproveLeaveAsync(thisYear)).Where(x => x.LeaveTypeCode == "LV-005" && x.KeycloakUserId == userId).FirstOrDefault();
if (govAge >= 3650) //if (govAge >= 180)
{ //{
leaveLimit = beginningLeave != null ? beginningLeave.LeaveDays : 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // var leavePrevYear = (await _leaveRequestRepository.GetSumApproveLeaveAsync(thisYear)).Where(x => x.LeaveTypeCode == "LV-005" && x.KeycloakUserId == userId).FirstOrDefault();
remainPrev = beginningLeave != null ? beginningLeave.LeaveDays : 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน // if (govAge >= 3650)
if (remainPrev >= 20) remainPrev = 20; // {
} // leaveLimit = beginningLeave != null ? beginningLeave.LeaveDays : 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay);
else // remainPrev = beginningLeave != null ? beginningLeave.LeaveDays : 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
{ // if (remainPrev >= 20) remainPrev = 20;
leaveLimit = beginningLeave != null ? beginningLeave.LeaveDays : 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // }
remainPrev = beginningLeave != null ? beginningLeave.LeaveDays : 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน // else
if (remainPrev >= 10) remainPrev = 10; // {
} // leaveLimit = beginningLeave != null ? beginningLeave.LeaveDays : 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay);
} // remainPrev = beginningLeave != null ? beginningLeave.LeaveDays : 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
else // if (remainPrev >= 10) remainPrev = 10;
{ // }
leaveLimit = 0; //}
} //else
//{
// leaveLimit = 0;
//}
} }
else else
leaveLimit = leaveType.Limit; leaveLimit = leaveType.Limit;
var sumLeave = await _leaveRequestRepository.GetSumLeaveByTypeForUserAsync(userId, req.Type, thisYear); //var sumLeave = await _leaveRequestRepository.GetSumLeaveByTypeForUserAsync(userId, req.Type, thisYear);
var restOldDay = 0.00; var restOldDay = leaveData == null ? 0 : leaveData.LeaveDays - 10;
if (leaveType.Code.Trim().ToUpper() == "LV-005") var restCurrentDay = 10.0;
{ var sumLeave = leaveData == null ? 0 : leaveData.LeaveDaysUsed;
restOldDay = remainPrev;
} //if (leaveType.Code.Trim().ToUpper() == "LV-005")
else //{
restOldDay = await _leaveRequestRepository.GetRestDayTotalByYearForUserAsync(userId, thisYear - 1); // restOldDay = remainPrev;
//}
//else
// restOldDay = await _leaveRequestRepository.GetRestDayTotalByYearForUserAsync(userId, thisYear - 1);
var lastSalary = profile.ProfileSalary; var lastSalary = profile.ProfileSalary;
@ -913,6 +919,7 @@ namespace BMA.EHR.Leave.Service.Controllers
LeaveTotal = sumLeave, LeaveTotal = sumLeave,
LeaveRemain = leaveLimit - sumLeave, LeaveRemain = leaveLimit - sumLeave,
RestDayTotalOld = restOldDay, RestDayTotalOld = restOldDay,
RestDayTotalCurrent = restCurrentDay,
BirthDate = profile.BirthDate.Date, BirthDate = profile.BirthDate.Date,
DateAppoint = profile.DateAppoint == null ? null : profile.DateAppoint.Value.Date, DateAppoint = profile.DateAppoint == null ? null : profile.DateAppoint.Value.Date,
Salary = lastSalary == null ? 0 : lastSalary.Amount == null ? 0 : (int)lastSalary.Amount.Value, Salary = lastSalary == null ? 0 : lastSalary.Amount == null ? 0 : (int)lastSalary.Amount.Value,
@ -946,11 +953,6 @@ namespace BMA.EHR.Leave.Service.Controllers
{ {
var totalDay = (double)req.StartLeaveDate.DiffDay(req.EndLeaveDate.Date); var totalDay = (double)req.StartLeaveDate.DiffDay(req.EndLeaveDate.Date);
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
@ -981,6 +983,8 @@ namespace BMA.EHR.Leave.Service.Controllers
var sumApproveLeave = await _leaveRequestRepository.GetSumApproveLeaveByTypeForUserAsync(userId, req.Type, req.StartLeaveDate.Year); var sumApproveLeave = await _leaveRequestRepository.GetSumApproveLeaveByTypeForUserAsync(userId, req.Type, req.StartLeaveDate.Year);
// อ่านค่าจากตาราง beginning ทั้ง limit และ usage
var sumLeaveDay = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(req.StartLeaveDate.Year, req.Type, userId);
var minLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type && var minLeave = (await _context.Set<LeaveRequest>().Where(x => x.Type.Id == req.Type &&
@ -1003,16 +1007,15 @@ namespace BMA.EHR.Leave.Service.Controllers
} }
var isLeave = false; var isLeave = false;
var approveDay = sumLeaveDay == null ? 0.0 : sumLeaveDay.LeaveDaysUsed;
var limitDay = sumLeaveDay == null ? 0.0 : sumLeaveDay.LeaveDays;
switch (leaveType.Code.ToUpper().Trim()) switch (leaveType.Code.ToUpper().Trim())
{ {
case "LV-001": case "LV-001":
// fix issue : ระบบลา (ขรก.) >> ลาป่วย (กรณียื่นขอลาเกิน 120 วัน/ปี) #828 // fix issue : ระบบลา (ขรก.) >> ลาป่วย (กรณียื่นขอลาเกิน 120 วัน/ปี) #828
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= 120;
isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 120;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
//isLeave = true; //isLeave = true;
break; break;
@ -1021,13 +1024,13 @@ namespace BMA.EHR.Leave.Service.Controllers
// fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณีผู้เข้ารับราชการไม่เกิน 1 ปี ยื่นขอลาเกิน 15 วัน/ปี) #831 // fix issue : ระบบลา (ขรก.) >> ลากิจส่วนตัว (กรณีผู้เข้ารับราชการไม่เกิน 1 ปี ยื่นขอลาเกิน 15 วัน/ปี) #831
if (govAge <= 365) if (govAge <= 365)
{ {
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= 15; isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 15;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
} }
else else
{ {
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= 45; isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 45;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
} }
@ -1041,7 +1044,7 @@ namespace BMA.EHR.Leave.Service.Controllers
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
break; break;
case "LV-004": case "LV-004":
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= 15; isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= 15;
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
break; break;
case "LV-005": case "LV-005":
@ -1050,23 +1053,27 @@ namespace BMA.EHR.Leave.Service.Controllers
//var leavePrevYearRemain = 10 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน //var leavePrevYearRemain = 10 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
if (govAge >= 180) if (govAge >= 180)
if (govAge >= 3650) {
{ isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= (limitDay);
// ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
var leavePrevYearRemain = 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน }
if (leavePrevYearRemain >= 20) leavePrevYearRemain = 20; //if (govAge >= 3650)
//{
// // ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน
// //var leavePrevYearRemain = 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
// //if (leavePrevYearRemain >= 20) leavePrevYearRemain = 20;
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain); // isLeave = (totalDay - (sumWorkDay + sumWeekend) + approveDay) <= (limitDay);
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; // if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
} //}
else //else
{ //{
var leavePrevYearRemain = 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน // //var leavePrevYearRemain = 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน
if (leavePrevYearRemain >= 10) leavePrevYearRemain = 10; // //if (leavePrevYearRemain >= 10) leavePrevYearRemain = 10;
isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain); // isLeave = (totalDay - (sumWorkDay + sumWeekend) + sumApproveLeave) <= (10 + leavePrevYearRemain);
if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด"; // if (!isLeave) message = "จำนวนวันลาเกินที่กำหนด";
} //}
else else
{ {
@ -2350,34 +2357,38 @@ namespace BMA.EHR.Leave.Service.Controllers
// fix issue : SIT ระบบบันทึกการลา>> สิทธิ์การลา(โอนสิทธิ์การลา) #974 // fix issue : SIT ระบบบันทึกการลา>> สิทธิ์การลา(โอนสิทธิ์การลา) #974
var extendLeave = 0.0; var extendLeave = 0.0;
var leaveLimit = leaveType.Limit; var leaveLimit = (double)leaveType.Limit;
if (leaveType.Code == "LV-005") if (leaveType.Code == "LV-005")
{ {
var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, leaveType.Id); var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(thisYear, leaveType.Id, userId);
leaveLimit = leaveData == null ? 0.0 : leaveData.LeaveDays;
extendLeave = leaveLimit - 10;
var apprvPrevData = approvePrevYear.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id); //var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, leaveType.Id);
var apprvPrev = apprvPrevData == null ? 0 : apprvPrevData.SumLeaveDay;
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); //var apprvPrevData = approvePrevYear.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
var govAge = (profile?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date); //var apprvPrev = apprvPrevData == null ? 0 : apprvPrevData.SumLeaveDay;
if (govAge >= 180) //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
{ //var govAge = (profile?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
if (govAge >= 3650)
{ //if (govAge >= 180)
// ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน //{
extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน // if (govAge >= 3650)
if (extendLeave >= 20) extendLeave = 20; // {
} // // ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน
else // extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน
{ // if (extendLeave >= 20) extendLeave = 20;
extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน // }
if (extendLeave >= 10) extendLeave = 10; // else
} // {
} // extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน
else // if (extendLeave >= 10) extendLeave = 10;
leaveLimit = 0; // }
//}
//else
// leaveLimit = 0;
} }
var data = new var data = new

View file

@ -28,6 +28,8 @@
public double RestDayTotalOld { get; set; } public double RestDayTotalOld { get; set; }
public double RestDayTotalCurrent { get; set; }
public DateTime BirthDate { get; set; } public DateTime BirthDate { get; set; }
public DateTime? DateAppoint { get; set; } public DateTime? DateAppoint { get; set; }