Add ProcessEmpTaskAsync method to handle employee task processing and integrate with external API for attendance reporting
This commit is contained in:
parent
82c31a0f57
commit
d85bab11b2
1 changed files with 246 additions and 0 deletions
|
|
@ -410,6 +410,251 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task ProcessEmpTaskAsync(Guid rootDnaId, DateTime? startDate, DateTime? endDate)
|
||||||
|
{
|
||||||
|
|
||||||
|
var profiles = new List<GetProfileByKeycloakIdRootDto>();
|
||||||
|
var dateStart = startDate?.Date ?? DateTime.Now.Date;
|
||||||
|
var dateEnd = endDate?.Date ?? DateTime.Now.Date;
|
||||||
|
|
||||||
|
var holidays = await _holidayRepository.GetHolidayAsync(dateStart, dateEnd);
|
||||||
|
var weekend = _holidayRepository.GetWeekEnd(dateStart, dateEnd);
|
||||||
|
var excludeDates = holidays.Union(weekend).ToList();
|
||||||
|
|
||||||
|
var dateList = new List<LoopDate>();
|
||||||
|
for (DateTime i = dateStart; i <= dateEnd; i = i.AddDays(1))
|
||||||
|
{
|
||||||
|
if (holidays.Contains(i))
|
||||||
|
{
|
||||||
|
var d = await _holidayRepository.GetHolidayAsync(i);
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = true,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = d
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (weekend.Contains(i))
|
||||||
|
{
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = true,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = "วันหยุด"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = false,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = ""
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
||||||
|
if (defaultRound == null)
|
||||||
|
{
|
||||||
|
throw new Exception("ไม่พบรอบการลงเวลา Default");
|
||||||
|
}
|
||||||
|
|
||||||
|
var employees = new List<DateResultReport>();
|
||||||
|
|
||||||
|
foreach (var dd in dateList.Where(x => !x.isHoliday && !x.isWeekEnd))
|
||||||
|
{
|
||||||
|
profiles = await _userProfileRepository.GetAllEmployeeByRootDnaId(rootDnaId.ToString(),dd.date);
|
||||||
|
foreach (var p in profiles)
|
||||||
|
{
|
||||||
|
var count = 1;
|
||||||
|
var keycloakUserId = p.Keycloak ?? Guid.Empty;
|
||||||
|
|
||||||
|
var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date);
|
||||||
|
|
||||||
|
var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}";
|
||||||
|
|
||||||
|
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id, dd.date);
|
||||||
|
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
|
||||||
|
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
|
||||||
|
|
||||||
|
var duty = userRound ?? defaultRound;
|
||||||
|
|
||||||
|
// check วันลาของแต่ละคน
|
||||||
|
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date);
|
||||||
|
var remarkStr = string.Empty;
|
||||||
|
var status = string.Empty;
|
||||||
|
var stampType = string.Empty;
|
||||||
|
var stampAmount = 0.0;
|
||||||
|
|
||||||
|
if (leaveReq != null)
|
||||||
|
{
|
||||||
|
switch (leaveReq.Type.Code.ToUpper())
|
||||||
|
{
|
||||||
|
case "LV-001":
|
||||||
|
case "LV-002":
|
||||||
|
case "LV-005":
|
||||||
|
remarkStr += leaveReq.Type.Name;
|
||||||
|
var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper();
|
||||||
|
if (leaveRange == "MORNING")
|
||||||
|
remarkStr += "ครึ่งวันเช้า";
|
||||||
|
else if (leaveRange == "AFTERNOON")
|
||||||
|
remarkStr += "ครึ่งวันบ่าย";
|
||||||
|
|
||||||
|
|
||||||
|
// var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
||||||
|
// if (leaveRangeEnd == "MORNING")
|
||||||
|
// remarkStr += "ครึ่งวันเช้า";
|
||||||
|
// else if (leaveRangeEnd == "AFTERNOON")
|
||||||
|
// remarkStr += "ครึ่งวันบ่าย";
|
||||||
|
|
||||||
|
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
||||||
|
if (leaveRange != leaveRangeEnd)
|
||||||
|
{
|
||||||
|
if (leaveRangeEnd == "MORNING")
|
||||||
|
remarkStr += " - ครึ่งวันเช้า";
|
||||||
|
else if (leaveRangeEnd == "AFTERNOON")
|
||||||
|
remarkStr += " - ครึ่งวันบ่าย";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
remarkStr += leaveReq.Type.Name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
status = "LEAVE";
|
||||||
|
stampType = leaveReq.LeaveRange ?? "";
|
||||||
|
stampAmount = leaveReq.LeaveRange == "MORNING" || leaveReq.LeaveRangeEnd == "MORNING" ? 0.5 : 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (timeStamps == null)
|
||||||
|
{
|
||||||
|
if (dd.date <= DateTime.Now.Date)
|
||||||
|
{
|
||||||
|
remarkStr = "ขาดราชการ";
|
||||||
|
status = "ABSENT";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
if (dd.isHoliday == true)
|
||||||
|
{
|
||||||
|
remarkStr = $"วันหยุด ({dd.dateRemark})";
|
||||||
|
status = "HOLIDAY";
|
||||||
|
}
|
||||||
|
else if (dd.isWeekEnd)
|
||||||
|
{
|
||||||
|
remarkStr = dd.dateRemark;
|
||||||
|
status = "WEEKEND";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else remarkStr = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// check status ของการลงเวลา
|
||||||
|
if (timeStamps.CheckOut != null)
|
||||||
|
{
|
||||||
|
if (timeStamps.CheckOutStatus == "ABSENT")
|
||||||
|
{
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : "");
|
||||||
|
status = "ABSENT";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
}
|
||||||
|
else if (timeStamps.CheckInStatus == "ABSENT")
|
||||||
|
{
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
status = "ABSENT";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
}
|
||||||
|
else if (timeStamps.CheckInStatus == "LATE")
|
||||||
|
{
|
||||||
|
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
status = "LATE";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
//lateTotal += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (timeStamps.CheckInStatus == "ABSENT")
|
||||||
|
{
|
||||||
|
status = "ABSENT";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
}
|
||||||
|
else if (timeStamps.CheckInStatus == "LATE")
|
||||||
|
{
|
||||||
|
status = "LATE";
|
||||||
|
stampType = "FULL_DAY";
|
||||||
|
stampAmount = 1;
|
||||||
|
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
//lateTotal += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var emp = new DateResultReport
|
||||||
|
{
|
||||||
|
profileId = p.Id.ToString(),
|
||||||
|
stampDate = dd.date,
|
||||||
|
stampType = stampType,
|
||||||
|
stampAmount = stampAmount,
|
||||||
|
remark = remarkStr,
|
||||||
|
status = status
|
||||||
|
};
|
||||||
|
|
||||||
|
employees.Add(emp);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// // Write employees to JSON file
|
||||||
|
// var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
|
||||||
|
// var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName);
|
||||||
|
|
||||||
|
// // Ensure directory exists
|
||||||
|
// var directory = Path.GetDirectoryName(filePath);
|
||||||
|
// if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
||||||
|
// {
|
||||||
|
// Directory.CreateDirectory(directory);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var jsonOptions = new JsonSerializerOptions
|
||||||
|
// {
|
||||||
|
// WriteIndented = true,
|
||||||
|
// Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
||||||
|
// };
|
||||||
|
|
||||||
|
// var jsonContent = JsonSerializer.Serialize(employees, jsonOptions);
|
||||||
|
// await File.WriteAllTextAsync(filePath, jsonContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
//call api
|
||||||
|
var apiPath = $"{_configuration["API"]}/org/profile-employee/absent-late/batch";
|
||||||
|
var apiKey = _configuration["API_KEY"];
|
||||||
|
var body = new
|
||||||
|
{
|
||||||
|
records = employees
|
||||||
|
};
|
||||||
|
|
||||||
|
var apiResult = await PostExternalAPIAsync(apiPath, AccessToken ?? "", body, apiKey);
|
||||||
|
if(apiResult == "")
|
||||||
|
{
|
||||||
|
throw new Exception($"เรียก API {apiPath} ไม่สำเร็จ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task ProcessPendingJobsAsync()
|
public async Task ProcessPendingJobsAsync()
|
||||||
{
|
{
|
||||||
var pendingJobs = await GetPendingJobsAsync();
|
var pendingJobs = await GetPendingJobsAsync();
|
||||||
|
|
@ -424,6 +669,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
|
|
||||||
// ทำงานที่ต้องการที่นี่ (เช่น เรียก API, ประมวลผลข้อมูล ฯลฯ)
|
// ทำงานที่ต้องการที่นี่ (เช่น เรียก API, ประมวลผลข้อมูล ฯลฯ)
|
||||||
await ProcessTaskAsync(job.RootDnaId,job.StartDate, job.EndDate);
|
await ProcessTaskAsync(job.RootDnaId,job.StartDate, job.EndDate);
|
||||||
|
await ProcessEmpTaskAsync(job.RootDnaId,job.StartDate, job.EndDate);
|
||||||
|
|
||||||
// อัปเดตสถานะเป็น Completed
|
// อัปเดตสถานะเป็น Completed
|
||||||
await UpdateToCompletedAsync(job.Id);
|
await UpdateToCompletedAsync(job.Id);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue