Compare commits

...

9 commits

Author SHA1 Message Date
harid
1aab307f6a fix รายการให้ออกลูกจ้าง ระบบใช้สิทธิ์ API เส้นเดียวกับของขรก. #2173
All checks were successful
Build & Deploy Retirement Service / build (push) Successful in 1m21s
2026-01-19 18:17:11 +07:00
harid
93a83b34e6 ปรับแบบใบขอยกเลิกวันลา
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m17s
2026-01-19 17:15:17 +07:00
Suphonchai Phoonsawat
79e0fe7f1b Merge branch 'develop' into working
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m20s
2026-01-19 14:28:29 +07:00
Suphonchai Phoonsawat
21f82d69e1 Add load testing script for simulating 30,000 requests over 10 minutes 2026-01-19 14:27:43 +07:00
harid
b5c82f4243 ปรับรายงานลา #2195
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m14s
2026-01-19 12:13:45 +07:00
Suphonchai Phoonsawat
b0715e3da6 refactor LeaveController to update check-out status logic based on morning end time #2187
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m12s
2026-01-16 16:19:49 +07:00
Suphonchai Phoonsawat
510f1cd78a fix sort order condition
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m15s
2026-01-16 16:09:23 +07:00
Suphonchai Phoonsawat
83a915f92c refactor LeaveReportController to sort employees by check-in time and remark #2193 2026-01-16 16:01:07 +07:00
harid
094789bfb1 API ขอลาออกและโอนออก ฝั่ง admin #2196
All checks were successful
Build & Deploy Placement Service / build (push) Successful in 1m22s
Build & Deploy Retirement Service / build (push) Successful in 1m23s
2026-01-16 15:43:55 +07:00
11 changed files with 856 additions and 58 deletions

View file

@ -989,13 +989,21 @@ namespace BMA.EHR.Leave.Service.Controllers
else
endTime = duty.EndTimeAfternoon;
var endTimeMorning = duty.EndTimeMorning;
string checkOutStatus = "NORMAL";
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(userId, currentDate.Date);
if (leaveReq != null)
{
var leaveRange = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
if (leaveRange == "AFTERNOON" || leaveRange == "ALL")
checkOutStatus = "NORMAL";
{
if(DateTime.Parse(currentDate.ToString("yyyy-MM-dd HH:mm")) <
DateTime.Parse($"{currentDate.ToString("yyyy-MM-dd")} {endTimeMorning}"))
checkOutStatus = "ABSENT";
else
checkOutStatus = "NORMAL";
}
else
{
// fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลาเข้า-ออกงาน (กรณีลงเวลาออกอีกวัน) #921
@ -2438,6 +2446,10 @@ namespace BMA.EHR.Leave.Service.Controllers
var endTime = isSeminar.Trim().ToUpper() == "Y"
? DateTime.Parse($"{DateTime.Now.Date.ToString("yyyy-MM-dd")} 14: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}");
var endTimeDisplay = endTime;
var status = string.Empty;
if(lastCheckIn == null)
{
@ -2458,7 +2470,17 @@ namespace BMA.EHR.Leave.Service.Controllers
{
var leaveRange = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
if (leaveRange == "AFTERNOON" || leaveRange == "ALL")
status = "NORMAL";
{
if(time < endTimeMorning)
{
status = "ABSENT";
endTimeDisplay = endTimeMorning;
}
else
{
status = "NORMAL";
}
}
else
{
status = "ABSENT";
@ -2482,7 +2504,7 @@ namespace BMA.EHR.Leave.Service.Controllers
Status = status,
StatusText = status == "ABSENT" ? "ขาดราชการ" : "ปกติ",
ServerTime = time,
EndTime = endTime
EndTime = endTimeDisplay
});
}

View file

@ -165,9 +165,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leaveDetail = data.LeaveDetail.ToThaiNumber(),
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
@ -228,9 +247,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
wifeDayName = data.WifeDayName ?? "",
wifeDayDateBorn = data.WifeDayDateBorn == null || data.WifeDayDateBorn == "" ? "" : DateTime.Parse(data.WifeDayDateBorn).ToThaiShortDate().ToThaiNumber(),
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
@ -289,9 +327,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
restDayOldTotal = extendLeave.ToString().ToThaiNumber(),
restDayCurrentTotal = (10).ToString().ToThaiNumber(),
@ -357,9 +414,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(),
@ -393,9 +469,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate().ToThaiNumber(),
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(),
@ -454,9 +549,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
absentDaySummon = data.AbsentDaySummon.ToThaiNumber(),
absentDayLocation = data.AbsentDayLocation.ToThaiNumber(),
@ -509,9 +623,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate().ToThaiNumber(),
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(),
@ -587,9 +720,28 @@ namespace BMA.EHR.Leave.Service.Controllers
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
fullnameEng = "",
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
@ -679,9 +831,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leaveSalary = data.LeaveSalary == null ? "" : data.LeaveSalary.Value.ToNumericText().ToThaiNumber(),
leaveSalaryText = data.LeaveSalaryText.ToThaiNumber(),
@ -748,9 +919,28 @@ namespace BMA.EHR.Leave.Service.Controllers
leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "",
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
@ -946,9 +1136,28 @@ namespace BMA.EHR.Leave.Service.Controllers
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(),
leaveTypeName = data.Type.Name,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc ?? "",
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (profile!.Oc!.ToThaiNumber()) },
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(),
@ -2251,7 +2460,8 @@ namespace BMA.EHR.Leave.Service.Controllers
}
//employees = employees.OrderBy(x => x.checkInDate).ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue).ToList();
employees = employees
.OrderBy(x => x.remark.Trim() == "" ? 0 : 1) // ข้อมูลที่ไม่มี remark ให้ขึ้นก่อน
.OrderBy(x => x.checkInTime.Trim() != "" ? 0 : 1) // เรียงตามวันที่ลงเวลา
.ThenBy(x => x.remark.Trim() == "" ? 0 : 1) // ข้อมูลที่ไม่มี remark ให้ขึ้นก่อน
.ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue)
.ThenBy(x => x.remark) // จากนั้นจัดเรียงตาม remark
.ToList();
@ -2605,11 +2815,12 @@ namespace BMA.EHR.Leave.Service.Controllers
{
var _default = new
{
fullName = "......................",
positionName = "......................",
positionSign = "......................",
updatedAt = "...... /...... /......",
comment = "......................",
fullName = "............................................",
positionName = "............................................",
posExOrg = Array.Empty<string>(),
positionSign = "............................................",
updatedAt = "............/............/............",
comment = "......................................................................................................................................................................",
approveType = ""
};
@ -2617,37 +2828,61 @@ namespace BMA.EHR.Leave.Service.Controllers
.Select(x => new
{
fullName = $"{(x.Prefix ?? "")}{(x.FirstName ?? "")} {(x.LastName ?? "")}".Trim(),
positionName = x.PositionName ?? "......................",
positionSign = x.PositionSign ?? "......................",
positionName = (!string.IsNullOrEmpty(x.PositionLevelName) &&
(x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร"))
? string.IsNullOrEmpty(x.PosExecutiveName)
? string.IsNullOrEmpty(x.PositionName)
? "............................................"
: x.PositionName
: x.PosExecutiveName
: string.IsNullOrEmpty(x.PositionName)
? "............................................"
: string.IsNullOrEmpty(x.PositionLevelName)
? x.PositionName
: $"{x.PositionName}{x.PositionLevelName}").ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(x.PositionLevelName) &&
(x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร"))
? new[] { (x!.OrganizationName!.ToThaiNumber()) }
: !string.IsNullOrEmpty(x.PosExecutiveName)
? new[] { (x.PosExecutiveName.ToThaiNumber()), (x!.OrganizationName!.ToThaiNumber()) }
: new[] { (x!.OrganizationName!.ToThaiNumber()) },
positionSign = !string.IsNullOrEmpty(x.PositionSign)
? x.PositionSign.Replace("\r", "").Replace("\n", " ")
: "............................................",
updatedAt = x.LastUpdatedAt.HasValue
? x.LastUpdatedAt.Value.Date.ToThaiShortDate().ToThaiNumber()
: "...... /...... /......",
comment = !string.IsNullOrEmpty(x.Comment)
? x.Comment.Replace("\r", "").Replace("\n", "").Trim()
: "......................",
: "............/............/............",
comment = !string.IsNullOrEmpty(x.Comment)
? (x.Comment.Replace("\r", "").Replace("\n", " ").Trim()).ToThaiNumber()
: "......................................................................................................................................................................",
approveType = (x.ApproveType ?? "").Trim().ToUpper()
})
.ToList();
// การเจ้าหน้าที่
var sender = approvers
.FirstOrDefault(x => x.approveType == "SENDER")
?? _default;
var approver = approvers
.FirstOrDefault(x => x.approveType == "APPROVER")
?? _default;
// ผู้บังคับบัญชา (มีได้มากกว่า 1 คน)
var commanders = approvers
.Where(x => x.approveType == "COMMANDER")
.DefaultIfEmpty(_default)
.ToList();
// ผู้มีอำนาจ
var approver = approvers
.FirstOrDefault(x => x.approveType == "APPROVER")
?? _default;
return new
{
sign = "............................................",
sender = sender,
approver = approver,
commanders = commanders
};
}
}

View file

@ -166,7 +166,14 @@ namespace BMA.EHR.Leave.Service.Controllers
ProfileId = r.ProfileId,
KeycloakId = r.KeycloakId,
ApproveStatus = "PENDING",
ApproveType = type.Trim().ToUpper()
ApproveType = type.Trim().ToUpper(),
CreatedFullName = FullName ?? "",
CreatedUserId = UserId!,
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "",
LastUpdateUserId = UserId!,
LastUpdatedAt = DateTime.Now,
});
}
@ -2033,7 +2040,7 @@ namespace BMA.EHR.Leave.Service.Controllers
Prefix = profile.Prefix ?? "",
FirstName = profile.FirstName ?? "",
LastName = profile.LastName ?? "",
PositionName = $"{profile.Position ?? ""}{profile.PositionLeaveName ?? ""}",
PositionName = $"{profile.Position ?? ""}",
ProfileId = profile.Id,
KeycloakId = Guid.Parse(UserId!),
ApproveType = "SENDER",

View file

@ -683,6 +683,140 @@ namespace BMA.EHR.Placement.Service.Controllers
return Success(placementTransfer.Id);
}
/// <summary>
/// สร้างคำขอโอน โดย admin
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("admin")]
public async Task<ActionResult<ResponseObject>> PostAdmin([FromForm] PlacementTransferAdminRequest req)
{
var placementTransfer = new PlacementTransfer
{
Organization = req.Organization,
Reason = req.Reason,
Status = "APPROVE",
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
var apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{req.ProfileId}";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync();
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
if (org == null || org.result == null)
return Error("ไม่พบหน่วยงานของผู้ใช้งานคนนี้", 404);
placementTransfer.profileId = org.result.profileId;
placementTransfer.prefix = org.result.prefix;
placementTransfer.firstName = org.result.firstName;
placementTransfer.lastName = org.result.lastName;
placementTransfer.citizenId = org.result.citizenId;
placementTransfer.rootOld = org.result.root;
placementTransfer.rootOldId = org.result.rootId;
placementTransfer.rootDnaOldId = org.result.rootDnaId;
placementTransfer.rootShortNameOld = org.result.rootShortName;
placementTransfer.child1Old = org.result.child1;
placementTransfer.child1OldId = org.result.child1Id;
placementTransfer.child1DnaOldId = org.result.child1DnaId;
placementTransfer.child1ShortNameOld = org.result.child1ShortName;
placementTransfer.child2Old = org.result.child2;
placementTransfer.child2OldId = org.result.child2Id;
placementTransfer.child2DnaOldId = org.result.child2DnaId;
placementTransfer.child2ShortNameOld = org.result.child2ShortName;
placementTransfer.child3Old = org.result.child3;
placementTransfer.child3OldId = org.result.child3Id;
placementTransfer.child3DnaOldId = org.result.child3DnaId;
placementTransfer.child3ShortNameOld = org.result.child3ShortName;
placementTransfer.child4Old = org.result.child4;
placementTransfer.child4OldId = org.result.child4Id;
placementTransfer.child4DnaOldId = org.result.child4DnaId;
placementTransfer.child4ShortNameOld = org.result.child4ShortName;
placementTransfer.posMasterNoOld = org.result.posMasterNo;
placementTransfer.posTypeOldId = org.result.posTypeId;
placementTransfer.posTypeNameOld = org.result.posTypeName;
placementTransfer.posLevelOldId = org.result.posLevelId;
placementTransfer.posLevelNameOld = org.result.posLevelName;
placementTransfer.AmountOld = org.result.salary;
placementTransfer.PositionOld = org.result.position;
placementTransfer.PositionExecutiveOld = org.result.posExecutiveName;
placementTransfer.positionExecutiveFieldOld = org.result.positionExecutiveField;
placementTransfer.positionAreaOld = org.result.positionArea;
placementTransfer.PositionLevelOld = org.result.posLevelName;
placementTransfer.PositionTypeOld = org.result.posTypeName;
placementTransfer.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
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") +
(org.result.child1 == null ? "" : org.result.child1 + "\n") +
(org.result.root == null ? "" : org.result.root);
placementTransfer.OrganizationPositionOld = org.result.position + "\n" +
(placementTransfer.PositionExecutiveOld == null ? "" : (placementTransfer.positionExecutiveField == null ? placementTransfer.PositionExecutiveOld + "\n" : placementTransfer.PositionExecutiveOld + "(" + placementTransfer.positionExecutiveField + ")" + "\n"))
+ placementTransfer.OrganizationOld;
}
await _context.PlacementTransfers.AddAsync(placementTransfer);
await _context.SaveChangesAsync();
if (Request.Form.Files != null && Request.Form.Files.Count != 0)
{
foreach (var file in Request.Form.Files)
{
var fileExtension = Path.GetExtension(file.FileName);
var doc = await _documentService.UploadFileAsync(file, file.FileName);
var _doc = await _context.Documents.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == doc.Id);
if (_doc != null)
{
var placementTransferDoc = new PlacementTransferDoc
{
PlacementTransfer = placementTransfer,
Document = _doc,
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
await _context.PlacementTransferDocs.AddAsync(placementTransferDoc);
}
}
}
//var baseAPIOrg = _configuration["API"];
//var apiUrlOrg = $"{baseAPIOrg}/org/workflow/add-workflow";
//using (var client = new HttpClient())
//{
// client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
// client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
// var _res = await client.PostAsJsonAsync(apiUrlOrg, new
// {
// refId = placementTransfer.Id,
// sysName = "SYS_TRANSFER_REQ",
// posLevelName = placementTransfer.posLevelNameOld,
// posTypeName = placementTransfer.posTypeNameOld,
// fullName = $"{placementTransfer.prefix}{placementTransfer.firstName} {placementTransfer.lastName}"
// });
//}
await _context.SaveChangesAsync();
return Success(placementTransfer.Id);
}
/// <summary>
/// แก้ไขคำขอโอน
/// </summary>

View file

@ -10,4 +10,13 @@ namespace BMA.EHR.Placement.Service.Requests
public DateTime? Date { get; set; }
public List<FormFile>? File { get; set; }
}
public class PlacementTransferAdminRequest
{
public string ProfileId { get; set; }
public string Organization { get; set; }
public string Reason { get; set; }
public DateTime? Date { get; set; }
public List<FormFile>? File { get; set; }
}
}

View file

@ -239,16 +239,6 @@ namespace BMA.EHR.Retirement.Service.Controllers
[HttpGet("{id:length(36)}")]
public async Task<ActionResult<ResponseObject>> GetDetailAdmin(Guid id)
{
var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), "SYS_DISMISS");
if (getWorkflow == false)
{
var getPermission = await _permission.GetPermissionAPIAsync("GET", "SYS_DISMISS");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
}
var data = await _context.RetirementOuts.AsQueryable()
.Where(x => x.Id == id)
.Select(p => new
@ -294,6 +284,20 @@ namespace BMA.EHR.Retirement.Service.Controllers
p.OrganizationOld,
})
.FirstOrDefaultAsync();
string _system = data != null && data.profileType?.Trim().ToUpper() == "OFFICER" ? "SYS_DISMISS" : "SYS_DISMISS_EMP";
var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), _system);
if (getWorkflow == false)
{
var getPermission = await _permission.GetPermissionAPIAsync("GET", "SYS_DISMISS");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
}
if (data == null)
return Error(GlobalMessages.DataNotFound, 404);
@ -462,14 +466,18 @@ namespace BMA.EHR.Retirement.Service.Controllers
[HttpPut("{id:length(36)}")]
public async Task<ActionResult<ResponseObject>> Put([FromBody] RetirementOutEditRequest req, Guid id)
{
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_DISMISS");
var uppdated = await _context.RetirementOuts
.FirstOrDefaultAsync(x => x.Id == id);
string _system = uppdated != null && uppdated.profileType?.Trim().ToUpper() == "OFFICER" ? "SYS_DISMISS" : "SYS_DISMISS_EMP";
var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", _system);
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var uppdated = await _context.RetirementOuts
.FirstOrDefaultAsync(x => x.Id == id);
if (uppdated == null)
return Error(GlobalMessages.RetirementOutNotFound, 404);
@ -527,14 +535,18 @@ namespace BMA.EHR.Retirement.Service.Controllers
[HttpDelete("{id:length(36)}")]
public async Task<ActionResult<ResponseObject>> Delete(Guid id)
{
var getPermission = await _permission.GetPermissionAPIAsync("DELETE", "SYS_DISMISS");
var deleted = await _context.RetirementOuts.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == id);
string _system = deleted != null && deleted.profileType?.Trim().ToUpper() == "OFFICER" ? "SYS_DISMISS" : "SYS_DISMISS_EMP";
var getPermission = await _permission.GetPermissionAPIAsync("DELETE", _system);
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var deleted = await _context.RetirementOuts.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == id);
if (deleted == null)
return NotFound();
_context.RetirementOuts.Remove(deleted);

View file

@ -1343,6 +1343,155 @@ namespace BMA.EHR.Retirement.Service.Controllers
return Success(retirementResign);
}
/// <summary>
/// สร้างการลาออก โดย admin
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("admin")]
public async Task<ActionResult<ResponseObject>> PostAdmin([FromForm] RetirementResignAdminRequest req)
{
var Remark = req.Remark;
if (req.Reason != null)
{
switch (req.Reason.Trim().ToUpper())
{
case "CAREER": Remark = $"ประกอบอาชีพอื่น" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "MOVE": Remark = $"รับราชการสังกัดอื่น" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "FAMILY": Remark = $"ดูแลบิดามารดา" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "EDUCATION": Remark = $"ศึกษาต่อ" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "OTHER": Remark = $"อื่น ๆ" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
}
}
var retirementResign = new RetirementResign
{
ApproveStep = "st1",
Location = req.Location,
SendDate = DateTime.Now,
ActiveDate = req.ActiveDate,
Reason = req.Reason,
ReasonResign = Remark,
Remark = req.Remark,
Status = "APPROVE",
IsActive = true,
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
var apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{req.ProfileId}";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync();
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
if (org == null || org.result == null)
return Error("ไม่พบหน่วยงานของผู้ใช้งานคนนี้", 404);
retirementResign.profileId = org.result.profileId;
retirementResign.prefix = org.result.prefix;
retirementResign.firstName = org.result.firstName;
retirementResign.lastName = org.result.lastName;
retirementResign.citizenId = org.result.citizenId;
retirementResign.rootOld = org.result.root;
retirementResign.rootOldId = org.result.rootId;
retirementResign.rootDnaOldId = org.result.rootDnaId;
retirementResign.rootShortNameOld = org.result.rootShortName;
retirementResign.child1Old = org.result.child1;
retirementResign.child1OldId = org.result.child1Id;
retirementResign.child1DnaOldId = org.result.child1DnaId;
retirementResign.child1ShortNameOld = org.result.child1ShortName;
retirementResign.child2Old = org.result.child2;
retirementResign.child2OldId = org.result.child2Id;
retirementResign.child2DnaOldId = org.result.child2DnaId;
retirementResign.child2ShortNameOld = org.result.child2ShortName;
retirementResign.child3Old = org.result.child3;
retirementResign.child3OldId = org.result.child3Id;
retirementResign.child3DnaOldId = org.result.child3DnaId;
retirementResign.child3ShortNameOld = org.result.child3ShortName;
retirementResign.child4Old = org.result.child4;
retirementResign.child4OldId = org.result.child4Id;
retirementResign.child4DnaOldId = org.result.child4DnaId;
retirementResign.child4ShortNameOld = org.result.child4ShortName;
retirementResign.posMasterNoOld = org.result.posMasterNo;
retirementResign.posTypeOldId = org.result.posTypeId;
retirementResign.posTypeNameOld = org.result.posTypeName;
retirementResign.posLevelOldId = org.result.posLevelId;
retirementResign.posLevelNameOld = org.result.posLevelName;
retirementResign.AmountOld = org.result.salary;
retirementResign.PositionOld = org.result.position;
retirementResign.PositionExecutiveOld = org.result.posExecutiveName;
retirementResign.positionExecutiveFieldOld = org.result.positionExecutiveField;
retirementResign.positionAreaOld = org.result.positionArea;
retirementResign.PositionLevelOld = org.result.posLevelName;
retirementResign.PositionTypeOld = org.result.posTypeName;
retirementResign.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
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") +
(org.result.child1 == null ? "" : org.result.child1 + "\n") +
(org.result.root == null ? "" : org.result.root);
retirementResign.OrganizationPositionOld = org.result.position + "\n" +
(retirementResign.PositionExecutiveOld == null ? "" : (retirementResign.positionExecutiveField == null ? retirementResign.PositionExecutiveOld + "\n" : retirementResign.PositionExecutiveOld + "(" + retirementResign.positionExecutiveField + ")" + "\n"))
+ retirementResign.OrganizationOld;
if ((retirementResign.posTypeNameOld == "ทั่วไป" && retirementResign.posLevelNameOld == "ชำนาญงาน") || (retirementResign.posTypeNameOld == "ทั่วไป" && retirementResign.posLevelNameOld == "ปฏิบัติงาน") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "ปฏิบัติการ") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "ชำนาญการ"))
{
retirementResign.Group = "1.1";
}
else if ((retirementResign.posTypeNameOld == "ทั่วไป" && retirementResign.posLevelNameOld == "อาวุโส") || (retirementResign.posTypeNameOld == "วิชาการ" && retirementResign.posLevelNameOld == "ชำนาญการพิเศษ") || (retirementResign.posTypeNameOld == "อำนวยการ" && retirementResign.posLevelNameOld == "ต้น"))
{
retirementResign.Group = "1.2";
}
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";
}
}
await _context.RetirementResigns.AddAsync(retirementResign);
await _context.SaveChangesAsync();
if (Request.Form.Files != null && Request.Form.Files.Count != 0)
{
foreach (var file in Request.Form.Files)
{
var fileExtension = Path.GetExtension(file.FileName);
var doc = await _documentService.UploadFileAsync(file, file.FileName);
var _doc = await _context.Documents.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == doc.Id);
if (_doc != null)
{
var retirementResignDoc = new RetirementResignDoc
{
RetirementResign = retirementResign,
Document = _doc,
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
await _context.RetirementResignDocs.AddAsync(retirementResignDoc);
}
}
}
await _context.SaveChangesAsync();
return Success(retirementResign);
}
/// <summary>
/// แก้ไขการลาออก
/// </summary>

View file

@ -1291,6 +1291,148 @@ namespace BMA.EHR.Retirement.Service.Controllers
return Success(retirementResignEmployee);
}
/// <summary>
/// สร้างการลาออก โดย admin
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("admin")]
public async Task<ActionResult<ResponseObject>> PostAdmin([FromForm] RetirementResignEmployeeAdminRequest req)
{
var Remark = req.Remark;
if (req.Reason != null)
{
switch (req.Reason.Trim().ToUpper())
{
case "CAREER": Remark = $"ประกอบอาชีพอื่น" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "MOVE": Remark = $"รับราชการสังกัดอื่น" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "FAMILY": Remark = $"ดูแลบิดามารดา" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "EDUCATION": Remark = $"ศึกษาต่อ" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
case "OTHER": Remark = $"อื่น ๆ" + (req.Remark == null || req.Remark == "" ? $"{req.Remark}" : ""); break;
}
}
var retirementResignEmployee = new RetirementResignEmployee
{
ApproveStep = "st1",
Location = req.Location,
SendDate = DateTime.Now,
ActiveDate = req.ActiveDate,
Reason = req.Reason,
ReasonResign = Remark,
Remark = req.Remark,
Status = "APPROVE",
IsActive = true,
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
var apiUrl = $"{_configuration["API"]}/org/profile-employee/profileid/position/{req.ProfileId}";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync();
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
if (org == null || org.result == null)
return Error("ไม่พบหน่วยงานของผู้ใช้งานคนนี้", 404);
retirementResignEmployee.profileId = org.result.profileId;
retirementResignEmployee.prefix = org.result.prefix;
retirementResignEmployee.firstName = org.result.firstName;
retirementResignEmployee.lastName = org.result.lastName;
retirementResignEmployee.citizenId = org.result.citizenId;
retirementResignEmployee.rootOld = org.result.root;
retirementResignEmployee.rootOldId = org.result.rootId;
retirementResignEmployee.rootDnaOldId = org.result.rootDnaId;
retirementResignEmployee.rootShortNameOld = org.result.rootShortName;
retirementResignEmployee.child1Old = org.result.child1;
retirementResignEmployee.child1OldId = org.result.child1Id;
retirementResignEmployee.child1DnaOldId = org.result.child1DnaId;
retirementResignEmployee.child1ShortNameOld = org.result.child1ShortName;
retirementResignEmployee.child2Old = org.result.child2;
retirementResignEmployee.child2OldId = org.result.child2Id;
retirementResignEmployee.child2DnaOldId = org.result.child2DnaId;
retirementResignEmployee.child2ShortNameOld = org.result.child2ShortName;
retirementResignEmployee.child3Old = org.result.child3;
retirementResignEmployee.child3OldId = org.result.child3Id;
retirementResignEmployee.child3DnaOldId = org.result.child3DnaId;
retirementResignEmployee.child3ShortNameOld = org.result.child3ShortName;
retirementResignEmployee.child4Old = org.result.child4;
retirementResignEmployee.child4OldId = org.result.child4Id;
retirementResignEmployee.child4DnaOldId = org.result.child4DnaId;
retirementResignEmployee.child4ShortNameOld = org.result.child4ShortName;
retirementResignEmployee.posMasterNoOld = org.result.posMasterNo;
retirementResignEmployee.posTypeOldId = org.result.posTypeId;
retirementResignEmployee.posTypeNameOld = org.result.posTypeName;
retirementResignEmployee.posLevelOldId = org.result.posLevelId;
retirementResignEmployee.posLevelNameOld = org.result.posLevelName;
retirementResignEmployee.AmountOld = org.result.salary;
retirementResignEmployee.PositionOld = org.result.position;
retirementResignEmployee.PositionLevelOld = org.result.posLevelName;
retirementResignEmployee.PositionTypeOld = org.result.posTypeName;
retirementResignEmployee.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo;
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") +
(org.result.child1 == null ? "" : org.result.child1 + "\n") +
(org.result.root == null ? "" : org.result.root);
retirementResignEmployee.OrganizationPositionOld = org.result.position + "\n" + retirementResignEmployee.OrganizationOld;
if ((retirementResignEmployee.posTypeNameOld == "ทั่วไป" && retirementResignEmployee.posLevelNameOld == "ชำนาญงาน") || (retirementResignEmployee.posTypeNameOld == "ทั่วไป" && retirementResignEmployee.posLevelNameOld == "ปฏิบัติงาน") || (retirementResignEmployee.posTypeNameOld == "วิชาการ" && retirementResignEmployee.posLevelNameOld == "ปฏิบัติการ") || (retirementResignEmployee.posTypeNameOld == "วิชาการ" && retirementResignEmployee.posLevelNameOld == "ชำนาญการ"))
{
retirementResignEmployee.Group = "1.1";
}
else if ((retirementResignEmployee.posTypeNameOld == "ทั่วไป" && retirementResignEmployee.posLevelNameOld == "อาวุโส") || (retirementResignEmployee.posTypeNameOld == "วิชาการ" && retirementResignEmployee.posLevelNameOld == "ชำนาญการพิเศษ") || (retirementResignEmployee.posTypeNameOld == "อำนวยการ" && retirementResignEmployee.posLevelNameOld == "ต้น"))
{
retirementResignEmployee.Group = "1.2";
}
else if ((retirementResignEmployee.posTypeNameOld == "ทั่วไป" && retirementResignEmployee.posLevelNameOld == "ทักษะพิเศษ") || (retirementResignEmployee.posTypeNameOld == "วิชาการ" && retirementResignEmployee.posLevelNameOld == "เชี่ยวชาญ") || (retirementResignEmployee.posTypeNameOld == "วิชาการ" && retirementResignEmployee.posLevelNameOld == "ทรงคุณวุฒิ") || (retirementResignEmployee.posTypeNameOld == "อำนวยการ" && retirementResignEmployee.posLevelNameOld == "สูง") || (retirementResignEmployee.posTypeNameOld == "บริหาร" && retirementResignEmployee.posLevelNameOld == "ต้น") || (retirementResignEmployee.posTypeNameOld == "บริหาร" && retirementResignEmployee.posLevelNameOld == "สูง"))
{
retirementResignEmployee.Group = "2";
}
}
await _context.RetirementResignEmployees.AddAsync(retirementResignEmployee);
await _context.SaveChangesAsync();
if (Request.Form.Files != null && Request.Form.Files.Count != 0)
{
foreach (var file in Request.Form.Files)
{
var fileExtension = Path.GetExtension(file.FileName);
var doc = await _documentService.UploadFileAsync(file, file.FileName);
var _doc = await _context.Documents.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == doc.Id);
if (_doc != null)
{
var retirementResignEmployeeDoc = new RetirementResignEmployeeDoc
{
RetirementResignEmployee = retirementResignEmployee,
Document = _doc,
CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now,
LastUpdateFullName = FullName ?? "System Administrator",
LastUpdateUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
};
await _context.RetirementResignEmployeeDocs.AddAsync(retirementResignEmployeeDoc);
}
}
}
await _context.SaveChangesAsync();
return Success(retirementResignEmployee);
}
/// <summary>
/// แก้ไขการลาออก
/// </summary>

View file

@ -19,4 +19,21 @@ namespace BMA.EHR.Retirement.Service.Requests
public double? AmountOld { get; set; }
public List<FormFile>? File { get; set; }
}
public class RetirementResignEmployeeAdminRequest
{
public string ProfileId { get; set; }
public string? Location { get; set; }
public DateTime? ActiveDate { get; set; }
public string? Reason { get; set; }
public string? Remark { get; set; }
public string? ReasonResign { get; set; }
public string? OrganizationPositionOld { get; set; }
public string? PositionTypeOld { get; set; }
public string? PositionLevelOld { get; set; }
public string? PositionNumberOld { get; set; }
public string? RemarkHorizontal { get; set; }
public double? AmountOld { get; set; }
public List<FormFile>? File { get; set; }
}
}

View file

@ -20,4 +20,21 @@ namespace BMA.EHR.Retirement.Service.Requests
public double? AmountOld { get; set; }
public List<FormFile>? File { get; set; }
}
public class RetirementResignAdminRequest
{
public string ProfileId { get; set; }
public string? Location { get; set; }
public DateTime? ActiveDate { get; set; }
public string? Reason { get; set; }
public string? Remark { get; set; }
public string? ReasonResign { get; set; }
public string? OrganizationPositionOld { get; set; }
public string? PositionExecutiveOld { get; set; }
public string? PositionTypeOld { get; set; }
public string? PositionLevelOld { get; set; }
public string? PositionNumberOld { get; set; }
public string? RemarkHorizontal { get; set; }
public double? AmountOld { get; set; }
public List<FormFile>? File { get; set; }
}
}

54
dotnet_keycloak_test.js Normal file
View file

@ -0,0 +1,54 @@
// ทดสอบการยิง 30,000 requests ในเวลา 10 นาที โดยให้กระจายการยิงในเวลาที่ต่างๆ กัน
import { check, sleep } from "k6";
import http from "k6/http";
import { Rate } from "k6/metrics";
export let errorRate = new Rate("errors");
// จำนวน request ที่ต้องการยิง
// ระยะเวลาทดสอบทั้งหมด
// จำนวน Virtual Users เฉลี่ยที่ต้องการ 300 users
//const averageVus = Math.ceil(totalRequests / totalDuration);
const averageVus = 300;
export let options = {
stages: [
{ duration: "2m", target: averageVus * 0.5 }, // 20% ของการทดสอบ เพิ่ม VUs เป็น 50% ของค่าเฉลี่ย
{ duration: "4m", target: averageVus }, // 40% ของการทดสอบ เพิ่ม VUs เป็น 100% ของค่าเฉลี่ย
{ duration: "2m", target: averageVus * 1.5 }, // 20% ของการทดสอบ เพิ่ม VUs เป็น 150% ของค่าเฉลี่ย
{ duration: "2m", target: 0 }, // ลด VUs ลงมาเป็น 0
],
thresholds: {
errors: ["rate<0.01"], // อัตรา error ต้องน้อยกว่า 1%
http_req_duration: ["p(95)<2000"], // 95% ของ requests ควรใช้เวลาไม่เกิน 2 วินาที
},
};
export default function () {
// ตัวเลือก headers
let headers = {
"Content-Type": "application/json",
Authorization:
"Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ4WTJWUi1FRnZ2TlBzTXMzOXU4b29WQldRTDZtUHdyTkpPaDNrb0pGVGdVIn0.eyJleHAiOjE3NzYyMTkxNjgsImlhdCI6MTc2ODQ0MzE2OCwianRpIjoiZDQxMmI5MWEtZmZhMi00N2JiLTliZDUtZDE5NTdmMDFjYzQyIiwiaXNzIjoiaHR0cHM6Ly9ocm1zLWlkLmJhbmdrb2suZ28udGgvcmVhbG1zL2hybXMiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYmFmYzU3OTUtYmVmYy00ZDNmLWE0NjEtMzUzM2MzOGE1ZmMxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiZ2V0dG9rZW4tY2hlY2tpbiIsInNpZCI6IjBkNzdiY2Y5LTE4YWQtNGQyMS1hYjBjLTI4Y2ZiZjUyZGZiNCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cHM6Ly9ocm1zLmJhbmdrb2suZ28udGgiLCJodHRwczovL2hybXMtY2hlY2tpbi5iYW5na29rLmdvLnRoIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJTVVBFUl9BRE1JTiIsInN0b3JhZ2VfbWFuYWdlbWVudCIsIm9mZmxpbmVfYWNjZXNzIiwiU1RBRkYiLCJkZWZhdWx0LXJvbGVzLWhybXMiLCJ1bWFfYXV0aG9yaXphdGlvbiIsIkFETUlOIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgb3BlbmlkIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInJvbGUiOlsiU1VQRVJfQURNSU4iLCJzdG9yYWdlX21hbmFnZW1lbnQiLCJvZmZsaW5lX2FjY2VzcyIsIlNUQUZGIiwiZGVmYXVsdC1yb2xlcy1ocm1zIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsIlVTRVIiXSwibmFtZSI6IuC4p-C4seC4meC5gOC4ieC4peC4tOC4oSDguInguLHguJXguKPguJfguK3guIciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMTIwMjAwNDI0OTc1IiwiZ2l2ZW5fbmFtZSI6IuC4p-C4seC4meC5gOC4ieC4peC4tOC4oSIsImZhbWlseV9uYW1lIjoi4LiJ4Lix4LiV4Lij4LiX4Lit4LiHIn0.UhMn0NEkymPxMAcb4noZedHCSqXotCyD2RziBtLYHn5OhA9yk1915Rrt9iV4wVaebr74iZ2eZMpBwp8YVy8-3cPXSv9T3vzbXwFP7IeICPCDDf4bOPFEHP5FYow2s9v48qG81wnu01AG7_EL2-CQKh1sBVrCVUUlATlf-P4lT_lHeHOCKNXTmw4V0IWm96ec6pk-jFY3KH2JdRSWR7wq8g-KVxhLOxk_pF72kMwOpdvcr_99byg28zzj6QfeNYXLt61koHXnZppUqytt86mQQgfamv2FNVywCEzbRITUceu2rmJnwQE8ubeoCh4UOsYauUuSKd7RPqvvXxL_Vg__8Q",
//"Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTT2wwWmFidm9rRzZET3pDZVBtT09Kek5haTdMUldkci1zV3lEYjRELTc0In0.eyJleHAiOjE3Njg4ODAzMjgsImlhdCI6MTc2ODc5MzkyOCwianRpIjoiMDYxODBlMWYtNTQzYy00MjU0LWFmN2QtYWI1NDA5NzFmNWY2IiwiaXNzIjoiaHR0cHM6Ly9ocm1zYmtrLWlkLmNhc2UtY29sbGVjdGlvbi5jb20vcmVhbG1zL2hybXMiLCJhdWQiOlsiYWNjb3VudCIsImdldHRva2VuIl0sInN1YiI6IjQzOWZhMzZkLTZiYzUtNGVmNS05NWFhLWVmMjllNjRkMmU5ZiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImdldHRva2VuIiwic2lkIjoiZGI2YzUxNjItNzZhYS00MmVmLWI0ZDMtYThmOTk2N2NjZWM2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIqIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJTVVBFUl9BRE1JTiIsIm9mZmxpbmVfYWNjZXNzIiwiU1RBRkYiLCJkZWZhdWx0LXJvbGVzLWhybXMiLCJ1bWFfYXV0aG9yaXphdGlvbiIsIkFETUlOIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgb3BlbmlkIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInJvbGUiOlsiU1VQRVJfQURNSU4iLCJvZmZsaW5lX2FjY2VzcyIsIlNUQUZGIiwiZGVmYXVsdC1yb2xlcy1ocm1zIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsIlVTRVIiXSwibmFtZSI6IuC4p-C4seC4meC5gOC4ieC4peC4tOC4oSDguInguLHguJXguKPguJfguK3guIciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMTIwMjAwNDI0OTc1IiwiZ2l2ZW5fbmFtZSI6IuC4p-C4seC4meC5gOC4ieC4peC4tOC4oSIsImZhbWlseV9uYW1lIjoi4LiJ4Lix4LiV4Lij4LiX4Lit4LiHIn0.fHdMzpHMD4JcbzYnUrfM473FSXka2Z4lz_S3HI2c-dPXfO5ATpijqsi12C6-ExE0RJRXUK671erMuyVXL6u2qj-FvdliBL3ubKy4J3jIT3svkcZxZL2ib16dRg375dITefvqd-J4vw6MR4bq8YAGPbqRIy6BQ2pdEiZgNiwUUihHAFwZlVER1lNbaqlbL6vk_L4k-g25DBVnDr756BFvrw7zEDbawkKZ31EZF5_DYk4RWej0wvWrGHQWLw-RyzYVSBB_AooqHkncHn_CwLBGC5juOEfFO4a2ThuKwoxYCstjtBj-zmjpHFs-Hh3CBTWJCGFcKst1Ey28StlKtNkLiw",
};
// ส่ง GET request
let response = http.get(
//"https://bma-hrms.bangkok.go.th/api/v1/leave/fake-check-in",
//"https://hrmsbkk.case-collection.com/api/v1/org/dotnet/keycloak/439fa36d-6bc5-4ef5-95aa-ef29e64d2e9f",
"https://hrms.bangkok.go.th/api/v1/org/dotnet/keycloak/bafc5795-befc-4d3f-a461-3533c38a5fc1",
{ headers: headers }
);
// ตรวจสอบการตอบสนอง
check(response, {
"is status 200": (r) => r.status === 200,
});
// หน่วงเวลา 1 วินาที
sleep(1);
}