diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs index e9cfc2e2..fe5364ca 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs @@ -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 GetByYearAndTypeIdAsync(int year, Guid typeId) { - return await _dbContext.Set() + var data = await _dbContext.Set() .Include(x => x.LeaveType) .FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId); + + + return data; } + + + public async Task 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().FirstOrDefaultAsync(x => x.Id == typeId); + + var data = await _dbContext.Set() + .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() + .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().Add(data); + await _dbContext.SaveChangesAsync(); + } + + return data; + } + } } diff --git a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs index 25457406..65b282f7 100644 --- a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs @@ -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().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 diff --git a/BMA.EHR.Leave/DTOs/LeaveRequest/GetUserLeaveProfileResultDto.cs b/BMA.EHR.Leave/DTOs/LeaveRequest/GetUserLeaveProfileResultDto.cs index 5434223d..6ddc93cb 100644 --- a/BMA.EHR.Leave/DTOs/LeaveRequest/GetUserLeaveProfileResultDto.cs +++ b/BMA.EHR.Leave/DTOs/LeaveRequest/GetUserLeaveProfileResultDto.cs @@ -28,6 +28,8 @@ public double RestDayTotalOld { get; set; } + public double RestDayTotalCurrent { get; set; } + public DateTime BirthDate { get; set; } public DateTime? DateAppoint { get; set; }