diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs index db09f644..e9cfc2e2 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveBeginingRepository.cs @@ -61,5 +61,12 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests .Where(x => x.LeaveYear == year) .ToListAsync(); } + + public async Task GetByYearAndTypeIdAsync(int year, Guid typeId) + { + return await _dbContext.Set() + .Include(x => x.LeaveType) + .FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId); + } } } diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index e92c9627..d1ee1a61 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -280,6 +280,18 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests public async Task GetSumLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year) { + var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(keycloakUserId, AccessToken); + if (pf == null) + throw new Exception(GlobalMessages.DataNotFound); + + var beginningLeave = await _dbContext.Set().AsNoTracking() + .Where(x => x.ProfileId == pf.Id) + .Where(x => x.LeaveYear == year) + .Where(x => x.LeaveTypeId == leaveTypeId) + .FirstOrDefaultAsync(); + + + var startFiscalDate = new DateTime(year - 1, 10, 1); var endFiscalDate = new DateTime(year, 9, 30); @@ -293,7 +305,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests //.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE") .ToListAsync(); - return data.Sum(x => x.LeaveTotal); + return data.Sum(x => x.LeaveTotal) + (beginningLeave == null ? 0 : beginningLeave.LeaveDaysUsed); } //public async Task GetSumApproveLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year) diff --git a/BMA.EHR.Leave/Controllers/LeaveReportController.cs b/BMA.EHR.Leave/Controllers/LeaveReportController.cs index a8a2a0d0..29a51113 100644 --- a/BMA.EHR.Leave/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveReportController.cs @@ -45,6 +45,7 @@ namespace BMA.EHR.Leave.Service.Controllers private readonly UserCalendarRepository _userCalendarRepository; private readonly IHttpContextAccessor _httpContextAccessor; private readonly PermissionRepository _permission; + private readonly LeaveBeginningRepository _leaveBeginningRepository; #endregion @@ -60,7 +61,8 @@ namespace BMA.EHR.Leave.Service.Controllers HolidayRepository holidayRepository, UserCalendarRepository userCalendarRepository, IHttpContextAccessor httpContextAccessor, - PermissionRepository permission) + PermissionRepository permission, + LeaveBeginningRepository leaveBeginningRepository) { _leaveRequestRepository = leaveRequestRepository; _userProfileRepository = userProfileRepository; @@ -73,6 +75,7 @@ namespace BMA.EHR.Leave.Service.Controllers _userCalendarRepository = userCalendarRepository; _httpContextAccessor = httpContextAccessor; _permission = permission; + _leaveBeginningRepository = leaveBeginningRepository; } private class LoopDate { @@ -231,7 +234,7 @@ namespace BMA.EHR.Leave.Service.Controllers private async Task GetReport03(LeaveRequest data) { - + var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); @@ -240,7 +243,7 @@ namespace BMA.EHR.Leave.Service.Controllers return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } - + var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; @@ -274,6 +277,9 @@ namespace BMA.EHR.Leave.Service.Controllers var apprvPrevData = approvePrevYear.FirstOrDefault(x => x.KeycloakUserId == data.KeycloakUserId && x.LeaveTypeId == data.Type.Id); var apprvPrev = apprvPrevData == null ? 0 : apprvPrevData.SumLeaveDay; + //หาวันลายกมาของปีก่อน + var leaveBeginning = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(data.LeaveStartDate.Year, data.Type.Id); + //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); var govAge = (profile?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date); @@ -282,12 +288,14 @@ namespace BMA.EHR.Leave.Service.Controllers if (govAge >= 3650) { // ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน - extendLeave = 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + //extendLeave = 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = leaveBeginning == null ? 30 - apprvPrev : leaveBeginning.LeaveDays; if (extendLeave >= 20) extendLeave = 20; } else { - extendLeave = 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + //extendLeave = 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = leaveBeginning == null ? 20 - apprvPrev : leaveBeginning.LeaveDays; if (extendLeave >= 10) extendLeave = 10; } } diff --git a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs index 591b257e..f04e4fa8 100644 --- a/BMA.EHR.Leave/Controllers/LeaveRequestController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveRequestController.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Org.BouncyCastle.Asn1.Pkcs; using Swashbuckle.AspNetCore.Annotations; using System.Net.Http.Headers; using System.Security.Claims; @@ -43,6 +44,7 @@ namespace BMA.EHR.Leave.Service.Controllers private readonly CommandRepository _commandRepository; private readonly UserCalendarRepository _userCalendarRepository; private readonly PermissionRepository _permission; + private readonly LeaveBeginningRepository _leaveBeginningRepository; private const string APPROVE_STEP_CREATE = "st1"; private const string APPROVE_STEP_OFFICER_APPROVE = "st2"; @@ -65,7 +67,8 @@ namespace BMA.EHR.Leave.Service.Controllers HolidayRepository holidayRepository, CommandRepository commandRepository, UserCalendarRepository userCalendarRepository, - PermissionRepository permission) + PermissionRepository permission, + LeaveBeginningRepository leaveBeginningRepository) { _context = context; _httpContextAccessor = httpContextAccessor; @@ -79,6 +82,7 @@ namespace BMA.EHR.Leave.Service.Controllers _commandRepository = commandRepository; _userCalendarRepository = userCalendarRepository; _permission = permission; + _leaveBeginningRepository = leaveBeginningRepository; } #endregion @@ -821,19 +825,21 @@ namespace BMA.EHR.Leave.Service.Controllers if (leaveType.Code.Trim().ToUpper() == "LV-005") { + 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 = 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); - remainPrev = 30 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน + 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 = 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); - remainPrev = 20 - (leavePrevYear == null ? 0 : leavePrevYear.SumLeaveDay); // หายอดวันลาที่เหลือของปีก่อน + 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; } } @@ -1823,11 +1829,11 @@ namespace BMA.EHR.Leave.Service.Controllers return Success(); } - catch(Exception ex) + catch (Exception ex) { return Error(ex); } - + } /// @@ -1895,7 +1901,7 @@ namespace BMA.EHR.Leave.Service.Controllers { return Error(ex); } - + } /// @@ -1996,7 +2002,7 @@ namespace BMA.EHR.Leave.Service.Controllers { return Error(ex); } - + } /// @@ -2100,6 +2106,8 @@ namespace BMA.EHR.Leave.Service.Controllers if (rawData.Type.Code == "LV-005") { + var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, rawData.Type.Id); + var apprvPrevData = approvePrevYear.FirstOrDefault(x => x.KeycloakUserId == rawData.KeycloakUserId && x.LeaveTypeId == rawData.Type.Id); var apprvPrev = apprvPrevData == null ? 0 : apprvPrevData.SumLeaveDay; @@ -2111,12 +2119,12 @@ namespace BMA.EHR.Leave.Service.Controllers if (govAge >= 3650) { // ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน - extendLeave = 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน if (extendLeave >= 20) extendLeave = 20; } else { - extendLeave = 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน if (extendLeave >= 10) extendLeave = 10; } } @@ -2290,6 +2298,8 @@ namespace BMA.EHR.Leave.Service.Controllers if (leaveType.Code == "LV-005") { + var beginningLeave = await _leaveBeginningRepository.GetByYearAndTypeIdAsync(thisYear, leaveType.Id); + var apprvPrevData = approvePrevYear.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id); var apprvPrev = apprvPrevData == null ? 0 : apprvPrevData.SumLeaveDay; @@ -2301,12 +2311,12 @@ namespace BMA.EHR.Leave.Service.Controllers if (govAge >= 3650) { // ถ้าอายุราชการเกิน 10 ปี ได้บวกเพิ่มอีก 10 วัน - extendLeave = 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 30 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน if (extendLeave >= 20) extendLeave = 20; } else { - extendLeave = 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน + extendLeave = beginningLeave != null ? beginningLeave.LeaveDays : 20 - apprvPrev; // หายอดวันลาที่เหลือของปีก่อน if (extendLeave >= 10) extendLeave = 10; } }