เพิี่มขั้นตอนการอนุมัติใบลา โดยดึงข้อมูลจากตาราง approver

This commit is contained in:
Suphonchai Phoonsawat 2025-04-22 15:35:10 +07:00
parent ddc3d268be
commit e635e4ff61
2 changed files with 339 additions and 128 deletions

View file

@ -510,6 +510,10 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task CommanderApproveLeaveRequest(Guid id, string reason) public async Task CommanderApproveLeaveRequest(Guid id, string reason)
{ {
// Get UserId from token
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var rawData = await GetByIdAsync(id); var rawData = await GetByIdAsync(id);
if (rawData == null) if (rawData == null)
{ {
@ -518,9 +522,43 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
if (rawData.ApproveStep != "st2") if (rawData.ApproveStep != "st2")
{ {
throw new Exception("คำขอนี้ยังไม่ได้รับการอนุมัติจากเจ้าหน้าที่ ไม่สามารถทำรายการได้"); throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
} }
// check commander approve
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList();
var maxSeq = approvers.Max(x => x.Seq);
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
if (approver == null)
{
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาในขั้นตอนนี้");
}
approver.ApproveStatus = "APPROVE";
approver.Comment = reason;
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 = "",
};
_appDbContext.Set<Notification>().Add(noti);
await _appDbContext.SaveChangesAsync();
rawData.LeaveStatus = "PENDING";
await UpdateAsync(rawData);
}
else
{
rawData.LeaveStatus = "PENDING"; rawData.LeaveStatus = "PENDING";
rawData.LeaveComment = reason; rawData.LeaveComment = reason;
rawData.ApproveStep = "st3"; rawData.ApproveStep = "st3";
@ -528,8 +566,73 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await UpdateAsync(rawData); await UpdateAsync(rawData);
} }
}
public async Task CommanderRejectLeaveRequest(Guid id, string reason)
{
// 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 maxSeq = approvers.Max(x => x.Seq);
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
if (approver == null)
{
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาในขั้นตอนนี้");
}
approver.ApproveStatus = "REJECT";
approver.Comment = reason;
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 = "",
};
_appDbContext.Set<Notification>().Add(noti);
await _appDbContext.SaveChangesAsync();
rawData.LeaveStatus = "PENDING";
await UpdateAsync(rawData);
}
else
{
rawData.LeaveStatus = "PENDING";
rawData.LeaveComment = reason;
rawData.ApproveStep = "st3";
await UpdateAsync(rawData);
}
}
public async Task ApproveLeaveRequest(Guid id, string reason) public async Task ApproveLeaveRequest(Guid id, string reason)
{ {
// Get UserId from token
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var rawData = await GetByIdAsync(id); var rawData = await GetByIdAsync(id);
if (rawData == null) if (rawData == null)
{ {
@ -538,9 +641,40 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
if (rawData.ApproveStep != "st3") if (rawData.ApproveStep != "st3")
{ {
throw new Exception("คำขอนี้ยังไม่ได้รับการอนุมัติจากผู้บังคับบัญชา ไม่สามารถทำรายการได้"); throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
} }
// check commander approve
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
var maxSeq = approvers.Max(x => x.Seq);
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
if (approver == null)
{
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาในขั้นตอนนี้");
}
approver.ApproveStatus = "APPROVE";
approver.Comment = reason;
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 = "",
};
_appDbContext.Set<Notification>().Add(noti1);
await _appDbContext.SaveChangesAsync();
await UpdateAsync(rawData);
}
else
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken);
if (profile == null) if (profile == null)
{ {
@ -553,24 +687,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await UpdateAsync(rawData); await UpdateAsync(rawData);
//var leaveType = await _appDbContext.Set<TypeLeave>()
// .FirstOrDefaultAsync(x => x.Name == rawData.Type.Name);
// insert to profile leave
// var profileLeave = new ProfileLeave
// {
// DateStartLeave = rawData.LeaveStartDate,
// DateEndLeave = rawData.LeaveEndDate,
// TotalLeave = rawData.LeaveTotal,
// Status = "approve",
// Reason = rawData.LeaveDetail,
// ProfileId = profile.Id, // change from profile object to id
// TypeLeave = leaveType
// };
// _appDbContext.Set<ProfileLeave>().Add(profileLeave);
var _baseAPI = _configuration["API"]; var _baseAPI = _configuration["API"];
var apiUrlSalary = string.Empty; var apiUrlSalary = string.Empty;
if (profile.ProfileType == "OFFICER") if (profile.ProfileType == "OFFICER")
@ -637,8 +753,13 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
} }
}
public async Task RejectLeaveRequest(Guid id, string reason) public async Task RejectLeaveRequest(Guid id, string reason)
{ {
// Get UserId from token
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var rawData = await GetByIdAsync(id); var rawData = await GetByIdAsync(id);
if (rawData == null) if (rawData == null)
{ {
@ -647,9 +768,40 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
if (rawData.ApproveStep != "st3") if (rawData.ApproveStep != "st3")
{ {
throw new Exception("คำขอนี้ยังไม่ได้รับการอนุมัติจากผู้บังคับบัญชา ไม่สามารถทำรายการได้"); throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
} }
// check commander approve
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
var maxSeq = approvers.Max(x => x.Seq);
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
if (approver == null)
{
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาในขั้นตอนนี้");
}
approver.ApproveStatus = "REJECT";
approver.Comment = reason;
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 = "",
};
_appDbContext.Set<Notification>().Add(noti1);
await _appDbContext.SaveChangesAsync();
await UpdateAsync(rawData);
}
else
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken);
if (profile == null) if (profile == null)
{ {
@ -673,6 +825,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
_appDbContext.Set<Notification>().Add(noti); _appDbContext.Set<Notification>().Add(noti);
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
} }
}
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumSendLeaveAsync(int year) public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumSendLeaveAsync(int year)
{ {

View file

@ -1814,6 +1814,8 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> CommanderApproveLeaveRequestAsync(Guid id, public async Task<ActionResult<ResponseObject>> CommanderApproveLeaveRequestAsync(Guid id,
[FromBody] LeaveRequestApproveDto req) [FromBody] LeaveRequestApproveDto req)
{
try
{ {
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST"); var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -1825,6 +1827,46 @@ namespace BMA.EHR.Leave.Service.Controllers
return Success(); return Success();
} }
catch(Exception ex)
{
return Error(ex);
}
}
/// <summary>
/// ผู้บังคับบัญชาไม่อนุมัติการลา(ADMIN)
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPut("admin/reject/comander/{id:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> CommanderRejectLeaveRequestAsync(Guid id,
[FromBody] LeaveRequestApproveDto req)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
await _leaveRequestRepository.CommanderRejectLeaveRequest(id, req.Reason ?? "");
return Success();
}
catch (Exception ex)
{
return Error(ex);
}
}
/// <summary> /// <summary>
/// LV2_016 - ผู้มีอำนาจอนุมัติการลา (ADMIN) /// LV2_016 - ผู้มีอำนาจอนุมัติการลา (ADMIN)
@ -1840,6 +1882,8 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> ApproveLeaveRequestAsync(Guid id, public async Task<ActionResult<ResponseObject>> ApproveLeaveRequestAsync(Guid id,
[FromBody] LeaveRequestApproveDto req) [FromBody] LeaveRequestApproveDto req)
{
try
{ {
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST"); var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -1851,6 +1895,12 @@ namespace BMA.EHR.Leave.Service.Controllers
return Success(); return Success();
} }
catch (Exception ex)
{
return Error(ex);
}
}
/// <summary> /// <summary>
/// LV2_021 - ส่งคำขอลา /// LV2_021 - ส่งคำขอลา
@ -1933,6 +1983,8 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> RejectLeaveRequestAsync(Guid id, public async Task<ActionResult<ResponseObject>> RejectLeaveRequestAsync(Guid id,
[FromBody] LeaveRequestApproveDto req) [FromBody] LeaveRequestApproveDto req)
{
try
{ {
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST"); var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_LIST");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -1944,6 +1996,12 @@ namespace BMA.EHR.Leave.Service.Controllers
return Success(); return Success();
} }
catch (Exception ex)
{
return Error(ex);
}
}
/// <summary> /// <summary>
/// LV2_012 - รายละเอียดการลา (ADMIN) /// LV2_012 - รายละเอียดการลา (ADMIN)