using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using BMA.EHR.Recruit.Service.Data; using BMA.EHR.Recruit.Service.Models.Recruits; using BMA.EHR.Recruit.Service.Core; using BMA.EHR.MetaData.Service.Models; using BMA.EHR.Domain.Models.Placement; using BMA.EHR.Recurit.Service.Data; using System.Security.Claims; namespace BMA.EHR.Recruit.Service.Services { public class RecruitService { private readonly ApplicationDbContext _context; private readonly MetadataDbContext _contextMetadata; private readonly MinIOService _minIOService; private readonly IHttpContextAccessor _httpContextAccessor; public RecruitService(ApplicationDbContext context, MetadataDbContext contextMetadata, IHttpContextAccessor httpContextAccessor, MinIOService minIOService) { _context = context; _contextMetadata = contextMetadata; _minIOService = minIOService; _httpContextAccessor = httpContextAccessor; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; #endregion public int GetExamCount(string citizenId) { try { var count = _context.Recruits.AsQueryable() .Where(x => x.CitizenId == citizenId) .Count(); return count; } catch { throw; } } public async Task GetExamAttributeAsync(Guid period, Guid exam) { try { var payment = await _context.RecruitPayments.AsQueryable() .Include(x => x.Recruit) .ThenInclude(x => x.RecruitImport) .Where(x => x.Recruit.Id == exam) .Where(x => x.Recruit.RecruitImport.Id == period) .FirstOrDefaultAsync(); return payment != null ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"; } catch { throw; } } public bool CheckValidCertificate(DateTime certDate, int nextYear = 5) { var valid = true; if (DateTime.Now.Date > certDate.Date.AddYears(nextYear)) valid = false; return valid; } public async Task UpdateDocAsync(Guid ImportId, IFormFileCollection files) { var periodExam = await _context.RecruitImports.AsQueryable() .FirstOrDefaultAsync(x => x.Id == ImportId); if (periodExam == null) throw new Exception(GlobalMessages.DataNotFound); foreach (var file in files) { var doc = await _minIOService.UploadFileAsync(file); var periodExamDocument = new RecruitImportDocument { RecruitImportId = ImportId, DocumentId = doc.Id, }; await _context.RecruitImportDocuments.AddAsync(periodExamDocument); } await _context.SaveChangesAsync(); } public async Task UpdateImageAsync(Guid ImportId, IFormFileCollection files) { var periodExam = await _context.RecruitImports.AsQueryable() .FirstOrDefaultAsync(x => x.Id == ImportId); if (periodExam == null) throw new Exception(GlobalMessages.DataNotFound); foreach (var file in files) { var doc = await _minIOService.UploadFileAsync(file); var periodExamImage = new RecruitImportImage { RecruitImportId = ImportId, DocumentId = doc.Id, }; await _context.RecruitImportImages.AddAsync(periodExamImage); } await _context.SaveChangesAsync(); } public async Task DeleteImageAsync(Guid id) { var image = await _context.RecruitImportImages.AsQueryable() .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Id == id); if (image == null) throw new Exception(GlobalMessages.DataNotFound); var doc_id = image.Document.Id; _context.RecruitImportImages.Remove(image); await _context.SaveChangesAsync(); await _minIOService.DeleteFileAsync(doc_id); } public async Task DeleteDocAsync(Guid id) { var doc = await _context.RecruitImportDocuments.AsQueryable() .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Id == id); if (doc == null) throw new Exception(GlobalMessages.DataNotFound); var doc_id = doc.Document.Id; _context.RecruitImportDocuments.Remove(doc); await _context.SaveChangesAsync(); await _minIOService.DeleteFileAsync(doc_id); } public async Task UpdateAsyncRecruitToPlacement(Guid examId) { var recruitImport = await _context.RecruitImports.AsQueryable() .FirstOrDefaultAsync(x => x.Id == examId); if (recruitImport == null) throw new Exception(GlobalMessages.DataNotFound); var _placement = await _contextMetadata.Placements.AsQueryable() .FirstOrDefaultAsync(x => x.Name == recruitImport.Name && x.Year == ((int)(recruitImport.Year == null ? 0 : recruitImport.Year))); if (_placement != null) throw new Exception("รอบการสอบนี้ได้ทำการบรรจุไปแล้ว"); var placement = new Placement { Name = recruitImport.Name, Round = recruitImport.Order == null ? "" : recruitImport.Order.ToString(), Year = (int)(recruitImport.Year == null ? 0 : recruitImport.Year), Number = await _context.Recruits.AsQueryable().Where(x => x.RecruitImport == recruitImport).CountAsync(), PlacementType = await _contextMetadata.PlacementTypes.FirstOrDefaultAsync(x => x.Name.Trim().ToUpper().Contains("ผู้พิการ")) == null ? await _contextMetadata.PlacementTypes.FirstOrDefaultAsync() : await _contextMetadata.PlacementTypes.FirstOrDefaultAsync(x => x.Name.Trim().ToUpper().Contains("ผู้พิการ")), StartDate = DateTime.Now, EndDate = DateTime.Now.AddYears(2).AddDays(-1), CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", LastUpdateFullName = FullName ?? "", }; await _contextMetadata.Placements.AddAsync(placement); var candidates = await _context.Recruits.AsQueryable() .Include(x => x.Addresses) .Include(x => x.Certificates) .Include(x => x.Educations) .Include(x => x.Occupations) .Where(x => x.RecruitImport == recruitImport) .ToListAsync(); foreach (var candidate in candidates) { var Address = candidate.Addresses.FirstOrDefault() == null ? null : $"{candidate.Addresses.FirstOrDefault().Address}"; var Moo = candidate.Addresses.FirstOrDefault() == null ? null : $" หมู่ {candidate.Addresses.FirstOrDefault().Moo}"; var Soi = candidate.Addresses.FirstOrDefault() == null ? null : $" ซอย {candidate.Addresses.FirstOrDefault().Soi}"; var Road = candidate.Addresses.FirstOrDefault() == null ? null : $" ถนน {candidate.Addresses.FirstOrDefault().Road}"; var Address1 = candidate.Addresses.FirstOrDefault() == null ? null : $"{candidate.Addresses.FirstOrDefault().Address1}"; var Moo1 = candidate.Addresses.FirstOrDefault() == null ? null : $" หมู่ {candidate.Addresses.FirstOrDefault().Moo1}"; var Soi1 = candidate.Addresses.FirstOrDefault() == null ? null : $" ซอย {candidate.Addresses.FirstOrDefault().Soi1}"; var Road1 = candidate.Addresses.FirstOrDefault() == null ? null : $" ถนน {candidate.Addresses.FirstOrDefault().Road1}"; var scoreImport = await _context.ScoreImports.AsQueryable() .FirstOrDefaultAsync(x => x.RecruitImport == recruitImport); var recruitScore = await _context.RecruitScores.AsQueryable() .Where(x => x.ScoreImport == scoreImport) .Where(x => x.ExamId == candidate.ExamId) .FirstOrDefaultAsync(x => x.ExamId == candidate.ExamId && x.ScoreImport == scoreImport); var placementProfile = new PlacementProfile { Placement = placement, PositionCandidate = await _contextMetadata.PositionPaths.FirstOrDefaultAsync(x => x.Name == candidate.PositionName), Prefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Name == candidate.Prefix), Firstname = candidate.FirstName, Lastname = candidate.LastName, Gender = await _contextMetadata.Genders.FirstOrDefaultAsync(x => x.Name == candidate.Gendor), Nationality = candidate.National, Race = candidate.Race, Religion = await _contextMetadata.Religions.FirstOrDefaultAsync(x => x.Name == candidate.Religion), DateOfBirth = candidate.DateOfBirth, Relationship = await _contextMetadata.Relationships.FirstOrDefaultAsync(x => x.Name == candidate.Marry), // Email = candidate.Email, CitizenId = candidate.CitizenId, // CitizenDistrict = await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Id == candidate.CitizenDistrictId), CitizenProvince = await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.CitizenCardIssuer), CitizenDate = candidate.CitizenCardExpireDate, Telephone = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().Telephone, MobilePhone = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().Mobile, // Knowledge = candidate.Knowledge, RegistAddress = $"{Address}{Moo}{Soi}{Road}", RegistProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Province), RegistDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().District), RegistSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur), RegistZipCode = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().ZipCode, RegistSame = false, CurrentAddress = $"{Address1}{Moo1}{Soi1}{Road1}", CurrentProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Province1), CurrentDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().District1), CurrentSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur1), CurrentZipCode = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().ZipCode1, Marry = candidate.Marry.Contains("สมรส"), // MarryPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.MarryPrefixId), // MarryFirstName = candidate.MarryFirstName, // MarryLastName = candidate.MarryLastName, // MarryOccupation = candidate.MarryOccupation, // MarryNationality = candidate.MarryNationality, // FatherPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.FatherPrefixId), // FatherFirstName = candidate.FatherFirstName, // FatherLastName = candidate.FatherLastName, // FatherOccupation = candidate.FatherOccupation, // FatherNationality = candidate.FatherNationality, // MotherPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.MotherPrefixId), // MotherFirstName = candidate.MotherFirstName, // MotherLastName = candidate.MotherLastName, // MotherOccupation = candidate.MotherOccupation, // MotherNationality = candidate.MotherNationality, OccupationType = "other", // OccupationCompany = candidate.OccupationCompany, OccupationDepartment = candidate.Occupations.FirstOrDefault() == null ? null : candidate.Occupations.FirstOrDefault().Workplace, // OccupationEmail = candidate.OccupationEmail, OccupationTelephone = candidate.Occupations.FirstOrDefault() == null ? null : candidate.Occupations.FirstOrDefault().Telephone, OccupationPosition = candidate.Occupations.FirstOrDefault() == null ? null : candidate.Occupations.FirstOrDefault().Position, PointTotalA = recruitScore == null ? null : Convert.ToDouble(recruitScore.FullA), PointA = recruitScore == null ? null : Convert.ToDouble(recruitScore.SumA), PointTotalB = recruitScore == null ? null : Convert.ToDouble(recruitScore.FullB), PointB = recruitScore == null ? null : Convert.ToDouble(recruitScore.SumB), PointTotalC = recruitScore == null ? null : Convert.ToDouble(recruitScore.FullC), PointC = recruitScore == null ? null : Convert.ToDouble(recruitScore.SumC), ExamNumber = recruitScore == null || int.TryParse(recruitScore.Number, out int n) == false ? null : Convert.ToInt32(recruitScore.Number), ExamRound = null, IsRelief = false, PlacementStatus = "UN-CONTAIN", Pass = recruitScore == null ? null : recruitScore.ExamStatus, ReportingDate = DateTime.Now, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", LastUpdateFullName = FullName ?? "", }; await _contextMetadata.PlacementProfiles.AddAsync(placementProfile); var placementEducation = new PlacementEducation { PlacementProfile = placementProfile, EducationLevel = await _contextMetadata.EducationLevels.FirstOrDefaultAsync(x => x.Name == (candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().HighDegree)), Field = candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().Major, Gpa = candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().GPA.ToString(), Institute = candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().University, Degree = candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().Degree, // Country = education.Name, // Duration = education.Name, // Other = education.Name, // FundName = education.Name, // DurationYear = education.Name, FinishDate = candidate.Educations.FirstOrDefault() == null ? null : candidate.Educations.FirstOrDefault().BachelorDate, IsDate = true, // StartDate = education.DurationStart, // EndDate = education.DurationEnd, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdateFullName = FullName ?? "", }; await _contextMetadata.PlacementEducations.AddAsync(placementEducation); var placementCertificate = new PlacementCertificate { PlacementProfile = placementProfile, CertificateNo = candidate.Certificates.FirstOrDefault() == null ? null : candidate.Certificates.FirstOrDefault().CertificateNo, // Issuer = candidate.Certificates.FirstOrDefault() == null ? null : candidate.Certificates.FirstOrDefault().Issuer, IssueDate = candidate.Certificates.FirstOrDefault() == null ? null : candidate.Certificates.FirstOrDefault().IssueDate, ExpireDate = candidate.Certificates.FirstOrDefault() == null ? null : candidate.Certificates.FirstOrDefault().ExpiredDate, CertificateType = candidate.Certificates.FirstOrDefault() == null ? null : candidate.Certificates.FirstOrDefault().Description, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdateFullName = FullName ?? "", }; await _contextMetadata.PlacementCertificates.AddAsync(placementCertificate); } await _contextMetadata.SaveChangesAsync(); } } }