From 0906690285575436b3d7324f40741cb8fd2e86ea Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Tue, 23 May 2023 09:58:37 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B8=A3=E0=B8=B2=E0=B8=A2=E0=B8=87=E0=B8=B2?= =?UTF-8?q?=E0=B8=99=E0=B8=9C=E0=B8=B9=E0=B9=89=E0=B8=A1=E0=B8=B5=E0=B8=AA?= =?UTF-8?q?=E0=B8=B4=E0=B8=97=E0=B8=98=E0=B8=BA=E0=B8=AA=E0=B8=AD=E0=B8=9A?= =?UTF-8?q?=20=E0=B9=81=E0=B8=A5=E0=B8=B0=E0=B8=A3=E0=B8=B2=E0=B8=A2?= =?UTF-8?q?=E0=B8=87=E0=B8=B2=E0=B8=99=E0=B8=84=E0=B8=B0=E0=B9=81=E0=B8=99?= =?UTF-8?q?=E0=B8=99=E0=B8=AA=E0=B8=AD=E0=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BMA.EHR.Report.Service.csproj | 6 + Controllers/ExamReportController.cs | 139 +++++++++++ Controllers/RecruitReportController.cs | 318 ++++++++++++++++++------- Report/Recruit/rptCandidateList.trdp | Bin 0 -> 1440 bytes Report/Recruit/rptPassExamList.trdp | Bin 0 -> 1559 bytes 5 files changed, 375 insertions(+), 88 deletions(-) create mode 100644 Report/Recruit/rptCandidateList.trdp create mode 100644 Report/Recruit/rptPassExamList.trdp diff --git a/BMA.EHR.Report.Service.csproj b/BMA.EHR.Report.Service.csproj index 6f6930f..96d16fc 100644 --- a/BMA.EHR.Report.Service.csproj +++ b/BMA.EHR.Report.Service.csproj @@ -90,9 +90,15 @@ PreserveNewest + + PreserveNewest + PreserveNewest + + PreserveNewest + diff --git a/Controllers/ExamReportController.cs b/Controllers/ExamReportController.cs index 31bb248..d8bffcf 100644 --- a/Controllers/ExamReportController.cs +++ b/Controllers/ExamReportController.cs @@ -249,6 +249,145 @@ namespace BMA.EHR.Report.Service.Controllers } } + [HttpGet("candidate/{id:length(36)}")] + [AllowAnonymous] + public async Task> GetCandidateListReportAsync(Guid id) + { + try + { + var data = await _context.Disables.AsQueryable() + .Include(x => x.PeriodExam) + .Where(x => x.PeriodExam.Id == id) + .OrderBy(x => x.ExamId) + .Select(p => new + { + ExamId = p.ExamId, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + PositionName = p.PositionName, + ExamName = + $"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round}/{p.PeriodExam.Year.Value.ToThaiYear()}", + }).ToListAsync(); + + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptCandidateList.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } + + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; + + + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + + var content = result.DocumentBytes; + return File(content, "application/pdf", $"รายชื่อผู้มีสิทธิ์สอบ_{data.First().ExamName}.pdf"); + + } + catch (Exception ex) + { + return Error(ex); + } + } + + [HttpGet("pass/{id:length(36)}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetPassExamListReportAsync(Guid id) + { + try + { + var data = await _context.Disables.AsQueryable() + .Include(x => x.PeriodExam) + .ThenInclude(x => x.ScoreImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + + + .Join(_context.DisableScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.PeriodExamId == id) + .Where(x => x.ExamStatus == "ผ่าน"), + rc => new { id = rc.PeriodExam.Id, examId = rc.ExamId }, + sc => new { id = sc.ScoreImport.PeriodExamId, examId = sc.ExamId }, + (p, sr) => new + { + Id = p.PeriodExam.Id, + ExamId = p.ExamId, + CitizenId = p.CitizenId, + p.Prefix, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + DateOfBirth = p.DateOfBirth.ToThaiShortDate(), + Gender = p.Gendor, + Degree = p.Educations.First().Degree, + Major = p.Educations.First().Major, + + ExamResult = sr == null ? "" : sr.ExamStatus, + + University = p.Educations.First().University, + PositionName = p.PositionName, + ExamName = $"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round}/{p.PeriodExam.Year.Value.ToThaiYear()}", + + + Number = sr == null ? "" : sr.Number, + + + + FullA = sr == null ? 0 : sr.FullA, + SumA = sr == null ? 0 : sr.SumA, + FullB = sr == null ? 0 : sr.FullB, + SumB = sr == null ? 0 : sr.SumB, + FullC = sr == null ? 0 : sr.FullC, + SumC = sr == null ? 0 : sr.SumC, + SumScore = sr == null ? 0 : sr.SumA + sr.SumB + sr.SumC, + + + + }) + .OrderBy(x => x.Number) + .Where(x => x.Id == id) + .Where(x => x.ExamResult == "ผ่าน") + .ToListAsync(); + + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptPassExamList.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } + + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; + + + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + + var content = result.DocumentBytes; + return File(content, "application/pdf", $"รายชื่อผู้สอบแข่งขันได้_{data.First().ExamName}.pdf"); + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } + #endregion } } diff --git a/Controllers/RecruitReportController.cs b/Controllers/RecruitReportController.cs index c95d7bd..d05e2f0 100644 --- a/Controllers/RecruitReportController.cs +++ b/Controllers/RecruitReportController.cs @@ -13,36 +13,36 @@ using Telerik.Reporting.Processing; namespace BMA.EHR.Report.Service.Controllers { - [Route("api/v{version:apiVersion}/report/recruit")] - [ApiVersion("1.0")] - [ApiController] - [Produces("application/json")] - [Authorize] - [SwaggerTag("รายงานข้อมูลการสอบแข่งขัน")] - public class RecruitReportController : BaseController - { - #region " Fields " + [Route("api/v{version:apiVersion}/report/recruit")] + [ApiVersion("1.0")] + [ApiController] + [Produces("application/json")] + [Authorize] + [SwaggerTag("รายงานข้อมูลการสอบแข่งขัน")] + public class RecruitReportController : BaseController + { + #region " Fields " - private readonly ApplicationDbContext _context; - private readonly IWebHostEnvironment _hostingEnvironment; - private readonly IConfiguration _configuration; - private readonly string space = "ㅤ"; + private readonly ApplicationDbContext _context; + private readonly IWebHostEnvironment _hostingEnvironment; + private readonly IConfiguration _configuration; + private readonly string space = "ㅤ"; private readonly RecruitService _recruitService; - #endregion + #endregion - #region " Constructor and Destructor " + #region " Constructor and Destructor " - public RecruitReportController(ApplicationDbContext context, - IWebHostEnvironment hostingEnvironment, - IConfiguration configuration, + public RecruitReportController(ApplicationDbContext context, + IWebHostEnvironment hostingEnvironment, + IConfiguration configuration, RecruitService recruitService) - { - this._context = context; - this._hostingEnvironment = hostingEnvironment; - this._configuration = configuration; + { + this._context = context; + this._hostingEnvironment = hostingEnvironment; + this._configuration = configuration; this._recruitService = recruitService; - } + } #endregion @@ -61,65 +61,65 @@ namespace BMA.EHR.Report.Service.Controllers /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("certificate/{type:int}/{id:length(36)}/{examId}")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> GetCertificateReportAsync(Guid id, string examId,int type) - { - try - { - var data = await _context.Recruits.AsQueryable() - .Include(x => x.RecruitImport) - .Where(x => x.RecruitImport.Id == id) - .Where(x => x.ExamId == examId) - .Join(_context.RecruitScores.AsQueryable() - .Include(x => x.ScoreImport), - rc => new { rc.RecruitImport.Year, rc.ExamId }, - sc => new { sc.ScoreImport.Year, sc.ExamId }, - (p, sr) => new - { - ExamID = p.ExamId, - p.CitizenId, - Order = p.RecruitImport.Order, - Year = p.RecruitImport.Year.ToThaiYear(), - FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", - ExamResult = sr == null ? "" : sr.ExamStatus, - EndDate = p.RecruitImport.RegisterEndDate == null ? "-" : p.RecruitImport.RegisterEndDate.Value.ToThaiFullDate3(), - AuthName = "นายณัฐพงศ์ ดิษยบุตร", - AuthPosition = "หัวหน้าสำนักงาน ก.ก." - }) - .FirstOrDefaultAsync(); + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetCertificateReportAsync(Guid id, string examId, int type) + { + try + { + var data = await _context.Recruits.AsQueryable() + .Include(x => x.RecruitImport) + .Where(x => x.RecruitImport.Id == id) + .Where(x => x.ExamId == examId) + .Join(_context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport), + rc => new { rc.RecruitImport.Year, rc.ExamId }, + sc => new { sc.ScoreImport.Year, sc.ExamId }, + (p, sr) => new + { + ExamID = p.ExamId, + p.CitizenId, + Order = p.RecruitImport.Order, + Year = p.RecruitImport.Year.ToThaiYear(), + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + ExamResult = sr == null ? "" : sr.ExamStatus, + EndDate = p.RecruitImport.RegisterEndDate == null ? "-" : p.RecruitImport.RegisterEndDate.Value.ToThaiFullDate3(), + AuthName = "นายณัฐพงศ์ ดิษยบุตร", + AuthPosition = "หัวหน้าสำนักงาน ก.ก." + }) + .FirstOrDefaultAsync(); - var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptCertificate{type}.trdp"); - ReportPackager reportPackager = new ReportPackager(); - Telerik.Reporting.Report report = null; - using (var sourceStream = System.IO.File.OpenRead(rptFile)) - { - report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); - } + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptCertificate{type}.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } - report.DataSource = data; - System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); - InstanceReportSource instanceReportSource = new InstanceReportSource() - { - ReportDocument = report - }; + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; - ReportProcessor reportProcessor = new ReportProcessor(_configuration); - RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); - var content = result.DocumentBytes; - return File(content, "application/pdf", $"หนังสือรับรอง_{data.CitizenId}_{data.FullName}.pdf"); + var content = result.DocumentBytes; + return File(content, "application/pdf", $"หนังสือรับรอง_{data.CitizenId}_{data.FullName}.pdf"); - } - catch (Exception ex) - { - return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); - } - } + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } /// /// แสดงเอกสารผลสอบ @@ -137,9 +137,9 @@ namespace BMA.EHR.Report.Service.Controllers [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetScoreReportAsync(Guid id, string examId) - { - try - { + { + try + { var data = await _context.Recruits.AsQueryable() .Include(x => x.RecruitImport) .Include(x => x.Documents) @@ -152,7 +152,7 @@ namespace BMA.EHR.Report.Service.Controllers sc => new { sc.ScoreImport.Year, sc.ExamId }, (p, sr) => new { - ExamId= p.ExamId, + ExamId = p.ExamId, CitizenId = p.CitizenId, p.Prefix, FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", @@ -160,14 +160,14 @@ namespace BMA.EHR.Report.Service.Controllers Gender = p.Gendor, Degree = p.Educations.First().Degree, Major = p.Educations.First().Major, - - ExamResult = sr == null ? "" : sr.ExamStatus, - + + ExamResult = sr == null ? "" : sr.ExamStatus, + University = p.Educations.First().University, PositionName = p.PositionName, ExamName = $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}", - - + + Number = sr == null ? "" : sr.Number, ExamCount = _recruitService.GetExamCount(p.CitizenId), ScoreExpire = p.RecruitImport.AnnouncementDate == null ? "" : p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(), @@ -181,7 +181,7 @@ namespace BMA.EHR.Report.Service.Controllers SumC = sr == null ? 0 : sr.SumC, - + }) .FirstOrDefaultAsync(); @@ -208,11 +208,153 @@ namespace BMA.EHR.Report.Service.Controllers var content = result.DocumentBytes; return File(content, "application/pdf", $"ผลคะแนนสอบ_{data.CitizenId}_{data.FullName}.pdf"); } - catch (Exception ex) - { + catch (Exception ex) + { return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); } - } + } + + + [HttpGet("candidate/{id:length(36)}")] + public async Task> GetCandidateListReportAsync(Guid id) + { + try + { + var data = await _context.Recruits.AsQueryable() + .Include(x => x.RecruitImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + .Where(x => x.RecruitImport.Id == id) + .OrderBy(x => x.ExamId) + .Select(p => new + { + ExamId = p.ExamId, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + PositionName = p.PositionName, + ExamName = + $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}", + }).ToListAsync(); + + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptCandidateList.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } + + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; + + + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + + var content = result.DocumentBytes; + return File(content, "application/pdf", $"รายชื่อผู้มีสิทธิ์สอบ_{data.First().ExamName}.pdf"); + + } + catch (Exception ex) + { + return Error(ex); + } + } + + [HttpGet("pass/{id:length(36)}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetPassExamListReportAsync(Guid id) + { + try + { + var data = await _context.Recruits.AsQueryable() + .Include(x => x.RecruitImport) + .ThenInclude(x => x.ScoreImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + + + .Join(_context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.RecruitImportId == id) + .Where(x => x.ExamStatus == "ผ่าน"), + rc => new { id = rc.RecruitImport.Id, examId = rc.ExamId }, + sc => new { id = sc.ScoreImport.RecruitImportId, examId = sc.ExamId }, + (p, sr) => new + { + Id = p.RecruitImport.Id, + ExamId = p.ExamId, + CitizenId = p.CitizenId, + p.Prefix, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + DateOfBirth = p.DateOfBirth.ToThaiShortDate(), + Gender = p.Gendor, + Degree = p.Educations.First().Degree, + Major = p.Educations.First().Major, + + ExamResult = sr == null ? "" : sr.ExamStatus, + + University = p.Educations.First().University, + PositionName = p.PositionName, + ExamName = $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}", + + + Number = sr == null ? "" : sr.Number, + ExamCount = _recruitService.GetExamCount(p.CitizenId), + ScoreExpire = p.RecruitImport.AnnouncementDate == null ? "" : p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(), + + + FullA = sr == null ? 0 : sr.FullA, + SumA = sr == null ? 0 : sr.SumA, + FullB = sr == null ? 0 : sr.FullB, + SumB = sr == null ? 0 : sr.SumB, + FullC = sr == null ? 0 : sr.FullC, + SumC = sr == null ? 0 : sr.SumC, + SumScore = sr == null ? 0 : sr.SumA + sr.SumB + sr.SumC, + + + + }) + .OrderBy(x => x.Number) + .Where(x => x.Id == id) + .Where(x => x.ExamResult == "ผ่าน") + .ToListAsync(); + + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptPassExamList.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } + + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; + + + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + + var content = result.DocumentBytes; + return File(content, "application/pdf", $"รายชื่อผู้สอบแข่งขันได้_{data.First().ExamName}.pdf"); + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } #endregion } diff --git a/Report/Recruit/rptCandidateList.trdp b/Report/Recruit/rptCandidateList.trdp new file mode 100644 index 0000000000000000000000000000000000000000..4f6b27e57b64408763775a75987ce9697ee70806 GIT binary patch literal 1440 zcmWIWW@Zs#U|`^2==9ni_QK0~+GA!01}0$!20jKEhLqH_%)HE!%=|pPirgH9MG_1e z3qYzd!P^M${5xg>`@~PwE0la(xFPO$N6Z_w6M4HgOuWIXv)tBLXs>sR5NoH`oH>`` zCW-BR-WYRh(R3zTlZ=3O`ycvqdIs*Ew8wAmBGXrD=I1)*NY;HWGqF^u_bf-;~BcgroF$_tg-RHT#?QC{oe(3 zPRaDHT^S;Kz@_g~k8fg6@`($&F$UZo=9z}u#ClTaTlxv=1~75YR%|M&Ip3G@=*g|- zFRy>ByI*W`d-IZH2DfS+)mAyLhh}pY$Fd|(Y1c?H%Gl8Tq2^%78{0Y8{%w9|lI(Lk zL+VPGa>*gJFH7#lCh%7~Z{2%qOLn~MFRwywS?|IG{w9Y`ca!XzKU|Z7c8UE-KN!#b zZ}Nlt-2awG*opozKN!!sPvrD_mj8ht%$xpe{g7|67yh$TN~ivUl;zvhz06@puXIGW zOKoarVHEwq+w|NhHF%2A6z}&QP2!G8SAJXcac1dHJDqNldhFmuJ&r`a_tP{j9Qbtv z9=Qj-<~5$VmQ!`(oQcyU8VD5?}M00 z%MbU?^*+z5{P+F|!=fnPNyV$YSM9IqlQ^>Ew$;wE`ny&~&uYHEY&Lg)(9ZNfx4%E) zdssESrNHe^MDMxSUbDc2FriHg_x?Wp&hO@b{on`8npSIXUD~t$tVZhc_t~G=F6>*s zb=ltQwQp^DH^2Rxy!P{l~+cJJI%Ikaj?PtwvAQX zMjwCnn*4lgQW|W+B{*@%;+BrY3BsH%jKBTfBwK$egd7F@pTe=EOEl{wP9>`7Dj z25oJDC%HQ;?`zK3soNKjU0Lhqr4(Hobiw$zaMC8*UbU%;lg@idFS}UK7TkXE#_pFK z-$P3sq-`cYZ@SKR;giqWne1ZIRWIMp>1)m~yKlAhz!3|JY>U%BiUe7*I{%CRVh`|U rWYT58RUD!hdZ>jXx?a@qLDs9y!hkKb0=!w-K+2eauog)3vVwR3)8KCx literal 0 HcmV?d00001 diff --git a/Report/Recruit/rptPassExamList.trdp b/Report/Recruit/rptPassExamList.trdp new file mode 100644 index 0000000000000000000000000000000000000000..ea03174d7c84308cdb873a36a811ed469ab1f8d7 GIT binary patch literal 1559 zcmWIWW@Zs#U|`^2Q1{s$#-}>}Ula=igOM}?10RD7LrQ8|W?p7VW`3StMQ)D5A_)eK z1t8U!;B91d{%tdnI{6L%9bTyNJFn>0b(ec1w$)tu;H)(rm)_2tDiOUxg-dAb(&}4n zjJs|4HG;k@mHlRva6nH&?Z5QDDHBCfy}RCCjTS%S%V7IKCaAsr{?CdE={tKnoIY^+ zZEiT?e72>Ht>BHIeaCWV-Q~}J_mzD=cRQcguh1!o%Z{(cN;+#AW3K+C1BWdZ$j_5c zp7K;vE-QJRm7}2kQchWA`wxOgzc=?}HIxgdJLkG(epn1%iHv8Ws8h`56de?Vup7s4w;&eMsLxH^e+|8Q&cO;IBEWg8kM)6C)iYvz(-?#7hY5c#|DQT6Jg*A(w z*Tuy)Z0bLPd3PL4kIDWfB)3_Rv-Y0S*^O*pmND=8vY>C_I)^(At8cdVWtui_GG^H^a4-ZCBSaTF+sz_+tFyA8S|3XWgD%*GikO{MC0TV(Faz!^2Oz#AV}>IU1oW z-n?brzZq#G?G=?A#O8T% zb5C7n0M}B>$dF@UJm2PTT*Ul)Z(Z%P4?elyrWqe^`FrkQ(zA#QFHC|i{V5Lnqp|r+ zaM&Nk$>)}yu+aLwV#<|AZN+czyx1pY9wWr|FRN(9D(PciceCrx#a$$1>kK`}?lj=C$w2FdI4UXv~# z4Y3JIv3bSmXU~yTzvAxeqWuAH(&eu6Zsp`M=96$&>re9Jd6%NPoAc9?$6Zfu%{Xq< zQ9LRAQq0%g$8p0?KyxX$oT(7)F=r9Mp8C(PLAtpIO~Owk?BTXS~$3&n&oC>EUiY|%BN zC*WGr(^c2nO}IjzMDN|cEBK#I+wvz|4UKX88t(q&4nQfPI{tjAoC+*{wgIs)u!M?s z&d)1J%`1rysVqn>jwMt~srq^IH5mx(^)jxOC`s(eJk7MXQ9R=nL+=H%5`!04V=7eE zCro_$d;k02%CA#pjx;ZO(iFZyTU+2s?hecQnlpCl_61~D*1CBqMb`#hFg`Avw8^$t zZK~p=^Ip=+E*7)}w_m)m`z6Qs&{79!o5|0cuJc{^sUf7z?+o~q>Kp& LYk_nND~JaG*d(4B literal 0 HcmV?d00001