From 5c047bb2f34fcd73c341e62a0a387b4ae3815a85 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Tue, 12 Sep 2023 13:13:26 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B8=84=E0=B8=B3=E0=B8=99=E0=B8=A7=E0=B8=93?= =?UTF-8?q?=E0=B9=80=E0=B8=84=E0=B8=A3=E0=B8=B7=E0=B9=88=E0=B8=AD=E0=B8=87?= =?UTF-8?q?=E0=B8=A3=E0=B8=B2=E0=B8=8A=20=E0=B8=A5=E0=B8=B9=E0=B8=81?= =?UTF-8?q?=E0=B8=88=E0=B9=89=E0=B8=B2=E0=B8=87=20**=20=E0=B8=A2=E0=B8=B1?= =?UTF-8?q?=E0=B8=87=E0=B9=84=E0=B8=A1=E0=B9=88=E0=B9=84=E0=B8=94=E0=B9=89?= =?UTF-8?q?=E0=B8=97=E0=B8=94=E0=B8=AA=E0=B8=AD=E0=B8=9A=20**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/InsigniaPeriodsRepository.cs | 684 ++++++++++++++++++ 1 file changed, 684 insertions(+) diff --git a/BMA.EHR.Application/Repositories/InsigniaPeriodsRepository.cs b/BMA.EHR.Application/Repositories/InsigniaPeriodsRepository.cs index e8c2a907..1df9f4a7 100644 --- a/BMA.EHR.Application/Repositories/InsigniaPeriodsRepository.cs +++ b/BMA.EHR.Application/Repositories/InsigniaPeriodsRepository.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using BMA.EHR.Domain.Models.Organizations; +using Amazon.S3.Model.Internal.MarshallTransformations; namespace BMA.EHR.Application.Repositories { @@ -197,6 +198,659 @@ namespace BMA.EHR.Application.Repositories } } + #region " Employee " + + /// + /// กลุ่ม ลจ ที่ค่าจ้าง >= 8340 และ < 15050 + /// + /// + /// + /// + public async Task> GetEmployeeInsignia_Type1(Guid periodId, Guid ocId) + { + try + { + var allOc = GetAllIdByRoot(ocId); + + var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); + + if (period == null) + throw new Exception(GlobalMessages.CoinPeriodNotFound); + + var oc = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == ocId); + + if (oc == null) + throw new Exception(GlobalMessages.OCNotFound); + + var CurrentRetireDate = new DateTime(period.Year, 9, 30); + + var inst_profile = _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + .Where(p => + allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) && + p.IsActive == true && + p.IsLeave == false && + p.DateAppoint != null && + + p.ProfileType == "employee" && + p.EmployeeClass == "perm" + ) + .Select(p => new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + ProfileDateAppoint = p.DateAppoint.Value, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + PositionLevelId = p.PositionLevel == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PositionLevel.Id, + PositionLevelName = p.PositionLevel == null ? null : p.PositionLevel.Name, + PositionTypeId = p.PositionType == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PositionType.Id, + PositionTypeName = p.PositionType == null ? null : p.PositionType.Name, + Gender = p.Gender == null ? null : p.Gender.Name, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PostionSalaryAmount = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().PositionSalaryAmount, + //FirstRecvInsigniaYear1 = p.Insignias.Count == 0 ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault().Year, + //FirstRecvInsigniaYear2 = p.Insignias.Count == 0 ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault().Year, + }); + + // 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, + 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, + 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.Value.ToString("#,##0") }" + }, + } + })).ToList(); + + var s2 = (from p in _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + where allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) + && p.IsActive == true + && p.IsLeave == false + && p.DateAppoint != null + && p.PositionType != null + && p.PositionLevel != null + && p.ProfileType == "employee" + && p.EmployeeClass == "perm" + && !p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name.Contains("เบญจมาภรณ์ช้างเผือก") + select new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + ProfileDateAppoint = p.DateAppoint.Value, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + Gender = p.Gender == null ? null : p.Gender.Name, + IsHigherLevel = IsHigherLevel(p.Insignias + .Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name, + "เบญจมาภรณ์ช้างเผือก"), + FirstRecvInsigniaYear = p.Insignias.Count == 0 ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault().Year, + }) + .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, + 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.Value.ToString("#,##0") }" + }, + new MatchingCondition + { + Condition = $"2.ได้ บ.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", + Result = $"ได้รับ บ.ม. ในปี { p.FirstRecvInsigniaYear }" + } + } + }) + .ToList(); + + var s3 = (from p in _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + where allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) + && p.IsActive == true + && p.IsLeave == false + && p.DateAppoint != null + && p.PositionType != null + && p.PositionLevel != null + && p.ProfileType == "employee" + && p.EmployeeClass == "perm" + && !p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name.Contains("จัตุรถาภรณ์มงกุฎไทย") + select new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + ProfileDateAppoint = p.DateAppoint.Value, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + Gender = p.Gender == null ? null : p.Gender.Name, + IsHigherLevel = IsHigherLevel(p.Insignias + .Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name, + "จัตุรถาภรณ์มงกุฎไทย"), + FirstRecvInsigniaYear = p.Insignias.Count == 0 ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault().Year, + }) + .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, + 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.Value.ToString("#,##0") }" + }, + new MatchingCondition + { + Condition = $"2.ได้ บ.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ช. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", + Result = $"ได้รับ บ.ช. ในปี { p.FirstRecvInsigniaYear }" + } + } + }) + .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) + { + try + { + var allOc = GetAllIdByRoot(ocId); + + var period = await _dbContext.Set().FirstOrDefaultAsync(p => p.Id == periodId); + + if (period == null) + throw new Exception(GlobalMessages.CoinPeriodNotFound); + + var oc = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == ocId); + + if (oc == null) + throw new Exception(GlobalMessages.OCNotFound); + + var CurrentRetireDate = new DateTime(period.Year, 9, 30); + + var inst_profile = _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + .Where(p => + allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) && + p.IsActive == true && + p.IsLeave == false && + p.DateAppoint != null && + + p.ProfileType == "employee" && + p.EmployeeClass == "perm" + ) + .Select(p => new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + ProfileDateAppoint = p.DateAppoint.Value, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + PositionLevelId = p.PositionLevel == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PositionLevel.Id, + PositionLevelName = p.PositionLevel == null ? null : p.PositionLevel.Name, + PositionTypeId = p.PositionType == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PositionType.Id, + PositionTypeName = p.PositionType == null ? null : p.PositionType.Name, + Gender = p.Gender == null ? null : p.Gender.Name, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Count == 0 ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PostionSalaryAmount = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().PositionSalaryAmount, + //FirstRecvInsigniaYear1 = p.Insignias.Count == 0 ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault().Year, + //FirstRecvInsigniaYear2 = p.Insignias.Count == 0 ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + // p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault().Year, + }); + + 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, + 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, + 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.Value.ToString("#,##0") }" + }, + } + })).ToList(); + + var s2 = (from p in _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + where allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) + && p.IsActive == true + && p.IsLeave == false + && p.DateAppoint != null + && p.PositionType != null + && p.PositionLevel != null + && p.ProfileType == "employee" + && p.EmployeeClass == "perm" + && !p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name.Contains("จัตุรถาภรณ์มงกุฎไทย") + select new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + ProfileDateAppoint = p.DateAppoint.Value, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + Gender = p.Gender == null ? null : p.Gender.Name, + IsHigherLevel = IsHigherLevel(p.Insignias + .Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name, + "จัตุรถาภรณ์มงกุฎไทย"), + FirstRecvInsigniaYear = p.Insignias.Count == 0 ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "เบญจมาภรณ์ช้างเผือก").OrderBy(x => x.Year).FirstOrDefault().Year, + }) + .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, + 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.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับชำนาญการขึ้นไป (15,050)", + Result = $"อัตราค่าจ้าง { p.SalaryCondition.Value.ToString("#,##0") }" + }, + new MatchingCondition + { + Condition = $"2.ได้ บ.ช. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ บ.ช. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", + Result = $"ได้รับ บ.ช. ในปี { p.FirstRecvInsigniaYear }" + } + } + }) + .ToList(); + + var s3 = (from p in _dbContext.Set() + .Include(p => p.Position) + .Include(p => p.PosNo) + .Include(p => p.PositionType) + .Include(p => p.PositionLevel) + .Include(p => p.Insignias) + .ThenInclude(i => i.Insignia) + .Include(p => p.Salaries) + where allOc.Contains(p.OcId == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.OcId.Value) + && p.IsActive == true + && p.IsLeave == false + && p.DateAppoint != null + && p.PositionType != null + && p.PositionLevel != null + && p.ProfileType == "employee" + && p.EmployeeClass == "perm" + && !p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name.Contains("จัตุรถาภรณ์ช้างเผือก") + select new + { + ProfileId = p.Id, + Prefix = p.Prefix == null ? null : p.Prefix.Name, + FullName = $"{p.FirstName} {p.LastName}", + Position = p.Position == null ? null : p.Position.Name, + Rank = p.PositionLevel.Name, + GovAge = p.DateAppoint.Value.CalculateGovAgeStr(0, 0), + ProfileDateAppoint = p.DateAppoint.Value, + LastInsignia = p.Insignias.Count == 0 ? "" : p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name, + LastInsigniaId = p.Insignias.Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")).OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Id, + Salary = p.Salaries.Count() == 0 ? null : p.Salaries.OrderByDescending(x => x.Order).FirstOrDefault().Amount, + SalaryCondition = p.Salaries.Count() == 0 ? null : p.Salaries.Where(x => x.Date <= new DateTime(period.Year, 4, 29)).OrderByDescending(x => x.Order).FirstOrDefault().Amount, + PosNo = p.PosNo == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.PosNo.Id, + Gender = p.Gender == null ? null : p.Gender.Name, + IsHigherLevel = IsHigherLevel(p.Insignias + .Where(x => !x.Insignia.Name.Contains("เหรียญจักรพรรดิมาลา")) + .OrderByDescending(x => x.Year) + .FirstOrDefault().Insignia.Name, + "จัตุรถาภรณ์ช้างเผือก"), + FirstRecvInsigniaYear = p.Insignias.Count == 0 ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "จัตุรถาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault() == null ? 0 : + p.Insignias.Where(x => x.Insignia.Name == "จัตุรถาภรณ์มงกุฎไทย").OrderBy(x => x.Year).FirstOrDefault().Year, + }) + .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, + 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.ได้รับอัตราค่าจ้างตั้งแต่อัตราเงินเดือนขั้นต่ำของข้าราขการพลเรือนระดับชำนาญการขึ้นไป (15,050)", + Result = $"อัตราค่าจ้าง { p.SalaryCondition.Value.ToString("#,##0") }" + }, + new MatchingCondition + { + Condition = $"2.ได้ จ.ม. มาแล้วไม่น้อยกว่า 5 ปี บริบูรณ์ (ได้รับ จ.ม. ก่อนวันที่ {(new DateTime(period.Year - 5, 7, 28)).ToThaiFullDate3()})", + Result = $"ได้รับ จ.ม. ในปี { p.FirstRecvInsigniaYear }" + } + } + }) + .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 " ทั่วไป " /// @@ -4721,6 +5375,36 @@ namespace BMA.EHR.Application.Repositories } } + public async Task> GetEmployeeInsigniaCandidateBKK(Guid periodId, Guid ocId) + { + try + { + var result_candidate = new List(); + + var type1 = await GetEmployeeInsignia_Type1(periodId, ocId); + var type2 = await GetEmployeeInsignia_Type2(periodId, ocId); + + // union result + foreach (var r in type2) + { + var old = result_candidate.FirstOrDefault(x => x.ProfileId == r.ProfileId); + if (old == null) + result_candidate.Add(r); + } + foreach (var r in type1) + { + 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; + } + } // /// กรองรายชื่อผู้มิสิทธิ์ยื่นขอเหรียญจักรพรรดิมาลา