diff --git a/.gitignore b/.gitignore index 3b4a194..a479b56 100644 --- a/.gitignore +++ b/.gitignore @@ -475,5 +475,3 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk - -.claude \ No newline at end of file diff --git a/Controllers/DisableController.cs b/Controllers/DisableController.cs index cb6804a..c982f03 100644 --- a/Controllers/DisableController.cs +++ b/Controllers/DisableController.cs @@ -86,7 +86,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; - private string? RootDnaId => _httpContextAccessor?.HttpContext?.User?.FindFirst("orgRootDnaId")?.Value; private string? token => _httpContextAccessor.HttpContext.Request.Headers["Authorization"]; #endregion @@ -488,7 +487,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers Note = req.Note, AnnouncementDate = req.AnnouncementDate, CheckDisability = true, - OrganizationId = req.rootDnaId, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", CreatedFullName = FullName ?? "System Administrator", @@ -501,7 +499,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers using (var client = new HttpClient()) { 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 _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _res = await client.SendAsync(_req); var _result = await _res.Content.ReadAsStringAsync(); @@ -670,16 +668,8 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } - string role = jsonData["result"]?.ToString() ?? string.Empty; - string rootDnaId = string.Empty; - if (role != "OWNER") - { - rootDnaId = RootDnaId?.ToString() ?? ""; - } - var data = await _context.PeriodExams.AsQueryable() .Where(x => x.CheckDisability == true) - .Where(x => string.IsNullOrEmpty(rootDnaId) || x.OrganizationId == Guid.Parse(rootDnaId)) .Include(x => x.ImportFile) .Include(x => x.Disables) .Include(x => x.ScoreImport) @@ -2188,177 +2178,90 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers { try { - #region old - //var data = await _context.Disables.AsQueryable() - // .Include(x => x.PeriodExam) - // .Include(x => x.Documents) - // .ThenInclude(x => x.DocumentFile) - // .Where(x => x.PeriodExam.Id == id) - // .Where(x => x.PeriodExam.CheckDisability == true) - // .Where(x => x.ExamId == examId) - // .Join(_context.DisableScores.AsQueryable() - // .Include(x => x.ScoreImport), - // rc => new { PeriodExamId = rc.PeriodExam.Id, rc.ExamId }, - // sc => new { PeriodExamId = sc.ScoreImport.PeriodExamId, sc.ExamId }, - // (p, sr) => new - // { - // ExamID = p.ExamId, - // ProfileID = p.CitizenId, - // p.Prefix, - // FullName = $"{p.FirstName} {p.LastName}", - // DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue - // ? p.DateOfBirth.Value.ToThaiShortDate() - // : "", - // Gender = p.Gendor, - // Degree = p.Educations.First().Degree, - // Major = p.Educations.First().Major, - // CertificateNo = p.Certificates.Count > 0 - // ? p.Certificates.First().CertificateNo ?? "" - // : "", - // CertificateIssueDate = p.Certificates.Count > 0 - // ? p.Certificates.First().IssueDate != DateTime.MinValue - // ? p.Certificates.First().IssueDate.ToThaiShortDate() - // : "" - // : "", - // ExamResult = sr == null ? "" : sr.ExamStatus, - // ExamAttribute = sr != null && !string.IsNullOrEmpty(sr.ExamAttribute) && - // (sr.ExamAttribute == "มีคุณสมบัติ" || sr.ExamAttribute == "ไม่มีคุณสมบัติ") - // ? sr.ExamAttribute : "", - // IsSpecial = p.Isspecial, - // Remark = p.Remark, - // University = p.Educations.First().University, - // PositionName = p.PositionName, - // PositionType = p.PositionType, - // PositionLevel = p.PositionLevel, - // ExamName = p.PeriodExam!.Name, - // ExamOrder = p.PeriodExam.Round, - // ExamYear = p.PeriodExam.Year == null ? 0 : p.PeriodExam.Year.Value.ToThaiYear(), - // Score = sr == null ? 0.0 : sr.TotalScore, - // Number = sr == null ? "" : sr.Number, - // ExamCount = _disableService.GetExamCount(p.CitizenId), - // ScoreExpire = p.PeriodExam.AnnouncementDate == null - // ? "" - // : p.PeriodExam.AnnouncementDate != DateTime.MinValue - // ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() - // : "", - // typeTest = p.typeTest, - // ScoreResult = sr == null ? null : new - // { - // ScoreAFull = sr.FullA, - // ScoreA = sr.SumA, - // ScoreBFull = sr.FullB, - // ScoreB = sr.SumB, - // ScoreAB = sr.SumAB, - // ScoreCFull = sr.FullC, - // ScoreC = sr.SumC, - // ScoreDFull = sr.FullD, - // ScoreD = sr.SumD, - // ScoreCD = sr.SumCD, - // ScoreSumFull = sr.FullScore, - // ScoreSum = sr.TotalScore, - // ExamResult = sr.ExamStatus - // }, - // Attachments = p.Documents.Select(a => new - // { - // FileName = a.DocumentFile.FileName, - // DocumentId = a.DocumentFile.Id - // }) - // }) - // .FirstOrDefaultAsync(); - #endregion - - // 1. Query Disable (ข้อมูลผู้สอบ) - var disable = await _context.Disables.AsQueryable() + var data = await _context.Disables.AsQueryable() .Include(x => x.PeriodExam) .Include(x => x.Documents) .ThenInclude(x => x.DocumentFile) - .Include(x => x.Educations) - .Include(x => x.Certificates) - .Where(x => x.PeriodExam != null) .Where(x => x.PeriodExam.Id == id) .Where(x => x.PeriodExam.CheckDisability == true) .Where(x => x.ExamId == examId) + .Join(_context.DisableScores.AsQueryable() + .Include(x => x.ScoreImport), + rc => new { PeriodExamId = rc.PeriodExam.Id, rc.ExamId }, + sc => new { PeriodExamId = sc.ScoreImport.PeriodExamId, sc.ExamId }, + (p, sr) => new + { + ExamID = p.ExamId, + ProfileID = p.CitizenId, + p.Prefix, + FullName = $"{p.FirstName} {p.LastName}", + DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue + ? p.DateOfBirth.Value.ToThaiShortDate() + : "", + Gender = p.Gendor, + Degree = p.Educations.First().Degree, + Major = p.Educations.First().Major, + CertificateNo = p.Certificates.Count > 0 + ? p.Certificates.First().CertificateNo ?? "" + : "", + CertificateIssueDate = p.Certificates.Count > 0 + ? p.Certificates.First().IssueDate != DateTime.MinValue + ? p.Certificates.First().IssueDate.ToThaiShortDate() + : "" + : "", + ExamResult = sr == null ? "" : sr.ExamStatus, + // ExamAttribute = p.Certificates.Count > 0 ? + // _disableService.CheckValidCertificate(p.Certificates.First().IssueDate, 5) + // ? "มีคุณสมบัติ" + // : "ไม่มีคุณสมบัติ" + // : "ไม่มีคุณสมบัติ", + + ExamAttribute = sr != null && !string.IsNullOrEmpty(sr.ExamAttribute) && + (sr.ExamAttribute == "มีคุณสมบัติ" || sr.ExamAttribute == "ไม่มีคุณสมบัติ") + ? sr.ExamAttribute : "", + + IsSpecial = p.Isspecial, + Remark = p.Remark, + University = p.Educations.First().University, + PositionName = p.PositionName, + PositionType = p.PositionType, + PositionLevel = p.PositionLevel, + ExamName = p.PeriodExam!.Name, + ExamOrder = p.PeriodExam.Round, + ExamYear = p.PeriodExam.Year == null ? 0 : p.PeriodExam.Year.Value.ToThaiYear(), + Score = sr == null ? 0.0 : sr.TotalScore, + Number = sr == null ? "" : sr.Number, + ExamCount = _disableService.GetExamCount(p.CitizenId), + ScoreExpire = p.PeriodExam.AnnouncementDate == null + ? "" + : p.PeriodExam.AnnouncementDate != DateTime.MinValue + ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() + : "", + typeTest = p.typeTest, + ScoreResult = sr == null ? null : new + { + ScoreAFull = sr.FullA, + ScoreA = sr.SumA, + ScoreBFull = sr.FullB, + ScoreB = sr.SumB, + ScoreAB = sr.SumAB, + ScoreCFull = sr.FullC, + ScoreC = sr.SumC, + ScoreDFull = sr.FullD, + ScoreD = sr.SumD, + ScoreCD = sr.SumCD, + ScoreSumFull = sr.FullScore, + ScoreSum = sr.TotalScore, + ExamResult = sr.ExamStatus + }, + Attachments = p.Documents.Select(a => new + { + FileName = a.DocumentFile.FileName, + DocumentId = a.DocumentFile.Id + }) + }) .FirstOrDefaultAsync(); - if (disable == null) - return Success(); - - // 2. Query DisableScore (ข้อมูลคะแนน) — แยกต่างหาก ไม่มีก็ผ่าน - var score = await _context.DisableScores.AsQueryable() - .Include(x => x.ScoreImport) - .Where(x => x.ScoreImport != null) - .Where(x => x.ScoreImport.PeriodExamId == id) - .Where(x => x.ExamId == examId) - .FirstOrDefaultAsync(); - - // 3. รวมผลลัพธ์ก่อน return - var data = new - { - ExamID = disable.ExamId, - ProfileID = disable.CitizenId, - disable.Prefix, - FullName = $"{disable.FirstName} {disable.LastName}", - DateOfBirth = disable.DateOfBirth.HasValue && disable.DateOfBirth.Value != DateTime.MinValue - ? disable.DateOfBirth.Value.ToThaiShortDate() - : "", - Gender = disable.Gendor, - Degree = disable.Educations.First().Degree, - Major = disable.Educations.First().Major, - CertificateNo = disable.Certificates.Count > 0 - ? disable.Certificates.First().CertificateNo ?? "" - : "", - CertificateIssueDate = disable.Certificates.Count > 0 - ? disable.Certificates.First().IssueDate != DateTime.MinValue - ? disable.Certificates.First().IssueDate.ToThaiShortDate() - : "" - : "", - ExamResult = score == null ? "" : score.ExamStatus, - - ExamAttribute = score != null && !string.IsNullOrEmpty(score.ExamAttribute) && - (score.ExamAttribute == "มีคุณสมบัติ" || score.ExamAttribute == "ไม่มีคุณสมบัติ") - ? score.ExamAttribute : "", - - IsSpecial = disable.Isspecial, - Remark = disable.Remark, - University = disable.Educations.First().University, - PositionName = disable.PositionName, - PositionType = disable.PositionType, - PositionLevel = disable.PositionLevel, - ExamName = disable.PeriodExam!.Name, - ExamOrder = disable.PeriodExam.Round, - ExamYear = disable.PeriodExam.Year == null ? 0 : disable.PeriodExam.Year.Value.ToThaiYear(), - Score = score == null ? 0.0 : score.TotalScore, - Number = score == null ? "" : score.Number, - ExamCount = _disableService.GetExamCount(disable.CitizenId), - ScoreExpire = disable.PeriodExam.AnnouncementDate == null - ? "" - : disable.PeriodExam.AnnouncementDate != DateTime.MinValue - ? disable.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() - : "", - typeTest = disable.typeTest, - ScoreResult = score == null ? null : new - { - ScoreAFull = score.FullA, - ScoreA = score.SumA, - ScoreBFull = score.FullB, - ScoreB = score.SumB, - ScoreAB = score.SumAB, - ScoreCFull = score.FullC, - ScoreC = score.SumC, - ScoreDFull = score.FullD, - ScoreD = score.SumD, - ScoreCD = score.SumCD, - ScoreSumFull = score.FullScore, - ScoreSum = score.TotalScore, - ExamResult = score.ExamStatus - }, - Attachments = disable.Documents.Select(a => new - { - FileName = a.DocumentFile.FileName, - DocumentId = a.DocumentFile.Id - }) - }; - return Success(data); } catch (Exception ex) @@ -2548,7 +2451,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers } /// - /// โอนคนสรรหาไปบรรจุ (คัดเลือกอื่นๆ) + /// โอนคนสรรหาไปบรรจุ /// /// รหัสรอบสมัคร /// @@ -2593,106 +2496,49 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers { try { - #region old - //var data = await _context.Disables.AsQueryable() - // .Include(x => x.PeriodExam) - // .Where(x => x.PeriodExam!.Id == id) - // .Where(x => x.ExamId == examId) - // .Join(_context.DisableScores.AsQueryable() - // .Include(x => x.ScoreImport), - // rc => new { rc.PeriodExam!.Id, rc.ExamId }, - // sc => new { Id = sc.ScoreImport!.PeriodExamId, sc.ExamId }, - // (p, sr) => new - // { - // ExamID = p.ExamId != null ? p.ExamId.ToThaiNumber() : "", - // CitizenId = p.CitizenId != null ? p.CitizenId.ToThaiNumber() : "", - // FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", - // DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue - // ? p.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() - // : "", - // Gender = p.Gendor, - // Degree = p.Educations.First().Degree, - // Major = p.Educations.First().Major, - // University = p.Educations.First().University, - // PositionName = p.PositionName, - // ExamName = $"{p.PeriodExam!.Name} ครั้งที่ {p.PeriodExam.Round}/{(p.PeriodExam.Year > 2500 ? p.PeriodExam.Year : (p.PeriodExam.Year + 543))}".ToThaiNumber(), - // - // ExamCount = _disableService.GetExamCount(p.CitizenId).ToString().ToThaiNumber(), - // type = p.typeTest == "bangkok" ? "กทม." : p.typeTest == "ocsc" ? "ก.พ." : "", - // FA = sr.FullA != null ? sr.FullA.ToString().ToThaiNumber() : "", - // SA = sr.SumA != null ? sr.SumA.ToString().ToThaiNumber() : "", - // FC = sr.FullC != null ? sr.FullC.ToString().ToThaiNumber() : "", - // SC = sr.SumC != null ? sr.SumC.ToString().ToThaiNumber() : "", - // FD = sr.FullD != null ? sr.FullD.ToString().ToThaiNumber() : "", - // SD = sr.SumD != null ? sr.SumD.ToString().ToThaiNumber() : "", - // F = sr.FullScore != null ? sr.FullScore.ToString().ToThaiNumber() : "", - // T = sr.TotalScore != null ? sr.TotalScore.ToString().ToThaiNumber() : "", - // Result = sr.ExamStatus, - // Number = sr.Number != null ? sr.Number.ToString().ToThaiNumber() : "", - // Expire = p.PeriodExam.AnnouncementDate == null - // ? "" - // : p.PeriodExam.AnnouncementDate != DateTime.MinValue - // ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() - // : "", - // }) - // .FirstOrDefaultAsync(); - #endregion - - // 1. Query Disable (ข้อมูลผู้สอบ) - var disable = await _context.Disables.AsQueryable() + var data = await _context.Disables.AsQueryable() .Include(x => x.PeriodExam) - .Include(x => x.Educations) - .Where(x => x.PeriodExam != null) - .Where(x => x.PeriodExam.Id == id) + .Where(x => x.PeriodExam!.Id == id) .Where(x => x.ExamId == examId) + .Join(_context.DisableScores.AsQueryable() + .Include(x => x.ScoreImport), + rc => new { rc.PeriodExam!.Id, rc.ExamId }, + sc => new { Id = sc.ScoreImport!.PeriodExamId, sc.ExamId }, + (p, sr) => new + { + ExamID = p.ExamId != null ? p.ExamId.ToThaiNumber() : "", + CitizenId = p.CitizenId != null ? p.CitizenId.ToThaiNumber() : "", + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue + ? p.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() + : "", + Gender = p.Gendor, + Degree = p.Educations.First().Degree, + Major = p.Educations.First().Major, + University = p.Educations.First().University, + PositionName = p.PositionName, + ExamName = $"{p.PeriodExam!.Name} ครั้งที่ {p.PeriodExam.Round}/{(p.PeriodExam.Year > 2500 ? p.PeriodExam.Year : (p.PeriodExam.Year + 543))}".ToThaiNumber(), + + ExamCount = _disableService.GetExamCount(p.CitizenId).ToString().ToThaiNumber(), + type = p.typeTest == "bangkok" ? "กทม." : p.typeTest == "ocsc" ? "ก.พ." : "", + FA = sr.FullA != null ? sr.FullA.ToString().ToThaiNumber() : "", + SA = sr.SumA != null ? sr.SumA.ToString().ToThaiNumber() : "", + FC = sr.FullC != null ? sr.FullC.ToString().ToThaiNumber() : "", + SC = sr.SumC != null ? sr.SumC.ToString().ToThaiNumber() : "", + FD = sr.FullD != null ? sr.FullD.ToString().ToThaiNumber() : "", + SD = sr.SumD != null ? sr.SumD.ToString().ToThaiNumber() : "", + F = sr.FullScore != null ? sr.FullScore.ToString().ToThaiNumber() : "", + T = sr.TotalScore != null ? sr.TotalScore.ToString().ToThaiNumber() : "", + Result = sr.ExamStatus, + Number = sr.Number != null ? sr.Number.ToString().ToThaiNumber() : "", + Expire = p.PeriodExam.AnnouncementDate == null + ? "" + : p.PeriodExam.AnnouncementDate != DateTime.MinValue + ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() + : "", + }) .FirstOrDefaultAsync(); - if (disable == null) - return Success(); - - // 2. Query DisableScore (ข้อมูลคะแนน) — แยกต่างหาก ไม่มีก็ผ่าน - var score = await _context.DisableScores.AsQueryable() - .Include(x => x.ScoreImport) - .Where(x => x.ScoreImport != null) - .Where(x => x.ScoreImport.PeriodExamId == id) - .Where(x => x.ExamId == examId) - .FirstOrDefaultAsync(); - - // 3. รวมผลลัพธ์ - var data = new - { - ExamID = disable.ExamId != null ? disable.ExamId.ToThaiNumber() : "", - CitizenId = disable.CitizenId != null ? disable.CitizenId.ToThaiNumber() : "", - FullName = $"{disable.Prefix}{disable.FirstName} {disable.LastName}", - DateOfBirth = disable.DateOfBirth.HasValue && disable.DateOfBirth.Value != DateTime.MinValue - ? disable.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() - : "", - Gender = disable.Gendor, - Degree = disable.Educations.First().Degree, - Major = disable.Educations.First().Major, - University = disable.Educations.First().University, - PositionName = disable.PositionName, - ExamName = $"{disable.PeriodExam!.Name} ครั้งที่ {disable.PeriodExam.Round}/{(disable.PeriodExam.Year > 2500 ? disable.PeriodExam.Year : (disable.PeriodExam.Year + 543))}".ToThaiNumber(), - - ExamCount = _disableService.GetExamCount(disable.CitizenId!).ToString().ToThaiNumber(), - type = disable.typeTest == "bangkok" ? "กทม." : disable.typeTest == "ocsc" ? "ก.พ." : "", - FA = score != null ? score.FullA.ToString().ToThaiNumber() : "", - SA = score != null ? score.SumA.ToString().ToThaiNumber() : "", - FC = score != null ? score.FullC.ToString().ToThaiNumber() : "", - SC = score != null ? score.SumC.ToString().ToThaiNumber() : "", - FD = score != null ? score.FullD.ToString().ToThaiNumber() : "", - SD = score != null ? score.SumD.ToString().ToThaiNumber() : "", - F = score != null ? score.FullScore.ToString().ToThaiNumber() : "", - T = score != null ? score.TotalScore.ToString().ToThaiNumber() : "", - Result = score != null ? score.ExamStatus : "", - Number = score != null && score.Number != null ? score.Number.ToString().ToThaiNumber() : "", - Expire = disable.PeriodExam.AnnouncementDate == null - ? "" - : disable.PeriodExam.AnnouncementDate != DateTime.MinValue - ? disable.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() - : "", - }; - var result = new { template = "recruit-exam", diff --git a/Controllers/PeriodExamController.cs b/Controllers/PeriodExamController.cs index db6edb9..b52b0f6 100644 --- a/Controllers/PeriodExamController.cs +++ b/Controllers/PeriodExamController.cs @@ -749,56 +749,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers } } - /// - /// ดาวน์โหลดรายชื่อผู้มีสิทธิ์สอบ - /// - /// รหัสรอบสมัคร - /// - /// เมื่อทำการอ่านโหลดผู้สมัครสอบสำเร็จ - /// ไม่ได้ Login เข้าระบบ - /// เมื่อเกิดข้อผิดพลาดในการทำงาน - [HttpGet("download/candidate-exam/{examId:length(36)}")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> DownloadCandidateExamAsync(string examId) - { - try - { - var data = await _periodExamService.DownloadCandidateExamAsync(examId); - return Success(data); - } - catch (Exception ex) - { - return Error(ex); - } - } - - /// - /// ดาวน์โหลดรายชื่อผู้สอบคัดเลือกได้ - /// - /// รหัสรอบสมัคร - /// - /// เมื่อทำการอ่านโหลดผู้สมัครสอบสำเร็จ - /// ไม่ได้ Login เข้าระบบ - /// เมื่อเกิดข้อผิดพลาดในการทำงาน - [HttpGet("download/pass-exam/{examId:length(36)}")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> DownloadPassExamAsync(string examId) - { - try - { - var data = await _periodExamService.DownloadPassExamAsync(examId); - return Success(data); - } - catch (Exception ex) - { - return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); - } - } - /// /// โหลดผู้สมัครสอบ /// @@ -1002,7 +952,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers } /// - /// โอนคนสรรหาไปบรรจุ (สอบคัดเลือก) + /// โอนคนสรรหาไปบรรจุ /// /// รหัสรอบสมัคร /// diff --git a/Core/RequestLoggingMiddleware.cs b/Core/RequestLoggingMiddleware.cs index a39a4d9..6d306de 100644 --- a/Core/RequestLoggingMiddleware.cs +++ b/Core/RequestLoggingMiddleware.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.Configuration; using Nest; using System.Diagnostics; -using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text.Encodings.Web; using System.Text.Json; @@ -30,49 +29,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Core SystemName = "recruiting"; } - /// - /// แกะ JWT token เพื่อดึง claims ต่างๆ - /// - private JwtSecurityToken? ParseToken(string token) - { - try - { - var tokenHandler = new JwtSecurityTokenHandler(); - var jwtToken = tokenHandler.ReadJwtToken(token.Replace("Bearer ", "")); - return jwtToken; - } - catch - { - return null; - } - } - - /// - /// ดึงค่า claim จาก token โดยลองชื่อหลายแบบ - /// - private string? GetClaimValue(JwtSecurityToken? token, params string[] claimNames) - { - if (token == null) return null; - - foreach (var name in claimNames) - { - var claim = token.Claims.FirstOrDefault(c => c.Type == name); - if (claim != null) - return claim.Value; - } - return null; - } - - /// - /// ดึงค่า Guid claim จาก token - /// - private Guid? GetGuidClaim(JwtSecurityToken? token, params string[] claimNames) - { - var value = GetClaimValue(token, claimNames); - if (Guid.TryParse(value, out var guid)) - return guid; - return null; - } public async Task Invoke(HttpContext context) { @@ -136,22 +92,28 @@ namespace BMA.EHR.Recurit.Exam.Service.Core // เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้ context.Response.Body = memoryStream; + + + // Extract all required data from JWT token claims var keycloakId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? Guid.Empty.ToString("D"); - var tokenHeader = context.Request.Headers["Authorization"].ToString(); - // แกะ JWT token เพื่อดึง claims ต่างๆ - var jwtToken = ParseToken(tokenHeader); + var prefix = context.User?.FindFirst("prefix")?.Value; + var firstName = context.User?.FindFirst("given_name")?.Value; + var lastName = context.User?.FindFirst("family_name")?.Value; + var preferredUsername = context.User?.FindFirst("preferred_username")?.Value; - // ดึงข้อมูลจาก claims โดยลองชื่อหลายแบบ (camelCase, snake_case, ฯลฯ) - var prefix = GetClaimValue(jwtToken, "prefix", "Prefix", "PREFIX"); - var firstName = GetClaimValue(jwtToken, "given_name", "firstname", "firstName", "FirstName", "FIRSTNAME"); - var lastName = GetClaimValue(jwtToken, "family_name", "lastname", "lastName", "LastName", "LASTNAME"); - var preferredUsername = GetClaimValue(jwtToken, "preferred_username", "preferred_username", "PreferredUsername"); - var orgRootDnaId = GetGuidClaim(jwtToken, "orgRootDnaId", "org_root_dna_id", "OrgRootDnaId", "rootDnaId"); - var orgChild1DnaId = GetGuidClaim(jwtToken, "orgChild1DnaId", "org_child1_dna", "OrgChild1Dna", "child1DnaId"); - var orgChild2DnaId = GetGuidClaim(jwtToken, "orgChild2DnaId", "org_child2_dna", "OrgChild2Dna", "child2DnaId"); - var orgChild3DnaId = GetGuidClaim(jwtToken, "orgChild3DnaId", "org_child3_dna", "OrgChild3Dna", "child3DnaId"); - var orgChild4DnaId = GetGuidClaim(jwtToken, "orgChild4DnaId", "org_child4_dna", "OrgChild4Dna", "child4DnaId"); + var orgRootDnaId = context.User?.FindFirst("orgRootDnaId")?.Value; + var orgChild1DnaId = context.User?.FindFirst("orgChild1DnaId")?.Value; + var orgChild2DnaId = context.User?.FindFirst("orgChild2DnaId")?.Value; + var orgChild3DnaId = context.User?.FindFirst("orgChild3DnaId")?.Value; + var orgChild4DnaId = context.User?.FindFirst("orgChild4DnaId")?.Value; + + // Parse Guid values safely + Guid? rootDnaId = Guid.TryParse(orgRootDnaId, out var rid) ? rid : null; + Guid? child1DnaId = Guid.TryParse(orgChild1DnaId, out var c1) ? c1 : null; + Guid? child2DnaId = Guid.TryParse(orgChild2DnaId, out var c2) ? c2 : null; + Guid? child3DnaId = Guid.TryParse(orgChild3DnaId, out var c3) ? c3 : null; + Guid? child4DnaId = Guid.TryParse(orgChild4DnaId, out var c4) ? c4 : null; await _next(context); // ดำเนินการต่อไปยัง Middleware อื่น ๆ @@ -238,7 +200,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Core { logType = logType, ip = context.Connection.RemoteIpAddress?.ToString(), - rootId = orgRootDnaId?.ToString("D"), + rootId = rootDnaId, systemName = SystemName, startTimeStamp = startTime.ToString("o"), endTimeStamp = endTime.ToString("o"), diff --git a/Models/District.cs b/Models/District.cs index 655e51c..6240c7d 100644 --- a/Models/District.cs +++ b/Models/District.cs @@ -9,9 +9,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Models [Required, MaxLength(150), Column(Order = 1), Comment("เขต/อำเภอ")] public string name { get; set; } = string.Empty; - [Column(Order = 2), Comment("รหัสอ้างอิงจังหวัด")] - public Guid? provinceId { get; set; } = null; - // [Column(Order = 2), Comment("สถานะการใช้งาน")] // public bool IsActive { get; set; } = true; diff --git a/Models/SubDistrict.cs b/Models/SubDistrict.cs index b2185f4..0610c37 100644 --- a/Models/SubDistrict.cs +++ b/Models/SubDistrict.cs @@ -12,9 +12,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Models [MaxLength(10), Column(Order = 2), Comment("รหัสไปรษณีย์")] public string? zipCode { get; set; } = null; - [Column(Order = 3), Comment("รหัสอ้างอิงอำเภอ")] - public Guid? districtId { get; set; } = null; - // [Column(Order = 3), Comment("สถานะการใช้งาน")] // public bool IsActive { get; set; } = true; diff --git a/Repositories/PermissionRepository.cs b/Repositories/PermissionRepository.cs index 52b70cd..afc84af 100644 --- a/Repositories/PermissionRepository.cs +++ b/Repositories/PermissionRepository.cs @@ -51,7 +51,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); - client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); + client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]); var req = await client.GetAsync(apiPath); var res = await req.Content.ReadAsStringAsync(); return res; diff --git a/Request/Disables/PostDisableImportRequest.cs b/Request/Disables/PostDisableImportRequest.cs index 2eab546..232bc33 100644 --- a/Request/Disables/PostDisableImportRequest.cs +++ b/Request/Disables/PostDisableImportRequest.cs @@ -82,10 +82,5 @@ namespace BMA.EHR.Recurit.Exam.Service.Request.Disables /// วันที่ประกาศผลสอบ /// public DateTime AnnouncementDate { get; set; } - - /// - /// รหัส DNA หน่วยงาน - /// - public Guid? rootDnaId { get; set; } } } diff --git a/Response/CandidateStatusResponse.cs b/Response/CandidateStatusResponse.cs index ac6b699..e36d0a7 100644 --- a/Response/CandidateStatusResponse.cs +++ b/Response/CandidateStatusResponse.cs @@ -9,8 +9,5 @@ namespace BMA.EHR.Recurit.Exam.Service.Response public string? RejectDetail { get; set; } public bool? IsShowExamInfo { get; set; } - - public bool? IsShowResult { get; set; } - } } diff --git a/Services/CandidateService.cs b/Services/CandidateService.cs index 2319b65..fc1ba9f 100644 --- a/Services/CandidateService.cs +++ b/Services/CandidateService.cs @@ -1978,19 +1978,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services if (candidate == null) throw new Exception(GlobalMessages.CandidateNotFound); - bool IsShowResult = true; - if (exam.AnnouncementDate != null) - { - var showResultEndDate = exam.AnnouncementDate.Value.Date.AddDays(15); - IsShowResult = DateTime.Now.Date <= showResultEndDate; - } - - return new CandidateStatusResponse { - Status = candidate.Status, - RejectDetail = candidate.RejectDetail, - IsShowExamInfo = candidate.IsShowExamInfo, - IsShowResult = IsShowResult, - }; + return new CandidateStatusResponse { Status = candidate.Status, RejectDetail = candidate.RejectDetail, IsShowExamInfo = candidate.IsShowExamInfo }; } public async Task UserCheckCandidateService(string examId, string positionId, string status) @@ -2663,7 +2651,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services using (var client = new HttpClient()) { 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(apiUrl, new { citizenId diff --git a/Services/PeriodExamService.cs b/Services/PeriodExamService.cs index 2d417e5..aeefa24 100644 --- a/Services/PeriodExamService.cs +++ b/Services/PeriodExamService.cs @@ -1232,57 +1232,30 @@ namespace BMA.EHR.Recurit.Exam.Service.Services if (candidate.Status == "checkSeat") { candidate.SeatNumber = item.SeatNumber; - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: ติดตามประกาศทาง Website"; - // try - // { - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"[MailError] ส่ง email ไม่สำเร็จ: {candidate.Email} | {ex.Message}"); - // if (ex.InnerException != null) - // Console.WriteLine($"[MailError] Inner: {ex.InnerException.Message}"); - // } + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: ติดตามประกาศทาง Website"; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); candidate.Status = "checkPoint"; } else { - // if (candidate.Status != "waiver") - // { - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; - // try - // { - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"[MailError] ส่ง email ไม่สำเร็จ: {candidate.Email} | {ex.Message}"); - // if (ex.InnerException != null) - // Console.WriteLine($"[MailError] Inner: {ex.InnerException.Message}"); - // } - // } + if (candidate.Status != "waiver") + { + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); + } candidate.Status = "waiver"; } } else { - // if (candidate.Status != "waiver") - // { - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; - // try - // { - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"[MailError] ส่ง email ไม่สำเร็จ: {candidate.Email} | {ex.Message}"); - // if (ex.InnerException != null) - // Console.WriteLine($"[MailError] Inner: {ex.InnerException.Message}"); - // } - // } + if (candidate.Status != "waiver") + { + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); + } candidate.Status = "waiver"; } periodExam.SetSeat = true; @@ -1336,30 +1309,30 @@ namespace BMA.EHR.Recurit.Exam.Service.Services candidate.Pass = item.Pass; candidate.ExamReason = item.ExamReason; candidate.Number = item.Number; - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สอบคัดเลือกสำเร็จ
" + "ผลการสอบของท่าน คือ " + candidate.Pass; - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สอบคัดเลือกสำเร็จ
" + "ผลการสอบของท่าน คือ " + candidate.Pass; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); candidate.Status = "done"; } else { - // if (candidate.Status != "waiver") - // { - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); - // } + if (candidate.Status != "waiver") + { + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); + } // candidate.Status = "waiver"; } } else { - // if (candidate.Status != "waiver") - // { - // var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; - // var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; - // if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); - // } + if (candidate.Status != "waiver") + { + var subject = "แจ้งผลการสมัครสอบคัดเลือก " + periodExam.Name; + var body = candidate.FirstName + " " + candidate.LastName + " สถานะการสมัครสอบ: สละสิทธิ์สอบ"; + if (candidate.Email != null && candidate.Email != "") _mailService.SendMailToUser(subject, body, candidate.Email); + } // candidate.Status = "waiver"; } periodExam.SetSeat = true; @@ -1652,101 +1625,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Services }; } - public async Task DownloadCandidateExamAsync(string examId) - { - var periodExam = await _context.PeriodExams.AsQueryable() - .Where(x => x.CheckDisability == false) - .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); - - if (periodExam == null) - throw new Exception(GlobalMessages.ExamNotFound); - - var data = await _context.Candidates.AsQueryable() - .Include(x => x.PeriodExam) - .Where(x => x.PeriodExam == periodExam) - .Where(x => x.Status != "register") - .Where(x => x.ExamIdenNumber != null && x.ExamIdenNumber != "") - .OrderBy(x => x.ExamIdenNumber) - .Select(p => new - { - ExamId = p.ExamIdenNumber == null ? null : (p.ExamIdenNumber.ToThaiNumber()), - FullName = $"{p.PrefixName}{p.FirstName} {p.LastName}", - PositionName = "", - ExamName = - ($"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round}/{p.PeriodExam.Year.Value.ToThaiYear()}").ToThaiNumber(), - }).ToListAsync(); - - if (data.Count == 0) - throw new Exception("ไม่พบข้อมูลในระบบ"); - - var examName = data[0].ExamName; - return new - { - template = "rptCandidateList", - reportName = $"รายชื่อผู้มีสิทธิ์สอบ_{data.First().ExamName}", - data = new - { - examName = examName, - data = data - } - }; - } - - public async Task DownloadPassExamAsync(string examId) - { - var periodExam = await _context.PeriodExams.AsQueryable() - .Where(x => x.CheckDisability == false) - .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); - - if (periodExam == null) - throw new Exception(GlobalMessages.ExamNotFound); - - var candidates = await _context.Candidates.AsQueryable() - .Include(x => x.PeriodExam) - .ThenInclude(x => x.ScoreImport) - .Where(x => x.PeriodExam == periodExam) - .Where(x => x.Status != "register") - .ToListAsync(); - - var data = candidates.Select((p, idx) => new - { - SeatNumber = p.SeatNumber == null ? "-" : (p.SeatNumber.ToThaiNumber()), - CitizenId = p.CitizenId == null ? "-" : (p.CitizenId.ToThaiNumber()), - FullName = $"{p.PrefixName}{p.FirstName} {p.LastName}", - DateOfBirth = p.DateOfBirth == null ? "-" : (p.DateOfBirth.Value.ToThaiShortDate()), - ExamName = ($"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round}/{p.PeriodExam.Year.Value.ToThaiYear()}").ToThaiNumber(), - Number = p.Number == null ? (idx + 1).ToString().ToThaiNumber() : p.Number.ToThaiNumber(), - FullA = "๐", - SumA = "๐", - FullB = p.PointTotalB == null ? "-" : p.PointTotalB.ToString(), - SumB = p.PointB == null ? "-" : p.PointB.ToString(), - FullC = p.PointTotalC == null ? "-" : p.PointTotalC.ToString(), - SumC = p.PointC == null ? "-" : p.PointC.ToString(), - SumScore = ((Convert.ToInt32(p.PointB ?? "0") + Convert.ToInt32(p.PointC ?? "0")).ToString()).ToThaiNumber(), - ExamResult = p.Pass, - ExamThaiId = p.ExamIdenNumber == null ? "-" : p.ExamIdenNumber.ToThaiNumber(), - ExamId = p.ExamIdenNumber, - }) - .OrderBy(x => x.ExamId) - .Where(x => x.ExamResult?.Trim() == "ได้") - .ToList(); - - if (data.Count == 0) - throw new Exception("ไม่พบข้อมูลในระบบ"); - - var examName = data[0].ExamName; - return new - { - template = "rptPassExamList", - reportName = $"รายชื่อผู้สอบแข่งขันได้_{periodExam.Name} ครั้งที่ {periodExam.Round}/{periodExam.Year.Value.ToThaiYear()}", - data = new - { - examName = examName, - data = data - } - }; - } - public async Task GetsPaymentExamAsync(string examId) { var periodExam = await _context.PeriodExams.AsQueryable() @@ -2982,7 +2860,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services using (var client = new HttpClient()) { 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 _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _res = await client.SendAsync(_req); var _result = await _res.Content.ReadAsStringAsync(); @@ -3177,7 +3055,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services throw new Exception(GlobalMessages.ExamNotFound); var _placement = await _contextMetadata.Placements.AsQueryable() - .FirstOrDefaultAsync(x => x.PlacementType.Name == "คัดเลือกอื่นๆ" && x.RefId == periodExam.Id); + .FirstOrDefaultAsync(x => x.PlacementType.Name == "คัดเลือกคนพิการ" && x.RefId == periodExam.Id); if (_placement != null) throw new Exception("รอบการสอบนี้ได้ทำการบรรจุไปแล้ว"); @@ -3195,7 +3073,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services Round = periodExam.Round?.ToString() ?? "", Year = (int)(periodExam.Year ?? 0), Number = await _context.Disables.AsQueryable().Where(x => x.PeriodExam == periodExam).CountAsync(), - PlacementType = placementTypesCache.FirstOrDefault(x => x.Name.Trim().ToUpper().Contains("คัดเลือกอื่นๆ")) ?? placementTypesCache.First(), + PlacementType = placementTypesCache.FirstOrDefault(x => x.Name.Trim().ToUpper().Contains("คัดเลือกคนพิการ")) ?? placementTypesCache.First(), StartDate = accountStartDate, EndDate = accountStartDate.AddYears(2).AddDays(-1), CreatedAt = DateTime.Now, @@ -3319,28 +3197,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Services positionNameWithoutLevel = positionNameWithoutLevel.Replace(posLevelName, "").Trim(); } - // lookup province, district, subDistrict IDs with parent filtering - var registProvinceId = provincesCache.FirstOrDefault(x => x.name == firstAddress?.Province)?.Id; - var registDistrictId = districtsCache.FirstOrDefault(x => x.name == firstAddress?.Amphur && x.provinceId == registProvinceId)?.Id; - var registSubDistrictId = subDistrictsCache.FirstOrDefault(x => x.name == firstAddress?.District && x.districtId == registDistrictId)?.Id; - var currentProvinceId = provincesCache.FirstOrDefault(x => x.name == firstAddress?.Province1)?.Id; - var currentDistrictId = districtsCache.FirstOrDefault(x => x.name == firstAddress?.Amphur1 && x.provinceId == currentProvinceId)?.Id; - var currentSubDistrictId = subDistrictsCache.FirstOrDefault(x => x.name == firstAddress?.District1 && x.districtId == currentDistrictId)?.Id; - - // log warning when address lookup fails - if (registProvinceId == null && !string.IsNullOrWhiteSpace(firstAddress?.Province)) - Console.WriteLine($"[WARN] Regist province not found: {firstAddress?.Province}"); - if (registDistrictId == null && !string.IsNullOrWhiteSpace(firstAddress?.Amphur)) - Console.WriteLine($"[WARN] Regist district not found: {firstAddress?.Amphur}, Province: {firstAddress?.Province}"); - if (registSubDistrictId == null && !string.IsNullOrWhiteSpace(firstAddress?.District)) - Console.WriteLine($"[WARN] Regist subdistrict not found: {firstAddress?.District}, District: {firstAddress?.Amphur}"); - if (currentProvinceId == null && !string.IsNullOrWhiteSpace(firstAddress?.Province1)) - Console.WriteLine($"[WARN] Current province not found: {firstAddress?.Province1}"); - if (currentDistrictId == null && !string.IsNullOrWhiteSpace(firstAddress?.Amphur1)) - Console.WriteLine($"[WARN] Current district not found: {firstAddress?.Amphur1}, Province: {firstAddress?.Province1}"); - if (currentSubDistrictId == null && !string.IsNullOrWhiteSpace(firstAddress?.District1)) - Console.WriteLine($"[WARN] Current subdistrict not found: {firstAddress?.District1}, District: {firstAddress?.Amphur1}"); - var placementProfile = new PlacementProfile { Placement = placement, @@ -3362,15 +3218,15 @@ namespace BMA.EHR.Recurit.Exam.Service.Services Telephone = firstAddress?.Telephone ?? "", MobilePhone = firstAddress?.Mobile ?? "", RegistAddress = registAddress, - RegistProvinceId = registProvinceId, - RegistDistrictId = registDistrictId, - RegistSubDistrictId = registSubDistrictId, + RegistProvinceId = provincesCache.FirstOrDefault(x => x.name == firstAddress?.Province)?.Id, + RegistDistrictId = districtsCache.FirstOrDefault(x => x.name == firstAddress?.District)?.Id, + RegistSubDistrictId = subDistrictsCache.FirstOrDefault(x => x.name == firstAddress?.Soi)?.Id, RegistZipCode = firstAddress?.ZipCode ?? "", RegistSame = false, CurrentAddress = currentAddress, - CurrentProvinceId = currentProvinceId, - CurrentDistrictId = currentDistrictId, - CurrentSubDistrictId = currentSubDistrictId, + CurrentProvinceId = provincesCache.FirstOrDefault(x => x.name == firstAddress?.Province1)?.Id, + CurrentDistrictId = districtsCache.FirstOrDefault(x => x.name == firstAddress?.District1)?.Id, + CurrentSubDistrictId = subDistrictsCache.FirstOrDefault(x => x.name == firstAddress?.Soi1)?.Id, CurrentZipCode = firstAddress?.ZipCode1, Marry = candidate.Marry?.Contains("สมรส") ?? false, OccupationPositionType = "other",