From 9aa444b40b6052c3d2593e4229f14c0755d90274 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Fri, 8 Sep 2023 09:36:25 +0700 Subject: [PATCH] Execute Command --- .../Commands/CommandRepository.cs | 1557 ++++++++++++++++- 1 file changed, 1556 insertions(+), 1 deletion(-) diff --git a/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs b/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs index 2f7d9c4e..404635e5 100644 --- a/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs +++ b/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs @@ -17,7 +17,9 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; +using System.Drawing; using System.Net.Http.Headers; +using System.Security.Cryptography; using Command = BMA.EHR.Domain.Models.Commands.Core.Command; using Profile = BMA.EHR.Domain.Models.HR.Profile; @@ -1458,6 +1460,27 @@ namespace BMA.EHR.Application.Repositories.Commands case "C-PM-02": await ExecuteCommand01_02Async(command); break; + case "C-PM-03": + await ExecuteCommand03Async(command); + break; + case "C-PM-04": + await ExecuteCommand04Async(command); + break; + case "C-PM-05": + await ExecuteCommand05Async(command); + break; + case "C-PM-06": + await ExecuteCommand06Async(command); + break; + case "C-PM-07": + await ExecuteCommand07Async(command); + break; + case "C-PM-08": + await ExecuteCommand08Async(command); + break; + case "C-PM-09": + await ExecuteCommand09Async(command); + break; case "C-PM-10": await ExecuteCommand10Async(command); break; @@ -1873,6 +1896,1538 @@ namespace BMA.EHR.Application.Repositories.Commands } } + // + /// C-PM-03 - คำสั่งแต่งตั้ง : สำหรับข้าราชการ กทม. เดิม + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand03Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + 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); + + var profile = await _dbContext.Set() + .Include(x => x.Salaries) + .FirstOrDefaultAsync(x => x.CitizenId == placementProfile.CitizenId); + if(profile != null) + { + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + 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.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.PlacementStatus = "CONTAIN"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-04 - คำสั่งย้าย : สำหรับข้าราชการ กทม. เดิม + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand04Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + 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); + + var profile = await _dbContext.Set() + .Include(x => x.Salaries) + .FirstOrDefaultAsync(x => x.CitizenId == placementProfile.CitizenId); + if (profile != null) + { + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + 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.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.PlacementStatus = "CONTAIN"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-05 - คำสั่งแต่งตั้ง + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand05Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + var placementProfile = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Salaries) + + .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.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); + + var profile = placementProfile.Profile; + if (profile != null) + { + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + Date = command.CommandAffectDate, + + Amount = recv.Amount == null ? 0 : recv.Amount, + PositionSalaryAmount = recv.PositionSalaryAmount == null ? 0 : recv.PositionSalaryAmount, + MouthSalaryAmount = recv.MouthSalaryAmount == null ? 0 : recv.MouthSalaryAmount, + SalaryClass = "", + SalaryRef = "คำสั่งแต่งตั้ง คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.Status = "DONE"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งแต่งตั้ง เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งแต่งตั้ง คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-06 - คำสั่งเลื่อน + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand06Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + var placementProfile = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Salaries) + + .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.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); + + var profile = placementProfile.Profile; + if (profile != null) + { + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + Date = command.CommandAffectDate, + + Amount = recv.Amount == null ? 0 : recv.Amount, + PositionSalaryAmount = recv.PositionSalaryAmount == null ? 0 : recv.PositionSalaryAmount, + MouthSalaryAmount = recv.MouthSalaryAmount == null ? 0 : recv.MouthSalaryAmount, + SalaryClass = "", + SalaryRef = "คำสั่งเลื่อน คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.Status = "DONE"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งเลื่อน เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งเลื่อน เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งเลื่อน เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งเลื่อน คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งเลื่อน คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งเลื่อน คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-07 - คำสั่งย้าย + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand07Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + var placementProfile = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Salaries) + + .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.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); + + var profile = placementProfile.Profile; + if (profile != null) + { + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + Date = command.CommandAffectDate, + + Amount = recv.Amount == null ? 0 : recv.Amount, + PositionSalaryAmount = recv.PositionSalaryAmount == null ? 0 : recv.PositionSalaryAmount, + MouthSalaryAmount = recv.MouthSalaryAmount == null ? 0 : recv.MouthSalaryAmount, + SalaryClass = "", + SalaryRef = "คำสั่งย้าย คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.Status = "DONE"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งย้าย เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งย้าย คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-08 - คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand08Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + var placementProfile = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Salaries) + + .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.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); + + var profile = placementProfile.Profile; + if (profile != null) + { + profile.IsActive = true; + profile.IsLeave = false; + profile.LeaveDate = null; + + + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + Date = command.CommandAffectDate, + + Amount = recv.Amount == null ? 0 : recv.Amount, + PositionSalaryAmount = recv.PositionSalaryAmount == null ? 0 : recv.PositionSalaryAmount, + MouthSalaryAmount = recv.MouthSalaryAmount == null ? 0 : recv.MouthSalaryAmount, + SalaryClass = "", + SalaryRef = "คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.Status = "DONE"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งบรรจุและแต่งตั้งข้าราชการฯ กลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + + // + /// C-PM-09 - คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ + /// + /// object ของรายการคำสั่ง + /// + private async Task ExecuteCommand09Async(Command command) + { + try + { + foreach (var recv in command.Receivers) + { + var placementProfile = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Salaries) + + .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.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); + + var profile = placementProfile.Profile; + if (profile != null) + { + profile.IsActive = true; + profile.IsLeave = false; + profile.LeaveDate = null; + + + profile.Position = placementProfile.PositionPath; + profile.PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id; + profile.PositionType = placementProfile.PositionType; + profile.PositionLevel = placementProfile.PositionLevel; + + profile.PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id; + profile.PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name; + profile.PosNo = placementProfile.OrganizationPosition!.PositionNumber; + + // organization + profile.OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id; + profile.OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name; + profile.OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id; + profile.OcId = placementProfile.OrganizationPosition!.Organization!.Id; + profile.Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"); + } + + var lastSarary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var order = 1; + if (lastSarary.Order != null) + order = lastSarary.Order.Value + 1; + + 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 = order, + Date = command.CommandAffectDate, + + Amount = recv.Amount == null ? 0 : recv.Amount, + PositionSalaryAmount = recv.PositionSalaryAmount == null ? 0 : recv.PositionSalaryAmount, + MouthSalaryAmount = recv.MouthSalaryAmount == null ? 0 : recv.MouthSalaryAmount, + SalaryClass = "", + SalaryRef = "คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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 (lastSarary.PositionPathSideId != null) salary.PositionPathSideId = lastSarary.PositionPathSideId; + if (lastSarary.PositionExecutiveSideId != null) salary.PositionExecutiveSideId = lastSarary.PositionExecutiveSideId; + + profile.Salaries.Add(salary); + + // update placementstatus + placementProfile.Status = "DONE"; + + await _dbContext.SaveChangesAsync(); + + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + + + var inbox = new Inbox + { + Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = profile.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + + var noti = new Notification + { + Body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ เลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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) + { + if (cc.IsSendInbox) + { + var inbox = new Inbox + { + Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + Body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}", + ReceiverUserId = pf.Id, + Payload = "", + }; + _dbContext.Set().Add(inbox); + } + + if (cc.IsSendMail) + { + // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่ + // Send noti inbox and email + var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + var body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}"; + _emailSenderService.SendMail(subject, body, "dev@frappet.com"); + } + + + var noti = new Notification + { + Body = $"คำสั่งบรรจุและแต่งตั้งผู้ออกไปรับราชการทหารกลับเข้ารับราชการ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {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; + } + } + // /// C-PM-10 - คำสั่งแต่งตั้งคณะกรรมการประเมินผลการทดลองปฏิบัติหน้าที่ราชการ /// @@ -2509,7 +4064,7 @@ namespace BMA.EHR.Application.Repositories.Commands { throw; } - } + } /// /// C-PM-15 - คำสั่งให้ช่วยราชการ