using System.Security.Claims; using BMA.EHR.Recurit.Exam.Service.Core; using BMA.EHR.Recurit.Exam.Service.Data; using BMA.EHR.Recurit.Exam.Service.Models; using BMA.EHR.Recurit.Exam.Service.Request; using BMA.EHR.Recurit.Exam.Service.Response; using Microsoft.EntityFrameworkCore; namespace BMA.EHR.Recurit.Exam.Service.Services { public class PeriodExamService { #region " Fields " private readonly ApplicationDbContext _context; private readonly IHttpContextAccessor _httpContextAccessor; #endregion #region " Constructor and Destructor " public PeriodExamService(ApplicationDbContext context, IHttpContextAccessor httpContextAccessor) { _context = context; _httpContextAccessor = httpContextAccessor; } #endregion #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; #endregion #region " Methods " public async Task> GetsAsync(bool showAll = true) { if (showAll) return await _context.PeriodExams.AsQueryable() .OrderBy(d => d.Name) .ToListAsync(); else return await _context.PeriodExams.AsQueryable() .Where(p => p.IsActive) .OrderBy(d => d.Name) .ToListAsync(); } public async Task GetsExamAndCandidateAsync(string examId, bool showAll = true) { var periodExam = await _context.PeriodExams.AsQueryable() .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); if (periodExam == null) throw new Exception(GlobalMessages.ExamNotFound); return periodExam; } public async Task CreateAsync(RequestPeriodExam inserted) { var periodExam = new PeriodExam { Name = inserted.Name, CheckDocument = inserted.CheckDocument, CheckDisability = inserted.CheckDisability, Round = inserted.Round, Year = inserted.Year, Fee = inserted.Fee, RegisterStartDate = inserted.RegisterStartDate, RegisterEndDate = inserted.RegisterEndDate, PaymentStartDate = inserted.PaymentStartDate, PaymentEndDate = inserted.PaymentEndDate, AnnouncementStartDate = inserted.AnnouncementStartDate, AnnouncementEndDate = inserted.AnnouncementEndDate, OrganizationCodeId = inserted.OrganizationCodeId, OrganizationCodeName = inserted.OrganizationCodeName, OrganizationId = inserted.OrganizationId, OrganizationName = inserted.OrganizationName, PaymentKrungThai = inserted.PaymentKrungThai, Detail = inserted.Detail, Note = inserted.Note, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdateFullName = FullName ?? "", }; foreach (var bank in inserted.BankExam) { var bankExam = new BankExam { PeriodExam = periodExam, AccountName = bank.AccountName, AccountNumber = bank.AccountNumber, BankName = bank.BankName, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdateFullName = FullName ?? "", }; await _context.BankExams.AddAsync(bankExam); } foreach (var position in inserted.PositionExam) { var positionExam = new PositionExam { PeriodExam = periodExam, PositionId = position.PositionId, PositionName = position.PositionName, TypeName = position.TypeName, CreatedAt = DateTime.Now, CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateUserId = UserId ?? "", CreatedFullName = FullName ?? "", LastUpdateFullName = FullName ?? "", }; await _context.PositionExams.AddAsync(positionExam); } await _context.PeriodExams.AddAsync(periodExam); await _context.SaveChangesAsync(); } public async Task UpdateAsync(string examId, RequestPeriodExam updated) { var periodExam = await _context.PeriodExams.AsQueryable() .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); if (periodExam == null) throw new Exception(GlobalMessages.ExamNotFound); periodExam.Name = updated.Name; periodExam.CheckDocument = updated.CheckDocument; periodExam.CheckDisability = updated.CheckDisability; periodExam.Round = updated.Round; periodExam.Year = updated.Year; periodExam.Fee = updated.Fee; periodExam.RegisterStartDate = updated.RegisterStartDate; periodExam.RegisterEndDate = updated.RegisterEndDate; periodExam.PaymentStartDate = updated.PaymentStartDate; periodExam.PaymentEndDate = updated.PaymentEndDate; periodExam.AnnouncementStartDate = updated.AnnouncementStartDate; periodExam.AnnouncementEndDate = updated.AnnouncementEndDate; periodExam.OrganizationCodeId = updated.OrganizationCodeId; periodExam.OrganizationCodeName = updated.OrganizationCodeName; periodExam.OrganizationId = updated.OrganizationId; periodExam.OrganizationName = updated.OrganizationName; periodExam.PaymentKrungThai = updated.PaymentKrungThai; periodExam.Detail = updated.Detail; periodExam.Note = updated.Note; periodExam.CreatedAt = DateTime.Now; periodExam.CreatedUserId = UserId ?? ""; periodExam.LastUpdatedAt = DateTime.Now; periodExam.LastUpdateUserId = UserId ?? ""; periodExam.CreatedFullName = FullName ?? ""; periodExam.LastUpdateFullName = FullName ?? ""; await _context.SaveChangesAsync(); } public async Task DeleteAsync(string examId) { var periodExam = await _context.PeriodExams.AsQueryable() .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); if (periodExam == null) throw new Exception(GlobalMessages.ExamNotFound); _context.PeriodExams.Remove(periodExam); await _context.SaveChangesAsync(); } public async Task> GetsCandidateByStatusAsync(string examId, string status) { var periodExam = await _context.PeriodExams.AsQueryable() .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); if (periodExam == null) throw new Exception(GlobalMessages.ExamNotFound); if (status == "all") { return await _context.Candidates.AsQueryable() .Where(x => x.PeriodExam == periodExam && x.Status != "register" && x.Status != "rejectRegister") .ToListAsync(); } else { return await _context.Candidates.AsQueryable() .Where(x => x.PeriodExam == periodExam && x.Status == status) .ToListAsync(); } } public async Task GetsAsyncInformation(string candidateId) { return await _context.Candidates.AsQueryable() .Where(x => x.Id == Guid.Parse(candidateId)) .Select(x => new CandidateInformationResponseItem { Prefix = x.Prefix, PrefixId = x.Prefix != null ? x.Prefix.Id.ToString() : null, FirstName = x.FirstName, LastName = x.LastName, Nationality = x.Nationality, DateOfBirth = x.DateOfBirth, Relationship = x.Relationship, RelationshipId = x.Relationship != null ? x.Relationship.Id.ToString() : null, CitizenProvince = x.CitizenProvince, CitizenProvinceId = x.CitizenProvince != null ? x.CitizenProvince.Id.ToString() : null, CitizenDistrict = x.CitizenDistrict, CitizenDistrictId = x.CitizenDistrict != null ? x.CitizenDistrict.Id.ToString() : null, CitizenDate = x.CitizenDate, Email = x.Email, CitizenId = x.CitizenId, Telephone = x.Telephone, MobilePhone = x.MobilePhone, Knowledge = x.Knowledge, }) .FirstOrDefaultAsync(); } public async Task GetsAsyncOccupation(string candidateId) { return await _context.Candidates.AsQueryable() .Where(x => x.Id == Guid.Parse(candidateId)) .Select(x => new CandidateOccupationResponseItem { OccupationType = x.OccupationType, OccupationCompany = x.OccupationCompany, OccupationDepartment = x.OccupationDepartment, OccupationEmail = x.OccupationEmail, OccupationTelephone = x.OccupationTelephone, OccupationPosition = x.OccupationPosition, }) .FirstOrDefaultAsync(); } public async Task GetsAsyncAddress(string candidateId) { return await _context.Candidates.AsQueryable() .Where(x => x.Id == Guid.Parse(candidateId)) .Select(x => new CandidateAddressResponseItem { RegistAddress = x.RegistAddress, RegistProvince = x.RegistProvince, RegistProvinceId = x.RegistProvince != null ? x.RegistProvince.Id.ToString() : null, RegistDistrict = x.RegistDistrict, RegistDistrictId = x.RegistDistrict != null ? x.RegistDistrict.Id.ToString() : null, RegistSubDistrict = x.RegistSubDistrict, RegistSubDistrictId = x.RegistSubDistrict != null ? x.RegistSubDistrict.Id.ToString() : null, RegistZipCode = x.RegistZipCode, RegistSame = x.RegistSame, CurrentAddress = x.CurrentAddress, CurrentProvince = x.CurrentProvince, CurrentProvinceId = x.CurrentProvince != null ? x.CurrentProvince.Id.ToString() : null, CurrentDistrict = x.CurrentDistrict, CurrentDistrictId = x.CurrentDistrict != null ? x.CurrentDistrict.Id.ToString() : null, CurrentSubDistrict = x.CurrentSubDistrict, CurrentSubDistrictId = x.CurrentSubDistrict != null ? x.CurrentSubDistrict.Id.ToString() : null, CurrentZipCode = x.CurrentZipCode, }) .FirstOrDefaultAsync(); } public async Task GetsAsyncFamily(string candidateId) { return await _context.Candidates.AsQueryable() .Where(x => x.Id == Guid.Parse(candidateId)) .Select(x => new CandidateFamilyResponseItem { Marry = x.Marry, MarryPrefix = x.MarryPrefix, MarryPrefixId = x.MarryPrefix != null ? x.MarryPrefix.Id.ToString() : null, MarryFirstName = x.MarryFirstName, MarryLastName = x.MarryLastName, MarryOccupation = x.MarryOccupation, MarryNationality = x.MarryNationality, FatherPrefix = x.FatherPrefix, FatherPrefixId = x.FatherPrefix != null ? x.FatherPrefix.Id.ToString() : null, FatherFirstName = x.FatherFirstName, FatherLastName = x.FatherLastName, FatherOccupation = x.FatherOccupation, FatherNationality = x.FatherNationality, MotherPrefix = x.MotherPrefix, MotherPrefixId = x.MotherPrefix != null ? x.MotherPrefix.Id.ToString() : null, MotherFirstName = x.MotherFirstName, MotherLastName = x.MotherLastName, MotherOccupation = x.MotherOccupation, MotherNationality = x.MotherNationality, }) .FirstOrDefaultAsync(); } public async Task> GetsAsyncEducation(string candidateId) { return await _context.Educations.AsQueryable() .Include(x => x.EducationLevel) .Where(x => x.Id == Guid.Parse(candidateId)) .OrderBy(d => d.DurationStart) .ToListAsync(); } public async Task> GetsAsyncCareer(string candidateId) { return await _context.Careers.AsQueryable() .Where(x => x.Id == Guid.Parse(candidateId)) .OrderBy(d => d.DurationStart) .ToListAsync(); } #endregion } }