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 RetirementEmployeeRepository : GenericRepository { private readonly IApplicationDBContext _dbContext; private readonly IHttpContextAccessor _httpContextAccessor; private readonly NotificationRepository _repositoryNoti; private readonly IConfiguration _configuration; private readonly string URL = string.Empty; public RetirementEmployeeRepository(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 async Task ExecuteRetirement() //{ // var retirePeriodOfficer = await _dbContext.Set() // .Include(x => x.RetirementRawProfiles.Where(y => y.Remove != "REMOVE")) // .Where(x => x.Year == DateTime.Now.Year) // .Where(x => x.Type.Trim().ToUpper().Contains("OFFICER")) // .FirstOrDefaultAsync(); // if (retirePeriodOfficer == null) // return; // var body = new // { // data = retirePeriodOfficer.RetirementRawProfiles // .Select(x => new // { // profileId = x.profileId // }) // .ToList() // }; // //ข้าราชการ // //var apiUrl = $"{_configuration["API"]}/org/unauthorize/retirement"; // using (var client = new HttpClient()) // { // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); // client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); // var jsonBody = JsonConvert.SerializeObject(body); // var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); // var _req = new HttpRequestMessage(HttpMethod.Patch, apiUrl) // { // Content = content // }; // var response = await client.SendAsync(_req); // var responseContent = await response.Content.ReadAsStringAsync(); // if (!response.IsSuccessStatusCode) // { // } // } //} 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 OfficerApproveRetirementResignEmployee(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-employee-detail/{id}", }; _dbContext.Set().Add(_noti1); } await _dbContext.SaveChangesAsync(); // 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-employee-detail/{id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } public async Task CommanderApproveRetirementResignEmployee(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 = await _dbContext.Set() // //.AsNoTracking() // .Include(x => x.RetirementResignEmployee) // .Where(x => x.RetirementResignEmployee.Id == id && x.ApproveType == "COMMANDER") // .OrderBy(x => x.Seq) // .ToListAsync(); 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); //var data = await _dbContext.Set() // .AsNoTracking() // .Include(x => x.RetirementResignEmployee) // .Where(x => x.RetirementResignEmployee.Id == id && x.KeycloakId == userId && x.ApproveType == "COMMANDER") // .FirstOrDefaultAsync(); //if(data != null) //{ // data.ApproveStatus = "APPROVE"; // data.Comment = reason; // data.LastUpdatedAt = DateTime.Now; // data.LastUpdateUserId = userId.ToString("D"); // data.LastUpdateFullName = FullName ?? ""; // await _dbContext.SaveChangesAsync(); //} approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; //await _dbContext.SaveChangesAsync(); 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-employee-detail/{id}", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; // rawData.LeaveComment = reason; // if (rawData.Group != "1.1") // { rawData.ApproveStep = "st3"; // } // 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-employee-detail/{id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } } public async Task CommanderRejectRetirementResignEmployee(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-employee-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"; // } // 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-employee-detail/{id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } } public async Task ApproveRetirementResignEmployee(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"; } // Send Noti var noti = new Notification { Body = $"การขอลาออกของคุณได้รับการอนุมัติ", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } } public async Task RejectRetirementResignEmployee(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"; // rawData.LeaveDirectorComment = reason; 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) .Include(x => x.RetirementResignEmployee) .FirstOrDefaultAsync(x => x.Id == id); return data; } catch { throw; } } public async Task OfficerApproveRetirementResignEmployeeCancel(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-employee-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(_noti1); } await _dbContext.SaveChangesAsync(); // 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-employee-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } public async Task CommanderApproveRetirementResignEmployeeCancel(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 = await _dbContext.Set() // //.AsNoTracking() // .Include(x => x.RetirementResignEmployeeCancel) // .Where(x => x.RetirementResignEmployeeCancel.Id == id && x.ApproveType == "COMMANDER") // .OrderBy(x => x.Seq) // .ToListAsync(); 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); //var data = await _dbContext.Set() // .AsNoTracking() // .Include(x => x.RetirementResignEmployeeCancel) // .Where(x => x.RetirementResignEmployeeCancel.Id == id && x.KeycloakId == userId && x.ApproveType == "COMMANDER") // .FirstOrDefaultAsync(); //if(data != null) //{ // data.ApproveStatus = "APPROVE"; // data.Comment = reason; // data.LastUpdatedAt = DateTime.Now; // data.LastUpdateUserId = userId.ToString("D"); // data.LastUpdateFullName = FullName ?? ""; // await _dbContext.SaveChangesAsync(); //} approver.ApproveStatus = "APPROVE"; approver.Comment = reason; approver.RejectDate = date; //await _dbContext.SaveChangesAsync(); 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-employee-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } else { rawData.Status = "PENDING"; // rawData.LeaveComment = reason; // if (rawData.Group != "1.1") // { rawData.ApproveStep = "st3"; // } // 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-employee-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } } public async Task CommanderRejectRetirementResignEmployeeCancel(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-employee-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"; // } // 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-employee-detail-reject/{rawData.Id}", }; _dbContext.Set().Add(noti1); await _dbContext.SaveChangesAsync(); } } public async Task ApproveRetirementResignEmployeeCancel(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"; } // Send Noti var noti = new Notification { Body = $"การขอยกเลิกลาออกของคุณได้รับการอนุมัติ", ReceiverUserId = Guid.Parse(rawData.profileId), Type = "", Payload = "", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } } public async Task RejectRetirementResignEmployeeCancel(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"; // rawData.LeaveDirectorComment = reason; 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(); } } } }