using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Application.Repositories.MessageQueue; using BMA.EHR.Domain.Models.Notifications; using BMA.EHR.Domain.Models.Retirement; using BMA.EHR.Domain.Shared; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Security.Claims; using System.Text; namespace BMA.EHR.Application.Repositories { public class RetirementRepository : GenericRepository { private readonly IApplicationDBContext _dbContext; private readonly IHttpContextAccessor _httpContextAccessor; private readonly NotificationRepository _repositoryNoti; private readonly IConfiguration _configuration; private readonly string URL = string.Empty; public RetirementRepository(IApplicationDBContext dbContext, NotificationRepository repositoryNoti, IHttpContextAccessor httpContextAccessor, UserProfileRepository userProfileRepository, IConfiguration configuration) : base(dbContext, httpContextAccessor) { _dbContext = dbContext; _httpContextAccessor = httpContextAccessor; _repositoryNoti = repositoryNoti; _configuration = configuration; URL = _configuration["VITE_URL_MGT"]; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; private string? token => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"]; #endregion //ปลดออก public async Task NotifyDischarge() { var cronjobNotis = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) .Where(x => x.Date != null && x.Date.Value.Date == DateTime.Now.Date) .AsQueryable() .ToListAsync(); foreach (var cronjobNoti in cronjobNotis) { cronjobNoti.Profile.IsLeave = true; cronjobNoti.Profile.LeaveReason = "DISCHARGE"; cronjobNoti.Profile.LeaveDate = DateTime.Now; } await _dbContext.SaveChangesAsync(); } //ไล่ออก public async Task NotifyExpulsion() { var cronjobNotis = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) .Where(x => x.Date != null && x.Date.Value.Date == DateTime.Now.Date) .AsQueryable() .ToListAsync(); foreach (var cronjobNoti in cronjobNotis) { cronjobNoti.Profile.IsLeave = true; cronjobNoti.Profile.LeaveReason = "DISMISS"; cronjobNoti.Profile.LeaveDate = DateTime.Now; } await _dbContext.SaveChangesAsync(); } //ให้ออก public async Task NotifyOut() { var cronjobNotis = await _dbContext.Set() //.Include(x => x.Profile) //.ThenInclude(x => x.Prefix) .Where(x => x.Date != null && x.Date.Value.Date == DateTime.Now.Date) .AsQueryable() .ToListAsync(); await _dbContext.SaveChangesAsync(); } public void TestMethod() { return; } public async Task GetByIdAsync(Guid id) { try { var data = await _dbContext.Set().AsQueryable() .Include(x => x.Approvers) .FirstOrDefaultAsync(x => x.Id == id); return data; } catch { throw; } } public async Task OfficerApproveRetirementResign(Guid id) { var rawData = await GetByIdAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } rawData.Status = "PENDING"; if (rawData.ApproveStep == "st1") { rawData.ApproveStep = "st2"; } else if (rawData.ApproveStep == "st3") { rawData.ApproveStep = "st4"; // TODO: Send notification to 1st Approver var _firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var _noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = _firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(_noti1); } // TODO: Send notification to 1st Commander var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "COMMANDER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } public async Task CommanderApproveRetirementResign(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st2") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { rawData.Status = "PENDING"; var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; rawData.ApproveStep = "st3"; if (rawData.Group == "1.1") { // TODO: Send notification to 1st Approver var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(noti1); } await _dbContext.SaveChangesAsync(); } } public async Task CommanderRejectRetirementResign(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st2") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "REJECT"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(noti); rawData.Status = "PENDING"; await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; // rawData.LeaveComment = reason; // if (rawData.Group != "1.1") // { rawData.ApproveStep = "st3"; // } if (rawData.Group == "1.1") { // TODO: Send notification to 1st Approver var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail/{id}", }; _dbContext.Set().Add(noti1); } await _dbContext.SaveChangesAsync(); } } public async Task ApproveRetirementResign(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st3") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = "", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "APPROVE"; // rawData.LeaveDirectorComment = reason; if (rawData.Group != "1.1") { rawData.ApproveStep = "st5"; } else { rawData.ApproveStep = "st4"; } if (rawData.profileId != null) { // Send Noti var noti = new Notification { Body = $"การขอลาออกของคุณได้รับการอนุมัติ", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); } await _dbContext.SaveChangesAsync(); } } public async Task RejectRetirementResign(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st3") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "REJECT"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti1 = new Notification { Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = "", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "REJECT"; if (rawData.Group != "1.1") { rawData.ApproveStep = "st5"; } else { rawData.ApproveStep = "st4"; } // Send Noti var noti = new Notification { Body = $"การขอลาออกของคุณไม่ได้รับการอนุมัติ \r\nเนื่องจาก{reason}", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } } public async Task GetByIdCancelAsync(Guid id) { try { var data = await _dbContext.Set().AsQueryable() .Include(x => x.Approvers) .FirstOrDefaultAsync(x => x.Id == id); return data; } catch { throw; } } public async Task OfficerApproveRetirementResignCancel(Guid id) { var rawData = await GetByIdCancelAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } rawData.Status = "PENDING"; if (rawData.ApproveStep == "st1") { rawData.ApproveStep = "st2"; } else if (rawData.ApproveStep == "st3") { rawData.ApproveStep = "st4"; // TODO: Send notification to 1st Approver var _firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var _noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = _firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(_noti1); } // TODO: Send notification to 1st Commander var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "COMMANDER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } public async Task CommanderApproveRetirementResignCancel(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdCancelAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st2") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { rawData.Status = "PENDING"; var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; rawData.ApproveStep = "st3"; if (rawData.Group == "1.1") { // TODO: Send notification to 1st Approver var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); } await _dbContext.SaveChangesAsync(); } } public async Task CommanderRejectRetirementResignCancel(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdCancelAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st2") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "REJECT"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti); rawData.Status = "PENDING"; await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; // rawData.LeaveComment = reason; // if (rawData.Group != "1.1") // { rawData.ApproveStep = "st3"; // } if (rawData.Group == "1.1") { // TODO: Send notification to 1st Approver var firstCommander = rawData.Approvers .Where(x => x.ApproveType!.ToUpper() == "APPROVER") .OrderBy(x => x.Seq) .FirstOrDefault(); // Send Notification var noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = firstCommander!.ProfileId, Type = "", Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); } await _dbContext.SaveChangesAsync(); } } public async Task ApproveRetirementResignCancel(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdCancelAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st3") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = "", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "APPROVE"; // rawData.LeaveDirectorComment = reason; if (rawData.Group != "1.1") { rawData.ApproveStep = "st5"; } else { rawData.ApproveStep = "st4"; } if (rawData.profileId != null) { // Send Noti var noti = new Notification { Body = $"การขอยกเลิกลาออกของคุณได้รับการอนุมัติ", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); } await _dbContext.SaveChangesAsync(); } } public async Task RejectRetirementResignCancel(Guid id, string reason, DateTime? date) { // Get UserId from token var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var rawData = await GetByIdCancelAsync(id); if (rawData == null) { throw new Exception(GlobalMessages.DataNotFound); } // if (rawData.ApproveStep != "st3") // { // throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); // } // check commander approve var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId); if (approver == null) { throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้"); } // check prev approver มี action แล้วหรือไม่? var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1); if (prevApprover != null) { if (prevApprover.ApproveStatus == "PENDING") { throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า"); } } var maxSeq = approvers.Max(x => x.Seq); approver.ApproveStatus = "REJECT"; approver.Comment = reason; approver.RejectDate = date; if (approver.Seq != maxSeq) { var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); // Send Noti var noti1 = new Notification { Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ", ReceiverUserId = nextApprover!.ProfileId, Type = "", Payload = "", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "REJECT"; if (rawData.Group != "1.1") { rawData.ApproveStep = "st5"; } else { rawData.ApproveStep = "st4"; } // Send Noti var noti = new Notification { Body = $"การขอยกเลิกลาออกของคุณไม่ได้รับการอนุมัติ \r\nเนื่องจาก{reason}", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } } } }