using Amazon.S3.Model.Internal.MarshallTransformations; using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Application.Requests; using BMA.EHR.Application.Responses.Profiles; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Insignias; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Models.OrganizationEmployee; using BMA.EHR.Domain.Models.Organizations; using BMA.EHR.Domain.Shared; using GreatFriends.ThaiBahtText; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Nest; using Newtonsoft.Json; using ProfileInsignia = BMA.EHR.Domain.Models.HR.ProfileInsignia; namespace BMA.EHR.Application.Repositories { public class InsigniaPeriodsRepository : GenericRepository { private readonly IApplicationDBContext _dbContext; private readonly IHttpContextAccessor _httpContextAccessor; private readonly MinIOService _documentService; private readonly UserProfileRepository _userProfileRepository; private List _insigniaLists = new(); public InsigniaPeriodsRepository(IApplicationDBContext dbContext, MinIOService documentService, IHttpContextAccessor httpContextAccessor, UserProfileRepository userProfileRepository) : base(dbContext, httpContextAccessor) { _dbContext = dbContext; _httpContextAccessor = httpContextAccessor; _documentService = documentService; _userProfileRepository = userProfileRepository; _insigniaLists = _dbContext.Set().AsNoTracking().Include(x => x.InsigniaType).ToList(); } public async Task> FindByNameAsync(string name) { var data = await _dbContext.Set().Where(x => x.Name == name).ToListAsync(); return data; } #region " Private " private List GetAllIdByRoot(Guid? id) { try { var ret = new List(); if (id == null) return ret; var oc = _dbContext.Set().FirstOrDefault(x => x.Id == id); if (oc != null) ret.Add(oc.Id); var child = _dbContext.Set().AsQueryable() .Where(x => x.Parent != null && x.Parent.Id == id).ToList(); if (child.Any()) { foreach (var item in child) { ret.AddRange(GetAllIdByRoot(item.Id)); } } return ret; } catch { throw; } } public InsigniaItem? GetInsigniaByName(string name) { try { var insignia = _insigniaLists .Where(x => x.Name == name) .Select(i => new InsigniaItem { Id = i.Id, Name = i.Name, ShortName = i.ShortName, Level = i.InsigniaType?.Name ?? "", LevelId = i.InsigniaType?.Id ?? null }) .FirstOrDefault(); return insignia; } catch { throw; } } public InsigniaItem? GetInsigniaById(Guid id) { try { var insignia = _insigniaLists .Where(x => x.Id == id) .Select(i => new InsigniaItem { Id = i.Id, Name = i.Name, ShortName = i.ShortName, Level = i.InsigniaType.Name, LevelId = i.InsigniaType.Id }) .FirstOrDefault(); return insignia; } catch { throw; } } private bool IsHigherLevel2(string last, string request) { try { var last_ins = _dbContext.Set() .FirstOrDefault(x => x.Name.ToLower().Trim() == last.ToLower().Trim()); if (last_ins == null) return true; var req_ins = _dbContext.Set() .FirstOrDefault(x => x.Name.ToLower().Trim() == request.ToLower().Trim()); if (req_ins == null) throw new Exception("Invalid Request Insignia!!"); return req_ins.Level > last_ins.Level; } catch { throw; } } private static bool IsHigherLevel(BMA.EHR.Application.Responses.Profiles.ProfileInsignia? last, string request) { if (last == null) return true; else { var last_ins = last.Insignia?.ToLower().Trim() ?? ""; return IsHigherLevel(last_ins, request); } } private static bool IsHigherLevel(string last, string request) { if (request.Contains("ตริตาภรณ์ช้างเผือก")) return (last.Contains("ตริตาภรณ์มงกุฎไทย")) ? false : true; else if (request.Contains("ทวีติยาภรณ์มงกุฎไทย")) return (last.Contains("ตริตาภรณ์มงกุฎไทย") || last.Contains("ตริตาภรณ์ช้างเผือก")) ? false : true; else if (request.Contains("ทวีติยาภรณ์ช้างเผือก")) return (last.Contains("ตริตาภรณ์มงกุฎไทย") || last.Contains("ตริตาภรณ์ช้างเผือก") || last.Contains("ทวีติยาภรณ์มงกุฎไทย")) ? false : true; else if (request.Contains("ประถมาภรณ์มงกุฎไทย")) return (last.Contains("ตริตาภรณ์มงกุฎไทย") || last.Contains("ตริตาภรณ์ช้างเผือก") || last.Contains("ทวีติยาภรณ์มงกุฎไทย") || last.Contains("ทวีติยาภรณ์ช้างเผือก")) ? false : true; else if (request.Contains("ประถมาภรณ์ช้างเผือก")) return (last.Contains("ตริตาภรณ์มงกุฎไทย") || last.Contains("ตริตาภรณ์ช้างเผือก") || last.Contains("ทวีติยาภรณ์มงกุฎไทย") || last.Contains("ทวีติยาภรณ์ช้างเผือก") || last.Contains("ประถมาภรณ์มงกุฎไทย")) ? false : true; else if (request.Contains("มหาวชิรมงกุฎ")) return (last.Contains("ตริตาภรณ์มงกุฎไทย") || last.Contains("ตริตาภรณ์ช้างเผือก") || last.Contains("ทวีติยาภรณ์มงกุฎไทย") || last.Contains("ทวีติยาภรณ์ช้างเผือก") || last.Contains("ประถมาภรณ์มงกุฎไทย") || last.Contains("ประถมาภรณ์ช้างเผือก")) ? false : true; else return false; } private bool CanRequestInsignia(Guid profileId, int year) { try { var ce_year = year; var insignia = _dbContext.Set() .Where(x => x.ProfileId == profileId) .Where(x => x.Year == ce_year - 1) .FirstOrDefault(); if (insignia != null) { return false; } else { var prev_period = _dbContext.Set().FirstOrDefault(x => x.Year == ce_year - 1); if (prev_period == null) return true; else { var req = _dbContext.Set() .FirstOrDefault(x => x.Request.Period.Id == prev_period.Id && x.ProfileId == profileId); if (req != null) return false; else return true; } } } catch { throw; } } #region " Employee " /// /// กลุ่ม ลจ ที่ค่าจ้าง >= 8340 และ < 15050 /// /// /// /// public async Task> GetEmployeeInsignia_Type1(Guid periodId, Guid ocId, List allProfilesByRoot) { try { Console.WriteLine(ocId); var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var coinInsignia = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เหรียญจักรพรรดิมาลา")); var inst_profile = allProfilesByRoot .Select(p => new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PositionSalaryAmount = p.PositionSalaryAmount ?? 0, ProfileInsignia = p.ProfileInsignia, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }); // check วันที่บรรจะต้องน้อยกว่า 29/5/ปี-8 ขอ บม. var s1 = ((from p in inst_profile where p.ProfileDateAppoint <= new DateTime(period.Year - 8, 5, 29) && p.LastInsigniaId == Guid.Parse("00000000-0000-0000-0000-000000000000") && (p.SalaryCondition >= 8340 && p.SalaryCondition < 15050) select p) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, RequestInsignia = GetInsigniaByName("เบญจมาภรณ์มงกุฎไทย"), Seq = 1, Gender = p.Gender, MatchingConditions = new List { new MatchingCondition { Condition = $"1.รับราชการก่อน {new DateTime(period.Year - 8, 5, 29).ToThaiFullDate3()}", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" }, new MatchingCondition { Condition = $"2.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับปฏิบัติการ (8,340) แต่ไม่ถึงขั้นต่ำของอัตราเงินเดือนข้าราชการพลเรือนระดับชำนาญการ (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate })).ToList(); var bcpRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เบญจมาภรณ์ช้างเผือก")); var bcmRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เบญจมาภรณ์มงกุฎไทย")); var jtmRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("จัตุรถาภรณ์มงกุฎไทย")); var s2_a = (from p in allProfilesByRoot where p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id && x.InsigniaId.Value == bcpRoyal.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", PositionSalaryAmount = p.PositionSalaryAmount ?? 0, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, IsHigherLevel = IsHigherLevel(p.ProfileInsignia.ToList() .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "เบญจมาภรณ์ช้างเผือก"), FirstRecvInsigniaYear = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault()?.Year, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = s2_a .Where(x => (x.SalaryCondition >= 8340 && x.SalaryCondition < 10150) && !x.IsHigherLevel) .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, RequestInsignia = GetInsigniaByName("เบญจมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับปฏิบัติการ (8,340) แต่ไม่ถึงขั้นต่ำของอัตราเงินเดือนข้าราชการพลเรือนระดับชำนาญการ (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, new MatchingCondition { Condition = $"2.ได้ บ.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ บ.ม. ในปี {p.FirstRecvInsigniaYear}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id && x.InsigniaId.Value == jtmRoyal.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevel == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, IsHigherLevel = IsHigherLevel(p.ProfileInsignia.ToList() .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "จัตุรถาภรณ์มงกุฎไทย"), FirstRecvInsigniaYear = p.ProfileInsignia == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount ?? 0, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => (x.SalaryCondition >= 8340 && x.SalaryCondition < 10150) && !x.IsHigherLevel) .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("จัตุรถาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับปฏิบัติการ (8,340) แต่ไม่ถึงขั้นต่ำของอัตราเงินเดือนข้าราชการพลเรือนระดับชำนาญการ (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, new MatchingCondition { Condition = $"2.ได้ บ.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ช. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ บ.ช. ในปี {p.FirstRecvInsigniaYear}" } }, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? //if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) // continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// กลุ่ม ลจ ที่ค่าจ้าง >= 15050 /// /// /// /// public async Task> GetEmployeeInsignia_Type2(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var coinInsignia = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เหรียญจักรพรรดิมาลา")); var inst_profile = allProfilesByRoot .Select(p => new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PositionSalaryAmount = p.PositionSalaryAmount ?? 0, ProfileInsignia = p.ProfileInsignia, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }); var s1 = ((from p in inst_profile where p.ProfileDateAppoint <= new DateTime(period.Year - 8, 5, 29) && p.LastInsigniaId == Guid.Parse("00000000-0000-0000-0000-000000000000") && (p.SalaryCondition >= 15050) select p) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("เบญจมาภรณ์ช้างเผือก"), Seq = 1, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.รับราชการก่อน {new DateTime(period.Year - 8, 5, 29).ToThaiFullDate3()}", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" }, new MatchingCondition { Condition = $"2.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับชำนาญการขึ้นไป (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate })).ToList(); var bcpRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เบญจมาภรณ์ช้างเผือก")); var bcmRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("เบญจมาภรณ์มงกุฎไทย")); var jtcRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("จัตุรถาภรณ์ช้างเผือก")); var jtmRoyal = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Name.Contains("จัตุรถาภรณ์มงกุฎไทย")); var s2 = (from p in allProfilesByRoot where p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id && x.InsigniaId.Value == jtmRoyal.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, IsHigherLevel = IsHigherLevel(p.ProfileInsignia.ToList() .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "จัตุรถาภรณ์มงกุฎไทย"), FirstRecvInsigniaYear = p.ProfileInsignia == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcpRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == bcpRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount ?? 0, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => (x.SalaryCondition >= 10150) && !x.IsHigherLevel) .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("จัตุรถาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับชำนาญการขึ้นไป (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, new MatchingCondition { Condition = $"2.ได้ บ.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ช. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ บ.ช. ในปี {p.FirstRecvInsigniaYear}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id && x.InsigniaId.Value == jtcRoyal.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? null : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()! .Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileInsignia!.OrderByDescending(x => x.Year).FirstOrDefault()!.InsigniaId.Value, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, IsHigherLevel = IsHigherLevel(p.ProfileInsignia.ToList() .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != coinInsignia.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "จัตุรถาภรณ์ช้างเผือก"), FirstRecvInsigniaYear = p.ProfileInsignia == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == jtmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == jtmRoyal.Id).OrderBy(x => x.Year) .FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => (x.SalaryCondition >= 10150) && !x.IsHigherLevel) .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("จัตุรถาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount ?? 0, Amount = p.Amount ?? 0, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับชำนาญการขึ้นไป (15,050)", Result = $"อัตราค่าจ้าง {p?.SalaryCondition?.ToString("#,##0")??""}" }, new MatchingCondition { Condition = $"2.ได้ จ.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ จ.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ จ.ม. ในปี {p.FirstRecvInsigniaYear}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? //if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) // continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #region " ทั่วไป " /// /// Gets the insignia candidate ประเภททั่วไป ระดับปฏิบัติงาน. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type1_Level1(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var inst_profile = allProfilesByRoot .Select(p => new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo ?? "", PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, ProfileInsignia = p.ProfileInsignia, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }); // check วันที่บรรจะต้องน้อยกว่า 29/5/ปี-5 var s1 = ((from p in inst_profile where p.ProfileDateAppoint <= new DateTime(period.Year - 5, 5, 29) && p.LastInsigniaId == Guid.Parse("00000000-0000-0000-0000-000000000000") && p.PositionLevelName == "ปฏิบัติงาน" // ปฏิบัติงาน && p.ProfileInsignia == null select p) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank ?? "", GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("เบญจมาภรณ์มงกุฎไทย"), Seq = 1, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.รับราชการก่อน {new DateTime(period.Year - 5, 5, 29).ToThaiFullDate3()}", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate })).ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "ปฏิบัติงาน" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("เบญจมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo ?? "", Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "เบญจมาภรณ์ช้างเผือก"), PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.SalaryCondition < 10190 && !x.IsHigherLevel) .Where(x => x.ProfileDateAppoint <= new DateTime(period.Year - 10, 5, 29)) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("เบญจมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนต่ำกว่าขั้นต่ำของระดับชำนาญงาน (เงินเดือนน้อยกว่า 10,190 บาท)", Result = $"ได้รับเงินเดือน {p.SalaryCondition} บาท" }, new MatchingCondition { Condition = $"2.ดำรงตำแหน่งมาแล้วไม่น้อยกว่า 10 ปี บริบูรณ์ (รับราชการก่อน {new DateTime(period.Year - 10, 5, 29).ToThaiFullDate3()})", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "ปฏิบัติงาน" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("จัตุรถาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo ?? "", Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "จัตุรถาภรณ์มงกุฎไทย"), PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.SalaryCondition >= 10190 && !x.IsHigherLevel) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("จัตุรถาภรณ์มงกุฎไทย"), Seq = 3, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนไม่ต่ำกว่าขั้นต่ำของระดับชำนาญงาน (เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} 10,190 บาทขึ้นไป)", Result = $"ได้รับเงินเดือน {p.SalaryCondition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s4 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "ปฏิบัติงาน" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("จัตุรถาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo ?? "", Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "จัตุรถาภรณ์ช้างเผือก"), PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.SalaryCondition >= 10190 && !x.IsHigherLevel) .Where(x => x.ProfileDateAppoint <= new DateTime(period.Year - 10, 5, 29)) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("จัตุรถาภรณ์ช้างเผือก"), Seq = 4, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนไม่ต่ำกว่าขั้นต่ำของระดับชำนาญงาน (เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} 10,190 บาทขึ้นไป)", Result = $"ได้รับเงินเดือน {p.SalaryCondition} บาท" }, new MatchingCondition { Condition = $"2.ดำรงตำแหน่งมาแล้วไม่น้อยกว่า 10 ปี บริบูรณ์ (รับราชการก่อน {new DateTime(period.Year - 10, 5, 29).ToThaiFullDate3()})", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s4) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภททั่วไป ระดับชำนาญงาน. /// /// The period identifier. /// The oc identifier. /// /// public async Task> GetInsigniaCandidate_Type1_Level2(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "ชำนาญงาน" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ตริตาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ตริตาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ตริตาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับชำนาญงาน", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "ชำนาญงาน" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ตริตาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ตริตาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญงาน").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญงาน").OrderBy(p => p.Date) .FirstOrDefault()?.Date, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstPositonLevelDate < new DateTime(period.Year - 5, 5, 29)) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ตริตาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ดำรงตำแหน่งมาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (เป็นระดับชำนาญงาน ก่อนวันที่ {(new DateTime(period.Year - 5, 5, 29)).ToThaiFullDate3()})", Result = $"ดำรงตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel} ตั้งแต่วันที่ {(p.FirstPositonLevelDate == null ? "-" : p.FirstPositonLevelDate.Value.ToThaiFullDate3())}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภททั่วไป ระดับอาวุโส. /// /// The period identifier. /// The oc identifier. /// /// public async Task> GetInsigniaCandidate_Type1_Level3(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "อาวุโส" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับอาวุโส", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && p.PosLevel == "อาวุโส" && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstPositonLevelDate < new DateTime(period.Year - 5, 5, 29)) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ดำรงตำแหน่งมาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (เป็นระดับอาวุโส ก่อนวันที่ {(new DateTime(period.Year - 5, 5, 29)).ToThaiFullDate3()})", Result = $"ดำรงตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel} ตั้งแต่วันที่ {(p.FirstPositonLevelDate == null ? "-" : p.FirstPositonLevelDate.Value.ToThaiFullDate3())}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภททั่วไป ระดับทักษะพิเศษ. /// /// The period identifier. /// The oc identifier. /// /// public async Task> GetInsigniaCandidate_Type1_Level4(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && (p.PosLevel == "อาวุโส" || p.PosLevel == "อาวุโส (เฉพาะสายงาน)") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับทักษะพิเศษ", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && (p.PosLevel == "อาวุโส" || p.PosLevel == "อาวุโส (เฉพาะสายงาน)") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ท.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้รับ ท.ช. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "ทั่วไป" && (p.PosLevel == "อาวุโส" || p.PosLevel == "อาวุโส (เฉพาะสายงาน)") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ ป.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #region " วิชาการ " /// /// Gets the insignia candidate ประเภทวิชาการ ระดับปฏิบัติการ. /// /// The period identifier. /// The oc identifier. /// /// public async Task> GetInsigniaCandidate_Type2_Level5(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ตริตาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ตริตาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ตริตาภรณ์มงกุฎไทย"), Seq = 1, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.รับราชการก่อน {new DateTime(period.Year - 5, 5, 29).ToThaiFullDate3()}", Result = $"วันที่บรรจุเข้ารับราชการ {p.ProfileDateAppoint.ToThaiFullDate3()}" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภทวิชาการ ระดับชำนาญการ. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type2_Level6(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ชำนาญการ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ตริตาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ตริตาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ตริตาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับชำนาญการ", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ชำนาญการ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.SalaryCondition >= 22140) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนไม่ต่ำกว่าขั้นต่ำของระดับชำนาญการพิเศษ (เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} 22,140 บาท)", Result = $"เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} เป็นเงิน {p.SalaryCondition} บาท" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ชำนาญการ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year - 5, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year - 5, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.SalaryCondition >= 22140) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนไม่ต่ำกว่าขั้นต่ำของระดับชำนาญการพิเศษมาแล้วไม่น้อยกว่า 5 ปี (เงินเดือนก่อนวันที่ {(new DateTime(period.Year - 5, 4, 29)).ToThaiFullDate3()} 22,140 บาท)", Result = $"เงินเดือนก่อนวันที่ {(new DateTime(period.Year - 5, 4, 29)).ToThaiFullDate3()} เป็นเงิน {p.SalaryCondition} บาท" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภทวิชาการ ระดับชำนาญการพิเศษ. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type2_Level7(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ชำนาญการพิเศษ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการพิเศษ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการพิเศษ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับชำนาญการพิเศษ", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ชำนาญการพิเศษ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการพิเศษ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ชำนาญการพิเศษ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.SalaryCondition >= 58390) .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนขั้นสูง (เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} 58,390 บาท)", Result = $"เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} เป็นเงิน {p.SalaryCondition} บาท" }, new MatchingCondition { Condition = $"2.ได้ ท.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ท.ช. วันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภทวิชาการ ระดับเชี่ยวชาญ. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type2_Level8(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "เชี่ยวชาญ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับเชี่ยวชาญ", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "เชี่ยวชาญ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ท.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ท.ช. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "เชี่ยวชาญ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "เชี่ยวชาญ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ท.ช. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภทวิชาการ ระดับทรงคุณวุฒิ ได้เงินตำแหน้ง 13000. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type2_Level9_1(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 3) .Where(x => x.SalaryPosition == 13000) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ม. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 13,000 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo == null ? "" : p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาวชิรมงกุฎ"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Where(p => p.SalaryPosition == 13000) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาวชิรมงกุฎ"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ช. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 13,000 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาปรมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Where(p => p.SalaryPosition == 13000) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ม.ว.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ม.ว.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ม.ว.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 13,000 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } /// /// Gets the insignia candidate ประเภทวิชาการ ระดับทรงคุณวุฒิ ได้เงินตำแหน้ง 15600. /// /// The period identifier. /// The oc identifier. /// public async Task> GetInsigniaCandidate_Type2_Level9_2(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(x => x.FirstRecvInsigniaYear != 0 && x.FirstRecvInsigniaYear <= period.Year - 3) .Where(x => x.SalaryPosition == 15600) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ม. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 15,600 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาวชิรมงกุฎ"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "อาวุโส").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Where(p => p.SalaryPosition == 15600) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาวชิรมงกุฎ"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ช. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ป.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 15,600 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "วิชาการ" && (p.PosLevel == "ทรงคุณวุฒิ") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาปรมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ทรงคุณวุฒิ").OrderBy(p => p.Date) .FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Where(p => p.SalaryPosition == 15600) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ม.ว.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ม.ว.ม. ก่อนวันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()})", Result = $"ได้รับ ม.ว.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 15,600 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #region " อำนวยการ " public async Task> GetInsigniaCandidate_Type3_Level10(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "อำนวยการ" && (p.PosLevel == "ต้น") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo == null ? "" : p.PosNo, Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ทวีติยาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.เป็นระดับอำนวยการ/ต้น", Result = $"ตำแหน่ง {p.Position} ประเภท {p.PositionType} ระดับ {p.PositionLevel}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "อำนวยการ" && (p.PosLevel == "ต้น") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.SalaryCondition >= 58390) .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้รับเงินเดือนขั้นสูง (เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} 58,390 บาท)", Result = $"เงินเดือน ณ วันที่ {(new DateTime(period.Year, 4, 29)).ToThaiFullDate3()} เป็นเงิน {p.SalaryCondition} บาท" }, new MatchingCondition { Condition = $"2.ได้ ท.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ท.ช. วันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } public async Task> GetInsigniaCandidate_Type3_Level11(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "อำนวยการ" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ท.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ท.ช. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "อำนวยการ" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? "" : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ม. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "อำนวยการ" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? "" : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? "" : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาวชิรมงกุฎ"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "อำนวยการ") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาวชิรมงกุฎ"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ป.ช. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #region " บริหาร " public async Task> GetInsigniaCandidate_Type4_Level10(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "ต้น") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์มงกุฎไทย"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ทวีติยาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์มงกุฎไทย"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ท.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ท.ช. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ท.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "ต้น") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ม. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "ต้น") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาวชิรมงกุฎ"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "ต้น" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาวชิรมงกุฎ"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ป.ช. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } public async Task> GetInsigniaCandidate_Type4_Level11(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var CurrentRetireDate = new DateTime(period.Year, 9, 30); var s1 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "ประถมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์มงกุฎไทย")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Where(x => x.SalaryPosition == 14500) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("ประถมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ม. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ม. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 14,500 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s2 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาวชิรมงกุฎ"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("ประถมาภรณ์ช้างเผือก")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 3) .Where(x => x.SalaryPosition == 14500) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาวชิรมงกุฎ"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ป.ช. มาแล้วไม่น้อยกว่า 3 ปี บริบูรณ์ (ได้ ป.ช. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ป.ช. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 14,500 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var s3 = (from p in allProfilesByRoot where p.PosType == "บริหาร" && (p.PosLevel == "สูง") // อาวุโส && p.ProfileInsignia != null && p.ProfileInsignia.Count > 0 && (p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id && x.InsigniaId.Value == GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก")?.Id) .ToList() .Count() == 0) select new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix == null ? null : p.Prefix, FullName = $"{(p.Prefix == null ? null : p.Prefix)}{p.FirstName} {p.LastName}", Position = p.Position == null ? null : p.Position, Rank = p.PosLevel ?? "", GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), ProfileDateAppoint = p.DateAppoint!.Value, LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryPosition = p.PositionSalaryAmount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PosNo = p.PosNo, Gender = p.Gender == null ? null : p.Gender, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, IsHigherLevel = p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? true : IsHigherLevel(p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year) .FirstOrDefault(), "มหาปรมาภรณ์ช้างเผือก"), PositionLevel = p.PosLevel == null ? "" : p.PosLevel, PositionType = p.PosType == null ? "" : p.PosType, FirstPositonLevelDate = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault() == null ? null : p.ProfileSalary.Where(x => x.PositionLevel == "สูง" && x.PositionType == "บริหาร") .OrderBy(p => p.Date).FirstOrDefault()?.Date, FirstRecvInsigniaYear = p.ProfileInsignia.Count == 0 ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : p.ProfileInsignia.Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value == GetInsigniaByName("มหาวชิรมงกุฎ")?.Id) .OrderBy(x => x.Year).FirstOrDefault()?.Year, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList() .Where(p => p.FirstRecvInsigniaYear != 0 && p.FirstRecvInsigniaYear <= period.Year - 5) .Where(x => x.SalaryPosition == 14500) .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, Prefix = p.Prefix, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank, GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("มหาปรมาภรณ์ช้างเผือก"), Seq = 2, Gender = p.Gender, PositionSalaryAmount = p.PositionSalaryAmount, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, MatchingConditions = new List { new MatchingCondition { Condition = $"1.ได้ ม.ว.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้ ม.ว.ม. วันที่ {(new DateTime(period.Year - 3, 7, 28)).ToThaiFullDate3()} หรือก่อนหน้านั้น)", Result = $"ได้รับ ม.ว.ม. ในปี {p.FirstRecvInsigniaYear.Value.ToThaiYear()}" }, new MatchingCondition { Condition = $"ได้รับเงินประจำตำแหน่ง 14,500 บาท", Result = $"ได้รับเงินประจำตำแหน่ง {p.SalaryPosition} บาท" } }, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }) .ToList(); var result_candidate = new List(); foreach (var r in s3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } foreach (var r in s2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } foreach (var r in s1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #endregion #region " Public " /// /// ประมวลผลรายชื่อผู้ได้รับเครื่องราชย์ของแต่ละหน่วยงาน /// /// รหัสรอบการขอ /// รหัสหน่วยงาน /// officer or employee /// ผลการคำนวนการขอพระราชทานเครื่องราชย์ public async Task> GetInsigniaCandidateBKKByTypeAsync(Guid periodId, Guid ocId, string type = "officer") { try { var result_candidate = new List(); var period = await _dbContext.Set().Include(x => x.InsigniaEmployees).FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) { throw new Exception(GlobalMessages.InsigniaPeriodNotFound); } if (type.ToLower().Trim() == "officer") { var allOfficerProfilesByRoot = (await _userProfileRepository.GetOfficerProfileByRootIdAsync(ocId, AccessToken)); if (allOfficerProfilesByRoot != null) { // calculate ตามแต่ละชั้น var type_coin = allOfficerProfilesByRoot.Count() > 0 ? await GetCoinCandidate(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level1 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level1(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level2 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level2(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level3 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level3(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level4 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level4(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level5 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level5(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level6 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level6(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level7 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level7(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level8 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level8(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level9_1 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level9_1(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level9_2 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level9_2(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type3_level10 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type3_Level10(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type3_level11 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type3_Level11(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type4_level10 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type4_Level10(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type4_level11 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type4_Level11(periodId, ocId, allOfficerProfilesByRoot) : new List(); // union result foreach (var r in type_coin) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type4_level11) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type4_level10) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type3_level11) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type3_level10) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level9_2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level9_1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level8) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level7) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level6) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level5) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level4) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } // ย้ายที่ตามที่ มอสแจ้ง if (period.Round != 1) { var insigniaIdList = await _dbContext.Set() .Include(x => x.InsigniaType) .Where(x => x.InsigniaType!.Name == "ชั้นสายสะพาย") .Select(x => x.Id) .ToListAsync(); result_candidate = result_candidate.Where(x => insigniaIdList.Contains(x.RequestInsignia.Id)).ToList(); } } } else if (type.ToLower().Trim() == "employee") { var allEmployeeProfileByRoot = new List(); if (period != null && period.InsigniaEmployees != null) { allEmployeeProfileByRoot = (await _userProfileRepository.GetEmployeeProfileByPositionAsync(ocId, period.InsigniaEmployees.Select(x => x.RefId!.ValueOrBlank()).ToArray(), AccessToken)); } if (allEmployeeProfileByRoot != null) { var type_coin = allEmployeeProfileByRoot.Count() > 0 ? await GetCoinCandidate(periodId, ocId, allEmployeeProfileByRoot) : new List(); var employee_type1 = allEmployeeProfileByRoot.Count() > 0 ? await GetEmployeeInsignia_Type1(periodId, ocId, allEmployeeProfileByRoot) : new List(); var employee_type2 = allEmployeeProfileByRoot.Count() > 0 ? await GetEmployeeInsignia_Type2(periodId, ocId, allEmployeeProfileByRoot) : new List(); // union result foreach (var r in type_coin) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in employee_type2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in employee_type1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } } } else throw new Exception(GlobalMessages.CalculateTypeNotValid); return result_candidate.OrderBy(x => x.Seq).ThenBy(x => x.Gender).ThenBy(x => x.ProfileId).ToList(); } catch { throw; } } /// /// ประมวลผลรายชื่อผู้ได้รับเครื่องราชย์ของแต่ละหน่วยงาน /// /// /// /// public async Task> GetInsigniaCandidateBKK(Guid periodId, Guid ocId) { try { var result_candidate = new List(); var allOfficerProfilesByRoot = (await _userProfileRepository.GetOfficerProfileByRootIdAsync(ocId, AccessToken)); var period = await _dbContext.Set().Include(x => x.InsigniaEmployees).FirstOrDefaultAsync(p => p.Id == periodId); var allEmployeeProfileByRoot = new List(); if (period != null && period.InsigniaEmployees != null) { allEmployeeProfileByRoot = (await _userProfileRepository.GetEmployeeProfileByPositionAsync(ocId, period.InsigniaEmployees.Select(x => x.RefId!.ValueOrBlank()).ToArray(), AccessToken)); } var type_coin = allOfficerProfilesByRoot.Count() > 0 ? await GetCoinCandidate(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level1 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level1(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level2 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level2(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level3 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level3(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type1_level4 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type1_Level4(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level5 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level5(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level6 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level6(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level7 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level7(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level8 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level8(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level9_1 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level9_1(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type2_level9_2 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type2_Level9_2(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type3_level10 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type3_Level10(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type3_level11 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type3_Level11(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type4_level10 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type4_Level10(periodId, ocId, allOfficerProfilesByRoot) : new List(); var type4_level11 = allOfficerProfilesByRoot.Count() > 0 ? await GetInsigniaCandidate_Type4_Level11(periodId, ocId, allOfficerProfilesByRoot) : new List(); var employee_type1 = allEmployeeProfileByRoot.Count() > 0 ? await GetEmployeeInsignia_Type1(periodId, ocId, allEmployeeProfileByRoot) : new List(); var employee_type2 = allEmployeeProfileByRoot.Count() > 0 ? await GetEmployeeInsignia_Type2(periodId, ocId, allEmployeeProfileByRoot) : new List(); // union result foreach (var r in type_coin) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type4_level11) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type4_level10) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type3_level11) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type3_level10) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level9_2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level9_1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level8) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level7) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level6) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type2_level5) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level4) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level3) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in type1_level1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } // ย้ายที่ตามที่ มอสแจ้ง if (period.Round != 1) { var insigniaIdList = await _dbContext.Set() .Include(x => x.InsigniaType) .Where(x => x.InsigniaType!.Name == "ชั้นสายสะพาย") .Select(x => x.Id) .ToListAsync(); result_candidate = result_candidate.Where(x => insigniaIdList.Contains(x.RequestInsignia.Id)).ToList(); } foreach (var r in employee_type2) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } foreach (var r in employee_type1) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); if (old == null) result_candidate.Add(r); } //foreach (var r in type) //{ // var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // if (old == null) // result_candidate.Add(r); //} return result_candidate.OrderBy(x => x.Seq).ThenBy(x => x.Gender).ThenBy(x => x.ProfileId).ToList(); } catch { throw; } } //กรองรายชื่อผู้มิสิทธิ์ยื่นขอเหรียญจักรพรรดิมาลา public async Task> GetCoinCandidate(Guid periodId, Guid ocId, List allProfilesByRoot) { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.CoinPeriodNotFound); var inst_profile = allProfilesByRoot.Where(x => x.DateAppoint.HasValue && x.DateAppoint != null) .Select(p => new { ProfileId = p.Id, p.CitizenId, p.FirstName, p.LastName, p.BirthDate, p.DateAppoint, Prefix = p.Prefix ?? "", FullName = $"{(p.Prefix ?? "")}{p.FirstName} {p.LastName}", Position = p.Position ?? "", Rank = p.PosLevel ?? "", ProfileDateAppoint = p.DateAppoint!.Value, GovAge = p.DateStart!.Value.CalculateGovAgeStr(0, 0), PosNo = p.PosNo, PositionLevelId = p.PosLevelId, PositionLevelName = p.PosLevel, PositionTypeId = p.PosTypeId, PositionTypeName = p.PosType, Gender = p.Gender ?? "", LastInsignia = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? "" : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.Insignia, LastInsigniaId = p.ProfileInsignia == null || p.ProfileInsignia.Count == 0 ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .FirstOrDefault() == null ? Guid.Empty : p.ProfileInsignia .Where(x => x.InsigniaId.HasValue && x.InsigniaId.Value != GetInsigniaByName("เหรียญจักรพรรดิมาลา")?.Id) .OrderByDescending(x => x.Year).FirstOrDefault()?.InsigniaId, Salary = p.Amount, SalaryCondition = p.ProfileSalary == null || p.ProfileSalary.Count == 0 ? 0 : p.ProfileSalary.Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault() != null ? p.ProfileSalary .Where(x => x.Date != null).Where(x => x.Date.HasValue && x.Date.Value <= new DateTime(period.Year, 4, 29)) .OrderByDescending(x => x.Order).FirstOrDefault()?.Amount : p.Amount, PositionSalaryAmount = p.PositionSalaryAmount, ProfileInsignia = p.ProfileInsignia, Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate }); // check วันที่บรรจะต้องมากกว่า 25 ปี var result = ((from p in inst_profile where p.ProfileDateAppoint <= new DateTime(period.Year - 25, 5, 29) select p) .ToList() .Select(p => new InsigniaResultSet { ProfileId = p.ProfileId, CitizenId = p.CitizenId, Prefix = p.Prefix, FirstName = p.FirstName, LastName = p.LastName, PosLevelName = p.PositionLevelName, PosTypeName = p.PositionTypeName, PositionSalary = p.PositionSalaryAmount, BirthDate = p.BirthDate, DateAppoint = p.DateAppoint, FullName = p.FullName, Position = p.Position, PosNo = p.PosNo, Rank = p.Rank ?? "", GovAge = p.GovAge, LastInsignia = p.LastInsignia, LastInsigniaId = p.LastInsigniaId, Salary = p.Salary, RequestInsignia = GetInsigniaByName("เหรียญจักรพรรดิมาลา"), Seq = 1, Gender = p.Gender, MatchingConditions = new List(), Amount = p.Amount, RootId = p.RootId, RootDnaId = p.RootDnaId, Root = p.Root, Child1Id = p.Child1Id, Child1DnaId = p.Child1DnaId, Child1 = p.Child1, Child2Id = p.Child2Id, Child2DnaId = p.Child2DnaId, Child2 = p.Child2, Child3Id = p.Child3Id, Child3DnaId = p.Child3DnaId, Child3 = p.Child3, Child4Id = p.Child4Id, Child4DnaId = p.Child4DnaId, Child4 = p.Child4, ProfileType = p.ProfileType, MarkDiscipline = p.MarkDiscipline, MarkInsignia = p.MarkInsignia, MarkLeave = p.MarkLeave, MarkRate = p.MarkRate })).ToList(); var result_candidate = new List(); foreach (var r in result) { var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); // Check ได้รับหรือเคยยื่นขอไปในปีที่แล้วหรือไม่? if (!CanRequestInsignia(r.ProfileId, period.Year)) continue; // Check ว่าชั้นที่ขอสูงกว่าชั้นที่เคยได้รับแล้วหรือไม่? if (!IsHigherLevel2(r.LastInsignia, r.RequestInsignia.Name)) continue; if (old == null) { result_candidate.Add(r); } } return result_candidate; } catch { throw; } } #endregion #region " From Ming " // คำนวณระยะเวลาของรอบการยืนขอ public async Task CalStatusByDate(DateTime start, DateTime end, string year) { var nowDate = DateTime.Now; if (nowDate.Year < Int32.Parse(year) || nowDate.Year > Int32.Parse(year)) return "ไม่ใช้งาน"; if (nowDate.Date >= start.Date && nowDate.Date <= end.Date) return "ใช้งาน"; return "ไม่ใช้งาน"; } public async Task GetRequestId(Guid period, Guid ocId) { try { var req = await _dbContext.Set() .Where(x => x.OrganizationId != null) .FirstOrDefaultAsync(x => x.Period.Id == period && x.OrganizationId == ocId); if (req == null) return null; return req.Id; } catch { throw; } } public async Task GetRequestIdByTypeAsync(Guid period, Guid ocId, string type = "officer") { try { var req = await _dbContext.Set() .Where(x => x.OrganizationId != null) .FirstOrDefaultAsync(x => x.Period.Id == period && x.OrganizationId == ocId && x.ProfileType.ToLower() == type.ToLower()); if (req == null) return null; return req.Id; } catch { throw; } } // Save Aprove public async Task SaveAprove(Guid period, Guid ocId) { try { var req = await GetRequestId(period, ocId); if (req != null) { var insigniaRequestProfiles = await _dbContext.Set() .Where(x => x.Request.Id == req) .ToListAsync(); foreach (var insigniaRequestProfile in insigniaRequestProfiles) { insigniaRequestProfile.IsApprove = true; } } await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task SaveApproveByTypeAsync(Guid period, Guid ocId, string type = "officer") { try { var req = await GetRequestIdByTypeAsync(period, ocId, type); if (req != null) { var insigniaRequestProfiles = await _dbContext.Set() .Where(x => x.Request.Id == req) .ToListAsync(); foreach (var insigniaRequestProfile in insigniaRequestProfiles) { insigniaRequestProfile.IsApprove = true; } } await _dbContext.SaveChangesAsync(); } catch { throw; } } // เช็คข้อมูล ใน table insignia_request_new public async Task GetInsigniaRequest(Guid id, Guid ocId) { try { var period = await _dbContext.Set() .Select(p => new { Id = p.Id, Name = p.Name, Round = p.Round, Year = p.Year, IsLock = p.IsLock, }) .FirstOrDefaultAsync(x => x.Id == id); if (period == null) return null; else { var request = await _dbContext.Set() .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Period.Id == period.Id && x.OrganizationId == ocId); return new InsigniaResults { PeriodId = period.Id, Year = period.Year, Round = period.Round, Name = period.Name, IsLock = period.IsLock, RequestId = request == null ? null : request.Id, RequestNote = request == null ? "" : request.RequestNote, RequestStatus = request == null ? null : request.RequestStatus, OrganizationName = request == null ? "" : request.Organization, Document = request == null ? null : (request.Document == null ? null : await _documentService.ImagesPath(request.Document.Id)), }; } } catch { throw; } } public async Task GetInsigniaRequestByTypeAsync(Guid id, Guid ocId, string type = "officer") { try { var period = await _dbContext.Set() .Select(p => new { Id = p.Id, Name = p.Name, Round = p.Round, Year = p.Year, IsLock = p.IsLock, }) .FirstOrDefaultAsync(x => x.Id == id); if (period == null) return null; else { var request = await _dbContext.Set() .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Period.Id == period.Id && x.OrganizationId == ocId && x.ProfileType.ToLower() == type.ToLower()); return new InsigniaResults { PeriodId = period.Id, Year = period.Year, Round = period.Round, Name = period.Name, IsLock = period.IsLock, RequestId = request == null ? null : request.Id, RequestNote = request == null ? "" : request.RequestNote, RequestStatus = request == null ? null : request.RequestStatus, OrganizationName = request == null ? "" : request.Organization, Document = request == null ? null : (request.Document == null ? null : await _documentService.ImagesPath(request.Document.Id)), }; } } catch { throw; } } // Get Data Table insignai_has_profile public async Task> InsigniaHasProfile(Guid period, Guid ocId, string status, string type = "officer") { try { var id = await GetRequestIdByTypeAsync(period, ocId, type); if (id != null) { var raw_result = _dbContext.Set() .Include(x => x.Request) .Include(x => x.RequestInsignia) .ThenInclude(x => x.InsigniaType) .Where(h => status.Trim().ToUpper() == "ALL" ? h.Status != null : h.Status == status.Trim().ToUpper()) .Where(h => h.Request.Id == id) .ToList(); var result = raw_result .Select(h => new InsigniaRequestItem { Id = h.Id, CitizenId = h.CitizenId, ProfileId = h.ProfileId, ProfileType = h.ProfileType, FullName = $"{h.Prefix}{h.FirstName} {h.LastName}", Position = h.Position, PosNo = h.PosNo, Rank = $"{h.PosTypeName}/{h.PosLevelName}", Salary = h.Salary.ToString(), LastInsignia = h.LastInsigniaName, RequestInsignia = h.RequestInsignia.Name, RequestInsigniaShortName = h.RequestInsignia.ShortName, Level = h.RequestInsignia.InsigniaType.Name, IsApprove = h.IsApprove, RequestDate = h.RequestDate, Status = h.Status, RequestNote = h.ReasonReject, Reason = h.Reason, MarkDiscipline = h.MarkDiscipline, MarkLeave = h.MarkLeave, MarkRate = h.MarkRate, MarkInsignia = h.MarkInsignia, MatchingConditions = h.MatchingConditions == null || h.MatchingConditions == "" ? null : JsonConvert.DeserializeObject>(h.MatchingConditions) }) .ToList(); return result; } else { return null; } } catch { throw; } } // เช็คข้อมูลนำเข้า กับข้อมูลที่อยู่ใน database // public async List GetDuplicate(List income, Guid period, Guid ocId, bool Duplicate = false) // { // try // { // var id = GetRequestId(period, ocId); // var req = await _dbContext.Set().FirstOrDefault(x => x.Id == id); // if (req == null) // throw new Exception(GlobalMessages.InsigniaNotFound); // var profile = await _dbContext.Set().AsQueryable() // .Include(x => x.RequestInsignia) // .ThenInclude(x => x.InsigniaType) // .Include(x => x.Profile) // .ThenInclude(x => x.Insignias) // .Where(x => x.Request.Id == id) // .Select(h => new DuplicateProfile // { // ProfileId = h.Profile.Id, // IsApprove = h.IsApprove, // RequestQualificationStatus = h.QualificationStatus, // RequestDocumentStatus = h.DocumentStatus, // Special = h.Special // }); // var newIncome = income.GroupJoin(profile, // pdb => pdb.Profile.Id, // dp => dp.ProfileId, // (pdb, dp) => new // { // Profile = pdb.Profile, // pdb.Profile.Insignias, // pdb.RequestInsignia, // //pdb.RequestInsignia.InsigniaType, // pdb.Salary, // pdb.RequestDate, // ProfileDB = dp // }) // .ToList() // .Where(d => !Duplicate ? d.ProfileDB.Count() == 0 : d.ProfileDB.Count() != 0) // .Select(d => !Duplicate ? new InsigniaRequestProfile // { // Request = req, // Profile = d.Profile, // RequestInsignia = d.RequestInsignia, // Salary = d.Salary, // RequestDate = d.RequestDate, // } : new InsigniaRequestProfile // { // Request = req, // Profile = d.Profile, // RequestInsignia = d.RequestInsignia, // Salary = d.Salary, // RequestDate = d.RequestDate, // IsApprove = d.ProfileDB.First().IsApprove, // QualificationStatus = d.ProfileDB.First().RequestQualificationStatus, // DocumentStatus = d.ProfileDB.First().RequestDocumentStatus, // Special = d.ProfileDB.First().Special // }) // .ToList(); // return newIncome; // } // catch // { // throw; // } // } // ลบข้อมูลใน db ที่ไม่เท่ากับ income // public async List DeleteProfile(List income, Guid period, Guid ocId) // { // try // { // var id = GetRequestId(period, ocId); // var incomProfileId = income.Select(i => i.Profile.Id).ToList(); // var arrayData = await _dbContext.Set().AsQueryable() // .Where(i => !(incomProfileId.Contains(i.Profile.Id)) && i.Request.Id == id) // .ToList(); // return arrayData; // } // catch // { // throw; // } // } // insert candidate list public async Task UpdateCandidateAsync(Guid periodId, Guid ocId, string oc, List items, string type = "officer") { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.InsigniaPeriodNotFound); var req = await _dbContext.Set() .Include(x => x.RequestProfiles) .Include(x => x.Period) .Where(x => x.Period.Id == periodId) .Where(x => x.OrganizationId == ocId) .Where(x => x.ProfileType.ToLower() == type.ToLower()) .FirstOrDefaultAsync(); if (req != null) { foreach (var item in items) { var reqInsignia = await _dbContext.Set() .FirstOrDefaultAsync(i => i.Id == item.RequestInsignia.Id); if (reqInsignia == null) throw new Exception(GlobalMessages.InsigniaNotFound); var pf = req.RequestProfiles.FirstOrDefault(x => x.ProfileId == item.ProfileId); if (pf != null) continue; // มีอยู่แล้วข้ามไป req.RequestProfiles.Add(new InsigniaRequestProfile { Status = "PENDING", ProfileId = item.ProfileId, RequestInsignia = reqInsignia, Salary = item.Salary, RequestDate = DateTime.Now, MatchingConditions = System.Text.Json.JsonSerializer.Serialize(item.MatchingConditions), CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, // Add Information for reused in API Call ProfileType = item.ProfileType != null && item.ProfileType != "" ? item.ProfileType.ToLower() : "officer", Prefix = item.Prefix, FirstName = item.FirstName, LastName = item.LastName, CitizenId = item.CitizenId, BirthDate = item.BirthDate, DateAppoint = item.DateAppoint, Position = item.Position, Gender = item.Gender, PosTypeName = item.PosTypeName, PosLevelName = item.PosLevelName, PosNo = item.PosNo, Amount = item.Salary, PositionSalaryAmount = item.PositionSalary, LastInsigniaName = item.LastInsignia, Root = item.Root, RootId = item.RootId, RootDnaId = item.RootDnaId, Child1 = item.Child1, Child1Id = item.Child1Id, Child1DnaId = item.Child1DnaId, Child2 = item.Child2, Child2Id = item.Child2Id, Child2DnaId = item.Child2DnaId, Child3 = item.Child3, Child3Id = item.Child3Id, Child3DnaId = item.Child3DnaId, Child4 = item.Child4, Child4Id = item.Child4Id, Child4DnaId = item.Child4DnaId, MarkDiscipline = item.MarkDiscipline, MarkInsignia = item.MarkInsignia, MarkLeave = item.MarkLeave, MarkRate = item.MarkRate }); } await _dbContext.SaveChangesAsync(); } } catch { throw; } } public async Task InsertCandidate(Guid periodId, Guid ocId, string oc, List items, string type = "officer") { try { var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); if (period == null) throw new Exception(GlobalMessages.InsigniaPeriodNotFound); var periodOlds = await _dbContext.Set().Where(p => p.Year == period.Year).ToListAsync(); foreach (var periodOld in periodOlds) { var requestOlds = await _dbContext.Set().Where(p => p.Period == periodOld) .ToListAsync(); foreach (var requestOld in requestOlds) { var profileOlds = await _dbContext.Set() .Where(p => p.Request == requestOld).Select(x => x.ProfileId).ToListAsync(); items = items.Where(x => !profileOlds.Contains(x.ProfileId)).ToList(); } } var req = new InsigniaRequest { Period = period, OrganizationId = ocId, Organization = oc, RequestStatus = "st1", RequestNote = "", CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, ProfileType = type }; foreach (var item in items) { var reqInsignia = await _dbContext.Set() .FirstOrDefaultAsync(i => i.Id == item.RequestInsignia.Id); if (reqInsignia == null) throw new Exception(GlobalMessages.InsigniaNotFound); req.RequestProfiles.Add(new InsigniaRequestProfile { Status = "PENDING", ProfileId = item.ProfileId, RequestInsignia = reqInsignia, Salary = item.Salary, RequestDate = DateTime.Now, MatchingConditions = System.Text.Json.JsonSerializer.Serialize(item.MatchingConditions), CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, // Add Information for reused in API Call ProfileType = item.ProfileType != null && item.ProfileType != "" ? item.ProfileType.ToLower() : "officer", Prefix = item.Prefix, FirstName = item.FirstName, LastName = item.LastName, CitizenId = item.CitizenId, BirthDate = item.BirthDate, DateAppoint = item.DateAppoint, Position = item.Position, Gender = item.Gender, PosTypeName = item.PosTypeName, PosLevelName = item.PosLevelName, PosNo = item.PosNo, Amount = item.Salary, PositionSalaryAmount = item.PositionSalary, LastInsigniaName = item.LastInsignia, Root = item.Root, RootId = item.RootId, RootDnaId = item.RootDnaId, Child1 = item.Child1, Child1Id = item.Child1Id, Child1DnaId = item.Child1DnaId, Child2 = item.Child2, Child2Id = item.Child2Id, Child2DnaId = item.Child2DnaId, Child3 = item.Child3, Child3Id = item.Child3Id, Child3DnaId = item.Child3DnaId, Child4 = item.Child4, Child4Id = item.Child4Id, Child4DnaId = item.Child4DnaId, MarkDiscipline = item.MarkDiscipline, MarkInsignia = item.MarkInsignia, MarkLeave = item.MarkLeave, MarkRate = item.MarkRate }); } await _dbContext.Set().AddAsync(req); await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task UpdateInsigniaRequestProfile(string[] items, string type) { try { var allProfiles = await _userProfileRepository.GetInsigniaRequestsProfileAsync(items, type, AccessToken); if (allProfiles != null && allProfiles.Count > 0) { var insigniaRequestProfiles = await _dbContext.Set() .Where(x => allProfiles.Select(x => x.Id).ToList().Contains(x.ProfileId)) .ToListAsync(); foreach (var insigniaRequestProfile in insigniaRequestProfiles) { var profile = allProfiles.FirstOrDefault(p => p.Id == insigniaRequestProfile.ProfileId); if (profile != null) { insigniaRequestProfile.MarkDiscipline = profile?.MarkDiscipline; insigniaRequestProfile.MarkLeave = profile?.MarkLeave; insigniaRequestProfile.MarkRate = profile?.MarkRate; insigniaRequestProfile.MarkInsignia = profile?.MarkInsignia; insigniaRequestProfile.APR1 = profile?.APR1; insigniaRequestProfile.APR2 = profile?.APR2; insigniaRequestProfile.APR3 = profile?.APR3; insigniaRequestProfile.APR4 = profile?.APR4; insigniaRequestProfile.APR5 = profile?.APR5; insigniaRequestProfile.OCT1 = profile?.OCT1; insigniaRequestProfile.OCT2 = profile?.OCT2; insigniaRequestProfile.OCT3 = profile?.OCT3; insigniaRequestProfile.OCT4 = profile?.OCT4; insigniaRequestProfile.OCT5 = profile?.OCT5; insigniaRequestProfile.LastUpdateFullName = FullName ?? "System Administrator"; insigniaRequestProfile.LastUpdateUserId = UserId ?? ""; insigniaRequestProfile.LastUpdatedAt = DateTime.Now; } } } await _dbContext.SaveChangesAsync(); } catch { throw; } } #endregion } }