Compare commits
70 commits
leave-dev1
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d75cf39d7b | ||
|
|
db3d531aa9 | ||
|
|
e17895de81 | ||
|
|
e09a6d0ea6 | ||
|
|
4c44bdf237 | ||
| 6f1ca58f04 | |||
| a956f0b0dd | |||
|
|
f0c493a026 | ||
|
|
fe5c2cd7c1 | ||
|
|
c4209400ff | ||
|
|
d6a7f1a5ca | ||
|
|
f50efc632b | ||
| 5f9c49f479 | |||
| 48aab28e04 | |||
| 1f7951dc4c | |||
|
|
d3a174faa0 | ||
|
|
afa5c85393 | ||
| 077b60b1c3 | |||
| efc96dfb6d | |||
|
|
4827906d1d | ||
|
|
8ae822d05b | ||
|
|
71a4748d39 | ||
|
|
ad70043264 | ||
|
|
513956c861 | ||
|
|
a48f3fa804 | ||
|
|
dc5ac329e2 | ||
|
|
3f98e07419 | ||
| ce4558c240 | |||
| 6a38f000ba | |||
|
|
f50ad38503 | ||
| aeb2ceea6f | |||
| e96f606c85 | |||
|
|
81dc7f4544 | ||
|
|
a16ef7ac55 | ||
|
|
f6bf1ab026 | ||
|
|
caa01088c6 | ||
|
|
782d1526b5 | ||
|
|
04ac35c10b | ||
|
|
02abedc973 | ||
| 8415ffc92d | |||
| 64c75cd9d5 | |||
|
|
22e04d90fe | ||
|
|
2146e0e0ca | ||
|
|
3f8ae1ede9 | ||
|
|
c2795d6891 | ||
|
|
6e5284b3c7 | ||
|
|
76697c4f63 | ||
|
|
e5f6a44f5f | ||
|
|
583569682d | ||
|
|
9f756771cd | ||
|
|
219b172073 | ||
|
|
ecf660e4cf | ||
|
|
0365fad723 | ||
|
|
20e8dfddd6 | ||
|
|
91c479ef9e | ||
|
|
80fcda61cf | ||
|
|
f02413f2b2 | ||
|
|
1739aa8057 | ||
|
|
bc3bba547f | ||
|
|
4161fcc1cf | ||
|
|
6d0921a76a | ||
|
|
df7bebe0ba | ||
|
|
82a45b6811 | ||
|
|
63d983f831 | ||
|
|
e326e43ae6 | ||
|
|
4dab3c5cd9 | ||
|
|
4bd46d13e5 | ||
|
|
132a59b946 | ||
|
|
740a9984c9 | ||
|
|
5b0fcd0680 |
60 changed files with 48384 additions and 355 deletions
|
|
@ -149,7 +149,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
var prevRemain = 0.0;
|
||||
if (prev != null)
|
||||
{
|
||||
prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
|
||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
||||
}
|
||||
|
||||
if (govAge >= 180)
|
||||
|
|
@ -215,7 +215,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
var prevRemain = 0.0;
|
||||
if (prev != null)
|
||||
{
|
||||
prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
|
||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
||||
}
|
||||
|
||||
if (govAge >= 180)
|
||||
|
|
@ -288,7 +288,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
var prevRemain = 0.0;
|
||||
if (prev != null)
|
||||
{
|
||||
prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
|
||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
||||
}
|
||||
|
||||
if (govAge >= 180)
|
||||
|
|
@ -376,7 +376,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
var prevRemain = 0.0;
|
||||
if (prev != null)
|
||||
{
|
||||
prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
|
||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
||||
}
|
||||
|
||||
if (govAge >= 180)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ using Microsoft.Extensions.Configuration;
|
|||
using System.IO.Compression;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Http.Json;
|
||||
using BMA.EHR.Application.Repositories.Leaves.TimeAttendants;
|
||||
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
||||
|
||||
namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
||||
{
|
||||
|
|
@ -29,6 +31,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
private readonly MinIOLeaveService _minIOService;
|
||||
|
||||
private readonly LeaveBeginningRepository _leaveBeginningRepository;
|
||||
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
|
||||
|
||||
private readonly string URL = string.Empty;
|
||||
|
||||
|
|
@ -44,7 +47,8 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
EmailSenderService emailSenderService,
|
||||
IApplicationDBContext appDbContext,
|
||||
MinIOLeaveService minIOService,
|
||||
LeaveBeginningRepository leaveBeginningRepository) : base(dbContext, httpContextAccessor)
|
||||
LeaveBeginningRepository leaveBeginningRepository,
|
||||
ProcessUserTimeStampRepository processUserTimeStampRepository) : base(dbContext, httpContextAccessor)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
|
|
@ -58,6 +62,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
Console.WriteLine($"URL : {URL}");
|
||||
_minIOService = minIOService;
|
||||
_leaveBeginningRepository = leaveBeginningRepository;
|
||||
_processUserTimeStampRepository = processUserTimeStampRepository;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
@ -522,7 +527,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
//.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE")
|
||||
.ToListAsync();
|
||||
|
||||
return data.Sum(x => x.LeaveTotal) + (beginningLeave == null ? 0 : beginningLeave.LeaveDaysUsed);
|
||||
return data.Sum(x => x.LeaveTotal) + (beginningLeave == null ? 0 : (beginningLeave.LeaveDaysUsed ?? 0.0));
|
||||
}
|
||||
|
||||
//public async Task<double> GetSumApproveLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year)
|
||||
|
|
@ -1325,9 +1330,68 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
}
|
||||
await _appDbContext.SaveChangesAsync();
|
||||
|
||||
// insert to process timestamp
|
||||
|
||||
|
||||
// ปรับสถานะการลงเวลา
|
||||
if (rawData.LeaveStartDate.Date == rawData.LeaveEndDate.Date)
|
||||
{
|
||||
var processCheckIn = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||
.Where(x => x.KeycloakUserId == rawData.KeycloakUserId)
|
||||
.Where(x => x.CheckIn.Date == rawData.LeaveStartDate.Date)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (processCheckIn is not null)
|
||||
{
|
||||
switch (rawData.LeaveRange.Trim().ToUpper())
|
||||
{
|
||||
case "MORNING":
|
||||
processCheckIn.CheckInStatus = "NORMAL";
|
||||
break;
|
||||
case "AFTERNOON":
|
||||
processCheckIn.CheckOutStatus = "NORMAL";
|
||||
break;
|
||||
case "ALL":
|
||||
processCheckIn.CheckInStatus = "NORMAL";
|
||||
processCheckIn.CheckOutStatus = "NORMAL";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
await _dbContext.SaveChangesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
var from = rawData.LeaveStartDate.Date;
|
||||
var to = rawData.LeaveEndDate.Date;
|
||||
for (var day = from.Date; day <= to.Date; day = day.AddDays(1))
|
||||
{
|
||||
var processCheckIn = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||
.Where(x => x.KeycloakUserId == rawData.KeycloakUserId)
|
||||
.Where(x => x.CheckIn.Date == day.Date)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
if (processCheckIn is not null)
|
||||
{
|
||||
switch (rawData.LeaveRange.Trim().ToUpper())
|
||||
{
|
||||
case "MORNING":
|
||||
processCheckIn.CheckInStatus = "NORMAL";
|
||||
break;
|
||||
case "AFTERNOON":
|
||||
processCheckIn.CheckOutStatus = "NORMAL";
|
||||
break;
|
||||
case "ALL":
|
||||
processCheckIn.CheckInStatus = "NORMAL";
|
||||
processCheckIn.CheckOutStatus = "NORMAL";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
await _dbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
// Send Noti
|
||||
var noti = new Notification
|
||||
{
|
||||
|
|
@ -1486,7 +1550,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
KeycloakUserId = pf.Keycloak == null ? Guid.Empty : pf.Keycloak.Value,
|
||||
LeaveTypeId = b.LeaveTypeId,
|
||||
LeaveTypeCode = b.LeaveType!.Code,
|
||||
SumLeaveDay = b.LeaveDaysUsed
|
||||
SumLeaveDay = b.LeaveDaysUsed ?? 0.0
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -1877,7 +1941,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
.Include(x => x.Type)
|
||||
.Where(x => x.KeycloakUserId == keycloakUserId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt).Date >= startDate && (x.DateSendLeave ??x.CreatedAt).Date < endDate))
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) <= endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
|
||||
.ToListAsync();
|
||||
|
|
@ -1887,6 +1951,68 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public async Task<double> GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
|
||||
.Include(x => x.Type)
|
||||
.Where(x => x.KeycloakUserId == keycloakUserId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ?? x.CreatedAt) < endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
|
||||
.ToListAsync();
|
||||
|
||||
if (data.Count > 0)
|
||||
return data.Sum(x => x.LeaveTotal);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public async Task<double> GetSumApproveLeaveTotalByTypeAndRangeForUserByProfile(Guid profileId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
|
||||
.Include(x => x.Type)
|
||||
.Where(x => x.ProfileId == profileId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) <= endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
|
||||
.ToListAsync();
|
||||
|
||||
if (data.Count > 0)
|
||||
return data.Sum(x => x.LeaveTotal);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public async Task<int> GetSumApproveLeaveCountByTypeAndRangeForUserByProfile(Guid profileId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
|
||||
.Include(x => x.Type)
|
||||
.Where(x => x.ProfileId == profileId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) <= endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
|
||||
.ToListAsync();
|
||||
|
||||
return data.Count;
|
||||
}
|
||||
|
||||
public async Task<int> GetSumApproveLeaveCountByTypeAndRangeForUser2(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
|
||||
.Include(x => x.Type)
|
||||
.Where(x => x.KeycloakUserId == keycloakUserId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) <= endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
|
||||
.ToListAsync();
|
||||
|
||||
return data.Count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// วันลาที่สร้างแบบร่างยังไม่ได้ยื่น
|
||||
|
|
@ -1928,9 +2054,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|||
.Include(x => x.Type)
|
||||
.Where(x => x.KeycloakUserId == keycloakUserId)
|
||||
.Where(x => x.Type.Id == leaveTypeId)
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt).Date >= startDate && (x.DateSendLeave ??x.CreatedAt).Date < endDate))
|
||||
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) < endDate))
|
||||
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
|
||||
.Where(x => x.LeaveStatus == "NEW")
|
||||
.Where(x => (x.LeaveStatus == "NEW" || x.LeaveStatus == "PENDING"))
|
||||
.ToListAsync();
|
||||
|
||||
if (data.Count > 0)
|
||||
|
|
|
|||
|
|
@ -213,6 +213,79 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
|||
}
|
||||
}
|
||||
|
||||
public async Task<List<AdditionalCheckRequest>> GetAdditionalCheckRequestsByAdminRole2(DateTime startDate, DateTime endDate, string role, string nodeId, int? node, string? keyword, string? status)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _dbContext.Set<AdditionalCheckRequest>().AsQueryable()
|
||||
.Where(x => (x.CheckDate.Date >= startDate.Date && x.CheckDate.Date <= endDate.Date))
|
||||
.OrderByDescending(x => x.CreatedAt.Date)
|
||||
.ToListAsync();
|
||||
|
||||
if(!string.IsNullOrEmpty(status))
|
||||
data = data.Where(x => x.Status == status).ToList();
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(keyword))
|
||||
{
|
||||
data = data.Where(x =>
|
||||
(
|
||||
(x.Prefix ?? "") + (x.FirstName ?? "") + " " + (x.LastName ?? "")).Contains(keyword)
|
||||
|| x.Description.Contains(keyword)
|
||||
|
||||
).ToList();
|
||||
}
|
||||
|
||||
if (role == "OWNER")
|
||||
{
|
||||
node = null;
|
||||
}
|
||||
if (role == "OWNER" || role == "CHILD")
|
||||
{
|
||||
data = data
|
||||
.Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true))))))
|
||||
.ToList();
|
||||
}
|
||||
else if (role == "BROTHER")
|
||||
{
|
||||
data = data
|
||||
.Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))
|
||||
.ToList();
|
||||
}
|
||||
else if (role == "ROOT")
|
||||
{
|
||||
data = data
|
||||
.Where(x => x.RootDnaId == Guid.Parse(nodeId!)).ToList();
|
||||
}
|
||||
// else if (role == "PARENT")
|
||||
// {
|
||||
// data = data
|
||||
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null && x.Child1DnaId != Guid.Empty).ToList();
|
||||
// }
|
||||
else if (role == "NORMAL")
|
||||
{
|
||||
data = data.Where(x =>
|
||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) &&
|
||||
(x.Child1DnaId == Guid.Empty || x.Child1DnaId == null) :
|
||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) &&
|
||||
(x.Child2DnaId == Guid.Empty || x.Child2DnaId == null) :
|
||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) &&
|
||||
(x.Child3DnaId == Guid.Empty || x.Child3DnaId == null) :
|
||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) &&
|
||||
(x.Child4DnaId == Guid.Empty || x.Child4DnaId == null) :
|
||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
||||
true
|
||||
).ToList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,6 +114,62 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
|||
return job!;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ดึงข้อมูลงานที่ค้างอยู่ในสถานะ PENDING หรือ PROCESSING เกินเวลาที่กำหนด (นาที)
|
||||
/// </summary>
|
||||
public async Task<List<CheckInJobStatus>> GetStalePendingOrProcessingJobsAsync(int timeoutMinutes = 30)
|
||||
{
|
||||
//var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
||||
var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
||||
var staleJobs = await _dbContext.Set<CheckInJobStatus>()
|
||||
.Where(x => (x.Status == "PENDING" || x.Status == "PROCESSING")
|
||||
&& x.CreatedDate <= cutoffDate)
|
||||
.OrderBy(x => x.CreatedDate)
|
||||
.ToListAsync();
|
||||
|
||||
return staleJobs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ดึงข้อมูลงานที่ค้างอยู่ในสถานะ PENDING หรือ PROCESSING เกินเวลาที่กำหนด (นาที) ของ user คนใดคนหนึ่ง
|
||||
/// </summary>
|
||||
public async Task<List<CheckInJobStatus>> GetStalePendingOrProcessingJobsByUserAsync(Guid userId, int timeoutMinutes = 30)
|
||||
{
|
||||
var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
||||
//var cutoffDate = new DateTime(2026, 5, 28, 23, 59, 59);
|
||||
var staleJobs = await _dbContext.Set<CheckInJobStatus>()
|
||||
.Where(x => x.KeycloakUserId == userId
|
||||
&& (x.Status == "PENDING" || x.Status == "PROCESSING")
|
||||
&& x.CreatedDate < cutoffDate)
|
||||
.OrderBy(x => x.CreatedDate)
|
||||
.ToListAsync();
|
||||
|
||||
return staleJobs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mark งานที่ค้างเกินเวลาที่กำหนดเป็น FAILED
|
||||
/// </summary>
|
||||
public async Task<int> MarkStaleJobsAsFailedAsync(int timeoutMinutes = 30)
|
||||
{
|
||||
var staleJobs = await GetStalePendingOrProcessingJobsAsync(timeoutMinutes);
|
||||
|
||||
foreach (var job in staleJobs)
|
||||
{
|
||||
job.Status = "FAILED";
|
||||
job.CompletedDate = DateTime.Now;
|
||||
job.ErrorMessage = $"งานค้างในสถานะ {job.Status} เกิน {timeoutMinutes} นาที ระบบทำเครื่องหมายเป็น FAILED อัตโนมัติ";
|
||||
}
|
||||
|
||||
if (staleJobs.Any())
|
||||
{
|
||||
_dbContext.Set<CheckInJobStatus>().UpdateRange(staleJobs);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
return staleJobs.Count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ล้างข้อมูล Job Status ที่เก่าเกิน X วัน
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -49,12 +49,16 @@ namespace BMA.EHR.Application.Repositories.MetaData
|
|||
|
||||
public async Task<int> GetHolidayCountAsync(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
||||
{
|
||||
var data = await _dbContext.Set<Holiday>().AsQueryable()
|
||||
var query = _dbContext.Set<Holiday>().AsQueryable()
|
||||
.Where(x => x.Category == category)
|
||||
.Where(x => x.HolidayDate.Date >= startDate && x.HolidayDate.Date <= endDate)
|
||||
.CountAsync();
|
||||
.Where(x => x.HolidayDate.Date >= startDate && x.HolidayDate.Date <= endDate);
|
||||
|
||||
return data;
|
||||
if (category == "NORMAL")
|
||||
query = query.Where(x => x.HolidayDate.DayOfWeek != DayOfWeek.Saturday && x.HolidayDate.DayOfWeek != DayOfWeek.Sunday);
|
||||
else
|
||||
query = query.Where(x => x.HolidayDate.DayOfWeek != DayOfWeek.Sunday);
|
||||
|
||||
return await query.CountAsync();
|
||||
}
|
||||
|
||||
public List<DateTime> GetWeekEnd(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
||||
|
|
|
|||
|
|
@ -2,24 +2,40 @@
|
|||
using BMA.EHR.Domain.Models.Placement;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System.Net.Http.Headers;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace BMA.EHR.Application.Repositories
|
||||
{
|
||||
/// <summary>
|
||||
/// Response model จาก Org API (check-isLeave)
|
||||
/// </summary>
|
||||
public class OrgProfileResult
|
||||
{
|
||||
public string citizenId { get; set; } = "";
|
||||
public string? profileId { get; set; }
|
||||
public bool isLeave { get; set; }
|
||||
public bool isActive { get; set; }
|
||||
}
|
||||
|
||||
public class PlacementRepository : GenericRepository<Guid, Placement>
|
||||
{
|
||||
#region " Fields "
|
||||
|
||||
private readonly IApplicationDBContext _dbContext;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
#endregion
|
||||
|
||||
#region " Constructor and Destructor "
|
||||
|
||||
public PlacementRepository(IApplicationDBContext dbContext, IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||
public PlacementRepository(IApplicationDBContext dbContext, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_configuration = configuration;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
@ -76,6 +92,148 @@ namespace BMA.EHR.Application.Repositories
|
|||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Job อัพเดทสถานะผู้สอบผ่านที่ลาออกไปแล้วแต่ยังไม่ส่งไปออกคำสั่ง
|
||||
/// และอัพเดทบุคคลภายนอกที่เข้ามาอยู่ในระบบแล้ว
|
||||
/// ทำงานทุกวันเวลา 05:00 น.
|
||||
/// </summary>
|
||||
public async Task UpdateStatusPlacementProfiles()
|
||||
{
|
||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === STARTED ===");
|
||||
|
||||
// 1. Query ทั้ง 2 กรณี: ทุกคนที่ยังไม่ DONE
|
||||
var allCitizenIds = await _dbContext.Set<PlacementProfile>()
|
||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
||||
&& p.PlacementStatus != "DONE"
|
||||
// && p.CitizenId == "2536721883131"
|
||||
)
|
||||
.Select(p => new { p.CitizenId, p.IsOfficer })
|
||||
.ToListAsync();
|
||||
|
||||
if (!allCitizenIds.Any())
|
||||
{
|
||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] No profiles to process");
|
||||
return;
|
||||
}
|
||||
|
||||
var officerCount = allCitizenIds.Count(x => x.IsOfficer == true);
|
||||
var notOfficerCount = allCitizenIds.Count(x => x.IsOfficer == false);
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] พบข้าราชการ {officerCount} คน, บุคคลภายนอก {notOfficerCount} คน");
|
||||
|
||||
// 2. ส่ง citizenIds ทั้งหมดไป Org API ครั้งเดียว
|
||||
var citizenIds = allCitizenIds.Select(x => x.CitizenId).Distinct().ToList();
|
||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/check-isLeave";
|
||||
|
||||
List<OrgProfileResult> orgResults = new();
|
||||
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
||||
|
||||
var payload = new { citizenIds };
|
||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(jsonPayload, System.Text.Encoding.UTF8, "application/json");
|
||||
|
||||
try
|
||||
{
|
||||
var response = await client.PostAsync(apiUrl, content);
|
||||
var result = await response.Content.ReadAsStringAsync();
|
||||
|
||||
var responseObj = JsonConvert.DeserializeAnonymousType(result, new
|
||||
{
|
||||
status = 0,
|
||||
message = "",
|
||||
result = new List<OrgProfileResult>()
|
||||
});
|
||||
|
||||
orgResults = responseObj?.result ?? new();
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Org API ตอบกลับ {orgResults.Count} รายการ");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Call API failed: {ex.Message}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!orgResults.Any())
|
||||
{
|
||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] ไม่มีรายการต้องอัปเดต");
|
||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ===");
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. แยกข้อมูลตามเงื่อนไข
|
||||
var leaveCitizenIds = orgResults.Where(x => x.isLeave).Select(x => x.citizenId).ToList();
|
||||
var inSystemProfiles = orgResults.Where(x => x.isActive && !x.isLeave && !string.IsNullOrEmpty(x.profileId)).ToList();
|
||||
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] ลาออก {leaveCitizenIds.Count} รายการ, อยู่ที่ทะเบียนประวัติ {inSystemProfiles.Count} รายการ");
|
||||
|
||||
// 4. Split Batch Update (500 รายการ/batch)
|
||||
var batchSize = 500;
|
||||
var totalUpdated = 0;
|
||||
|
||||
// 4.1 Update คนลาออก → IsOfficer = false
|
||||
if (leaveCitizenIds.Any())
|
||||
{
|
||||
var totalBatches = (int)Math.Ceiling((double)leaveCitizenIds.Count / batchSize);
|
||||
for (int i = 0; i < totalBatches; i++)
|
||||
{
|
||||
var batch = leaveCitizenIds.Skip(i * batchSize).Take(batchSize).ToList();
|
||||
|
||||
var profilesToUpdate = await _dbContext.Set<PlacementProfile>()
|
||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
||||
&& batch.Contains(p.CitizenId)
|
||||
&& p.IsOfficer == true)
|
||||
.ToListAsync();
|
||||
|
||||
foreach (var profile in profilesToUpdate)
|
||||
{
|
||||
profile.profileId = null;
|
||||
profile.IsOfficer = false;
|
||||
}
|
||||
|
||||
await _dbContext.SaveChangesAsync();
|
||||
totalUpdated += profilesToUpdate.Count;
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [ลาออก] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ");
|
||||
}
|
||||
}
|
||||
|
||||
// 4.2 Update คนที่อยู่ในทะเบียนประวัติ → profileId + IsOfficer = true
|
||||
if (inSystemProfiles.Any())
|
||||
{
|
||||
var totalBatches = (int)Math.Ceiling((double)inSystemProfiles.Count / batchSize);
|
||||
for (int i = 0; i < totalBatches; i++)
|
||||
{
|
||||
var batch = inSystemProfiles.Skip(i * batchSize).Take(batchSize).ToList();
|
||||
var batchCitizenIds = batch.Select(x => x.citizenId).ToList();
|
||||
|
||||
var profilesToUpdate = await _dbContext.Set<PlacementProfile>()
|
||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
||||
&& batchCitizenIds.Contains(p.CitizenId)
|
||||
&& p.IsOfficer == false)
|
||||
.ToListAsync();
|
||||
|
||||
foreach (var profile in profilesToUpdate)
|
||||
{
|
||||
var orgProfile = batch.FirstOrDefault(x => x.citizenId == profile.CitizenId);
|
||||
if (orgProfile != null)
|
||||
{
|
||||
profile.profileId = orgProfile.profileId;
|
||||
profile.IsOfficer = true;
|
||||
}
|
||||
}
|
||||
|
||||
await _dbContext.SaveChangesAsync();
|
||||
totalUpdated += profilesToUpdate.Count;
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [เข้าระบบ] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] อัปเดตรวมทั้งหมด {totalUpdated} รายการ");
|
||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ===");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -233,6 +233,29 @@ namespace BMA.EHR.Application.Repositories
|
|||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<GetProfileByKeycloakIdDto?> GetProfileByCheckInAsync(Guid keycloakId, string? accessToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
var apiPath = $"{_configuration["API"]}/org/dotnet/check-keycloak/{keycloakId}";
|
||||
var apiKey = _configuration["API_KEY"];
|
||||
|
||||
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
|
||||
if (apiResult != null)
|
||||
{
|
||||
var raw = JsonConvert.DeserializeObject<GetProfileByKeycloakIdResultDto>(apiResult);
|
||||
if (raw != null)
|
||||
return raw.Result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<GetProfileLeaveByKeycloakDto?> GetProfileLeaveByKeycloakIdAsync(Guid keycloakId, string? accessToken)
|
||||
|
|
@ -1039,6 +1062,42 @@ namespace BMA.EHR.Application.Repositories
|
|||
}
|
||||
}
|
||||
|
||||
public async Task<List<GetProfileByKeycloakIdRootDto>> GetEmployeeByAdminRolev2(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate)
|
||||
{
|
||||
try
|
||||
{
|
||||
var apiPath = $"{_configuration["API"]}/org/dotnet/employee-by-admin-rolev2";
|
||||
var apiKey = _configuration["API_KEY"];
|
||||
var body = new
|
||||
{
|
||||
node = node,
|
||||
nodeId = nodeId,
|
||||
role = role,
|
||||
// isRetirement
|
||||
reqNode = reqNode,
|
||||
reqNodeId = reqNodeId,
|
||||
date = endDate
|
||||
};
|
||||
Console.WriteLine(body);
|
||||
|
||||
var profiles = new List<SearchProfileDto>();
|
||||
|
||||
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
|
||||
if (apiResult != null)
|
||||
{
|
||||
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
|
||||
if (raw != null)
|
||||
return raw.Result;
|
||||
}
|
||||
|
||||
return new List<GetProfileByKeycloakIdRootDto>();
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<GetProfileByKeycloakIdRootAddTotalDto> SearchProfile(string? citizenId, string? firstName, string? lastName, string accessToken, int page, int pageSize, string? role, string? nodeId, int? node,string? selectedNodeId,int? selectedNode )
|
||||
{
|
||||
try
|
||||
|
|
|
|||
|
|
@ -968,12 +968,20 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command19/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand19([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand19([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -993,7 +1001,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1013,6 +1027,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1061,8 +1080,8 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
// คำสั่งไล่ออก หรือ ปลดออก Status หลังออกคำสั่งใช้ "REPORTED" เพื่อไม่ให้ส่งรายชื่อไปออกคำสั่งซ้ำได้
|
||||
data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
//// คำสั่งไล่ออก หรือ ปลดออก Status หลังออกคำสั่งใช้ "REPORTED" เพื่อไม่ให้ส่งรายชื่อไปออกคำสั่งซ้ำได้
|
||||
// data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
var _profile = new List<ProfileComplaintInvestigate>();
|
||||
DateTime _date = DateTime.Now;
|
||||
foreach (var item in data)
|
||||
|
|
@ -1105,12 +1124,20 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command20/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportcommand20([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportcommand20([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1130,7 +1157,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1150,6 +1183,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1198,8 +1236,8 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
// คำสั่งไล่ออก หรือ ปลดออก Status หลังออกคำสั่งใช้ "REPORTED" เพื่อไม่ให้ส่งรายชื่อไปออกคำสั่งซ้ำได้
|
||||
data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
//// คำสั่งไล่ออก หรือ ปลดออก Status หลังออกคำสั่งใช้ "REPORTED" เพื่อไม่ให้ส่งรายชื่อไปออกคำสั่งซ้ำได้
|
||||
// data.ForEach(profile => { profile.Status = "REPORTED"; profile.CommandTypeId = null; });
|
||||
var _profile = new List<ProfileComplaintInvestigate>();
|
||||
DateTime _date = DateTime.Now;
|
||||
foreach (var item in data)
|
||||
|
|
@ -1379,6 +1417,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
// .Where(x => x.Status == "REPORT")
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1424,12 +1467,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.Status = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1518,6 +1561,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
// .Where(x => x.Status == "REPORT")
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1563,12 +1611,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.Status = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1582,14 +1630,22 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command27/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand27([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand27([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1616,7 +1672,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1641,6 +1703,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -1686,12 +1753,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1705,14 +1772,22 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command28/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand28([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand28([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1739,7 +1814,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1764,6 +1845,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -1809,12 +1895,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1828,14 +1914,22 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command29/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand29([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand29([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1862,7 +1956,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1887,6 +1987,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -1932,12 +2037,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1951,14 +2056,22 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command30/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand30([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand30([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1985,7 +2098,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2010,6 +2129,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -2055,12 +2179,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2074,14 +2198,22 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command31/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand31([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand31([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
// data.ForEach(profile => profile.Status = req.status.Trim().ToUpper());
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2108,7 +2240,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
// .Where(x => x.Status.ToUpper() == "REPORT")
|
||||
.ToListAsync();
|
||||
data.ForEach(profile => profile.Status = "NEW");
|
||||
// data.ForEach(profile => profile.Status = "NEW");
|
||||
data.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2133,6 +2271,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Include(x => x.DisciplineDisciplinary)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -2178,12 +2321,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => { profile.Status = "NEW"; profile.CommandTypeId = null; });
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2197,7 +2340,7 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("command32/report")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand32([FromBody] ReportPersonRequest req)
|
||||
public async Task<ActionResult<ResponseObject>> PostReportCommand32([FromBody] ReportPersonAndCommandRequest req)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -2210,7 +2353,15 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
.Where(x => req.refIds.Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
data2.ForEach(profile => profile.IsReport = req.status.Trim().ToUpper());
|
||||
// data2.ForEach(profile => profile.IsReport = req.status.Trim().ToUpper());
|
||||
data2.ForEach(profile =>
|
||||
{
|
||||
profile.Status = !string.IsNullOrEmpty(req.status)
|
||||
? req.status.Trim().ToUpper() : null;
|
||||
profile.CommandTypeId = !string.IsNullOrEmpty(req.commandTypeId) && Guid.TryParse(req.commandTypeId, out var cmdTypeId)
|
||||
? cmdTypeId : null;
|
||||
profile.CommandCode = req.commandCode ?? null;
|
||||
});
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
|
|
@ -2245,7 +2396,13 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
// .Where(x => x.IsReport == "REPORT")
|
||||
.ToListAsync();
|
||||
|
||||
data2.ForEach(profile => profile.IsReport = "NEW");
|
||||
// data2.ForEach(profile => profile.IsReport = "NEW");
|
||||
data2.ForEach(profile =>
|
||||
{
|
||||
profile.Status = "NEW";
|
||||
profile.CommandTypeId = null;
|
||||
profile.CommandCode = null;
|
||||
});
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
|
|
@ -2272,6 +2429,11 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
// .Where(x => x.IsReport == "REPORT")
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.IsReport = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -2317,12 +2479,12 @@ namespace BMA.EHR.DisciplineResult.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.IsReport = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.IsReport = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
|
||||
var data1 = await _context.DisciplineDisciplinary_ProfileComplaintInvestigates
|
||||
|
|
|
|||
|
|
@ -95,6 +95,9 @@ namespace BMA.EHR.Domain.Common
|
|||
protected Guid? ProfileId => User.GetProfileId();
|
||||
protected string? Prefix => User.GetPrefix();
|
||||
protected string? FullNameFromClaim => User.GetName();
|
||||
|
||||
protected string? FirstName => User.GetFirstName();
|
||||
protected string? LastName => User.GetLastName();
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
|
|||
|
|
@ -26,5 +26,7 @@ namespace BMA.EHR.Domain.Extensions
|
|||
public static Guid? GetProfileId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.ProfileId);
|
||||
public static string? GetPrefix(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.Prefix);
|
||||
public static string? GetName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.Name);
|
||||
public static string? GetFirstName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.GivenName);
|
||||
public static string? GetLastName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.FamilyName);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,11 +27,11 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
|
|||
[Required, Comment("จำนวนวันลาทั้งหมด")]
|
||||
public double LeaveDays { get; set; } = 0.0;
|
||||
|
||||
[Required, Comment("จำนวนวันลาที่ใช้ไป")]
|
||||
public double LeaveDaysUsed { get; set; } = 0.0;
|
||||
[Comment("จำนวนวันลาที่ใช้ไป")]
|
||||
public double? LeaveDaysUsed { get; set; } = 0.0;
|
||||
|
||||
[Comment("จำนวนครั้งที่ลาสะสม")]
|
||||
public int LeaveCount { get; set; } = 0;
|
||||
public int? LeaveCount { get; set; } = 0;
|
||||
|
||||
public Guid? RootDnaId { get; set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -38,5 +38,10 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
|
|||
public string Comment { get; set; } = string.Empty;
|
||||
|
||||
public string? ApproveType { get; set; } = string.Empty; // ผู้บังคับบัญชา = commander, ผู้มีอำนาจอนุมัติ = Approver
|
||||
|
||||
|
||||
public bool IsAct { get; set; } = false;
|
||||
|
||||
public string KeyId { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,6 +119,10 @@ namespace BMA.EHR.Domain.Models.Placement
|
|||
public string? position { get; set; }
|
||||
[Comment("ตำแหน่งทางการบริหาร")]
|
||||
public string? PositionExecutive { get; set; }
|
||||
|
||||
[Comment("id ตำแหน่งทางการบริหาร")]
|
||||
public string? posExecutiveId { get; set; }
|
||||
|
||||
[Comment("id ประเภทตำแหน่ง")]
|
||||
public string? posTypeId { get; set; }
|
||||
[Comment("ชื่อประเภทตำแหน่ง")]
|
||||
|
|
|
|||
|
|
@ -321,6 +321,10 @@ namespace BMA.EHR.Domain.Models.Placement
|
|||
public string? positionName { get; set; }
|
||||
[Comment("ตำแหน่งทางการบริหาร")]
|
||||
public string? PositionExecutive { get; set; }
|
||||
|
||||
[Comment("id ตำแหน่งทางการบริหาร")]
|
||||
public string? posExecutiveId { get; set; }
|
||||
|
||||
[Comment("สายงาน")]
|
||||
public string? positionField { get; set; }
|
||||
[Comment("id ประเภทตำแหน่ง")]
|
||||
|
|
|
|||
|
|
@ -64,6 +64,10 @@ namespace BMA.EHR.Domain.Models.Placement
|
|||
public string? profileId { get; set; }
|
||||
[Comment("คำนำหน้า")]
|
||||
public string? prefix { get; set; }
|
||||
|
||||
[Comment("ยศ")]
|
||||
public string? rank { get; set; }
|
||||
|
||||
[Comment("ชื่อ")]
|
||||
public string? firstName { get; set; }
|
||||
[Comment("นามสกุล")]
|
||||
|
|
@ -128,6 +132,10 @@ namespace BMA.EHR.Domain.Models.Placement
|
|||
public string? position { get; set; }
|
||||
[Comment("ตำแหน่งทางการบริหาร")]
|
||||
public string? PositionExecutive { get; set; }
|
||||
|
||||
[Comment("id ตำแหน่งทางการบริหาร")]
|
||||
public string? posExecutiveId { get; set; }
|
||||
|
||||
[Comment("id ประเภทตำแหน่ง")]
|
||||
public string? posTypeId { get; set; }
|
||||
[Comment("ชื่อประเภทตำแหน่ง")]
|
||||
|
|
|
|||
|
|
@ -173,6 +173,10 @@ namespace BMA.EHR.Domain.Models.Retirement
|
|||
public string? position { get; set; }
|
||||
[Comment("ตำแหน่งทางการบริหาร")]
|
||||
public string? PositionExecutive { get; set; }
|
||||
|
||||
[Comment("id ตำแหน่งทางการบริหาร")]
|
||||
public string? posExecutiveId { get; set; }
|
||||
|
||||
[Comment("id ประเภทตำแหน่ง")]
|
||||
public string? posTypeId { get; set; }
|
||||
[Comment("ชื่อประเภทตำแหน่ง")]
|
||||
|
|
|
|||
21250
BMA.EHR.Infrastructure/Migrations/20260512073417_update_PlacementReceives_add_rank.Designer.cs
generated
Normal file
21250
BMA.EHR.Infrastructure/Migrations/20260512073417_update_PlacementReceives_add_rank.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,30 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace BMA.EHR.Infrastructure.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class update_PlacementReceives_add_rank : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "rank",
|
||||
table: "PlacementReceives",
|
||||
type: "longtext",
|
||||
nullable: true,
|
||||
comment: "ยศ")
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "rank",
|
||||
table: "PlacementReceives");
|
||||
}
|
||||
}
|
||||
}
|
||||
21266
BMA.EHR.Infrastructure/Migrations/20260521081933_update_Tables_add_posExecutiveId.Designer.cs
generated
Normal file
21266
BMA.EHR.Infrastructure/Migrations/20260521081933_update_Tables_add_posExecutiveId.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,66 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace BMA.EHR.Infrastructure.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class update_Tables_add_posExecutiveId : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "posExecutiveId",
|
||||
table: "RetirementOthers",
|
||||
type: "longtext",
|
||||
nullable: true,
|
||||
comment: "id ตำแหน่งทางการบริหาร")
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementReceives",
|
||||
type: "longtext",
|
||||
nullable: true,
|
||||
comment: "id ตำแหน่งทางการบริหาร")
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementProfiles",
|
||||
type: "longtext",
|
||||
nullable: true,
|
||||
comment: "id ตำแหน่งทางการบริหาร")
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementAppointments",
|
||||
type: "longtext",
|
||||
nullable: true,
|
||||
comment: "id ตำแหน่งทางการบริหาร")
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "posExecutiveId",
|
||||
table: "RetirementOthers");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementReceives");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementProfiles");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "posExecutiveId",
|
||||
table: "PlacementAppointments");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -11721,6 +11721,10 @@ namespace BMA.EHR.Infrastructure.Migrations
|
|||
.HasColumnType("longtext")
|
||||
.HasComment("id revision");
|
||||
|
||||
b.Property<string>("posExecutiveId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ตำแหน่งทางการบริหาร");
|
||||
|
||||
b.Property<string>("posLevelId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ระดับตำแหน่ง");
|
||||
|
|
@ -13108,6 +13112,10 @@ namespace BMA.EHR.Infrastructure.Migrations
|
|||
.HasColumnType("longtext")
|
||||
.HasComment("ชื่อหน่วยงาน");
|
||||
|
||||
b.Property<string>("posExecutiveId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ตำแหน่งทางการบริหาร");
|
||||
|
||||
b.Property<string>("posLevelId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ระดับตำแหน่ง");
|
||||
|
|
@ -13613,6 +13621,10 @@ namespace BMA.EHR.Infrastructure.Migrations
|
|||
.HasColumnType("longtext")
|
||||
.HasComment("id revision");
|
||||
|
||||
b.Property<string>("posExecutiveId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ตำแหน่งทางการบริหาร");
|
||||
|
||||
b.Property<string>("posLevelId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ระดับตำแหน่ง");
|
||||
|
|
@ -13693,6 +13705,10 @@ namespace BMA.EHR.Infrastructure.Migrations
|
|||
.HasColumnType("longtext")
|
||||
.HasComment("profile Id");
|
||||
|
||||
b.Property<string>("rank")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("ยศ");
|
||||
|
||||
b.Property<string>("root")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("ชื่อหน่วยงาน root");
|
||||
|
|
@ -15799,6 +15815,10 @@ namespace BMA.EHR.Infrastructure.Migrations
|
|||
.HasColumnType("longtext")
|
||||
.HasComment("id revision");
|
||||
|
||||
b.Property<string>("posExecutiveId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ตำแหน่งทางการบริหาร");
|
||||
|
||||
b.Property<string>("posLevelId")
|
||||
.HasColumnType("longtext")
|
||||
.HasComment("id ระดับตำแหน่ง");
|
||||
|
|
|
|||
1805
BMA.EHR.Infrastructure/Migrations/LeaveDb/20260505035145_Change Field.Designer.cs
generated
Normal file
1805
BMA.EHR.Infrastructure/Migrations/LeaveDb/20260505035145_Change Field.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,62 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class ChangeField : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AlterColumn<double>(
|
||||
name: "LeaveDaysUsed",
|
||||
table: "LeaveBeginnings",
|
||||
type: "double",
|
||||
nullable: true,
|
||||
comment: "จำนวนวันลาที่ใช้ไป",
|
||||
oldClrType: typeof(double),
|
||||
oldType: "double",
|
||||
oldComment: "จำนวนวันลาที่ใช้ไป");
|
||||
|
||||
migrationBuilder.AlterColumn<int>(
|
||||
name: "LeaveCount",
|
||||
table: "LeaveBeginnings",
|
||||
type: "int",
|
||||
nullable: true,
|
||||
comment: "จำนวนครั้งที่ลาสะสม",
|
||||
oldClrType: typeof(int),
|
||||
oldType: "int",
|
||||
oldComment: "จำนวนครั้งที่ลาสะสม");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AlterColumn<double>(
|
||||
name: "LeaveDaysUsed",
|
||||
table: "LeaveBeginnings",
|
||||
type: "double",
|
||||
nullable: false,
|
||||
defaultValue: 0.0,
|
||||
comment: "จำนวนวันลาที่ใช้ไป",
|
||||
oldClrType: typeof(double),
|
||||
oldType: "double",
|
||||
oldNullable: true,
|
||||
oldComment: "จำนวนวันลาที่ใช้ไป");
|
||||
|
||||
migrationBuilder.AlterColumn<int>(
|
||||
name: "LeaveCount",
|
||||
table: "LeaveBeginnings",
|
||||
type: "int",
|
||||
nullable: false,
|
||||
defaultValue: 0,
|
||||
comment: "จำนวนครั้งที่ลาสะสม",
|
||||
oldClrType: typeof(int),
|
||||
oldType: "int",
|
||||
oldNullable: true,
|
||||
oldComment: "จำนวนครั้งที่ลาสะสม");
|
||||
}
|
||||
}
|
||||
}
|
||||
1812
BMA.EHR.Infrastructure/Migrations/LeaveDb/20260511075931_Add Approver Field.Designer.cs
generated
Normal file
1812
BMA.EHR.Infrastructure/Migrations/LeaveDb/20260511075931_Add Approver Field.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,40 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddApproverField : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsAct",
|
||||
table: "LeaveRequestApprovers",
|
||||
type: "tinyint(1)",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "KeyId",
|
||||
table: "LeaveRequestApprovers",
|
||||
type: "longtext",
|
||||
nullable: false)
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsAct",
|
||||
table: "LeaveRequestApprovers");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "KeyId",
|
||||
table: "LeaveRequestApprovers");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -192,7 +192,7 @@ namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
|
|||
.HasColumnOrder(102)
|
||||
.HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
|
||||
|
||||
b.Property<int>("LeaveCount")
|
||||
b.Property<int?>("LeaveCount")
|
||||
.HasColumnType("int")
|
||||
.HasComment("จำนวนครั้งที่ลาสะสม");
|
||||
|
||||
|
|
@ -200,7 +200,7 @@ namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
|
|||
.HasColumnType("double")
|
||||
.HasComment("จำนวนวันลาทั้งหมด");
|
||||
|
||||
b.Property<double>("LeaveDaysUsed")
|
||||
b.Property<double?>("LeaveDaysUsed")
|
||||
.HasColumnType("double")
|
||||
.HasComment("จำนวนวันลาที่ใช้ไป");
|
||||
|
||||
|
|
@ -713,6 +713,13 @@ namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
|
|||
.IsRequired()
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<bool>("IsAct")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.Property<string>("KeyId")
|
||||
.IsRequired()
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<Guid>("KeycloakId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
|
|
|
|||
|
|
@ -74,6 +74,9 @@
|
|||
<Content Update="wwwroot\keycloak.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\blank.jpeg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
private readonly IConfiguration _configuration;
|
||||
private readonly UserProfileRepository _userProfileRepository;
|
||||
private readonly PermissionRepository _permission;
|
||||
private readonly LeaveRequestRepository _leaveRequestRepository;
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
@ -44,7 +45,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
IWebHostEnvironment hostingEnvironment,
|
||||
IConfiguration configuration,
|
||||
UserProfileRepository userProfileRepository,
|
||||
PermissionRepository permission)
|
||||
PermissionRepository permission,
|
||||
LeaveRequestRepository leaveRequestRepository)
|
||||
{
|
||||
_leaveBeginningRepository = leaveBeginningRepository;
|
||||
_context = context;
|
||||
|
|
@ -53,6 +55,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
_configuration = configuration;
|
||||
_userProfileRepository = userProfileRepository;
|
||||
_permission = permission;
|
||||
_leaveRequestRepository = leaveRequestRepository;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
@ -375,6 +378,15 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
try
|
||||
{
|
||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
||||
// var profileId = ProfileId ?? Guid.Empty;
|
||||
// var prefix = Prefix ?? "";
|
||||
// var firstName = FirstName ?? "";
|
||||
// var lastName = LastName ?? "";
|
||||
// var rootDnaId = OrgRootDnaId ?? Guid.Empty;
|
||||
// var child1DnaId = OrgChild1DnaId ?? Guid.Empty;
|
||||
// var child2DnaId = OrgChild2DnaId ?? Guid.Empty;
|
||||
// var child3DnaId = OrgChild3DnaId ?? Guid.Empty;
|
||||
// var child4DnaId = OrgChild4DnaId ?? Guid.Empty;
|
||||
|
||||
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_LEAVE_HISTORY");
|
||||
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
|
||||
|
|
@ -386,20 +398,41 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
if (leaveBeginning == null)
|
||||
return Error("ไม่พบข้อมูลที่ต้องการแก้ไข", StatusCodes.Status404NotFound);
|
||||
|
||||
|
||||
var profile = await _userProfileRepository.GetProfileByProfileIdAsync(req.ProfileId, AccessToken);
|
||||
if (profile == null)
|
||||
{
|
||||
return Error("ไม่พบข้อมูลข้าราชการหรือลูกจ้าง", StatusCodes.Status404NotFound);
|
||||
}
|
||||
|
||||
var startFiscalDate = new DateTime(DateTime.Now.Year - 1, 10, 1);
|
||||
var endFiscalDate = new DateTime(DateTime.Now.Year, 9, 30);
|
||||
|
||||
|
||||
if (req.LeaveDaysUsed is null || req.LeaveCount is null)
|
||||
{
|
||||
var systemLeaveDays = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUserByProfile(req.ProfileId, req.LeaveTypeId, startFiscalDate, endFiscalDate);
|
||||
var systemLeaveCount = await _leaveRequestRepository.GetSumApproveLeaveCountByTypeAndRangeForUserByProfile(req.ProfileId, req.LeaveTypeId, startFiscalDate, endFiscalDate);
|
||||
|
||||
leaveBeginning.LeaveDaysUsed = req.BeginningLeaveDays + systemLeaveDays;
|
||||
leaveBeginning.LeaveCount = req.BeginningLeaveCount + systemLeaveCount;
|
||||
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
leaveBeginning.LeaveDaysUsed = req.LeaveDaysUsed;
|
||||
leaveBeginning.LeaveCount = req.LeaveCount;
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
//var systemLeaveDays = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(profile.Keycloak ?? Guid.Empty, req.LeaveTypeId, startFiscalDate, endFiscalDate);
|
||||
//var systemLeaveCount = await _leaveRequestRepository.GetSumApproveLeaveCountByTypeAndRangeForUser2(profile.Keycloak ?? Guid.Empty, req.LeaveTypeId, startFiscalDate, endFiscalDate);
|
||||
}
|
||||
|
||||
leaveBeginning.LeaveTypeId = req.LeaveTypeId;
|
||||
leaveBeginning.LeaveYear = req.LeaveYear;
|
||||
leaveBeginning.LeaveDays = req.LeaveDays;
|
||||
leaveBeginning.LeaveDaysUsed = req.LeaveDaysUsed;
|
||||
leaveBeginning.LeaveCount = req.LeaveCount;
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
|
||||
|
||||
leaveBeginning.ProfileId = req.ProfileId;
|
||||
leaveBeginning.Prefix = profile.Prefix;
|
||||
|
|
@ -440,6 +473,17 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
try
|
||||
{
|
||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
||||
|
||||
// var profileId = ProfileId ?? Guid.Empty;
|
||||
// var prefix = Prefix ?? "";
|
||||
// var firstName = FirstName ?? "";
|
||||
// var lastName = LastName ?? "";
|
||||
// var rootDnaId = OrgRootDnaId ?? Guid.Empty;
|
||||
// var child1DnaId = OrgChild1DnaId ?? Guid.Empty;
|
||||
// var child2DnaId = OrgChild2DnaId ?? Guid.Empty;
|
||||
// var child3DnaId = OrgChild3DnaId ?? Guid.Empty;
|
||||
// var child4DnaId = OrgChild4DnaId ?? Guid.Empty;
|
||||
|
||||
var getPermission = await _permission.GetPermissionAPIAsync("CREATE", "SYS_LEAVE_HISTORY");
|
||||
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
|
||||
if (jsonData["status"]?.ToString() != "200")
|
||||
|
|
@ -464,13 +508,26 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
}
|
||||
|
||||
var leaveBeginning = new LeaveBeginning();
|
||||
|
||||
if (req.LeaveDaysUsed is null || req.LeaveCount is null)
|
||||
{
|
||||
leaveBeginning.LeaveDaysUsed = req.BeginningLeaveDays;
|
||||
leaveBeginning.LeaveCount = req.BeginningLeaveCount;
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
leaveBeginning.LeaveDaysUsed = req.LeaveDaysUsed;
|
||||
leaveBeginning.LeaveCount = req.LeaveCount;
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
}
|
||||
|
||||
leaveBeginning.LeaveTypeId = req.LeaveTypeId;
|
||||
leaveBeginning.LeaveYear = req.LeaveYear;
|
||||
leaveBeginning.LeaveDays = req.LeaveDays;
|
||||
leaveBeginning.LeaveDaysUsed = req.LeaveDaysUsed;
|
||||
leaveBeginning.LeaveCount = req.LeaveCount;
|
||||
leaveBeginning.BeginningLeaveDays = req.BeginningLeaveDays;
|
||||
leaveBeginning.BeginningLeaveCount = req.BeginningLeaveCount;
|
||||
|
||||
|
||||
leaveBeginning.ProfileId = req.ProfileId;
|
||||
leaveBeginning.Prefix = profile.Prefix;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ using System.Diagnostics;
|
|||
using System.Security.Claims;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using BMA.EHR.Leave.Services;
|
||||
using SearchProfileResultDto = BMA.EHR.Leave.Service.DTOs.ChangeRound.SearchProfileResultDto;
|
||||
|
||||
namespace BMA.EHR.Leave.Service.Controllers
|
||||
|
|
@ -63,6 +64,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
private readonly UserCalendarRepository _userCalendarRepository;
|
||||
private readonly PermissionRepository _permission;
|
||||
private readonly CheckInJobStatusRepository _checkInJobStatusRepository;
|
||||
private readonly NotificationService _notificationService;
|
||||
|
||||
private readonly CommandRepository _commandRepository;
|
||||
|
||||
|
|
@ -102,7 +104,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
CheckInJobStatusRepository checkInJobStatusRepository,
|
||||
HttpClient httpClient,
|
||||
ApplicationDBContext appDbContext,
|
||||
LeaveProcessJobStatusRepository leaveProcessJobStatusRepository)
|
||||
LeaveProcessJobStatusRepository leaveProcessJobStatusRepository,
|
||||
NotificationService notificationService)
|
||||
{
|
||||
_dutyTimeRepository = dutyTimeRepository;
|
||||
_context = context;
|
||||
|
|
@ -122,6 +125,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
_notificationRepository = notificationRepository;
|
||||
_checkInJobStatusRepository = checkInJobStatusRepository;
|
||||
_leaveProcessJobStatusRepository = leaveProcessJobStatusRepository;
|
||||
_notificationService = notificationService;
|
||||
_objectPool = objectPool;
|
||||
_permission = permission;
|
||||
|
||||
|
|
@ -446,29 +450,30 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
public async Task<ActionResult<ResponseObject>> CheckTimeAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
||||
var profileId = ProfileId ?? Guid.Empty;
|
||||
|
||||
// Get user's last check-in record and profile in parallel
|
||||
var dataTask = _userTimeStampRepository.GetLastRecord(userId);
|
||||
var profileTask = _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
||||
//var profileTask = _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
||||
var defaultRoundTask = _dutyTimeRepository.GetDefaultAsync();
|
||||
|
||||
await Task.WhenAll(dataTask, profileTask, defaultRoundTask);
|
||||
await Task.WhenAll(dataTask, defaultRoundTask);
|
||||
|
||||
var data = await dataTask;
|
||||
var profile = await profileTask;
|
||||
//var profile = await profileTask;
|
||||
var getDefaultRound = await defaultRoundTask;
|
||||
|
||||
if (profile == null)
|
||||
{
|
||||
throw new Exception(GlobalMessages.DataNotFound);
|
||||
}
|
||||
// if (profile == null)
|
||||
// {
|
||||
// throw new Exception(GlobalMessages.DataNotFound);
|
||||
// }
|
||||
|
||||
if (getDefaultRound == null)
|
||||
{
|
||||
return Error("ไม่พบรอบลงเวลา Default", StatusCodes.Status404NotFound);
|
||||
}
|
||||
|
||||
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(profile.Id);
|
||||
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(profileId);
|
||||
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
|
||||
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
|
||||
|
||||
|
|
@ -531,7 +536,18 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
// prepare data and convert request body and send to queue
|
||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
||||
var currentDate = DateTime.Now;
|
||||
|
||||
|
||||
// ตรวจสอบและ mark งานเก่าที่ค้างเกิน 30 นาทีเป็น FAILED อัตโนมัติ
|
||||
var staleJobs = await _checkInJobStatusRepository.GetStalePendingOrProcessingJobsByUserAsync(userId, 30);
|
||||
if (staleJobs != null && staleJobs.Count > 0)
|
||||
{
|
||||
foreach (var staleJob in staleJobs)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(staleJob.TaskId,
|
||||
$"งานค้างในสถานะ {staleJob.Status} เกิน 30 นาที ระบบทำเครื่องหมายเป็น FAILED อัตโนมัติ");
|
||||
}
|
||||
}
|
||||
|
||||
// ตรวจสอบว่ามีงานที่กำลัง pending หรือ processing อยู่หรือไม่
|
||||
var existingJobs = await _checkInJobStatusRepository.GetPendingOrProcessingJobsAsync(userId);
|
||||
if (existingJobs != null && existingJobs.Count > 0)
|
||||
|
|
@ -539,10 +555,10 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
// กรองเฉพาะงานที่เป็นประเภทเดียวกัน (CHECK_IN หรือ CHECK_OUT)
|
||||
var checkType = data.CheckInId == null ? "CHECK_IN" : "CHECK_OUT";
|
||||
var sameTypeJob = existingJobs.FirstOrDefault(j => j.CheckType == checkType);
|
||||
|
||||
|
||||
if (sameTypeJob != null)
|
||||
{
|
||||
|
||||
|
||||
return Error($"มีงาน {checkType} กำลังดำเนินการอยู่", StatusCodes.Status500InternalServerError);
|
||||
// var timeDiff = (currentDate - sameTypeJob.CreatedDate).TotalMinutes;
|
||||
// if (timeDiff < 2)
|
||||
|
|
@ -598,8 +614,17 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
var properties = channel.CreateBasicProperties();
|
||||
properties.Persistent = true;
|
||||
properties.MessageId = taskId;
|
||||
|
||||
// ส่งไป RabbitMQ
|
||||
channel.BasicPublish(exchange: "",
|
||||
routingKey: queue,
|
||||
basicProperties: properties,
|
||||
body: body);
|
||||
|
||||
// บันทึกสถานะงานก่อนส่งไป RabbitMQ
|
||||
// Clear Byte data Before Save to DB
|
||||
checkData.CheckInFileBytes = new byte[0];
|
||||
|
||||
// บันทึกสถานะงานหลังส่งไป RabbitMQ
|
||||
jobStatus = new CheckInJobStatus
|
||||
{
|
||||
TaskId = Guid.Parse(taskId),
|
||||
|
|
@ -608,21 +633,10 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
Status = "PENDING",
|
||||
CheckType = data.CheckInId == null ? "CHECK_IN" : "CHECK_OUT",
|
||||
CheckInId = data.CheckInId,
|
||||
AdditionalData = JsonConvert.SerializeObject(new
|
||||
{
|
||||
IsLocation = data.IsLocation,
|
||||
LocationName = data.LocationName,
|
||||
POI = data.POI
|
||||
})
|
||||
AdditionalData = JsonConvert.SerializeObject(checkData)
|
||||
};
|
||||
await _checkInJobStatusRepository.AddAsync(jobStatus);
|
||||
|
||||
// ส่งไป RabbitMQ
|
||||
channel.BasicPublish(exchange: "",
|
||||
routingKey: queue,
|
||||
basicProperties: properties,
|
||||
body: body);
|
||||
|
||||
|
||||
return Success(new { date = currentDate, taskId = taskId, keycloakId = userId });
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
@ -720,6 +734,117 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
return Success(new { count = result.Count, jobs = result });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ประมวลผลงาน CheckIn ที่ค้างอยู่ในสถานะ PENDING/PROCESSING เกินเวลาที่กำหนดใหม่อีกครั้ง
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpPost("reprocess-stale-checkin-jobs")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public async Task<ActionResult<ResponseObject>> ReprocessStaleCheckInJobsAsync([FromQuery] int timeoutMinutes = 30)
|
||||
{
|
||||
try
|
||||
{
|
||||
var staleJobs = await _checkInJobStatusRepository.GetStalePendingOrProcessingJobsAsync(timeoutMinutes);
|
||||
|
||||
if (staleJobs == null || staleJobs.Count == 0)
|
||||
{
|
||||
return Success(new { message = "ไม่พบงานที่ค้างอยู่", count = 0 });
|
||||
}
|
||||
|
||||
var results = new List<object>();
|
||||
foreach (var job in staleJobs)
|
||||
{
|
||||
try
|
||||
{
|
||||
// อ่านข้อมูลเดิมจาก AdditionalData
|
||||
if (string.IsNullOrEmpty(job.AdditionalData))
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(job.TaskId,
|
||||
"ไม่พบข้อมูลสำหรับประมวลผลซ้ำ (AdditionalData is null)");
|
||||
results.Add(new
|
||||
{
|
||||
taskId = job.TaskId,
|
||||
keycloakUserId = job.KeycloakUserId,
|
||||
checkType = job.CheckType,
|
||||
createdDate = job.CreatedDate,
|
||||
previousStatus = job.Status,
|
||||
newStatus = "FAILED",
|
||||
errorMessage = "ไม่พบข้อมูลสำหรับประมวลผลซ้ำ"
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
var checkData = JsonConvert.DeserializeObject<CheckTimeDtoRB>(job.AdditionalData);
|
||||
checkData.UserId = job.KeycloakUserId;
|
||||
checkData.CurrentDate = job.CreatedDate;
|
||||
if (checkData == null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(job.TaskId,
|
||||
"ไม่สามารถอ่านข้อมูลสำหรับประมวลผลซ้ำได้");
|
||||
results.Add(new
|
||||
{
|
||||
taskId = job.TaskId,
|
||||
keycloakUserId = job.KeycloakUserId,
|
||||
checkType = job.CheckType,
|
||||
createdDate = job.CreatedDate,
|
||||
previousStatus = job.Status,
|
||||
newStatus = "FAILED",
|
||||
errorMessage = "ไม่สามารถอ่านข้อมูลสำหรับประมวลผลซ้ำได้"
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// ตั้ง TaskId ให้ตรงกับ job เดิม
|
||||
checkData.TaskId = job.TaskId;
|
||||
|
||||
// เรียก ProcessCheckInAsync ด้วยข้อมูลเดิม
|
||||
var processResult = await ProcessCheckInAsync(checkData);
|
||||
|
||||
results.Add(new
|
||||
{
|
||||
taskId = job.TaskId,
|
||||
keycloakUserId = job.KeycloakUserId,
|
||||
checkType = job.CheckType,
|
||||
createdDate = job.CreatedDate,
|
||||
previousStatus = job.Status,
|
||||
result = processResult
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(job.TaskId,
|
||||
$"เกิดข้อผิดพลาดในการประมวลผลซ้ำ: {ex.Message}");
|
||||
results.Add(new
|
||||
{
|
||||
taskId = job.TaskId,
|
||||
keycloakUserId = job.KeycloakUserId,
|
||||
checkType = job.CheckType,
|
||||
createdDate = job.CreatedDate,
|
||||
previousStatus = job.Status,
|
||||
newStatus = "FAILED",
|
||||
errorMessage = ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return Success(new
|
||||
{
|
||||
message = $"ประมวลผลซ้ำงาน {staleJobs.Count} รายการเสร็จสิ้น",
|
||||
count = staleJobs.Count,
|
||||
jobs = results
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return Error(ex);
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("check-status")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
|
|
@ -938,26 +1063,31 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
await _checkInJobStatusRepository.UpdateToProcessingAsync(taskId);
|
||||
}
|
||||
|
||||
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, data.Token);
|
||||
var profile = await _userProfileRepository.GetProfileByCheckInAsync(userId, data.Token);
|
||||
|
||||
if (profile == null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่พบข้อมูลผู้ใช้");
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "เกิดข้อผิดพลาดจากการเรียก API [GetProfileByCheckInAsync] : ไม่พบข้อมูลผู้ใช้");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,
|
||||
$"ลงเวลาไม่สำเร็จ \r\nเนื่องจาก ไม่พบข้อมูลผู้ใช้ \r\nกรุณาลองใหม่อีกครั้ง");
|
||||
//var staffList = await _userProfileRepository.GetOCStaffAsync(profile)
|
||||
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
|
||||
}
|
||||
|
||||
var currentDate = data.CurrentDate ?? DateTime.Now;
|
||||
|
||||
if (data.CheckInFileName == "no-file")
|
||||
if (data.CheckInFileName == "no-file")
|
||||
{
|
||||
//throw new Exception(GlobalMessages.NoFileToUpload);
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, GlobalMessages.NoFileToUpload);
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,
|
||||
$"ลงเวลาไม่สำเร็จ \r\nเนื่องจาก {GlobalMessages.NoFileToUpload}\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
{
|
||||
Body = $"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจาก {GlobalMessages.NoFileToUpload}",
|
||||
Body =
|
||||
$"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจาก {GlobalMessages.NoFileToUpload}",
|
||||
ReceiverUserId = profile.Id,
|
||||
Type = "",
|
||||
Payload = "",
|
||||
|
|
@ -967,45 +1097,54 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
|
||||
return Error(GlobalMessages.NoFileToUpload, StatusCodes.Status400BadRequest);
|
||||
}
|
||||
|
||||
|
||||
// last check-in record
|
||||
var lastCheckIn = await _userTimeStampRepository.GetLastRecord(userId);
|
||||
|
||||
var check_status = data.CheckInId == null ? "check-in-picture" : "check-out-picture";
|
||||
var check_out_status = "check-out-picture";
|
||||
|
||||
var fileName = $"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_status}/{data.CheckInFileName}";
|
||||
var fileNameCheckOut = $"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_out_status}/{data.CheckInFileName}";
|
||||
using (var ms = new MemoryStream(data.CheckInFileBytes ?? new byte[0]))
|
||||
// ถ้าไม่มี CheckInFileBytes ให้ใช้ภาพ blank.jpeg แทน
|
||||
var fileBytes = data.CheckInFileBytes;
|
||||
if (fileBytes == null || fileBytes.Length == 0)
|
||||
{
|
||||
var blankPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "blank.jpeg");
|
||||
fileBytes = await System.IO.File.ReadAllBytesAsync(blankPath);
|
||||
data.CheckInFileName = "blank.jpeg";
|
||||
}
|
||||
|
||||
var fileName =
|
||||
$"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_status}/{data.CheckInFileName}";
|
||||
var fileNameCheckOut =
|
||||
$"{_bucketName}/{userId}/{currentDate.ToString("dd-MM-yyyy")}/{check_out_status}/{data.CheckInFileName}";
|
||||
using (var ms = new MemoryStream(fileBytes))
|
||||
{
|
||||
try
|
||||
{
|
||||
await _minIOService.UploadFileAsync(fileName, ms);
|
||||
// if (lastCheckIn != null && lastCheckIn.CheckOut == null)
|
||||
// {
|
||||
// // ยังไม่เคย check-out มาก่อน หรือ check-out เป็น null ให้ใช้ชื่อไฟล์แบบ check-out
|
||||
// await _minIOService.UploadFileAsync(fileNameCheckOut, ms);
|
||||
// }
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, $"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}");
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId,
|
||||
$"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,
|
||||
$"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
var noti2 = new Notification
|
||||
{
|
||||
Body = $"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}",
|
||||
Body =
|
||||
$"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}",
|
||||
ReceiverUserId = profile.Id,
|
||||
Type = "",
|
||||
Payload = "",
|
||||
};
|
||||
_appDbContext.Set<Notification>().Add(noti1);
|
||||
_appDbContext.Set<Notification>().Add(noti2);
|
||||
await _appDbContext.SaveChangesAsync();
|
||||
|
||||
|
||||
return Error($"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}", StatusCodes.Status500InternalServerError);
|
||||
return Error($"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}",
|
||||
StatusCodes.Status500InternalServerError);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (lastCheckIn != null && lastCheckIn.CheckOut == null)
|
||||
|
|
@ -1015,39 +1154,38 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
try
|
||||
{
|
||||
await _minIOService.UploadFileAsync(fileNameCheckOut, ms2);
|
||||
// if (lastCheckIn != null && lastCheckIn.CheckOut == null)
|
||||
// {
|
||||
// // ยังไม่เคย check-out มาก่อน หรือ check-out เป็น null ให้ใช้ชื่อไฟล์แบบ check-out
|
||||
// await _minIOService.UploadFileAsync(fileNameCheckOut, ms);
|
||||
// }
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, $"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}");
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId,
|
||||
$"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,
|
||||
$"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
var noti3 = new Notification
|
||||
{
|
||||
Body = $"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}",
|
||||
Body =
|
||||
$"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจากไม่สามารถอัปโหลดรูปภาพได้ {ex.Message}",
|
||||
ReceiverUserId = profile.Id,
|
||||
Type = "",
|
||||
Payload = "",
|
||||
};
|
||||
_appDbContext.Set<Notification>().Add(noti1);
|
||||
_appDbContext.Set<Notification>().Add(noti3);
|
||||
await _appDbContext.SaveChangesAsync();
|
||||
|
||||
|
||||
return Error($"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}", StatusCodes.Status500InternalServerError);
|
||||
return Error($"ไม่สามารถอัปโหลดรูปภาพได้: {ex.Message}",
|
||||
StatusCodes.Status500InternalServerError);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
||||
if (defaultRound == null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่พบรอบการลงเวลาทำงาน Default");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,
|
||||
$"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่พบรอบการลงเวลาทำงาน Default\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
{
|
||||
|
|
@ -1201,11 +1339,12 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
if (currentCheckIn != null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่สามารถลงเวลาได้ เนื่องจากมีการลงเวลาในวันนี้แล้ว");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true,$"ลงเวลาไม่สำเร็จ \r\nเนื่องจากมีการลงเวลาในวันนี้แล้ว\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
{
|
||||
Body = $"ประมวลผลการลงเวลาวันที่ {currentDate.ToString("dd-MM-yyyy")} ไม่สำเร็จ \r\nเนื่องจากมีการลงเวลาในวันนี้แล้ว",
|
||||
Body = $"ลงเวลาไม่สำเร็จ \r\nเนื่องจากมีการลงเวลาในวันนี้แล้ว",
|
||||
ReceiverUserId = profile.Id,
|
||||
Type = "",
|
||||
Payload = "",
|
||||
|
|
@ -1358,6 +1497,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
if (checkout == null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่พบข้อมูลการลงเวลาทำงาน");
|
||||
await _notificationService.SendNotificationAsync(data.Token,true, $"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่พบข้อมูลการลงเวลาทำงาน\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
|
|
@ -1378,6 +1518,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
if (currentCheckInProcess == null)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่พบข้อมูลการประมวลผลเวลาทำงาน (CheckIn)");
|
||||
await _notificationService.SendNotificationAsync(data.Token, true, $"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่พบข้อมูลการประมวลผลเวลาทำงาน (CheckIn)\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
|
|
@ -1555,6 +1696,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
else
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, "ไม่พบข้อมูลการประมวลผลเวลาทำงาน");
|
||||
await _notificationService.SendNotificationAsync(data.Token,true, $"ลงเวลาไม่สำเร็จ \r\nเนื่องจากไม่พบข้อมูลการประมวลผลเวลาทำงาน\r\nกรุณาลองใหม่อีกครั้ง");
|
||||
// send notification to user
|
||||
var noti1 = new Notification
|
||||
{
|
||||
|
|
@ -1578,6 +1720,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
ProcessedDate = currentDate
|
||||
});
|
||||
await _checkInJobStatusRepository.UpdateToCompletedAsync(taskId, additionalData);
|
||||
await _notificationService.SendNotificationAsync(data.Token, false,
|
||||
$"ลงเวลาสำเร็จ");
|
||||
}
|
||||
|
||||
var checkInType = data.CheckInId == null ? "check-in" : "check-out";
|
||||
|
|
@ -1589,6 +1733,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
if (taskId != Guid.Empty)
|
||||
{
|
||||
await _checkInJobStatusRepository.UpdateToFailedAsync(taskId, ex.Message);
|
||||
await _notificationService.SendNotificationAsync(data.Token, true, ex.Message);
|
||||
}
|
||||
return Error(ex);
|
||||
}
|
||||
|
|
@ -1934,7 +2079,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
ProfileType = d.ProfileType ?? "",
|
||||
|
||||
CheckInDate = d.CheckIn.Date,
|
||||
CheckInTime = d.CheckIn.ToString("HH:mm:ss"),
|
||||
CheckInTime = d.CheckIn.ToString("HH:mm"),
|
||||
CheckInLocation = d.CheckInPOI,
|
||||
CheckInLat = d.CheckInLat,
|
||||
CheckInLon = d.CheckInLon,
|
||||
|
|
@ -1945,7 +2090,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
CheckInLocationName = d.CheckInLocationName ?? "",
|
||||
|
||||
CheckOutDate = d.CheckOut?.Date,
|
||||
CheckOutTime = d.CheckOut == null ? "" : d.CheckOut.Value.ToString("HH:mm:ss"),
|
||||
CheckOutTime = d.CheckOut == null ? "" : d.CheckOut.Value.ToString("HH:mm"),
|
||||
CheckOutLocation = d.CheckOut == null ? "" : d.CheckOutPOI,
|
||||
CheckOutLat = d.CheckOut == null ? null : d.CheckOutLat,
|
||||
CheckOutLon = d.CheckOut == null ? null : d.CheckOutLon,
|
||||
|
|
@ -3010,6 +3155,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public async Task<ActionResult<ResponseObject>> CheckoutCheckAsync(string isSeminar = "N")
|
||||
{
|
||||
// "S" = Seminar, "N" = Normal, "O" = One Stop Service
|
||||
|
||||
var time = DateTime.Now;
|
||||
|
||||
var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty;
|
||||
|
|
@ -3041,9 +3188,11 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
|
||||
//var endTime = DateTimeOffset.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")}T{duty.EndTimeAfternoon}:00.0000000+07:00").ToLocalTime().DateTime;
|
||||
|
||||
//var endTime = DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")}T{duty.EndTimeAfternoon}:00.0000000+07:00");
|
||||
var endTime = isSeminar.Trim().ToUpper() == "Y"
|
||||
//var endTime = DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")}T{duty.EndTimeAfternoon}:00.0000000+07:00");
|
||||
var endTime = isSeminar.Trim().ToUpper() == "S"
|
||||
? DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")} 14:30")
|
||||
: isSeminar.Trim().ToUpper() == "O"
|
||||
? DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")} 18:30")
|
||||
: DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}");
|
||||
|
||||
var endTimeMorning = DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")} {duty.EndTimeMorning}");
|
||||
|
|
@ -3131,8 +3280,17 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
{
|
||||
return Error("ไม่สามารถขอลงเวลากรณีพิเศษในวันที่มากกว่าวันที่ปัจจุบันได้", StatusCodes.Status400BadRequest);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty;
|
||||
|
||||
var checkin = await _userTimeStampRepository.GetTimestampByDateAsync(userId, req.CheckDate.Date);
|
||||
if (checkin != null && checkin.CheckOut == null)
|
||||
{
|
||||
return Error("ระบบพบรายการลงเวลาของวันที่ต้องการแก้ไข แต่ยังไม่มีข้อมูลการลงเวลาออก กรุณาลงเวลาออกให้เรียบร้อยก่อนดำเนินการ");
|
||||
}
|
||||
|
||||
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
||||
if (profile == null)
|
||||
{
|
||||
|
|
@ -3180,7 +3338,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public async Task<ActionResult<ResponseObject>> GetAdditionalCheckRequestAsync([Required] int year, [Required] int month, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false)
|
||||
public async Task<ActionResult<ResponseObject>> GetAdditionalCheckRequestAsync([Required] DateTime startDate, [Required] DateTime endDate, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false,string? status = "")
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("LIST", "SYS_CHECKIN_SPECIAL");
|
||||
//var jsonData = JsonConvert.DeserializeObject<GetPermissionWithActingResultDto>(getPermission);
|
||||
|
|
@ -3225,7 +3383,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
}
|
||||
|
||||
//var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequests(year, month);
|
||||
var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, role, nodeId, profileAdmin?.Node, keyword);
|
||||
var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole2(startDate, endDate, role, nodeId, profileAdmin?.Node, keyword,status);
|
||||
|
||||
// ถ้ามีการรักษาการ
|
||||
if (jsonData.result.isAct)
|
||||
|
|
@ -3293,7 +3451,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
actNode = 0;
|
||||
}
|
||||
|
||||
var rawDataAct = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, actRole, actNodeId, profileAdmin?.Node, keyword);
|
||||
var rawDataAct = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole2(startDate, endDate, actRole, actNodeId, profileAdmin?.Node, keyword,status);
|
||||
if (rawDataAct != null)
|
||||
{
|
||||
if (rawData != null)
|
||||
|
|
@ -3809,6 +3967,10 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
"ABSENT" :
|
||||
"NORMAL",
|
||||
CheckOutDescription = d.CheckOutRemark ?? "",
|
||||
IsLocationCheckIn = d.IsLocationCheckIn,
|
||||
IsLocationCheckOut = d.IsLocationCheckOut,
|
||||
CheckInLocationName = d.CheckInLocationName ?? "",
|
||||
CheckOutLocationName = d.CheckOutLocationName ?? ""
|
||||
};
|
||||
|
||||
return Success(result);
|
||||
|
|
@ -3873,6 +4035,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
{
|
||||
resultCheckInDate = checkInData == null ? null : checkInData.CheckIn;
|
||||
resultCheckInTime = checkInData == null ? "00:00" : checkInData.CheckIn.ToString("HH:mm");
|
||||
resultCheckInLocation = checkInData == null ? "" : checkInData!.CheckInPOI;
|
||||
}
|
||||
|
||||
if (data.CheckOutEdit)
|
||||
|
|
@ -3890,6 +4053,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
resultCheckOutTime = checkInData == null ? "00:00" :
|
||||
checkInData.CheckOut == null ? "00:00" :
|
||||
checkInData.CheckOut.Value.ToString("HH:mm");
|
||||
resultCheckOutLocation = checkInData == null ? "" : checkInData!.CheckOutPOI;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -157,14 +157,14 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
data.Type.Id, data.CreatedAt);
|
||||
|
||||
var startFiscalYear = (new DateTime(data.LeaveStartDate.Year - 1, 10, 1)).Date;
|
||||
var endFiscalYear = (data.DateSendLeave ?? data.CreatedAt).Date;
|
||||
var endFiscalYear = (data.DateSendLeave ?? data.CreatedAt);
|
||||
|
||||
var thisYear = data.LeaveStartDate.Year;
|
||||
var toDay = data.LeaveStartDate.Date;
|
||||
if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31))
|
||||
thisYear = thisYear + 1;
|
||||
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, data.Type.Id, data.KeycloakUserId);
|
||||
var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
|
||||
var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
|
||||
if (leaveData != null)
|
||||
{
|
||||
sumLeave += leaveData.BeginningLeaveDays;
|
||||
|
|
@ -217,6 +217,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
leaveNumber = data.LeaveNumber.ToThaiNumber(),
|
||||
LeaveLastStart = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
|
||||
LeaveLastEnd = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
|
||||
|
||||
LeaveLastTotal = lastLeaveRequest == null ? "0".ToThaiNumber() : lastLeaveRequest.LeaveTotal.ToString().ToThaiNumber(),
|
||||
|
||||
LeaveSummary = sumLeave.ToString().ToThaiNumber(),
|
||||
LeaveRemain = (data.Type.Limit - sumLeave).ToString().ToThaiNumber(),
|
||||
|
|
@ -346,7 +348,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
//var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
|
||||
|
||||
|
||||
var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
|
||||
var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
|
||||
if (leaveData != null)
|
||||
{
|
||||
sumLeave += leaveData.BeginningLeaveDays;
|
||||
|
|
@ -1352,7 +1354,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
}
|
||||
else
|
||||
{
|
||||
profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
|
||||
profile = await _userProfileRepository.GetEmployeeByAdminRolev2(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
|
||||
}
|
||||
// get leave day
|
||||
var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate);
|
||||
|
|
@ -1675,18 +1677,22 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
agencyCount = agencyCount,
|
||||
coupleCount = coupleCount,
|
||||
therapyCount = therapyCount,
|
||||
|
||||
// ระบบนับจำนวนครั้ง วันลาพักผ่อนด้วย ซึ่งตามระเบียบไม่ให้นับจำนวนครั้งวันลาพักผ่อนครับ จำนวนครั้งนับเฉพาะ ป่วย กับ กิจ
|
||||
leaveTotal = sickCount +
|
||||
personalCount
|
||||
|
||||
leaveTotal = sickCount +
|
||||
maternityCount +
|
||||
wifeCount +
|
||||
personalCount +
|
||||
restCount +
|
||||
ordainCount +
|
||||
absentCount +
|
||||
studyCount +
|
||||
agencyCount +
|
||||
coupleCount +
|
||||
therapyCount
|
||||
// leaveTotal = sickCount +
|
||||
// maternityCount +
|
||||
// wifeCount +
|
||||
// personalCount +
|
||||
// restCount +
|
||||
// ordainCount +
|
||||
// absentCount +
|
||||
// studyCount +
|
||||
// agencyCount +
|
||||
// coupleCount +
|
||||
// therapyCount
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2376,7 +2382,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
}
|
||||
else
|
||||
{
|
||||
profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
|
||||
profile = await _userProfileRepository.GetEmployeeByAdminRolev2(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
|
||||
}
|
||||
// Child กรองตามที่ fe ส่งมาอีกชั้น
|
||||
if ((role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "PARENT" || role == "BROTHER") /*&& req.node > profileAdmin?.Node*/)
|
||||
|
|
@ -2440,6 +2446,15 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
var workTotal = 0;
|
||||
var seminarTotal = 0;
|
||||
|
||||
var wfaTotal = 0; //ปฏิบัติงานนอกสถานที่
|
||||
var outOfficeTotal = 0; //ขออนุญาติิิออกนอกสถานที่
|
||||
var oneStopSrvrTotal = 0; //จุดบริการด่วนมหานคร
|
||||
var otherTotal = 0; //อื่นๆ
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
||||
if (defaultRound == null)
|
||||
{
|
||||
|
|
@ -2623,10 +2638,19 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
workTotal += 1;
|
||||
if (!timeStamps.IsLocationCheckIn)
|
||||
{
|
||||
if (timeStamps.CheckInLocationName == "ปฏิบัติงานที่บ้าน")
|
||||
if (timeStamps.CheckInLocationName!.Contains("ปฏิบัติงานที่บ้าน"))
|
||||
wfhTotal += 1;
|
||||
else if (timeStamps.CheckInLocationName == "ไปประชุม / อบรม / สัมมนา")
|
||||
seminarTotal += 1;
|
||||
else if (timeStamps.CheckInLocationName.Contains("ปฏิบัติงานนอกสถานที่"))
|
||||
wfaTotal += 1;
|
||||
else if (timeStamps.CheckInLocationName.Contains("ขออนุญาตออกนอกสถานที่"))
|
||||
outOfficeTotal += 1;
|
||||
else if (timeStamps.CheckInLocationName.Contains("ปฏิบัติงานในจุดบริการด่วนมหานคร"))
|
||||
oneStopSrvrTotal += 1;
|
||||
else otherTotal += 1;
|
||||
// else if (timeStamps.CheckInLocationName.Contains("อื่นๆ"))
|
||||
// otherTotal += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2777,19 +2801,36 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
worksheet.Cells[lastRow + 2, 8].Value = "อบรม ประชุม สัมมนาฯ";
|
||||
worksheet.Cells[lastRow + 2, 9].Value = seminarTotal;
|
||||
worksheet.Cells[lastRow + 2, 10].Value = "คน";
|
||||
worksheet.Cells[lastRow + 3, 8].Value = "ปฎิบัติงานนอกสถานที่";
|
||||
worksheet.Cells[lastRow + 3, 9].Value = wfaTotal;
|
||||
worksheet.Cells[lastRow + 3, 10].Value = "คน";
|
||||
worksheet.Cells[lastRow + 4, 8].Value = "ขออนุญาตออกนอกสถานที่";
|
||||
worksheet.Cells[lastRow + 4, 9].Value = outOfficeTotal;
|
||||
worksheet.Cells[lastRow + 4, 10].Value = "คน";
|
||||
worksheet.Cells[lastRow + 5, 8].Value = "ปฎิบัติงานในจุดบริการด่วนมหานคร";
|
||||
worksheet.Cells[lastRow + 5, 9].Value = oneStopSrvrTotal;
|
||||
worksheet.Cells[lastRow + 5, 10].Value = "คน";
|
||||
worksheet.Cells[lastRow + 6, 8].Value = "อื่นๆ";
|
||||
worksheet.Cells[lastRow + 6, 9].Value = otherTotal;
|
||||
worksheet.Cells[lastRow + 6, 10].Value = "คน";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
worksheet.Cells[lastRow + 3, 2].Value = "ลาป่วย/ลากิจ";
|
||||
worksheet.Cells[lastRow + 3, 5].Value = sickTotal;
|
||||
worksheet.Cells[lastRow + 3, 6].Value = "คน";
|
||||
worksheet.Cells[lastRow + 4, 2].Value = "มาสาย";
|
||||
worksheet.Cells[lastRow + 4, 5].Value = lateTotal;
|
||||
worksheet.Cells[lastRow + 4, 6].Value = "คน";
|
||||
worksheet.Cells[lastRow + 6, 2].Value = "เรียน";
|
||||
worksheet.Cells[lastRow + 7, 2].Value = "เพื่อโปรดทราบ";
|
||||
worksheet.Cells[lastRow + 7, 9].Value = "ทราบ";
|
||||
worksheet.Cells[lastRow + 7, 9].Style.Font.Bold = true;
|
||||
worksheet.Cells[lastRow + 7, 9].Style.Font.Size = 22;
|
||||
worksheet.Cells[lastRow + 8, 2].Value = "................................";
|
||||
worksheet.Cells[lastRow + 8, 9].Value = "................................";
|
||||
worksheet.Cells[lastRow + 8, 2].Value = "เรียน";
|
||||
worksheet.Cells[lastRow + 9, 2].Value = "เพื่อโปรดทราบ";
|
||||
worksheet.Cells[lastRow + 9, 9].Value = "ทราบ";
|
||||
worksheet.Cells[lastRow + 9, 9].Style.Font.Bold = true;
|
||||
worksheet.Cells[lastRow + 9, 9].Style.Font.Size = 22;
|
||||
worksheet.Cells[lastRow + 10, 2].Value = "................................";
|
||||
worksheet.Cells[lastRow + 10, 9].Value = "................................";
|
||||
worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
|
||||
var fileBytes = package.GetAsByteArray();
|
||||
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "TimeStampRecords.xlsx");
|
||||
|
|
|
|||
|
|
@ -175,6 +175,9 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
LastUpdateFullName = FullName ?? "",
|
||||
LastUpdateUserId = UserId!,
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
|
||||
IsAct = r.isAct,
|
||||
KeyId = r.keyId
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -943,8 +946,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
OrganizationName = orgName, //profile.Oc ?? "",
|
||||
|
||||
LeaveLimit = leaveLimit, // จำนวนวันลาทั้งหมดในปีนั้นๆที่ลาได้ โดยรวมยอดที่เหลือจากปีก่อนมา (เอาค่ามาจากตาราง Beginning เลย)
|
||||
LeaveTotal = sumLeave, // จำนวนวันลาที่ลาไปแล้วในปีนั้นๆ โดยเมื่อมีการอนุมัติลา จะมาบวกค่านี้ไปเรื่อยๆ (เอาค่ามาจากตาราง Beginning เลย)
|
||||
LeaveRemain = leaveLimit - sumLeave,
|
||||
LeaveTotal = sumLeave ?? 0, // จำนวนวันลาที่ลาไปแล้วในปีนั้นๆ โดยเมื่อมีการอนุมัติลา จะมาบวกค่านี้ไปเรื่อยๆ (เอาค่ามาจากตาราง Beginning เลย)
|
||||
LeaveRemain = leaveLimit - (sumLeave ?? 0),
|
||||
RestDayTotalOld = restOldDay, // เอา leaveLimit มาลบ 10 (LV-005)
|
||||
RestDayTotalCurrent = restCurrentDay,// 10 วันเสมอ (LV-005)
|
||||
BirthDate = profile.BirthDate.Date,
|
||||
|
|
@ -1703,7 +1706,11 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
|
||||
|
||||
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUserAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId);
|
||||
var restDayOld = govAge < 180 ? 0 : leaveData == null ? 0 : (leaveData.LeaveDays + leaveData.BeginningLeaveDays - 10);
|
||||
|
||||
var restDayOld = 0.0;
|
||||
|
||||
//restDayOld = govAge < 180 ? 0 : leaveData == null ? 0 : (leaveData.LeaveDays + leaveData.BeginningLeaveDays - 10);
|
||||
restDayOld = govAge < 180 ? 0 : leaveData == null ? 0 : (leaveData.LeaveDays - 10);
|
||||
if (restDayOld < 0) restDayOld = 0;
|
||||
var restDayCurrent = govAge < 180 ? 0 : 10;
|
||||
|
||||
|
|
@ -2127,6 +2134,45 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// API ลบรายการการลา (ADMIN)
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// </returns>
|
||||
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpDelete("admin/{id:guid}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public async Task<ActionResult<ResponseObject>> DeleteLeaveRequestForAdminAsync(Guid id)
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("DELETE", "SYS_LEAVE_LIST");
|
||||
if (jsonData!.status != 200)
|
||||
{
|
||||
return Error(jsonData.message, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
// ตรวจสอบว่า role ต้องเป็น OWNER เท่านั้น
|
||||
if (jsonData.result.privilege != "OWNER")
|
||||
{
|
||||
return Error("ไม่มีสิทธิ์ในการลบรายการขอลา", StatusCodes.Status403Forbidden);
|
||||
}
|
||||
|
||||
var deleted = await _leaveRequestRepository.GetByIdAsync(id);
|
||||
if (deleted == null)
|
||||
return Error(GlobalMessages.DataNotFound);
|
||||
|
||||
// ห้ามลบเฉพาะสถานะ APPROVE, DELETING, DELETE
|
||||
if (new[] { "APPROVE", "DELETING", "DELETE" }.Contains(deleted.LeaveStatus))
|
||||
{
|
||||
return Error("ไม่สามารถลบรายการขอลาสถานะนี้ได้");
|
||||
}
|
||||
|
||||
await _leaveRequestRepository.DeleteAsync(deleted);
|
||||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LV2_014 - รายการขอยกเลิกการลา (ADMIN)
|
||||
/// </summary>
|
||||
|
|
@ -2835,8 +2881,9 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, rawData.Type.Id, rawData.KeycloakUserId);
|
||||
|
||||
var startFiscalYear = new DateTime(rawData.LeaveStartDate.Year - 1, 10, 1);
|
||||
var endFiscalYear = rawData.CreatedAt;
|
||||
var endFiscalYear = rawData.DateSendLeave ?? rawData.CreatedAt;
|
||||
var endFiscalYear2 = new DateTime(rawData.LeaveStartDate.Year, 9, 30);
|
||||
//var endFiscalYear3 = rawData.DateSendLeave ?? rawData.CreatedAt;
|
||||
var leaveSummary = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(rawData.KeycloakUserId, rawData.Type.Id, startFiscalYear, endFiscalYear);
|
||||
|
||||
// วันลาแบบร่างและที่ยื่นลาไปแล้ว
|
||||
|
|
@ -2987,7 +3034,10 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
ApproveStatus = x.ApproveStatus,
|
||||
Comment = x.Comment,
|
||||
ProfileId = x.ProfileId,
|
||||
KeycloakId = x.KeycloakId
|
||||
KeycloakId = x.KeycloakId,
|
||||
isAct = x.IsAct,
|
||||
keyId = x.KeyId
|
||||
|
||||
}).ToList();
|
||||
|
||||
var approvers = rawData.Approvers.Where(x => x.ApproveType.ToUpper() == "APPROVER")
|
||||
|
|
@ -3002,7 +3052,10 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
ApproveStatus = x.ApproveStatus,
|
||||
Comment = x.Comment,
|
||||
ProfileId = x.ProfileId,
|
||||
KeycloakId = x.KeycloakId
|
||||
KeycloakId = x.KeycloakId,
|
||||
|
||||
isAct = x.IsAct,
|
||||
keyId = x.KeyId
|
||||
}).ToList();
|
||||
|
||||
result.Approvers.AddRange(approvers);
|
||||
|
|
@ -3072,6 +3125,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
|
||||
leaveBeginningDict.TryGetValue(leaveType.Id, out var leaveData);
|
||||
var approve = leaveData?.LeaveDaysUsed ?? 0;
|
||||
var approveCount = leaveData?.LeaveCount ?? 0;
|
||||
|
||||
// fix issue : SIT ระบบบันทึกการลา>> สิทธิ์การลา(โอนสิทธิ์การลา) #974
|
||||
var extendLeave = 0.0;
|
||||
|
|
@ -3094,6 +3148,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
|||
LeaveCountApprove = approve,
|
||||
LeaveCountReject = reject,
|
||||
LeaveCountDelete = delete,
|
||||
LeaveCountApproveCount = approveCount,
|
||||
};
|
||||
result.Add(data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,16 +17,16 @@ namespace BMA.EHR.Leave.Service.DTOs.LeaveBeginnings
|
|||
[Required, Comment("จำนวนวันลายกมา")]
|
||||
public double LeaveDays { get; set; } = 0.0;
|
||||
|
||||
[Required, Comment("จำนวนวันลาที่ใช้ไป")]
|
||||
public double LeaveDaysUsed { get; set; } = 0.0;
|
||||
[Comment("จำนวนวันลาที่ใช้ไป")]
|
||||
public double? LeaveDaysUsed { get; set; }
|
||||
|
||||
[Required, Comment("จำนวนครั้งที่ลาสะสม")]
|
||||
public int LeaveCount { get; set; } = 0;
|
||||
[Comment("จำนวนครั้งที่ลาสะสม")]
|
||||
public int? LeaveCount { get; set; }
|
||||
|
||||
[Required, Comment("จำนวนวันลายกมา")]
|
||||
[Required, Comment("จำนวนวันลายกมาก่อนใช้ระบบ")]
|
||||
public double BeginningLeaveDays { get; set; } = 0.0;
|
||||
|
||||
[Comment("จำนวนครั้งที่ลายกมา")]
|
||||
[Comment("จำนวนครั้งที่ลายกมาก่อนใช้ระบบ")]
|
||||
public int BeginningLeaveCount { get; set; } = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -174,5 +174,8 @@ namespace BMA.EHR.Leave.Service.DTOs.LeaveRequest
|
|||
public string ApproveStatus { get; set; } = string.Empty;
|
||||
|
||||
public string Comment { get; set; } = string.Empty;
|
||||
|
||||
public bool isAct { get; set; } = false;
|
||||
public string keyId { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,5 +37,11 @@ namespace BMA.EHR.Leave.Service.DTOs.LeaveRequest
|
|||
[JsonProperty("organizationName")]
|
||||
public string OrganizationName { get; set; } = string.Empty;
|
||||
|
||||
[JsonProperty("isAct")]
|
||||
public bool isAct { get; set; } = false;
|
||||
|
||||
[JsonProperty("keyId")]
|
||||
public string keyId { get; set; } = string.Empty;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ using Hangfire.Common;
|
|||
using BMA.EHR.Application.Repositories.Leaves.TimeAttendants;
|
||||
using BMA.EHR.Leave.Service.Extensions;
|
||||
using BMA.EHR.Leave.Service.Services;
|
||||
using BMA.EHR.Leave.Services;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
// ตั้ง TimeZone เป็น Asia/Bangkok ในโค้ด
|
||||
|
|
@ -95,6 +96,7 @@ builder.Services.AddLeaveApplication();
|
|||
builder.Services.AddPersistence(builder.Configuration);
|
||||
builder.Services.AddLeavePersistence(builder.Configuration);
|
||||
builder.Services.AddTransient<HolidayService>();
|
||||
builder.Services.AddTransient<NotificationService>();
|
||||
|
||||
// Configure HttpClient with increased timeout for long-running operations (e.g., RabbitMQ Management API)
|
||||
builder.Services.AddHttpClient();
|
||||
|
|
@ -196,12 +198,20 @@ if (manager != null)
|
|||
// ทำความสะอาดข้อมูล CheckIn Job Status ที่เก่ากว่า 30 วัน - รันทุกวันเวลา 02:00 น.
|
||||
manager.AddOrUpdate("ทำความสะอาดข้อมูล CheckIn Job Status", Job.FromExpression<CheckInJobStatusRepository>(x => x.CleanupOldJobsAsync(30)), "0 2 * * *", bangkokTimeZone);
|
||||
|
||||
manager.AddOrUpdate("ประมวลผลงานที่ค้างอยู่ในสถานะ Pending หรือ Processing", Job.FromExpression<LeaveProcessJobStatusRepository>(x => x.ProcessPendingJobsAsync()), "0 3 * * *",
|
||||
new RecurringJobOptions
|
||||
{
|
||||
TimeZone = bangkokTimeZone,
|
||||
QueueName = "leave" // ← กำหนด queue
|
||||
});
|
||||
// ตรวจสอบและ mark งาน CheckIn ที่ค้างเกิน 30 นาทีเป็น FAILED - รันทุก 15 นาที
|
||||
// manager.AddOrUpdate("ตรวจสอบงาน CheckIn ที่ค้างเกินเวลา", Job.FromExpression<CheckInJobStatusRepository>(x => x.MarkStaleJobsAsFailedAsync(30)), "*/15 * * * *",
|
||||
// new RecurringJobOptions
|
||||
// {
|
||||
// TimeZone = bangkokTimeZone,
|
||||
// QueueName = "leave"
|
||||
// });
|
||||
//
|
||||
// manager.AddOrUpdate("ประมวลผลงานที่ค้างอยู่ในสถานะ Pending หรือ Processing", Job.FromExpression<LeaveProcessJobStatusRepository>(x => x.ProcessPendingJobsAsync()), "0 3 * * *",
|
||||
// new RecurringJobOptions
|
||||
// {
|
||||
// TimeZone = bangkokTimeZone,
|
||||
// QueueName = "leave" // ← กำหนด queue
|
||||
// });
|
||||
}
|
||||
|
||||
// apply migrations
|
||||
|
|
|
|||
58
BMA.EHR.Leave/Services/NotificationService.cs
Normal file
58
BMA.EHR.Leave/Services/NotificationService.cs
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
|
||||
namespace BMA.EHR.Leave.Services;
|
||||
|
||||
public class NotificationService
|
||||
{
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly ILogger<NotificationService> _logger;
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
private const string NotifyEndpoint = "https://hrmsbkk.case-collection.com/api/v1/org/through-socket/notify-from-token";
|
||||
|
||||
public NotificationService(IHttpClientFactory httpClientFactory, ILogger<NotificationService> logger, IConfiguration configuration)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
_logger = logger;
|
||||
_configuration = configuration;
|
||||
}
|
||||
|
||||
public async Task SendNotificationAsync(string? token, bool error, string message)
|
||||
{
|
||||
if (string.IsNullOrEmpty(token))
|
||||
{
|
||||
_logger.LogWarning("Cannot send import notification: token is null or empty.");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var client = _httpClientFactory.CreateClient("default");
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
|
||||
var payload = new
|
||||
{
|
||||
error,
|
||||
message
|
||||
};
|
||||
|
||||
var json = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
||||
|
||||
var response = await client.PostAsync(NotifyEndpoint, content);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
var responseBody = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogWarning("Import notification failed with status {StatusCode}: {Body}", response.StatusCode, responseBody);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Failed to send import notification: {Message}", ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -23,15 +23,15 @@
|
|||
"ExamConnection": "Server=192.168.1.63;User ID=root;Password=12345678;Port=3306;Database=hrms_exam;Allow User Variables=True;Convert Zero Datetime=True;Pooling=True;",
|
||||
"LeaveConnection": "Server=192.168.1.63;User ID=root;Password=12345678;Port=3306;Database=hrms_leave;Allow User Variables=True;Convert Zero Datetime=True;Pooling=True;"
|
||||
|
||||
// "DefaultConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=3306;database=hrms;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;",
|
||||
// "ExamConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=3306;database=hrms_exam;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;",
|
||||
// "LeaveConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=3306;database=hrms_leave;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;"
|
||||
// "DefaultConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=13306;database=hrms;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;",
|
||||
// "ExamConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=13306;database=hrms_exam;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;",
|
||||
// "LeaveConnection": "server=127.0.0.1;user=root;password=ey2qVVyyqGYw8CyA7h8X72559r2Ad84K;port=13306;database=hrms_leave;Convert Zero Datetime=True;Allow User Variables=true;Pooling=True;Connection Timeout=180;"
|
||||
},
|
||||
"Jwt": {
|
||||
"Key": "j7C9RO_p4nRtuwCH4z9Db_A_6We42tkD_p4lZtDrezc",
|
||||
"Issuer": "https://hrmsbkk-id.case-collection.com/realms/hrms"
|
||||
// "Key": "xY2VR-EFvvNPsMs39u8ooVBWQL6mPwrNJOh3koJFTgU",
|
||||
// "Issuer": "https://hrms-id.bangkok.go.th/realms/hrms"
|
||||
// "Key": "xY2VR-EFvvNPsMs39u8ooVBWQL6mPwrNJOh3koJFTgU",
|
||||
// "Issuer": "https://hrms-id.bangkok.go.th/realms/hrms"
|
||||
},
|
||||
"EPPlus": {
|
||||
"ExcelPackage": {
|
||||
|
|
@ -43,6 +43,10 @@
|
|||
"AccessKey": "iwvzjyjgz0BKtLPmMpPu",
|
||||
"SecretKey": "Yv56vwctYdIspDknRJ46xztcBDzteGF3elZiDcAr",
|
||||
"BucketName": "hrms-fpt"
|
||||
// "Endpoint": "https://hrms-s3.bangkok.go.th/",
|
||||
// "AccessKey": "frappet",
|
||||
// "SecretKey": "FPTadmin2357",
|
||||
// "BucketName": "bma-ehr-fpt"
|
||||
},
|
||||
"Protocol": "HTTPS",
|
||||
"Node": {
|
||||
|
|
@ -54,11 +58,11 @@
|
|||
"Password": "12345678",
|
||||
"Queue": "hrms-checkin-queue-dev",
|
||||
"URL": "http://192.168.1.63:9122/api/queues/%2F/"
|
||||
// "Host": "172.27.17.68",
|
||||
// "User": "admin",
|
||||
// "Password": "admin123456",
|
||||
// "Queue": "hrms-checkin-queue",
|
||||
// "URL": "http://172.27.17.68:9122/api/queues/%2F/"
|
||||
// "Host": "172.27.17.68",
|
||||
// "User": "admin",
|
||||
// "Password": "admin123456",
|
||||
// "Queue": "hrms-checkin-queue",
|
||||
// "URL": "http://172.27.17.68:9122/api/queues/%2F/"
|
||||
},
|
||||
"Mail": {
|
||||
"Server": "mail.bangkok.go.th",
|
||||
|
|
@ -72,10 +76,10 @@
|
|||
"API": "https://hrmsbkk.case-collection.com/api/v1",
|
||||
"APIV2": "https://hrmsbkk.case-collection.com/api/v2",
|
||||
"VITE_URL_MGT": "https://hrmsbkk-mgt.case-collection.com",
|
||||
// "Domain": "https://hrms-exam.bangkok.go.th",
|
||||
// "APIPROBATION": "https://hrms.bangkok.go.th/api/v1/probation",
|
||||
// "API": "https://hrms.bangkok.go.th/api/v1",
|
||||
// "APIV2": "https://hrms.bangkok.go.th/api/v2",
|
||||
// "VITE_URL_MGT": "https://hrms-mgt.bangkok.go.th",
|
||||
// "Domain": "https://hrms.bangkok.go.th",
|
||||
// "APIPROBATION": "https://hrms.bangkok.go.th/api/v1/probation",
|
||||
// "API": "https://hrms.bangkok.go.th/api/v1",
|
||||
// "APIV2": "https://hrms.bangkok.go.th/api/v2",
|
||||
// "VITE_URL_MGT": "https://hrms-mgt.bangkok.go.th",
|
||||
"API_KEY": "fKRL16yyEgbyTEJdsMw2h64tGSCmkW685PRtM3CygzX1JOSdptT9UJtpgWwKM8FybRTJups3GTFwj27ZRvlPdIkv3XgCoVJaD5LmR06ozuEPvCCRSdp2WFthg08V5xHc56fTPfZLpr1VmXrhd6dvYhHIqKkQUJR02Rlkss11cLRWEQOssEFVA4xdu2J5DIRO1EM5m7wRRvEwcDB4mYRXD9HH52SMq6iYqUWEWsMwLdbk7QW9yYESUEuzMW5gWrb6vIeWZxJV5bTz1PcWUyR7eO9Fyw1F5DiQYc9JgzTC1mW7cv31fEtTtrfbJYKIb5EbWilqIEUKC6A0UKBDDek35ML0006cqRVm0pvdOH6jeq7VQyYrhdXe59dBEyhYGUIfozoVBvW7Up4QBuOMjyPjSqJPlMBKwaseptfrblxQV1AOOivSBpf1ZcQyOZ8JktRtKUDSuXsmG0lsXwFlI3JCeSHdpVdgZWFYcJPegqfrB6KotR02t9AVkpLs1ZWrixwz"
|
||||
}
|
||||
|
|
|
|||
BIN
BMA.EHR.Leave/wwwroot/blank.jpeg
Normal file
BIN
BMA.EHR.Leave/wwwroot/blank.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -554,7 +554,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementAppointment.positionAreaOld = org.result.positionArea;
|
||||
placementAppointment.PositionLevelOld = org.result.posLevelName;
|
||||
placementAppointment.PositionTypeOld = org.result.posTypeName;
|
||||
placementAppointment.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementAppointment.PositionNumberOld = org.result.posNo;
|
||||
placementAppointment.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -676,6 +676,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
uppdated.posMasterNo = req.posMasterNo;
|
||||
uppdated.position = req.positionName;
|
||||
uppdated.PositionExecutive = req.posExecutiveName;
|
||||
uppdated.posExecutiveId = req.posExecutiveId;
|
||||
uppdated.positionExecutiveField = req.positionExecutiveField;
|
||||
uppdated.positionArea = req.positionArea;
|
||||
uppdated.positionField = req.positionField;
|
||||
|
|
@ -1010,10 +1011,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionExecutive = p.PositionExecutive,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
positionTypeId = p.posTypeId,
|
||||
positionType = p.posTypeName,
|
||||
positionLevelId = p.posLevelId,
|
||||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -1222,10 +1227,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionExecutive = p.PositionExecutive,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
positionTypeId = p.posTypeId,
|
||||
positionType = p.posTypeName,
|
||||
positionLevelId = p.posLevelId,
|
||||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -1851,10 +1860,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionExecutive = p.PositionExecutive,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
positionTypeId = p.posTypeId,
|
||||
positionType = p.posTypeName,
|
||||
positionLevelId = p.posLevelId,
|
||||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -2016,6 +2029,8 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
|
|||
|
|
@ -542,7 +542,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementAppointment.positionOld = org.result.position;
|
||||
placementAppointment.PositionLevelOld = org.result.posLevelName;
|
||||
placementAppointment.PositionTypeOld = org.result.posTypeName;
|
||||
placementAppointment.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementAppointment.PositionNumberOld = org.result.posNo;
|
||||
placementAppointment.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
|
|||
|
|
@ -1065,6 +1065,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
person.positionId = req.positionId;
|
||||
person.posMasterNo = req.posMasterNo;
|
||||
person.positionName = req.positionName;
|
||||
person.posExecutiveId = req.posExecutiveId;
|
||||
person.PositionExecutive = req.posExecutiveName;
|
||||
person.positionExecutiveField = req.positionExecutiveField;
|
||||
person.positionArea = req.positionArea;
|
||||
|
|
@ -1453,6 +1454,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
profile.posTypeName = null;
|
||||
profile.posLevelId = null;
|
||||
profile.posLevelName = null;
|
||||
profile.PositionExecutive = null;
|
||||
profile.posExecutiveId = null;
|
||||
profile.positionArea = null;
|
||||
profile.positionExecutiveField = null;
|
||||
|
||||
// profile.PositionLevel = null;
|
||||
// profile.PositionType = null;
|
||||
|
|
@ -1810,16 +1815,27 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
[HttpPost("recruit/report/excecute")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportExecuteRecruit([FromBody] ReportExecuteRequest req)
|
||||
{
|
||||
Console.WriteLine($"[RecruitReportExcecute] Starting execution at {DateTime.Now}");
|
||||
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"[RecruitReportExcecute] Request received with {req?.refIds?.Length ?? 0} refIds");
|
||||
|
||||
var placementProfile = await _context.PlacementProfiles
|
||||
.Include(x => x.PlacementCertificates)
|
||||
.Include(x => x.PlacementEducations)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
Console.WriteLine($"[RecruitReportExcecute] Found {placementProfile?.Count ?? 0} placement profiles");
|
||||
|
||||
if (placementProfile == null)
|
||||
{
|
||||
Console.Error.WriteLine("[RecruitReportExcecute] PlacementProfile is null - returning NotFound");
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
Console.WriteLine("[RecruitReportExcecute] Building resultData from placement profiles and refIds");
|
||||
|
||||
var resultData = (from p in placementProfile
|
||||
join r in req.refIds
|
||||
|
|
@ -1936,7 +1952,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
bodyPosition = new
|
||||
{
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId
|
||||
positionId = p.positionId,
|
||||
positionName = p.positionName,
|
||||
positionField = p.positionField,
|
||||
posTypeId = p.posTypeId,
|
||||
posLevelId = p.posLevelId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
},
|
||||
bodyMarry = new
|
||||
{
|
||||
|
|
@ -1965,6 +1988,9 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
},
|
||||
}).ToList();
|
||||
|
||||
Console.WriteLine($"[RecruitReportExcecute] resultData built successfully with {resultData?.Count ?? 0} records");
|
||||
|
||||
Console.WriteLine($"[RecruitReportExcecute] Calling external API: {_configuration["API"]}/org/command/excexute/create-officer-profile");
|
||||
var apiUrl = $"{_configuration["API"]}/org/command/excexute/create-officer-profile";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
|
|
@ -1976,8 +2002,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
data = resultData
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
Console.WriteLine($"[RecruitReportExcecute] External API response status: {_res.StatusCode}");
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
Console.WriteLine("[RecruitReportExcecute] External API call successful - updating placement profiles");
|
||||
placementProfile.ForEach(profile =>
|
||||
{
|
||||
profile.PlacementStatus = "DONE";
|
||||
|
|
@ -1991,14 +2019,24 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
profile.templateDoc = req.refIds[0].remark;
|
||||
}
|
||||
});
|
||||
Console.WriteLine($"[RecruitReportExcecute] Saving changes to database for {placementProfile.Count} profiles");
|
||||
await _context.SaveChangesAsync();
|
||||
Console.WriteLine("[RecruitReportExcecute] Database save completed successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Error.WriteLine($"[RecruitReportExcecute] External API call failed with status: {_res.StatusCode}");
|
||||
Console.Error.WriteLine($"[RecruitReportExcecute] Response content: {_result}");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"[RecruitReportExcecute] Process completed successfully at {DateTime.Now}");
|
||||
return Success();
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine($"[RecruitReportExcecute] Error occurred: {ex.Message}");
|
||||
Console.Error.WriteLine($"[RecruitReportExcecute] Stack trace: {ex.StackTrace}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
|
@ -2160,8 +2198,11 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
[HttpPost("candidate/report/excecute")]
|
||||
public async Task<ActionResult<ResponseObject>> PostReportExecuteCandidate([FromBody] ReportExecuteRequest req)
|
||||
{
|
||||
Console.WriteLine($"[CandidateReportExcecute] Starting execution at {DateTime.Now}");
|
||||
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"[CandidateReportExcecute] Request received with {req?.refIds?.Length ?? 0} refIds");
|
||||
var placementProfile = await _context.PlacementProfiles
|
||||
.Include(x => x.PlacementCertificates)
|
||||
.Include(x => x.PlacementEducations)
|
||||
|
|
@ -2169,8 +2210,15 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
Console.WriteLine($"[CandidateReportExcecute] Found {placementProfile?.Count ?? 0} placement profiles");
|
||||
|
||||
if (placementProfile == null)
|
||||
{
|
||||
Console.Error.WriteLine("[CandidateReportExcecute] PlacementProfile is null - returning NotFound");
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
Console.WriteLine("[CandidateReportExcecute] Building resultData from placement profiles and refIds");
|
||||
|
||||
var resultData = (from p in placementProfile
|
||||
join r in req.refIds
|
||||
|
|
@ -2292,7 +2340,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
bodyPosition = new
|
||||
{
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId
|
||||
positionId = p.positionId,
|
||||
positionName = p.positionName,
|
||||
positionField = p.positionField,
|
||||
posTypeId = p.posTypeId,
|
||||
posLevelId = p.posLevelId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
},
|
||||
bodyMarry = new
|
||||
{
|
||||
|
|
@ -2321,6 +2376,9 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
},
|
||||
}).ToList();
|
||||
|
||||
Console.WriteLine($"[CandidateReportExcecute] resultData built successfully with {resultData?.Count ?? 0} records");
|
||||
|
||||
Console.WriteLine($"[CandidateReportExcecute] Calling external API: {_configuration["API"]}/org/command/excexute/create-officer-profile");
|
||||
var apiUrl = $"{_configuration["API"]}/org/command/excexute/create-officer-profile";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
|
|
@ -2332,8 +2390,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
data = resultData
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
Console.WriteLine($"[CandidateReportExcecute] External API response status: {_res.StatusCode}");
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
Console.WriteLine("[CandidateReportExcecute] External API call successful - updating placement profiles");
|
||||
placementProfile.ForEach(profile =>
|
||||
{
|
||||
profile.PlacementStatus = "DONE";
|
||||
|
|
@ -2347,17 +2407,27 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
profile.templateDoc = req.refIds[0].remark;
|
||||
}
|
||||
});
|
||||
Console.WriteLine($"[CandidateReportExcecute] Saving changes to database for {placementProfile.Count} profiles");
|
||||
await _context.SaveChangesAsync();
|
||||
Console.WriteLine("[CandidateReportExcecute] Database save completed successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Error.WriteLine($"[CandidateReportExcecute] External API call failed with status: {_res.StatusCode}");
|
||||
Console.Error.WriteLine($"[CandidateReportExcecute] Response content: {_result}");
|
||||
}
|
||||
}
|
||||
|
||||
// // update placementstatus
|
||||
// placementProfile.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
// await _context.SaveChangesAsync();
|
||||
Console.WriteLine($"[CandidateReportExcecute] Process completed successfully at {DateTime.Now}");
|
||||
return Success();
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine($"[CandidateReportExcecute] Error occurred: {ex.Message}");
|
||||
Console.Error.WriteLine($"[CandidateReportExcecute] Stack trace: {ex.StackTrace}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
|
@ -2541,6 +2611,11 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementProfiles
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -2554,10 +2629,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionExecutive = p.PositionExecutive,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
positionTypeId = p.posTypeId,
|
||||
positionType = p.posTypeName,
|
||||
positionLevelId = p.posLevelId,
|
||||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -2590,12 +2669,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2777,6 +2856,11 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementProfiles
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -2790,10 +2874,14 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionExecutive = p.PositionExecutive,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
positionTypeId = p.posTypeId,
|
||||
positionType = p.posTypeName,
|
||||
positionLevelId = p.posLevelId,
|
||||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -2826,12 +2914,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2998,6 +3086,11 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementProfiles
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -3015,6 +3108,8 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
positionLevel = p.posLevelName,
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
commandId = r.commandId,
|
||||
orgRoot = p.root,
|
||||
orgChild1 = p.child1,
|
||||
|
|
@ -3047,12 +3142,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// data.ForEach(profile => profile.PlacementStatus = "DONE");
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
p.child4OldId,
|
||||
p.child4ShortNameOld,
|
||||
p.PositionOld,
|
||||
p.PositionNumberOld,
|
||||
p.PositionExecutiveOld,
|
||||
p.positionExecutiveFieldOld,
|
||||
p.positionAreaOld,
|
||||
|
|
@ -493,7 +494,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementOfficer.positionAreaOld = org.result.positionArea;
|
||||
placementOfficer.PositionLevelOld = org.result.posLevelName;
|
||||
placementOfficer.PositionTypeOld = org.result.posTypeName;
|
||||
placementOfficer.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementOfficer.PositionNumberOld = org.result.posNo;
|
||||
placementOfficer.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -758,6 +759,17 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementOfficers
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
var firstRef = req.refIds.FirstOrDefault();
|
||||
var commandNoText = firstRef != null ? $"{firstRef.commandNo}/{firstRef.commandYear.ToThaiYear()}" : null;
|
||||
foreach (var profile in data)
|
||||
{
|
||||
profile.Status = "DONE";
|
||||
profile.commandNo = commandNoText;
|
||||
}
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -809,17 +821,16 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
//data.ForEach(profile => profile.Status = "DONE");
|
||||
foreach (var profile in data)
|
||||
{
|
||||
profile.Status = "DONE";
|
||||
profile.commandNo = resultData.Count > 0 ? $"{resultData[0].commandNo}/{resultData[0].commandYear.ToThaiYear()}" : null;
|
||||
}
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
//// var _result = await _res.Content.ReadAsStringAsync();
|
||||
//// if (_res.IsSuccessStatusCode)
|
||||
//// {
|
||||
//// foreach (var profile in data)
|
||||
//// {
|
||||
//// profile.Status = "DONE";
|
||||
//// profile.commandNo = resultData.Count > 0 ? $"{resultData[0].commandNo}/{resultData[0].commandYear.ToThaiYear()}" : null;
|
||||
//// }
|
||||
//// await _context.SaveChangesAsync();
|
||||
//// }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
p.Id,
|
||||
p.prefix,
|
||||
p.rank,
|
||||
p.firstName,
|
||||
p.lastName,
|
||||
p.citizenId,
|
||||
|
|
@ -280,6 +281,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
// ProfileId = p.Profile.Id,
|
||||
p.citizenId,
|
||||
p.prefix,
|
||||
p.rank,
|
||||
p.firstName,
|
||||
p.lastName,
|
||||
p.DateOfBirth,
|
||||
|
|
@ -377,6 +379,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
// data.ProfileId,
|
||||
data.citizenId,
|
||||
data.prefix,
|
||||
data.rank,
|
||||
data.firstName,
|
||||
data.lastName,
|
||||
data.DateOfBirth,
|
||||
|
|
@ -484,6 +487,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
// Profile = profile,
|
||||
citizenId = req.citizenId,
|
||||
prefix = req.prefix,
|
||||
rank = req.rank,
|
||||
firstName = req.firstName,
|
||||
lastName = req.lastName,
|
||||
DateOfBirth = req.BirthDate,
|
||||
|
|
@ -510,9 +514,8 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
|
||||
client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
|
||||
|
||||
Console.Write($"[PlacementReceiveController] Check-Citizen API-Key : {_configuration["API_KEY"]}");
|
||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
||||
var _res = await client.PostAsJsonAsync(apiUrlCheckCitizen, new
|
||||
|
||||
{
|
||||
|
|
@ -537,6 +540,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
using (var client = new HttpClient())
|
||||
{
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
Console.Write("[PlacementReceiveController] Check-Position");
|
||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
||||
var _res = await client.SendAsync(_req);
|
||||
|
|
@ -586,7 +590,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementReceive.positionAreaOld = org.result.positionArea;
|
||||
placementReceive.PositionLevelOld = org.result.posLevelName;
|
||||
placementReceive.PositionTypeOld = org.result.posTypeName;
|
||||
placementReceive.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementReceive.PositionNumberOld = org.result.posNo;
|
||||
placementReceive.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -778,6 +782,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
uppdated.posMasterNo = req.posMasterNo;
|
||||
uppdated.position = req.positionName;
|
||||
uppdated.PositionExecutive = req.posExecutiveName;
|
||||
uppdated.posExecutiveId = req.posExecutiveId;
|
||||
uppdated.positionExecutiveField = req.positionExecutiveField;
|
||||
uppdated.positionArea = req.positionArea;
|
||||
uppdated.positionField = req.positionField;
|
||||
|
|
@ -826,7 +831,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
|
||||
client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
|
||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
||||
|
||||
var _res = await client.PostAsJsonAsync(apiUrlCheckCitizen, new
|
||||
|
||||
|
|
@ -852,6 +857,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
uppdated.Gender = req.Gender;
|
||||
uppdated.citizenId = req.citizenId;
|
||||
uppdated.prefix = req.prefix;
|
||||
uppdated.rank = req.rank;
|
||||
uppdated.firstName = req.firstName;
|
||||
uppdated.lastName = req.lastName;
|
||||
uppdated.DateOfBirth = req.DateOfBirth;
|
||||
|
|
@ -917,6 +923,61 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// API ลบรายการรับโอน (ADMIN)
|
||||
/// </summary>
|
||||
/// <param name="id">Id รับโอน</param>
|
||||
/// <returns></returns>
|
||||
/// <response code="200"></response>
|
||||
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpDelete("admin/{id:length(36)}")]
|
||||
public async Task<ActionResult<ResponseObject>> DeleteForAdminAsync(Guid id)
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("DELETE", "SYS_TRANSFER_RECEIVE");
|
||||
if (jsonData!.status != 200)
|
||||
{
|
||||
return Error(jsonData.message, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
// ตรวจสอบว่า role ต้องเป็น OWNER เท่านั้น
|
||||
if (jsonData.result.privilege != "OWNER")
|
||||
{
|
||||
return Error("ไม่มีสิทธิ์ในการลบรายการรับโอน", StatusCodes.Status403Forbidden);
|
||||
}
|
||||
var deleted = await _context.PlacementReceives.AsQueryable()
|
||||
.Include(x => x.PlacementReceiveDocs)
|
||||
.ThenInclude(x => x.Document)
|
||||
.FirstOrDefaultAsync(x => x.Id == id);
|
||||
if (deleted == null)
|
||||
return NotFound();
|
||||
|
||||
// ห้ามลบเฉพาะสถานะ REPORT, WAITING, DONE
|
||||
if (new[] { "REPORT", "WAITING", "DONE" }.Contains(deleted.Status))
|
||||
{
|
||||
return Error("ไม่สามารถลบรายการรับโอนสถานะนี้ได้");
|
||||
}
|
||||
|
||||
var placementReceiveDocs = new List<dynamic>();
|
||||
foreach (var doc in deleted.PlacementReceiveDocs)
|
||||
{
|
||||
if (doc.Document != null)
|
||||
placementReceiveDocs.Add(doc.Document.Id);
|
||||
}
|
||||
_context.PlacementReceiveDocs.RemoveRange(deleted.PlacementReceiveDocs);
|
||||
await _context.SaveChangesAsync();
|
||||
_context.PlacementReceives.Remove(deleted);
|
||||
foreach (var doc in placementReceiveDocs)
|
||||
{
|
||||
if (doc != null)
|
||||
await _documentService.DeleteFileAsync(doc);
|
||||
}
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
return Success();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// สั่งรายชื่อไปออกคำสั่ง
|
||||
/// </summary>
|
||||
|
|
@ -1124,6 +1185,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
.Include(x => x.Avatar)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1131,7 +1196,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
bodyProfile = new
|
||||
{
|
||||
rank = string.Empty,
|
||||
rank = string.IsNullOrEmpty(p.rank) ? string.Empty : p.rank,
|
||||
prefix = p.prefix == null ? string.Empty : p.prefix,
|
||||
firstName = p.firstName == null ? string.Empty : p.firstName,
|
||||
lastName = p.lastName == null ? string.Empty : p.lastName,
|
||||
|
|
@ -1207,13 +1272,19 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
},
|
||||
bodyPosition = new
|
||||
{
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId
|
||||
posmasterId = p.posmasterId,
|
||||
positionId = p.positionId,
|
||||
positionName = p.position,
|
||||
positionField = p.positionField,
|
||||
posTypeId = p.posTypeId,
|
||||
posLevelId = p.posLevelId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionExecutiveField = p.positionExecutiveField,
|
||||
positionArea = p.positionArea,
|
||||
}
|
||||
}).ToList();
|
||||
|
||||
var baseAPIOrg = _configuration["API"];
|
||||
//var apiUrlOrg = $"{baseAPIOrg}/org/command/excexute/salary-current";
|
||||
var apiUrlOrg = $"{_configuration["API"]}/org/command/excexute/create-officer-profile";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
|
|
@ -1223,12 +1294,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -374,7 +374,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementRepatriation.positionAreaOld = org.result.positionArea;
|
||||
placementRepatriation.PositionLevelOld = org.result.posLevelName;
|
||||
placementRepatriation.PositionTypeOld = org.result.posTypeName;
|
||||
placementRepatriation.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementRepatriation.PositionNumberOld = org.result.posNo;
|
||||
placementRepatriation.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -623,6 +623,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementRepatriations
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -675,12 +679,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -764,7 +764,7 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
placementTransfer.positionAreaOld = org.result.positionArea;
|
||||
placementTransfer.PositionLevelOld = org.result.posLevelName;
|
||||
placementTransfer.PositionTypeOld = org.result.posTypeName;
|
||||
placementTransfer.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
placementTransfer.PositionNumberOld = org.result.posNo;
|
||||
placementTransfer.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -932,6 +932,60 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// API ลบรายการคำขอโอน (ADMIN)
|
||||
/// </summary>
|
||||
/// <param name="id">Id คำขอโอน</param>
|
||||
/// <returns></returns>
|
||||
/// <response code="200"></response>
|
||||
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpDelete("admin/{id:length(36)}")]
|
||||
public async Task<ActionResult<ResponseObject>> DeleteForAdminAsync(Guid id)
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("DELETE", "SYS_TRANSFER_REQ");
|
||||
if (jsonData!.status != 200)
|
||||
{
|
||||
return Error(jsonData.message, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
// ตรวจสอบว่า role ต้องเป็น OWNER เท่านั้น
|
||||
if (jsonData.result.privilege != "OWNER")
|
||||
{
|
||||
return Error("ไม่มีสิทธิ์ในการลบรายการคำขอโอน", StatusCodes.Status403Forbidden);
|
||||
}
|
||||
var deleted = await _context.PlacementTransfers.AsQueryable()
|
||||
.Include(x => x.PlacementTransferDocs)
|
||||
.ThenInclude(x => x.Document)
|
||||
.FirstOrDefaultAsync(x => x.Id == id);
|
||||
if (deleted == null)
|
||||
return NotFound();
|
||||
|
||||
// ห้ามลบเฉพาะสถานะ REPORT, WAITING, DONE
|
||||
if (new[] { "REPORT", "WAITING", "DONE" }.Contains(deleted.Status))
|
||||
{
|
||||
return Error("ไม่สามารถลบรายการคำขอโอนสถานะนี้ได้");
|
||||
}
|
||||
|
||||
var placementTransferDocs = new List<dynamic>();
|
||||
foreach (var doc in deleted.PlacementTransferDocs)
|
||||
{
|
||||
if (doc.Document != null)
|
||||
placementTransferDocs.Add(doc.Document.Id);
|
||||
}
|
||||
_context.PlacementTransferDocs.RemoveRange(deleted.PlacementTransferDocs);
|
||||
await _context.SaveChangesAsync();
|
||||
_context.PlacementTransfers.Remove(deleted);
|
||||
foreach (var doc in placementTransferDocs)
|
||||
{
|
||||
if (doc != null)
|
||||
await _documentService.DeleteFileAsync(doc);
|
||||
}
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// สั่งรายชื่อไปออกคำสั่ง
|
||||
/// </summary>
|
||||
|
|
@ -1094,6 +1148,10 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
var data = await _context.PlacementTransfers
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -1146,12 +1204,12 @@ namespace BMA.EHR.Placement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ using System.Text;
|
|||
using System.Transactions;
|
||||
using BMA.EHR.Placement.Service.Filters;
|
||||
using BMA.EHR.Application.Repositories.Reports;
|
||||
using BMA.EHR.Application.Repositories;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
{
|
||||
|
|
@ -164,6 +165,8 @@ var app = builder.Build();
|
|||
if (manager != null)
|
||||
{
|
||||
manager.AddOrUpdate("แจ้งเตือนระบบทดลองงาน", Job.FromExpression<ProbationReportRepository>(x => x.NotifyProbation()), Cron.Daily(Int32.Parse(builder.Configuration["KeycloakCron:Hour"]), Int32.Parse(builder.Configuration["KeycloakCron:Minute"])), TimeZoneInfo.Local);
|
||||
// Job: อัพเดทสถานะผู้สอบผ่านที่ลาออกไปแล้วแต่ยังไม่ส่งไปออกคำสั่ง ทำงานทุกวันเวลา 05:00 น.
|
||||
manager.AddOrUpdate("ประมวลผลข้าราชการฯ กทม.", Job.FromExpression<PlacementRepository>(x => x.UpdateStatusPlacementProfiles()), Cron.Daily(5), TimeZoneInfo.Local);
|
||||
}
|
||||
|
||||
// apply migrations
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public double? Amount { get; set; }
|
||||
public string? avatarUrl { get; set; }
|
||||
public bool? isDeputy { get; set; }
|
||||
public string? posNo { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -30,6 +30,7 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public string? posLevelName { get; set; }
|
||||
public string? typeCommand { get; set; }
|
||||
public string? posExecutiveName { get; set; }
|
||||
public string? posExecutiveId { get; set; }
|
||||
public string? positionExecutiveField { get; set; }
|
||||
public string? positionArea { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public string? posLevelName { get; set; }
|
||||
public string? typeCommand { get; set; }
|
||||
public string? posExecutiveName { get; set; }
|
||||
public string? posExecutiveId { get; set; }
|
||||
public string? positionExecutiveField { get; set; }
|
||||
public string? positionArea { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public string? posLevelName { get; set; }
|
||||
public string? typeCommand { get; set; }
|
||||
public string? posExecutiveName { get; set; }
|
||||
public string? posExecutiveId { get; set; }
|
||||
public string? positionExecutiveField { get; set; }
|
||||
public string? positionArea { get; set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public class PlacementReceiveEditRequest
|
||||
{
|
||||
public string citizenId { get; set; }
|
||||
public string prefix { get; set; }
|
||||
public string? prefix { get; set; }
|
||||
public string? rank { get; set; }
|
||||
public string firstName { get; set; }
|
||||
public string lastName { get; set; }
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ namespace BMA.EHR.Placement.Service.Requests
|
|||
public class PlacementReceiveRequest
|
||||
{
|
||||
public string citizenId { get; set; }
|
||||
public string prefix { get; set; }
|
||||
|
||||
public string? prefix { get; set; }
|
||||
public string? rank { get; set; }
|
||||
public string firstName { get; set; }
|
||||
public string lastName { get; set; }
|
||||
public DateTime BirthDate { get; set; }
|
||||
|
|
|
|||
|
|
@ -448,7 +448,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
retirementOther.positionAreaOld = org.result.positionArea;
|
||||
retirementOther.PositionLevelOld = org.result.posLevelName;
|
||||
retirementOther.PositionTypeOld = org.result.posTypeName;
|
||||
retirementOther.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
retirementOther.PositionNumberOld = org.result.posNo;
|
||||
retirementOther.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -569,6 +569,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
uppdated.positionId = req.positionId;
|
||||
uppdated.posMasterNo = req.posMasterNo;
|
||||
uppdated.position = req.positionName;
|
||||
uppdated.posExecutiveId = req.posExecutiveId;
|
||||
uppdated.PositionExecutive = req.posExecutiveName;
|
||||
uppdated.positionExecutiveField = req.positionExecutiveField;
|
||||
uppdated.positionArea = req.positionArea;
|
||||
|
|
@ -845,6 +846,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
var data = await _context.RetirementOthers
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -885,6 +890,9 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
commandCode = r.commandCode,
|
||||
commandName = r.commandName,
|
||||
remark = r.remark,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
positionTypeNew = p.posTypeId,
|
||||
positionLevelNew = p.posLevelId,
|
||||
positionNameNew = p.position,
|
||||
|
|
@ -914,12 +922,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -1090,6 +1098,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
var data = await _context.RetirementOthers
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -1130,6 +1142,9 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
commandCode = r.commandCode,
|
||||
commandName = r.commandName,
|
||||
remark = r.remark,
|
||||
positionId = p.positionId,
|
||||
posExecutiveId = p.posExecutiveId,
|
||||
positionField = p.positionField,
|
||||
positionTypeNew = p.posTypeId,
|
||||
positionLevelNew = p.posLevelId,
|
||||
positionNameNew = p.position,
|
||||
|
|
@ -1159,12 +1174,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -642,6 +642,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
var data = await _context.RetirementOuts
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -701,12 +705,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Error("ไม่พบหน่วยงานของผู้ใช้งานคนนี้", 404);
|
||||
|
||||
var retirementResigns = await _context.RetirementResigns.AsQueryable()
|
||||
.Where(x => x.profileId == org.result.profileId)
|
||||
.Where(x => x.Status != "DELETE" && x.profileId == org.result.profileId)
|
||||
.OrderByDescending(x => x.CreatedAt)
|
||||
.Select(p => new
|
||||
{
|
||||
|
|
@ -1290,7 +1290,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
retirementResign.positionAreaOld = org.result.positionArea;
|
||||
retirementResign.PositionLevelOld = org.result.posLevelName;
|
||||
retirementResign.PositionTypeOld = org.result.posTypeName;
|
||||
retirementResign.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
retirementResign.PositionNumberOld = org.result.posNo;
|
||||
retirementResign.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -1439,7 +1439,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
retirementResign.positionAreaOld = org.result.positionArea;
|
||||
retirementResign.PositionLevelOld = org.result.posLevelName;
|
||||
retirementResign.PositionTypeOld = org.result.posTypeName;
|
||||
retirementResign.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
retirementResign.PositionNumberOld = org.result.posNo;
|
||||
retirementResign.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -1456,10 +1456,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
else if ((retirementResign.posTypeNameOld == "ทั่วไป" && retirementResign.posLevelNameOld == "อาวุโส") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "ชำนาญการพิเศษ") || (retirementResign.posTypeNameOld == "อำนวยการ" && retirementResign.posLevelNameOld == "ต้น"))
|
||||
{
|
||||
retirementResign.Group = "1.2";
|
||||
retirementResign.ApproveStep = "st3";
|
||||
}
|
||||
else if ((retirementResign.posTypeNameOld == "ทั่วไป" && retirementResign.posLevelNameOld == "ทักษะพิเศษ") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "เชี่ยวชาญ") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "ทรงคุณวุฒิ") || (retirementResign.posTypeNameOld == "อำนวยการ" && retirementResign.posLevelNameOld == "สูง") || (retirementResign.posTypeNameOld == "บริหาร" && retirementResign.posLevelNameOld == "ต้น") || (retirementResign.posTypeNameOld == "บริหาร" && retirementResign.posLevelNameOld == "สูง"))
|
||||
{
|
||||
retirementResign.Group = "2";
|
||||
retirementResign.ApproveStep = "st3";
|
||||
}
|
||||
}
|
||||
await _context.RetirementResigns.AddAsync(retirementResign);
|
||||
|
|
@ -1511,7 +1513,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Error(GlobalMessages.RetirementResignNotFound, 404);
|
||||
|
||||
updated.Location = req.Location;
|
||||
updated.ActiveDate = req.ActiveDate;
|
||||
if (req.SendDate != null)
|
||||
{
|
||||
updated.SendDate = req.SendDate;
|
||||
}
|
||||
// updated.Reason = req.Reason;
|
||||
updated.Remark = req.Remark;
|
||||
updated.ReasonResign = req.Reason;
|
||||
|
|
@ -1809,6 +1814,47 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// API ลบรายการลาออก (ADMIN)
|
||||
/// </summary>
|
||||
/// <param name="id">Id ลาออก</param>
|
||||
/// <returns></returns>
|
||||
/// <response code="200"></response>
|
||||
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpDelete("admin/{id:length(36)}")]
|
||||
public async Task<ActionResult<ResponseObject>> DeleteForAdminAsync(Guid id)
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("DELETE", "SYS_RESIGN");
|
||||
if (jsonData!.status != 200)
|
||||
{
|
||||
return Error(jsonData.message, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
// ตรวจสอบว่า role ต้องเป็น OWNER เท่านั้น
|
||||
if (jsonData.result.privilege != "OWNER")
|
||||
{
|
||||
return Error("ไม่มีสิทธิ์ในการลบรายการลาออก", StatusCodes.Status403Forbidden);
|
||||
}
|
||||
var deleted = await _context.RetirementResigns.AsQueryable()
|
||||
.FirstOrDefaultAsync(x => x.Id == id);
|
||||
if (deleted == null)
|
||||
return Error(GlobalMessages.RetirementResignNotFound, 404);
|
||||
|
||||
// ห้ามลบเฉพาะสถานะ REPORT, WAITING, DONE, CANCELING, CANCEL
|
||||
if (new[] { "REPORT", "WAITING", "DONE", "CANCELING", "CANCEL" }.Contains(deleted.Status))
|
||||
{
|
||||
return Error("ไม่สามารถลบรายการลาออกสถานะนี้ได้");
|
||||
}
|
||||
|
||||
deleted.Status = "DELETE";
|
||||
deleted.LastUpdateFullName = FullName ?? "System Administrator";
|
||||
deleted.LastUpdateUserId = UserId ?? "";
|
||||
deleted.LastUpdatedAt = DateTime.Now;
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// อนุมัติคำลาออก
|
||||
/// </summary>
|
||||
|
|
@ -2861,6 +2907,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
var data = await _context.RetirementResigns
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -2915,12 +2965,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -3060,6 +3110,11 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
.Include(x => x.RetirementResign)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
data.ForEach(profile => profile.RetirementResign.Status = "CANCEL");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -3120,13 +3175,13 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
data.ForEach(profile => profile.RetirementResign.Status = "CANCEL");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // data.ForEach(profile => profile.RetirementResign.Status = "CANCEL");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
//}
|
||||
//else
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Error("ไม่พบหน่วยงานของผู้ใช้งานคนนี้", 404);
|
||||
|
||||
var retirementResignEmployees = await _context.RetirementResignEmployees.AsQueryable()
|
||||
.Where(x => x.profileId == org.result.profileId)
|
||||
.Where(x => x.Status != "DELETE" && x.profileId == org.result.profileId)
|
||||
.OrderByDescending(x => x.CreatedAt)
|
||||
.Select(p => new
|
||||
{
|
||||
|
|
@ -1227,7 +1227,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
retirementResignEmployee.PositionOld = org.result.position;
|
||||
retirementResignEmployee.PositionLevelOld = org.result.posLevelName;
|
||||
retirementResignEmployee.PositionTypeOld = org.result.posTypeName;
|
||||
retirementResignEmployee.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
retirementResignEmployee.PositionNumberOld = org.result.posNo;
|
||||
retirementResignEmployee.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -1381,7 +1381,7 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
retirementResignEmployee.PositionOld = org.result.position;
|
||||
retirementResignEmployee.PositionLevelOld = org.result.posLevelName;
|
||||
retirementResignEmployee.PositionTypeOld = org.result.posTypeName;
|
||||
retirementResignEmployee.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
|
||||
retirementResignEmployee.PositionNumberOld = org.result.posNo;
|
||||
retirementResignEmployee.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") +
|
||||
(org.result.child3 == null ? "" : org.result.child3 + "\n") +
|
||||
(org.result.child2 == null ? "" : org.result.child2 + "\n") +
|
||||
|
|
@ -1450,7 +1450,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Error(GlobalMessages.RetirementResignEmployeeNotFound, 404);
|
||||
|
||||
updated.Location = req.Location;
|
||||
updated.ActiveDate = req.ActiveDate;
|
||||
if (req.SendDate != null)
|
||||
{
|
||||
updated.SendDate = req.SendDate;
|
||||
}
|
||||
// updated.Reason = req.Reason;
|
||||
updated.Remark = req.Remark;
|
||||
updated.ReasonResign = req.Reason;
|
||||
|
|
@ -1719,6 +1722,47 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// API ลบรายการลาออกลูกจ้าง (ADMIN)
|
||||
/// </summary>
|
||||
/// <param name="id">Id ลาออก</param>
|
||||
/// <returns></returns>
|
||||
/// <response code="200"></response>
|
||||
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
|
||||
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||
[HttpDelete("admin/{id:length(36)}")]
|
||||
public async Task<ActionResult<ResponseObject>> DeleteForAdminAsync(Guid id)
|
||||
{
|
||||
var jsonData = await _permission.GetPermissionWithActingAPIAsync("DELETE", "SYS_RESIGN_EMP");
|
||||
if (jsonData!.status != 200)
|
||||
{
|
||||
return Error(jsonData.message, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
// ตรวจสอบว่า role ต้องเป็น OWNER เท่านั้น
|
||||
if (jsonData.result.privilege != "OWNER")
|
||||
{
|
||||
return Error("ไม่มีสิทธิ์ในการลบรายการลาออกลูกจ้าง", StatusCodes.Status403Forbidden);
|
||||
}
|
||||
var deleted = await _context.RetirementResignEmployees.AsQueryable()
|
||||
.FirstOrDefaultAsync(x => x.Id == id);
|
||||
if (deleted == null)
|
||||
return Error(GlobalMessages.RetirementResignEmployeeNotFound, 404);
|
||||
|
||||
// ห้ามลบเฉพาะสถานะ REPORT, WAITING, DONE, CANCELING, CANCEL
|
||||
if (new[] { "REPORT", "WAITING", "DONE", "CANCELING", "CANCEL" }.Contains(deleted.Status))
|
||||
{
|
||||
return Error("ไม่สามารถลบรายการลาออกลูกจ้างสถานะนี้ได้");
|
||||
}
|
||||
|
||||
deleted.Status = "DELETE";
|
||||
deleted.LastUpdateFullName = FullName ?? "System Administrator";
|
||||
deleted.LastUpdateUserId = UserId ?? "";
|
||||
deleted.LastUpdatedAt = DateTime.Now;
|
||||
await _context.SaveChangesAsync();
|
||||
return Success();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// อนุมัติคำลาออก
|
||||
/// </summary>
|
||||
|
|
@ -2361,6 +2405,10 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
var data = await _context.RetirementResignEmployees
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
on p.Id.ToString() equals r.refId
|
||||
|
|
@ -2413,12 +2461,12 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
return Success();
|
||||
}
|
||||
|
|
@ -2556,6 +2604,11 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
.Include(x => x.RetirementResignEmployee)
|
||||
.Where(x => req.refIds.Select(x => x.refId).Contains(x.Id.ToString()))
|
||||
.ToListAsync();
|
||||
// Task #224 ปรับให้เป็น process ที่ควรบันทึกตามลำดับ
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
data.ForEach(profile => profile.RetirementResignEmployee.Status = "CANCEL");
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
string? _null = null;
|
||||
var resultData = (from p in data
|
||||
join r in req.refIds
|
||||
|
|
@ -2615,13 +2668,13 @@ namespace BMA.EHR.Retirement.Service.Controllers
|
|||
{
|
||||
data = resultData,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
if (_res.IsSuccessStatusCode)
|
||||
{
|
||||
data.ForEach(profile => profile.Status = "DONE");
|
||||
data.ForEach(profile => profile.RetirementResignEmployee.Status = "CANCEL");
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
// // var _result = await _res.Content.ReadAsStringAsync();
|
||||
// // if (_res.IsSuccessStatusCode)
|
||||
// // {
|
||||
// // data.ForEach(profile => profile.Status = "DONE");
|
||||
// // data.ForEach(profile => profile.RetirementResignEmployee.Status = "CANCEL");
|
||||
// // await _context.SaveChangesAsync();
|
||||
// // }
|
||||
}
|
||||
//}
|
||||
//else
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ namespace BMA.EHR.Retirement.Service.Requests
|
|||
public string? posLevelId { get; set; }
|
||||
public string? posLevelName { get; set; }
|
||||
public string? typeCommand { get; set; }
|
||||
public string? posExecutiveId { get; set; }
|
||||
public string? posExecutiveName { get; set; }
|
||||
public string? positionExecutiveField { get; set; }
|
||||
public string? positionArea { get; set; }
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ namespace BMA.EHR.Retirement.Service.Requests
|
|||
public class RetirementResignEmployeeRequest
|
||||
{
|
||||
public string? Location { get; set; }
|
||||
// public DateTime? SendDate { get; set; }
|
||||
public DateTime? SendDate { get; set; }
|
||||
public DateTime? ActiveDate { get; set; }
|
||||
public string? Reason { get; set; }
|
||||
public string? Remark { get; set; }
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ namespace BMA.EHR.Retirement.Service.Requests
|
|||
public class RetirementResignRequest
|
||||
{
|
||||
public string? Location { get; set; }
|
||||
// public DateTime? SendDate { get; set; }
|
||||
public DateTime? SendDate { get; set; }
|
||||
public DateTime? ActiveDate { get; set; }
|
||||
public string? Reason { get; set; }
|
||||
public string? Remark { get; set; }
|
||||
|
|
|
|||
210
README.md
Normal file
210
README.md
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
# BMA.EHR - HRMS API Backend
|
||||
|
||||
ระบบบริหารจัดการทรัพยากรบุคคล (Human Resource Management System) พัฒนาด้วยสถาปัตยกรรม Microservices บน .NET
|
||||
|
||||
---
|
||||
|
||||
## Tech Stack
|
||||
|
||||
| Category | Technology |
|
||||
| ----------------- | ----------------------------- |
|
||||
| Framework | .NET 6.0 / 7.0 / 8.0 |
|
||||
| Architecture | Clean Architecture, DDD, CQRS |
|
||||
| Database | MySQL (Entity Framework Core) |
|
||||
| Authentication | JWT + Keycloak |
|
||||
| Message Queue | RabbitMQ |
|
||||
| Object Storage | MinIO |
|
||||
| Background Jobs | Hangfire |
|
||||
| Logging | Serilog + Elasticsearch |
|
||||
| Error Tracking | Sentry |
|
||||
| API Documentation | Swagger / OpenAPI |
|
||||
| Containerization | Docker |
|
||||
| Testing | xUnit, k6 (Load Testing) |
|
||||
|
||||
---
|
||||
|
||||
## โครงสร้างโปรเจกต์ (Project Structure)
|
||||
|
||||
```
|
||||
BMA.EHR.Solution.sln
|
||||
├── src/ # Core Libraries
|
||||
│ ├── BMA.EHR.Domain/ # Domain layer (Entities, Business Rules)
|
||||
│ ├── BMA.EHR.Application/ # Application layer (Use Cases, Interfaces)
|
||||
│ └── BMA.EHR.Infrastructure/ # Infrastructure layer (Data Access, External Services)
|
||||
│
|
||||
└── Service/ # Microservices
|
||||
├── BMA.EHR.Command.Service/ # Command/CQRS API Gateway
|
||||
├── BMA.EHR.MetaData.Service/ # ข้อมูลอ้างอิง (คำนำหน้า, หมู่เลือด, ศาสนา ฯลฯ)
|
||||
├── BMA.EHR.Placement.Service/ # การบริจาค/สั่งย้าย/แต่งตั้ง
|
||||
├── BMA.EHR.OrganizationEmployee.Service/ # โครงสร้างองค์กรและบุคลากร
|
||||
├── BMA.EHR.Discipline.Service/ # การ discipline บุคลากร
|
||||
├── BMA.EHR.Retirement.Service/ # การเกษียณอายุราชการ
|
||||
├── BMA.EHR.Report.Service/ # รายงาน
|
||||
├── BMA.EHR.Insignia/ # เครื่องราชอิสริยาภรณ์
|
||||
├── BMA.EHR.Leave/ # ระบบลา
|
||||
└── BMA.EHR.CheckInConsumer/ # ลงเวลาปฏิบัติงาน
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## โมดูลหลัก (Key Modules)
|
||||
|
||||
### การบริหารทรัพยากรบุคคล
|
||||
|
||||
- **Placement Service** - สั่งย้าย, แต่งตั้ง, เลื่อนตำแหน่ง, โอนย้ายบุคลากร
|
||||
- **Organization Employee Service** - จัดการโครงสร้างองค์กร, ตำแหน่ง, ข้อมูลบุคลากร
|
||||
- **Leave Service** - การลางาน, การอนุมัติ, วันหยุดนักขัตฤกษ์, ยอดวันลาคงเหลือ
|
||||
- **Discipline Service** - การดำเนินการ discipline, การสืบสวน, เอกสารที่เกี่ยวข้อง
|
||||
- **Retirement Service** - การเกษียณอายุ, เอกสาร, สิทธิประโยชน์
|
||||
- **Insignia Service** - เครื่องราชอิสริยาภรณ์และรางวัล
|
||||
- **CheckIn Consumer** - ติดตามการลงเวลาปฏิบัติงาน
|
||||
|
||||
### ระบบสนับสนุน
|
||||
|
||||
- **Metadata Service** - ข้อมูลอ้างอิง (คำนำหน้าชื่อ, หมู่เลือด, ศาสนา, ระดับการศึกษา ฯลฯ)
|
||||
- **Report Service** - สร้างรายงาน PDF/Excel
|
||||
- **Command Service** - API Gateway สำหรับ CQRS command operations
|
||||
|
||||
### ฟีเจอร์เด่น
|
||||
|
||||
- **Real-time Notifications** - แจ้งเตือนผ่าน WebSocket
|
||||
- **Background Processing** - งานที่กำหนดเวลาผ่าน Hangfire
|
||||
- **Event-Driven Communication** - สื่อสารระหว่าง services ผ่าน RabbitMQ
|
||||
- **Document Generation** - สร้างเอกสาร PDF/Excel
|
||||
- **Audit Trail** - บันทึกประวัติการเปลี่ยนแปลงข้อมูลทั้งหมด
|
||||
|
||||
---
|
||||
|
||||
## API Endpoints
|
||||
|
||||
API ใช้ versioning และสามารถดูรายละเอียดได้ผ่าน Swagger UI:
|
||||
|
||||
```
|
||||
/api/v1/placement # การบริจาค/สั่งย้าย/แต่งตั้ง
|
||||
/api/v1/leave # ระบบลา
|
||||
/api/v1/discipline # การ discipline
|
||||
/api/v1/organization # โครงสร้างองค์กร
|
||||
/api/v1/metadata # ข้อมูลอ้างอิง
|
||||
/api/v1/retirement # การเกษียณอายุ
|
||||
/api/v1/insignia # เครื่องราชอิสริยาภรณ์
|
||||
/api/v1/reports # รายงาน
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- .NET SDK 6.0 / 7.0 / 8.0
|
||||
- MySQL Server
|
||||
- Keycloak (Authentication Server)
|
||||
- RabbitMQ
|
||||
- MinIO (Object Storage)
|
||||
- Docker (สำหรับ deployment)
|
||||
|
||||
### Configuration
|
||||
|
||||
แต่ละ service มีไฟล์ `appsettings.json` สำหรับ config ดังนี้:
|
||||
|
||||
- **JWT Authentication** - เชื่อมต่อกับ Keycloak
|
||||
- **Database Connection** - MySQL connection string
|
||||
- **RabbitMQ** - Message queue connection
|
||||
- **MinIO** - File storage endpoint
|
||||
- **Elasticsearch** - Logging endpoint
|
||||
- **Mail Server** - สำหรับส่งอีเมล
|
||||
|
||||
### Build & Run
|
||||
|
||||
```bash
|
||||
# Restore dependencies
|
||||
dotnet restore
|
||||
|
||||
# Build solution
|
||||
dotnet build
|
||||
|
||||
# Run specific service
|
||||
dotnet run --project Service/BMA.EHR.Command.Service
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
```bash
|
||||
# Build Docker image
|
||||
docker build -t bma-ehr-service .
|
||||
|
||||
# Run container
|
||||
docker run -d -p 5000:80 bma-ehr-service
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ Swagger │ │ Client │ │ WebSocket │
|
||||
│ UI │ │ Apps │ │ Clients │
|
||||
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
|
||||
│ │ │
|
||||
└────────────────────┼────────────────────┘
|
||||
│
|
||||
┌────────▼────────┐
|
||||
│ API Gateway │
|
||||
│ (Keycloak JWT) │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌────────────────────┼────────────────────┐
|
||||
│ │ │
|
||||
┌──────▼──────┐ ┌────────▼──────┐ ┌────────▼──────┐
|
||||
│ Placement │ │ Leave │ │ Discipline │
|
||||
│ Service │ │ Service │ │ Service │
|
||||
└──────┬──────┘ └────────┬──────┘ └────────┬──────┘
|
||||
│ │ │
|
||||
└────────────────────┼────────────────────┘
|
||||
│
|
||||
┌─────────────▼──────────────┐
|
||||
│ MySQL Database │
|
||||
│ (Entity Framework) │
|
||||
└────────────────────────────┘
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ RabbitMQ / MinIO / │
|
||||
│ Elasticsearch / Hangfire │
|
||||
└────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencies ที่สำคัญ
|
||||
|
||||
| Package | หน้าที่ |
|
||||
| --------------------- | ------------------------- |
|
||||
| Entity Framework Core | ORM สำหรับ MySQL |
|
||||
| Serilog | Structured Logging |
|
||||
| Swashbuckle | API Documentation |
|
||||
| Hangfire | Background Job Processing |
|
||||
| EPPlus | สร้าง/อ่านไฟล์ Excel |
|
||||
| iTextSharp | สร้างไฟล์ PDF |
|
||||
| RabbitMQ.Client | Message Queue |
|
||||
| NEST | Elasticsearch Client |
|
||||
| ThaiBahtText | แปลงตัวเลขเป็นหน่วยบาทไทย |
|
||||
| NodaTime | Date/Time Handling |
|
||||
| Sentry | Error Tracking |
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
```bash
|
||||
# Run unit tests
|
||||
dotnet test
|
||||
|
||||
# Run with coverage
|
||||
dotnet test --collect:"XPlat Code Coverage"
|
||||
|
||||
# Run load tests (k6)
|
||||
k6 run tests/load/*.js
|
||||
```
|
||||
|
||||
---
|
||||
Loading…
Add table
Add a link
Reference in a new issue