hrms-api-backend/BMA.EHR.Application/Repositories/RetirementRepository.cs
2025-06-11 10:58:47 +07:00

924 lines
39 KiB
C#

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<Guid, RetirementPeriod>
{
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<RetirementDischarge>()
.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<RetirementExpulsion>()
.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<RetirementOut>()
//.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<RetirementResign?> GetByIdAsync(Guid id)
{
try
{
var data = await _dbContext.Set<RetirementResign>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().Add(noti);
await _dbContext.SaveChangesAsync();
}
}
public async Task<RetirementResignCancel?> GetByIdCancelAsync(Guid id)
{
try
{
var data = await _dbContext.Set<RetirementResignCancel>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().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<Notification>().Add(noti);
await _dbContext.SaveChangesAsync();
}
}
}
}