From a50153f32cadc6b0a3dca7ab423e391d62ee81db Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Tue, 31 Mar 2026 11:26:28 +0700 Subject: [PATCH] Refactor LeaveProcessJobStatusRepository to enhance leave remark generation logic and update file export functionality with environment path handling --- .../LeaveProcessJobStatusRepository.cs | 255 ++++++++++++------ 1 file changed, 170 insertions(+), 85 deletions(-) diff --git a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs index 4a2be392..3962b53e 100644 --- a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs @@ -10,6 +10,7 @@ using BMA.EHR.Application.Repositories.MetaData; using BMA.EHR.Application.Responses.Profiles; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Leave.TimeAttendants; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; @@ -29,6 +30,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository; private readonly LeaveRequestRepository _leaveRequestRepository; private readonly IConfiguration _configuration; + private readonly IWebHostEnvironment _env; #endregion @@ -42,7 +44,8 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants UserDutyTimeRepository userDutyTimeRepository, ProcessUserTimeStampRepository processUserTimeStampRepository, LeaveRequestRepository leaveRequestRepository, - IConfiguration configuration) : base(dbContext, httpContextAccessor) + IConfiguration configuration, + IWebHostEnvironment env) : base(dbContext, httpContextAccessor) { _dbContext = dbContext; _httpContextAccessor = httpContextAccessor; @@ -53,6 +56,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants _dutyTimeRepository = dutyTimeRepository; _userDutyTimeRepository = userDutyTimeRepository; _processUserTimeStampRepository = processUserTimeStampRepository; + _env = env; } #endregion @@ -255,34 +259,75 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants 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(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date) { - if (leaveRangeEnd == "MORNING") - remarkStr += " - ครึ่งวันเช้า"; - else if (leaveRangeEnd == "AFTERNOON") - remarkStr += " - ครึ่งวันบ่าย"; + 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 += " - ครึ่งวันบ่าย"; + } } + else + { + if(dd.date == leaveReq.LeaveStartDate.Date) + { + if (leaveRange == "MORNING") + remarkStr += "ครึ่งวันเช้า"; + else if (leaveRange == "AFTERNOON") + remarkStr += "ครึ่งวันบ่าย"; + } + else if(dd.date == leaveReq.LeaveEndDate.Date) + { + var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); + if (leaveRangeEnd == "MORNING") + remarkStr += "ครึ่งวันเช้า"; + else if (leaveRangeEnd == "AFTERNOON") + remarkStr += "ครึ่งวันบ่าย"; + else + remarkStr += "เต็มวัน"; + } + else + { + remarkStr += "เต็มวัน"; + } + } + + break; default: remarkStr += leaveReq.Type.Name; break; } status = "LEAVE"; - stampType = leaveReq.LeaveRange ?? ""; - stampAmount = leaveReq.LeaveRange == "MORNING" || leaveReq.LeaveRangeEnd == "MORNING" ? 0.5 : 1; + if(leaveReq.LeaveStartDate.Date == dd.date) + { + stampType = leaveReq.LeaveRange ?? ""; + stampAmount = leaveReq.LeaveRange != "ALL" ? 0.5 : 1; + } + else if(leaveReq.LeaveEndDate.Date == dd.date) + { + stampAmount = leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1; + stampType = leaveReq.LeaveRangeEnd ?? ""; + } + else + stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1; + if(stampType == "ALL") stampType = "FULL_DAY"; } else { @@ -374,25 +419,25 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants count++; } - // // Write employees to JSON file - // var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt"; - // var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName); + // 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); - // } + // 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 jsonOptions = new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; - // var jsonContent = JsonSerializer.Serialize(employees, jsonOptions); - // await File.WriteAllTextAsync(filePath, jsonContent); + var jsonContent = JsonSerializer.Serialize(employees, jsonOptions); + await File.WriteAllTextAsync(filePath, jsonContent); } //call api @@ -499,34 +544,72 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants 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(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date) { - if (leaveRangeEnd == "MORNING") - remarkStr += " - ครึ่งวันเช้า"; - else if (leaveRangeEnd == "AFTERNOON") - remarkStr += " - ครึ่งวันบ่าย"; + 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 += " - ครึ่งวันบ่าย"; + } } + else + { + if(dd.date == leaveReq.LeaveStartDate.Date) + { + if (leaveRange == "MORNING") + remarkStr += "ครึ่งวันเช้า"; + else if (leaveRange == "AFTERNOON") + remarkStr += "ครึ่งวันบ่าย"; + } + else if(dd.date == leaveReq.LeaveEndDate.Date) + { + var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); + if (leaveRangeEnd == "MORNING") + remarkStr += "ครึ่งวันเช้า"; + else if (leaveRangeEnd == "AFTERNOON") + remarkStr += "ครึ่งวันบ่าย"; + } + else + { + remarkStr += "เต็มวัน"; + } + } break; default: remarkStr += leaveReq.Type.Name; break; } status = "LEAVE"; - stampType = leaveReq.LeaveRange ?? ""; - stampAmount = leaveReq.LeaveRange == "MORNING" || leaveReq.LeaveRangeEnd == "MORNING" ? 0.5 : 1; + if(leaveReq.LeaveStartDate.Date == dd.date) + { + stampType = leaveReq.LeaveRange ?? ""; + stampAmount = leaveReq.LeaveRange != "ALL" ? 0.5 : 1; + } + else if(leaveReq.LeaveEndDate.Date == dd.date) + { + stampAmount = leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1; + stampType = leaveReq.LeaveRangeEnd ?? ""; + } + else + stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1; + if(stampType == "ALL") stampType = "FULL_DAY"; + //stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1; } else { @@ -618,40 +701,42 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants count++; } - // // Write employees to JSON file - // var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt"; - // var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName); + // Write employees to JSON file + var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt"; + var filePath = Path.Combine(_env.ContentRootPath, "Exports", fileName); - // // Ensure directory exists - // var directory = Path.GetDirectoryName(filePath); - // if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - // { - // Directory.CreateDirectory(directory); - // } + // 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 jsonOptions = new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; - // var jsonContent = JsonSerializer.Serialize(employees, jsonOptions); - // await File.WriteAllTextAsync(filePath, jsonContent); + var jsonContent = JsonSerializer.Serialize(employees, jsonOptions); + Console.WriteLine($"Writing file to: {filePath}"); + await File.WriteAllTextAsync(filePath, jsonContent); + Console.WriteLine($"File written successfully: {fileName}"); } //call api - var apiPath = $"{_configuration["API"]}/org/profile-employee/absent-late/batch"; - var apiKey = _configuration["API_KEY"]; - var body = new - { - records = employees - }; + // 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} ไม่สำเร็จ"); - } + // var apiResult = await PostExternalAPIAsync(apiPath, AccessToken ?? "", body, apiKey); + // if(apiResult == "") + // { + // throw new Exception($"เรียก API {apiPath} ไม่สำเร็จ"); + // } } @@ -669,7 +754,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants // ทำงานที่ต้องการที่นี่ (เช่น เรียก API, ประมวลผลข้อมูล ฯลฯ) await ProcessTaskAsync(job.RootDnaId,job.StartDate, job.EndDate); - await ProcessEmpTaskAsync(job.RootDnaId,job.StartDate, job.EndDate); + //await ProcessEmpTaskAsync(job.RootDnaId,job.StartDate, job.EndDate); // อัปเดตสถานะเป็น Completed await UpdateToCompletedAsync(job.Id);