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.Domain.Extensions;
using BMA.EHR.Domain.Models.Leave.Commons;
using BMA.EHR.Domain.Models.Leave.Requests;
using BMA.EHR.Domain.Shared;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
@ -64,9 +68,81 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task<LeaveBeginning?> GetByYearAndTypeIdAsync(int year, Guid typeId)
{
return await _dbContext.Set<LeaveBeginning>()
var data = await _dbContext.Set<LeaveBeginning>()
.Include(x => x.LeaveType)
.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

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

View file

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