using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Application.Requests.Commands; using BMA.EHR.Application.Responses; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Commands.Core; using BMA.EHR.Domain.Models.HR; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Models.Notifications; using BMA.EHR.Domain.Models.OrganizationEmployee; using BMA.EHR.Domain.Models.Organizations; using BMA.EHR.Domain.Models.Placement; using BMA.EHR.Domain.Models.Retirement; using BMA.EHR.Domain.Shared; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using System.Net.Http.Headers; using Command = BMA.EHR.Domain.Models.Commands.Core.Command; using Profile = BMA.EHR.Domain.Models.HR.Profile; namespace BMA.EHR.Application.Repositories.Commands { public class CommandRepository : GenericRepository { #region " Fields " private readonly IApplicationDBContext _dbContext; private readonly IHttpContextAccessor _httpContextAccessor; private readonly OrganizationCommonRepository _organizationCommonRepository; private readonly UserProfileRepository _userProfileRepository; private readonly IConfiguration _configuration; #endregion #region " Constructor and Destuctor " public CommandRepository(IApplicationDBContext dbContext, IHttpContextAccessor httpContextAccessor, OrganizationCommonRepository organizationCommonRepository, UserProfileRepository userProfileRepository, IConfiguration configuration) : base(dbContext, httpContextAccessor) { _dbContext = dbContext; _httpContextAccessor = httpContextAccessor; _organizationCommonRepository = organizationCommonRepository; _userProfileRepository = userProfileRepository; _configuration = configuration; } #endregion #region " Properties " protected Guid UserOrganizationId { get { if (UserId != null || UserId != "") return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!)); else return Guid.Empty; } } #endregion #region " Methods " #region " Private " #region " List Receiver " public async Task> GetReceiverForByCommndTypeAsync(Command command, string token = "") { var result = new List(); switch (command.CommandType.CommandCode.Trim().ToUpper()) { case "C-PM-01": result = await GetReceiver01Async(command); break; case "C-PM-02": result = await GetReceiver02Async(command); break; case "C-PM-03": result = await GetReceiver03Async(command); break; case "C-PM-04": result = await GetReceiver04Async(command); break; case "C-PM-05": result = await GetReceiver05Async(command); break; case "C-PM-06": result = await GetReceiver06Async(command); break; case "C-PM-07": result = await GetReceiver07Async(command); break; case "C-PM-08": result = await GetReceiver08Async(command); break; case "C-PM-09": result = await GetReceiver09Async(command); break; case "C-PM-10": result = await GetReceiver10Async(command); break; case "C-PM-11": result = await GetReceiver11Async(command, token); break; case "C-PM-12": result = await GetReceiver12Async(command, token); break; case "C-PM-13": result = await GetReceiver13Async(command); break; case "C-PM-14": result = await GetReceiver14Async(command); break; case "C-PM-15": result = await GetReceiver15Async(command); break; case "C-PM-16": result = await GetReceiver16Async(command); break; case "C-PM-17": result = await GetReceiver17Async(command); break; case "C-PM-18": result = await GetReceiver18Async(command); break; case "C-PM-19": result = await GetReceiver19Async(command); break; case "C-PM-20": result = await GetReceiver20Async(command); break; case "C-PM-21": result = await GetReceiver21Async(command); break; default: throw new Exception(GlobalMessages.MethodForCommandTypeNotImplement); } return result; } /// /// C-PM-01 - คำสั่งบรรจุและแต่งตั้ง: สำหรับผู้สอบแข่งขันได้ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver01Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper().StartsWith("C-PM-01")) .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Placement) .ThenInclude(x => x.PlacementType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.PlacementStatus.Trim().ToUpper() == "PREPARE-CONTAIN") .Where(x => x.Draft! == true) .Where(x => x.Placement!.PlacementType!.Name == "สอบแข่งขัน") .OrderBy(x => x.ExamNumber) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { if (!(await CheckIsActiveOfficerAsync(item.CitizenId!))) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } } return result; } catch { throw; } } /// /// C-PM-02 - คำสั่งบรรจุและแต่งตั้ง: สำหรับผู้ได้รับคัดเลือก /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver02Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-02") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Placement) .ThenInclude(x => x.PlacementType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.PlacementStatus.Trim().ToUpper() == "PREPARE-CONTAIN") .Where(x => x.Draft! == true) .Where(x => x.Placement!.PlacementType!.Name != "สอบแข่งขัน") .OrderBy(x => x.ExamNumber) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { if (!(await CheckIsActiveOfficerAsync(item.CitizenId!))) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } } return result; } catch { throw; } } /// /// C-PM-03 - คำสั่งแต่งตั้ง : สำหรับข้าราชการ กทม. เดิม /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver03Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-03") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Placement) .ThenInclude(x => x.PlacementType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.PlacementStatus.Trim().ToUpper() == "PREPARE-CONTAIN") .Where(x => x.Draft! == true) .OrderBy(x => x.ExamNumber) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var profile_oc = await GetProfileOrganizationAsync(item.CitizenId!); if (await CheckIsActiveOfficerAsync(item.CitizenId!)) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } } return result; } catch { throw; } } /// /// C-PM-04 - คำสั่งย้าย : สำหรับข้าราชการ กทม. เดิม /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver04Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-04") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Placement) .ThenInclude(x => x.PlacementType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.PlacementStatus.Trim().ToUpper() == "PREPARE-CONTAIN") .Where(x => x.Draft! == true) .OrderBy(x => x.ExamNumber) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var profile_oc = await GetProfileOrganizationAsync(item.CitizenId!); if (await CheckIsActiveOfficerAsync(item.CitizenId!)) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } } return result; } catch { throw; } } /// /// C-PM-05 - คำสั่งแต่งตั้ง /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver05Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-05") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.CommandType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .Where(x => x.CommandType!.Id == command.CommandType!.Id) .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-06 - คำสั่งเลื่อน /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver06Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-06") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.CommandType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .Where(x => x.CommandType!.Id == command.CommandType!.Id) .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-07 - คำสั่งย้าย /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver07Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-07") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.CommandType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .Where(x => x.CommandType!.Id == command.CommandType!.Id) .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-08 - คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver08Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-08") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.CommandType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .Where(x => x.CommandType!.Id == command.CommandType!.Id) .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-09 - คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver09Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-09") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.CommandType) .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .Where(x => x.CommandType!.Id == command.CommandType!.Id) .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-10 - คำสั่งแต่งตั้งคณะกรรมการประเมินผลการทดลองปฏิบัติหน้าที่ราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver10Async(Command command) { try { var result = new List(); var seq = 1; // เอาชื่อของกรรมการ ไปหาจากทะเบียนประวัติ var p1 = (await _dbContext.Set() .Include(x => x.Prefix) .Select(x => new { profileId = x.Id, citizenId = x.CitizenId, prefix = x.Prefix.Name, firstName = x.FirstName, lastName = x.LastName, fullName = $"{x.Prefix.Name}{x.FirstName} {x.LastName}" }) .ToListAsync()) .FirstOrDefault(x => x.fullName == command.ChairManFullName); if (p1 != null) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = p1.citizenId!, Prefix = p1.prefix!, FirstName = p1.firstName!, LastName = p1.lastName!, RefPlacementProfileId = p1.profileId }; seq++; result.Add(receiver); } var p2 = (await _dbContext.Set() .Include(x => x.Prefix) .Select(x => new { profileId = x.Id, citizenId = x.CitizenId, prefix = x.Prefix.Name, firstName = x.FirstName, lastName = x.LastName, fullName = $"{x.Prefix.Name}{x.FirstName} {x.LastName}" }) .ToListAsync()) .FirstOrDefault(x => x.fullName == command.Member1FullName); if (p2 != null) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = p2.citizenId!, Prefix = p2.prefix!, FirstName = p2.firstName!, LastName = p2.lastName!, RefPlacementProfileId = p2.profileId }; seq++; result.Add(receiver); } var p3 = (await _dbContext.Set() .Include(x => x.Prefix) .Select(x => new { profileId = x.Id, citizenId = x.CitizenId, prefix = x.Prefix.Name, firstName = x.FirstName, lastName = x.LastName, fullName = $"{x.Prefix.Name}{x.FirstName} {x.LastName}" }) .ToListAsync()) .FirstOrDefault(x => x.fullName == command.Member2FullName); if (p3 != null) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = p3.citizenId!, Prefix = p3.prefix!, FirstName = p3.firstName!, LastName = p3.lastName!, RefPlacementProfileId = p3.profileId }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-11 - คำสั่งให้ข้าราชการที่มีผลการทดลองปฏิบัติหน้าที่ราชการไม่ต่ำกว่ามาตรฐานที่กำหนดรับราชการต่อไป /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver11Async(Command command, string token) { try { var resultData = new List(); var baseAPI = _configuration["Node:API"]; var apiUrl = $"{baseAPI}/report/pass"; var response = new PassProbationResponse(); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var res = await client.SendAsync(req); var result = await res.Content.ReadAsStringAsync(); response = JsonConvert.DeserializeObject(result); var seq = 1; foreach (var d in response!.data) { var pf = await _dbContext.Set() .Include(x => x.Prefix) .FirstOrDefaultAsync(x => x.Id == d.person.id); if (pf != null) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = pf.CitizenId!, Prefix = pf.Prefix!.Name, FirstName = pf.FirstName!, LastName = pf.LastName!, RefPlacementProfileId = pf.Id }; seq++; resultData.Add(receiver); } } } return resultData; } catch { throw; } } /// /// C-PM-12 - คำสั่งให้ข้าราชการออกจากราชการเพราะผลการทดลองปฏิบัติหน้าที่ราชการต่ำกว่ามาตรฐานที่กำหนด /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver12Async(Command command, string token) { try { var resultData = new List(); var baseAPI = _configuration["Node:API"]; var apiUrl = $"{baseAPI}/report/not-pass"; var response = new PassProbationResponse(); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var res = await client.SendAsync(req); var result = await res.Content.ReadAsStringAsync(); response = JsonConvert.DeserializeObject(result); var seq = 1; foreach (var d in response!.data) { var pf = await _dbContext.Set() .Include(x => x.Prefix) .FirstOrDefaultAsync(x => x.Id == d.person.id); if (pf != null) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = pf.CitizenId!, Prefix = pf.Prefix!.Name, FirstName = pf.FirstName!, LastName = pf.LastName!, RefPlacementProfileId = pf.Id }; seq++; resultData.Add(receiver); } } } return resultData; } catch { throw; } } /// /// C-PM-13 - คำสั่งให้โอนข้าราชการกรุงเทพมหานครสามัญ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver13Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-13") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-14 - คำสั่งรับโอนข้าราชการกรุงเทพมหานครสามัญ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver14Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-14") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix!.Name, FirstName = item.Firstname!, LastName = item.Lastname!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-15 - คำสั่งให้ช่วยราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver15Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-15") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-16 - คำสั่งส่งตัวกลับ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver16Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-16") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-17 - คำสั่งอนุญาตให้ข้าราชการลาออกจากราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver17Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-17") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-18 - คำสั่งให้ออกจากราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver18Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-18") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-19 - คำสั่งปลดออกจากราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver19Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-19") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-20 - คำสั่งไล่ออกจากราชการ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver20Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-20") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } /// /// C-PM-21 - คำสั่งแต่งตั้งลูกจ้างชั่วคราวเป็นลูกจ้างประจำ /// /// object ของรายการคำสั่ง /// private async Task> GetReceiver21Async(Command command) { try { var result = new List(); // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน var otherCommandReceivers = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-21") .Where(x => x.Command.Id != command.Id) .Select(x => x.CitizenId) .ToListAsync(); // 2. Query var appointPeople = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) .Where(x => x.Status.Trim().ToUpper() == "REPORT") .OrderBy(x => x.Profile!.CitizenId) .ToListAsync(); // 3. Create new Record var seq = 1; foreach (var item in appointPeople) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.Profile!.CitizenId!, Prefix = item.Profile!.Prefix!.Name, FirstName = item.Profile!.FirstName!, LastName = item.Profile!.LastName!, RefPlacementProfileId = item.Id }; seq++; result.Add(receiver); } return result; } catch { throw; } } #endregion #region " Execute and Deploy " private async Task ExecuteCommandByTypeAsync(Command command) { switch (command.CommandType.CommandCode.Trim().ToUpper()) { case "C-PM-01": case "C-PM-02": await ExecuteCommand01_02Async(command); break; default: throw new Exception(GlobalMessages.MethodForCommandTypeNotImplement); } } /// /// C-PM-01 - คำสั่งบรรจุและแต่งตั้ง: สำหรับผู้สอบแข่งขันได้, /// C-PM-02 - คำสั่งบรรจุและแต่งตั้ง: สำหรับผู้ได้รับคัดเลือก /// /// object ของรายการคำสั่ง /// private async Task ExecuteCommand01_02Async(Command command) { try { // create new profile foreach (var recv in command.Receivers) { // query placement Profile var placementProfile = await _dbContext.Set() .Include(x => x.Prefix) .Include(x => x.FatherPrefix) .Include(x => x.MotherPrefix) .Include(x => x.MarryPrefix) .Include(x => x.Gender) .Include(x => x.Relationship) .Include(x => x.BloodGroup) .Include(x => x.Religion) .Include(x => x.RegistSubDistrict) .Include(x => x.RegistDistrict) .Include(x => x.RegistProvince) .Include(x => x.CurrentSubDistrict) .Include(x => x.CurrentDistrict) .Include(x => x.CurrentProvince) .Include(x => x.PositionPath) .Include(x => x.PositionPathSide) .Include(x => x.PositionType) .Include(x => x.PositionLine) .Include(x => x.PositionLevel) .Include(x => x.PositionNumber) .Include(x => x.PlacementCertificates) .Include(x => x.PlacementEducations) .ThenInclude(x => x.EducationLevel) .Include(x => x.OrganizationPosition) .ThenInclude(x => x.Organization) .ThenInclude(x => x.OrganizationShortName) .Include(x => x.OrganizationPosition) .ThenInclude(x => x.PositionMaster) .ThenInclude(x => x.PositionExecutive) .Include(x => x.OrganizationPosition) .ThenInclude(x => x.PositionMaster) .ThenInclude(x => x.PositionExecutiveSide) .Include(x => x.OrganizationPosition) .ThenInclude(x => x.PositionMaster) .ThenInclude(x => x.PositionLine) .Include(x => x.OrganizationPosition) .ThenInclude(x => x.Organization) .ThenInclude(x => x.OrganizationOrganization) .FirstOrDefaultAsync(x => x.Id == recv.RefPlacementProfileId); if (placementProfile == null) throw new Exception("Invalid placement profile: " + recv.RefPlacementProfileId); // ใส่ฟีลจากข้อมูล var profile = new Profile { ProfileType = "officer", CitizenId = placementProfile.CitizenId, Prefix = placementProfile.Prefix, FirstName = placementProfile.Firstname, LastName = placementProfile.Lastname, Gender = placementProfile.Gender, Nationality = placementProfile.Nationality, BirthDate = placementProfile.DateOfBirth == null ? DateTime.MinValue : placementProfile.DateOfBirth.Value, RelationshipId = placementProfile.Relationship == null ? Guid.Empty : placementProfile.Relationship!.Id, TelephoneNumber = placementProfile.Telephone, Race = placementProfile.Race, ReligionId = placementProfile.Religion == null ? Guid.Empty : placementProfile.Religion.Id, BloodGroupId = placementProfile.BloodGroup == null ? Guid.Empty : placementProfile.BloodGroup.Id, DateAppoint = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value, DateStart = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value, RegistrationAddress = placementProfile.RegistAddress, RegistrationSubDistrictId = placementProfile.RegistSubDistrict == null ? Guid.Empty : placementProfile.RegistSubDistrict!.Id, RegistrationDistrictId = placementProfile.RegistDistrict == null ? Guid.Empty : placementProfile.RegistDistrict!.Id, RegistrationProvinceId = placementProfile.RegistProvince == null ? Guid.Empty : placementProfile.RegistProvince!.Id, CurrentAddress = placementProfile.CurrentAddress, CurrentSubDistrictId = placementProfile.CurrentSubDistrict == null ? Guid.Empty : placementProfile.CurrentSubDistrict!.Id, CurrentDistrictId = placementProfile.CurrentDistrict == null ? Guid.Empty : placementProfile.CurrentDistrict!.Id, CurrentProvinceId = placementProfile.CurrentProvince == null ? Guid.Empty : placementProfile.CurrentProvince!.Id, FatherPrefixId = placementProfile.FatherPrefix == null ? Guid.Empty : placementProfile.FatherPrefix.Id, FatherFirstName = placementProfile.FatherFirstName, FatherLastName = placementProfile.FatherLastName, FatherCareer = placementProfile.FatherOccupation, MotherPrefixId = placementProfile.MotherPrefix == null ? Guid.Empty : placementProfile.MotherPrefix.Id, MotherFirstName = placementProfile.MotherFirstName, MotherLastName = placementProfile.MotherLastName, MotherCareer = placementProfile.MotherOccupation, CouplePrefixId = placementProfile.MarryPrefix == null ? Guid.Empty : placementProfile.MarryPrefix.Id, CoupleFirstName = placementProfile.MarryFirstName, CoupleLastName = placementProfile.MarryLastName, CoupleCareer = placementProfile.MarryOccupation, Position = placementProfile.PositionPath, PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id, PositionType = placementProfile.PositionType, PositionLevel = placementProfile.PositionLevel, //PositionEmployeeLevel = placementProfile.PositionLevel, PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id, PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name, PosNo = placementProfile.OrganizationPosition!.PositionNumber, IsVerified = true, IsProbation = true, Physical = "", Ability = "", AvatarRef = "", GovAgeAbsent = 0, GovAgePlus = 0, EntryStatus = "", IsTransfer = false, IsActive = true, IsLeave = false, VerifiedUser = "", FirstNameOld = "", LastNameOld = "", CoupleLive = false, FatherLive = false, MotherLive = false, CreatedUser = "", Educations = new List(), Certificates = new List(), Salaries = new List(), CreatedAt = DateTime.Now, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", // organization OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id, OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name, OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id, OcId = placementProfile.OrganizationPosition!.Organization!.Id, Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"), }; // add profile education foreach (var edu in placementProfile.PlacementEducations) { profile.Educations.Add(new ProfileEducation { Country = edu.Country, Degree = edu.Degree, Duration = edu.Duration, DurationYear = edu.DurationYear == null ? 0 : edu.DurationYear.Value, EducationLevelId = edu.EducationLevel == null ? Guid.Empty : edu.EducationLevel.Id, EducationLevel = edu.EducationLevel == null ? "" : edu.EducationLevel.Name, StartDate = edu.StartDate, EndDate = edu.EndDate, Field = edu.Field, FinishDate = edu.FinishDate, FundName = edu.FundName, Gpa = edu.Gpa, Institute = edu.Institute, IsActive = true, CreatedAt = DateTime.Now, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", }); } // add profile certificate foreach (var cert in placementProfile.PlacementCertificates) { profile.Certificates.Add(new ProfileCertificate { CertificateNo = cert.CertificateNo, IssueDate = cert.IssueDate, Issuer = cert.Issuer, CertificateType = cert.CertificateType, ExpireDate = cert.ExpireDate, IsActive = true, CreatedAt = DateTime.Now, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", }); } // add profile salary var oc = _dbContext.Set() .FirstOrDefault(x => x.Id == placementProfile.OrganizationPosition!.Organization!.Id); var position = placementProfile.PositionPath; var positionNumber = placementProfile.PositionNumber; var positionType = placementProfile.PositionType; var positionLevel = placementProfile.PositionLevel; var salary = new ProfileSalary { Order = 1, Date = command.CommandAffectDate, Amount = placementProfile.Amount == null ? 0 : placementProfile.Amount, PositionSalaryAmount = placementProfile.PositionSalaryAmount == null ? 0 : placementProfile.PositionSalaryAmount, MouthSalaryAmount = placementProfile.MouthSalaryAmount == null ? 0 : placementProfile.MouthSalaryAmount, SalaryClass = "", SalaryRef = "บรรจุและแต่งตั้งผู้สอบแข่งขันได้วุฒิ คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate!.Value.ToThaiFullDate3()}", OcId = oc == null ? Guid.Empty : oc.Id, PositionLevel = placementProfile.PositionLevel, PositionLineId = placementProfile.PositionLine!.Id, PositionTypeId = placementProfile.PositionType!.Id, OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id, PosNoId = positionNumber!.Id, CommandNo = $"{command.CommandNo}/{command.CommandYear}", CommandTypeName = command.CommandType.Name, PositionEmployeeGroupId = null, PositionEmployeeLevelId = null, PositionEmployeePositionId = null, PositionEmployeePositionSideId = null, PosNoEmployee = "", PositionPathSideId = placementProfile.PositionPathSide! == null ? null : placementProfile.PositionPathSide!.Id, PositionExecutiveId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive!.Id, PositionExecutiveSideId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide!.Id, IsActive = true, CreatedAt = DateTime.Now, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", }; //if (placementProfile.PositionPathSide! != null) //{ // salary.PositionPathSideId = placementProfile.PositionPathSide!.Id; //} //else //if (placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive! != null) //{ // salary.PositionExecutiveId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive!.Id; //} //if (placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide! != null) //{ // salary.PositionExecutiveSideId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide!.Id; //} // add profile position var profilePosition = new ProfilePosition { Profile = profile, OrganizationPosition = placementProfile.OrganizationPosition, IsActive = true, IsPublished = true, }; _dbContext.Set().Add(profilePosition); profile.Salaries.Add(salary); _dbContext.Set().Add(profile); // update placementstatus placementProfile.PlacementStatus = "CONTAIN"; await _dbContext.SaveChangesAsync(); // Send noti inbox and email var inbox = new Inbox { Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", Body = $"คุณได้รับบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", ReceiverUserId = profile.Id, Payload = "", }; _dbContext.Set().Add(inbox); var noti = new Notification { Body = $"คุณได้รับบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", ReceiverUserId = profile.Id, Type = "", Payload = "", }; _dbContext.Set().Add(noti); await _dbContext.SaveChangesAsync(); } // send cc noti inbox foreach (var cc in command.Deployments) { var pf = await _dbContext.Set().FirstOrDefaultAsync(x => x.CitizenId == cc.CitizenId); if (pf != null) { var inbox = new Inbox { Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", Body = $"คำสั่งบบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", ReceiverUserId = pf.Id, Payload = "", }; _dbContext.Set().Add(inbox); var noti = new Notification { Body = $"คำสั่งบบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", ReceiverUserId = pf.Id, Type = "", Payload = "", }; _dbContext.Set().Add(noti); } } // change command status var cmdStatus = await _dbContext.Set().FirstOrDefaultAsync(x => x.Sequence == 5); command.CommandStatusId = cmdStatus!.Id; await _dbContext.SaveChangesAsync(); } catch { throw; } } #endregion #endregion #region " Override " public override async Task GetByIdAsync(Guid id) { return await _dbContext.Set() .Include(x => x.Placement) .Include(x => x.CommandType) .Include(x => x.Documents) .Include(x => x.Receivers) .Include(x => x.CommandStatus) .FirstOrDefaultAsync(x => x.Id == id); } public override async Task> GetAllAsync() { return await _dbContext.Set() .Include(x => x.Placement) .Include(x => x.CommandType) .Include(x => x.CommandStatus) .ToListAsync(); } public override async Task AddAsync(Command command) { var status = await _dbContext.Set().FirstOrDefaultAsync(c => c.Sequence == 1); command.CommandStatus = status!; _dbContext.Attatch(status!); return await base.AddAsync(command); } public override async Task UpdateAsync(Command entity) { // attatch _dbContext.Attatch(entity.CommandStatus); _dbContext.Attatch(entity.CommandType); if (entity.Placement != null) _dbContext.Attatch(entity.Placement); return await base.UpdateAsync(entity); } #endregion #region " Execute Command " public async Task ExecuteCommandAsync(Guid id) { try { var command = await _dbContext.Set() .Include(x => x.Receivers) .Include(x => x.Deployments) .Include(x => x.CommandType) .FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); else await ExecuteCommandByTypeAsync(command); } catch { throw; } } #endregion #region " Command Receiver " public async Task SaveSelectedReceiverAsync(Guid id, List selected, string token = "") { try { var command = await _dbContext.Set() .Include(x => x.Receivers) .Include(x => x.CommandType) .FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); var ap = (await GetReceiverForByCommndTypeAsync(command, token)).Where(x => selected.Contains(x.RefPlacementProfileId!.Value)); //var appointPeople = await _dbContext.Set() // .Include(x => x.Prefix) // .Include(x => x.OrganizationPosition) // .ThenInclude(x => x!.Organization) // //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) // .Where(x => selected.Contains(x.Id)) // .OrderBy(x => x.ExamNumber) // .ToListAsync(); _dbContext.Set().RemoveRange(command.Receivers); await _dbContext.SaveChangesAsync(); var seq = 1; foreach (var item in ap) { var receiver = new CommandReceiver { Sequence = seq, CitizenId = item.CitizenId!, Prefix = item.Prefix, FirstName = item.FirstName!, LastName = item.LastName!, RefPlacementProfileId = item.RefPlacementProfileId }; seq++; command.Receivers.Add(receiver); } await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task> GetReceiverForCommandAsync(Guid id, string token = "") { try { var command = await _dbContext.Set() .Include(x => x.Receivers) .Include(x => x.CommandType) .FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); else return await GetReceiverForByCommndTypeAsync(command, token); } catch { throw; } } public async Task> GetReceiverByCommmandIdAsync(Guid Id) { try { // ปรับใหม่ให้อ่านจาก database ล้วนๆ var command = await _dbContext.Set() .Include(x => x.Receivers) .Include(x => x.CommandType) .FirstOrDefaultAsync(x => x.Id == Id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); else { if (command.Receivers != null && command!.Receivers!.Count > 0) { return command.Receivers; } else { // returrn empty list return new List(); } } } catch { throw; } } public async Task DeleteCommandReceiverAsync(Guid personalId) { try { var deleted = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Id == personalId); if (deleted == null) throw new Exception(GlobalMessages.DataNotFound); _dbContext.Set().Remove(deleted); await _dbContext.SaveChangesAsync(); return deleted; } catch { throw; } } public async Task GetCommandReceiverAsync(Guid personalId) { try { var receiver = await _dbContext.Set() .Include(x => x.Command) .ThenInclude(x => x.CommandType) .FirstOrDefaultAsync(x => x.Id == personalId); if (receiver == null) throw new Exception(GlobalMessages.DataNotFound); return receiver; } catch { throw; } } public async Task SwapReceiverOrderAsync(Guid personalId, string direction) { try { var current = await _dbContext.Set() .Include(c => c.Command) .FirstOrDefaultAsync(x => x.Id == personalId); if (current == null) throw new Exception(GlobalMessages.DataNotFound); var currentSeq = current.Sequence; var commandID = current.Command!.Id; switch (direction.Trim().ToLower()) { case "up": { // get prev record var prev = await _dbContext.Set() .Include(c => c.Command) .Where(x => x.Command.Id == commandID) .Where(x => x.Sequence < currentSeq) .OrderByDescending(x => x.Sequence) .Take(1) .FirstOrDefaultAsync(); if (prev != null) { var prevSeq = prev.Sequence; current.Sequence = prevSeq; prev.Sequence = currentSeq; await _dbContext.SaveChangesAsync(); } break; } case "down": { // get next record var next = await _dbContext.Set() .Include(c => c.Command) .Where(x => x.Command.Id == commandID) .Where(x => x.Sequence > currentSeq) .OrderBy(x => x.Sequence) .Take(1) .FirstOrDefaultAsync(); if (next != null) { var nextSeq = next.Sequence; current.Sequence = nextSeq; next.Sequence = currentSeq; await _dbContext.SaveChangesAsync(); } break; } default: throw new Exception("Invalid swap direction!"); } } catch { throw; } } #endregion public async Task> GetDeploymentByCommandIdAsync(Guid id) { try { var command = await _dbContext.Set() .Include(x => x.Deployments) .FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); else { if (command.Deployments != null || command!.Deployments!.Count > 0) { return command.Deployments; } else { var orgPos = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x!.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) .ThenInclude(x => x!.OrganizationOrganization) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionPath) .Where(x => x.OrganizationPosition!.IsDirector! == true) .Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) .FirstOrDefaultAsync(); if (orgPos != null) { if (orgPos.Profile != null) { var dp = new CommandDeployment { Sequence = 1, ReceiveUserId = orgPos!.Profile!.Id!.ToString("D"), CitizenId = orgPos!.Profile!.CitizenId!, Prefix = orgPos!.Profile!.Prefix!.Name, FirstName = orgPos!.Profile!.FirstName!, LastName = orgPos!.Profile!.LastName!, IsSendInbox = true, IsSendMail = true, IsSendNotification = true, OrganizationName = orgPos!.OrganizationPosition!.Organization!.OrganizationOrganization!.Name, PositionName = orgPos!.OrganizationPosition!.PositionMaster!.PositionPath!.Name }; command.Deployments.Add(dp); } await _dbContext.SaveChangesAsync(); } // query for new list return command.Deployments; } } } catch { throw; } } public async Task> GetProfileByOrganizationIdAsync(Guid orgId) { try { var orgProfiles = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x!.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) .ThenInclude(x => x!.OrganizationOrganization) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionPath) .Where(x => x.OrganizationPosition!.Organization!.Id == orgId) .ToListAsync(); return orgProfiles; } catch { throw; } } public async Task CreateCommandDeploymentAsync(Guid commandId, List deploy) { try { var command = await _dbContext.Set() .Include(x => x.Deployments) .FirstOrDefaultAsync(x => x.Id == commandId); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); else { var lastSeq = 0; var dep = command.Deployments.OrderByDescending(x => x.Sequence).FirstOrDefault(); if (dep == null) lastSeq = 1; else lastSeq = dep.Sequence; foreach (var dep2 in deploy) { dep2.Sequence = lastSeq; lastSeq++; } command.Deployments.AddRange(deploy); await _dbContext.SaveChangesAsync(); } } catch { throw; } } public async Task UpdatCommandDeploymentAsync(List deploys) { try { foreach (var dp in deploys) { var updated = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == dp.Id); if (updated != null) { updated.IsSendMail = dp.IsSendMail; updated.IsSendInbox = dp.IsSendInbox; } } await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task DeleteCommandDeploymentAsync(Guid id) { try { var deleted = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == id); if (deleted == null) throw new Exception(GlobalMessages.DataNotFound); _dbContext.Set().Remove(deleted); await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task GetCommandDeploymentById(Guid id) { try { var data = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == id); return data; } catch { throw; } } #region " Documents " public async Task> GetExistDocument(Guid id, string category) { try { var command = await _dbContext.Set() .Include(x => x.Documents) .ThenInclude(x => x.Document) .FirstOrDefaultAsync(c => c.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); // insert new record to comand Document var exist = command.Documents.Where(x => x.Category == category).ToList(); return exist; } catch { throw; } } public async Task UploadDocument(Guid id, string category, CommandDocument document) { try { var command = await _dbContext.Set() .Include(x => x.Documents) //.ThenInclude(x =>x.Document) .FirstOrDefaultAsync(c => c.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); // insert new record to comand Document //var exist = command.Documents.Where(x => x.Category == category).ToList(); //if (exist.Any()) //{ // _dbContext.Set().RemoveRange(exist); // await _dbContext.SaveChangesAsync(); //} // insert new Record command.Documents.Add(document); await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task> GetCommandDocumentAsync(Guid id) { try { var docs = await _dbContext.Set() .Include(x => x.Command) .Include(x => x.Document) .Where(x => x.Command.Id == id) .ToListAsync(); return docs; } catch { throw; } } #endregion #region " Change Command Status " public async Task GotoNextStateAsync(Guid id) { try { var command = await _dbContext.Set().Include(c => c.CommandStatus).FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); var notProcess = new int[] { 4, 5 }; if (!notProcess.Contains(command.CommandStatus.Sequence)) { var nextStatus = await _dbContext.Set().FirstOrDefaultAsync(c => c.Sequence == command.CommandStatus.Sequence + 1); command.CommandStatus = nextStatus!; _dbContext.Attatch(nextStatus!); await _dbContext.SaveChangesAsync(); } } catch { throw; } } public async Task GotoPrevStateAsync(Guid id) { try { var command = await _dbContext.Set().Include(c => c.CommandStatus).FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); var notProcess = new int[] { 1, 5 }; if (!notProcess.Contains(command.CommandStatus.Sequence)) { var nextStatus = await _dbContext.Set().FirstOrDefaultAsync(c => c.Sequence == command.CommandStatus.Sequence - 1); command.CommandStatus = nextStatus!; _dbContext.Attatch(nextStatus!); await _dbContext.SaveChangesAsync(); } } catch { throw; } } #endregion #region " Change Detail Sequence " #endregion #region " Placement " public async Task GetCommandReceiverSalary(Guid recordId) { try { var cmdReceiver = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Id == recordId); if (cmdReceiver == null) return new PlacementSalaryResponse { SalaryAmount = 0, PositionSalaryAmount = 0, MonthSalaryAmount = 0 }; return new PlacementSalaryResponse { SalaryAmount = cmdReceiver.Amount ?? 0, PositionSalaryAmount = cmdReceiver.PositionSalaryAmount ?? 0, MonthSalaryAmount = cmdReceiver.MouthSalaryAmount ?? 0 }; } catch { throw; } } public async Task GetPlacementSalaryAsync(Guid placementProfileId) { try { var placementProfile = await _dbContext.Set() .FirstOrDefaultAsync(p => p.Id == placementProfileId); if (placementProfile == null) throw new Exception($"Invalid placement profile: {placementProfileId}"); return new PlacementSalaryResponse { SalaryAmount = placementProfile.Amount ?? 0, PositionSalaryAmount = placementProfile.PositionSalaryAmount ?? 0, MonthSalaryAmount = placementProfile.MouthSalaryAmount ?? 0 }; } catch { throw; } } public async Task UpdateCommandReceiverSalaryAsync(Guid personalId, UpdatePlacementSalaryRequest req) { try { var current = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Id == personalId); if (current == null) throw new Exception(GlobalMessages.DataNotFound); current.Amount = req.SalaryAmount; current.PositionSalaryAmount = req.PositionSalaryAmount; current.MouthSalaryAmount = req.MonthSalaryAmount; await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task UpdatePlacementSalaryAsync(Guid personalId, UpdatePlacementSalaryRequest req) { try { var current = await _dbContext.Set() .FirstOrDefaultAsync(x => x.Id == personalId); if (current == null) throw new Exception(GlobalMessages.DataNotFound); var placementProfile = await _dbContext.Set() .FirstOrDefaultAsync(p => p.Id == current.RefPlacementProfileId); if (placementProfile == null) throw new Exception($"Invalid placement profile: {current.RefPlacementProfileId}"); placementProfile.Amount = req.SalaryAmount; placementProfile.PositionSalaryAmount = req.PositionSalaryAmount; placementProfile.MouthSalaryAmount = req.MonthSalaryAmount; await _dbContext.SaveChangesAsync(); } catch { throw; } } public async Task> GetPlacementPositionPath(Guid id) { try { var data = await _dbContext.Set() .Include(x => x.PositionPath) .Include(x => x.Placement) .Where(x => x.Placement!.Id == id) .Where(x => x.PositionPath != null) .Select(x => x.PositionPath) .Distinct() .ToListAsync(); return data!; } catch { throw; } } #endregion #region " Command Info " public async Task GetCommandInfoAsync(Guid id) { try { var command = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); return new CommandInfoResponse { SignDate = command.CommandExcecuteDate.Value, OrderNo = command.CommandNo, OrderYear = command.CommandYear, }; } catch { throw; } } public async Task UpdateCommandInfoAsync(Guid id, string orderNo, string orderYear, DateTime signDate) { try { var command = await _dbContext.Set().FirstOrDefaultAsync(x => x.Id == id); if (command == null) throw new Exception(GlobalMessages.CommandNotFound); command.CommandExcecuteDate = signDate; command.CommandNo = orderNo; command.CommandYear = orderYear; await _dbContext.SaveChangesAsync(); } catch { throw; } } #endregion #region " Organization and Approver " public async Task GetRootOcIdAsync(Guid ocId) { try { var data = await _dbContext.Set().AsQueryable() .FirstOrDefaultAsync(o => o.Id == ocId); if (data == null) throw new Exception(GlobalMessages.OrganizationNotFound); return data.OrganizationAgencyId == null ? ocId : data.OrganizationAgencyId!.Value; } catch { throw; } } public async Task> GetCommandOrgAsync() { try { var ret = new List(); ret.Add(new KeyValueItemResponse { Id = Guid.Empty, Name = "กรุงเทพมหานคร" }); var rootOcId = await GetRootOcIdAsync(UserOrganizationId); var oc = await _dbContext.Set() .Include(x => x.OrganizationOrganization) .Select(x => new KeyValueItemResponse { Id = x.Id, Name = x.OrganizationOrganization!.Name }) .FirstOrDefaultAsync(x => x.Id == rootOcId); if (oc != null) ret.Add(oc); return ret; } catch { throw; } } public async Task> GetOrgApproverAsync(Guid ocId) { try { if (ocId == Guid.Empty) return new List() { new OrganizationApproverResponse { Id = Guid.Empty, Name = "", PositionName = "ปลัดกรุงเทพมหานคร" } }; else { //var ret = new List(); var oc = await _dbContext.Set().Include(x => x.Parent).FirstOrDefaultAsync(x => x.Id == ocId); var profilePosition = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionPath) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionExecutive) .Where(x => x.OrganizationPosition!.Organization!.Id == ocId && x.OrganizationPosition!.PositionMaster!.IsDirector == true) .Select(x => new OrganizationApproverResponse { Id = x.Profile!.Id, Name = $"{x.Profile!.Prefix!.Name}{x.Profile!.FirstName} {x.Profile!.LastName}", PositionName = x.OrganizationPosition!.PositionMaster!.PositionExecutive != null ? x.OrganizationPosition!.PositionMaster!.PositionExecutive!.Name : x.OrganizationPosition!.PositionMaster!.PositionPath == null ? "" : x.OrganizationPosition!.PositionMaster!.PositionPath!.Name }) .ToListAsync(); if (profilePosition.Count > 0) { return profilePosition; } else { if (oc != null && oc.Parent != null) { var parentProfilePosition = await _dbContext.Set() .Include(x => x.Profile) .ThenInclude(x => x.Prefix) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.Organization) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionPath) .Include(x => x.OrganizationPosition) .ThenInclude(x => x!.PositionMaster) .ThenInclude(x => x!.PositionExecutive) .Where(x => x.OrganizationPosition!.Organization!.Id == oc.Parent.Id && x.OrganizationPosition!.PositionMaster!.IsDirector == true) .Select(x => new OrganizationApproverResponse { Id = x.Profile!.Id, Name = $"{x.Profile!.Prefix!.Name}{x.Profile!.FirstName} {x.Profile!.LastName}", PositionName = x.OrganizationPosition!.PositionMaster!.PositionExecutive != null ? x.OrganizationPosition!.PositionMaster!.PositionExecutive!.Name : x.OrganizationPosition!.PositionMaster!.PositionPath == null ? "" : x.OrganizationPosition!.PositionMaster!.PositionPath!.Name }) .ToListAsync(); return parentProfilePosition; } else return new List(); } } } catch { throw; } } #endregion #endregion } }