using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.MessageQueue; using BMA.EHR.Application.Repositories.Reports; using BMA.EHR.Application.Responses; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.HR; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Models.Notifications; using BMA.EHR.Domain.Models.Retirement; using BMA.EHR.Domain.Shared; using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Retirement.Service.Requests; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using System.Reflection.Metadata; using System.Security.Claims; using System.Security.Cryptography; namespace BMA.EHR.Retirement.Service.Controllers { [Route("api/v{version:apiVersion}/retirement/deceased")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("ระบบแจ้งการถึงแก่กรรม")] public class RetirementDeceasedController : BaseController { private readonly RetirementRepository _repository; private readonly NotificationRepository _repositoryNoti; private readonly RetireReportRepository _repositoryRetireReport; private readonly ApplicationDBContext _context; private readonly MinIOService _documentService; private readonly IConfiguration _configuration; private readonly IHttpContextAccessor _httpContextAccessor; public RetirementDeceasedController(RetirementRepository repository, NotificationRepository repositoryNoti, RetireReportRepository repositoryRetireReport, ApplicationDBContext context, MinIOService documentService, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) { _repository = repository; _repositoryNoti = repositoryNoti; _repositoryRetireReport = repositoryRetireReport; _context = context; _documentService = documentService; _httpContextAccessor = httpContextAccessor; _configuration = configuration; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; #endregion /// /// list รายการบันทึกเวียนแจ้งการถึงแก่กรรม /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet()] public async Task> GetList() { var retirementDeceaseds = await _context.RetirementDeceaseds.AsQueryable() .OrderByDescending(x => x.CreatedAt) .Select(p => new { p.Id, ProfileId = p.Profile.Id, Prefix = p.Profile.Prefix == null ? null : p.Profile.Prefix.Name, p.Profile.FirstName, p.Profile.LastName, Position = p.Profile.Position == null ? null : p.Profile.Position.Name, PositionType = p.Profile.PositionType == null ? null : p.Profile.PositionType.Name, p.Profile.PositionLine, // PositionLine = p.Profile.PositionLine == null ? null : p.Profile.PositionLine.Name, PositionLevel = p.Profile.PositionLevel == null ? null : p.Profile.PositionLevel.Name, p.Profile.PositionExecutive, // PositionExecutive = p.Profile.PositionExecutive == null ? null : p.Profile.PositionExecutive.Name, Organization = p.Profile.Oc, // Organization = p.Profile.Oc == null ? null : p.Profile.Oc.Name, p.Number, p.Date, p.Location, p.Reason, FileName = p.Document == null ? null : p.Document.FileName, PathName = p.Document == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Document.Id, p.IsActive, p.CreatedAt, }) .ToListAsync(); var _retirementDeceaseds = new List(); foreach (var data in retirementDeceaseds) { var _data = new { data.Id, data.ProfileId, data.Prefix, data.FirstName, data.LastName, data.Position, data.PositionExecutive, data.PositionType, data.PositionLine, data.PositionLevel, data.Organization, data.Number, data.Date, data.Location, data.Reason, data.FileName, PathName = data.PathName == Guid.Parse("00000000-0000-0000-0000-000000000000") ? null : await _documentService.ImagesPath(data.PathName), data.IsActive, data.CreatedAt, }; _retirementDeceaseds.Add(_data); } return Success(_retirementDeceaseds); } /// /// get รายละเอียดบันทึกเวียนแจ้งการถึงแก่กรรม /// /// Id การถึงแก่กรรม /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{id:length(36)}")] public async Task> GetDetailByUser(Guid id) { var data = await _context.RetirementDeceaseds.AsQueryable() .Where(x => x.Id == id) .Select(p => new { p.Id, ProfileId = p.Profile.Id, Prefix = p.Profile.Prefix == null ? null : p.Profile.Prefix.Name, PrefixId = p.Profile.Prefix == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Prefix.Id, p.Profile.FirstName, p.Profile.LastName, Position = p.Profile.Position == null ? null : p.Profile.Position.Name, PositionId = p.Profile.Position == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Position.Id, PositionType = p.Profile.PositionType == null ? null : p.Profile.PositionType.Name, PositionTypeId = p.Profile.PositionType == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.PositionType.Id, p.Profile.PositionLine, p.Profile.PositionLineId, // PositionLine = p.Profile.PositionLine == null ? null : p.Profile.PositionLine.Name, PositionLevel = p.Profile.PositionLevel == null ? null : p.Profile.PositionLevel.Name, PositionLevelId = p.Profile.PositionLevel == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.PositionLevel.Id, p.Profile.PositionExecutive, p.Profile.PositionExecutiveId, // PositionExecutive = p.Profile.PositionExecutive == null ? null : p.Profile.PositionExecutive.Name, Organization = p.Profile.Oc, OrganizationId = p.Profile.OcId, // Organization = p.Profile.Oc == null ? null : p.Profile.Oc.Name, p.Number, p.Date, p.Location, p.Reason, FileName = p.Document == null ? null : p.Document.FileName, PathName = p.Document == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Document.Id, p.IsActive, p.CreatedAt, Avatar = p.Profile.Avatar == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Avatar.Id, }) .FirstOrDefaultAsync(); if (data == null) return Error(GlobalMessages.RetirementDeceasedNotFound, 404); var _data = new { data.Id, data.ProfileId, data.Prefix, data.PrefixId, data.FirstName, data.LastName, data.Position, data.PositionExecutive, data.PositionType, data.PositionLine, data.PositionLevel, data.Organization, data.PositionId, data.PositionExecutiveId, data.PositionTypeId, data.PositionLineId, data.PositionLevelId, data.OrganizationId, data.Number, data.Date, data.Location, data.Reason, data.FileName, PathName = data.PathName == Guid.Parse("00000000-0000-0000-0000-000000000000") ? null : await _documentService.ImagesPath(data.PathName), data.IsActive, data.CreatedAt, Avatar = data.Avatar == Guid.Parse("00000000-0000-0000-0000-000000000000") ? null : await _documentService.ImagesPath(data.Avatar), }; return Success(_data); } /// /// สร้าง รายละเอียดบันทึกเวียนแจ้งการถึงแก่กรรม /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost()] public async Task> Post([FromForm] RetirementDeceasedRequest req) { var profile = await _context.Profiles .Include(x => x.Prefix) .FirstOrDefaultAsync(x => x.Id == req.ProfileId); if (profile == null) return Error(GlobalMessages.DataNotFound, 404); profile.LeaveDate = DateTime.Now; profile.IsLeave = true; profile.LeaveReason = "DEATH"; var retirementDeceased = new RetirementDeceased { Profile = profile, Number = req.Number, Date = req.Date, Location = req.Location, Reason = req.Reason, IsActive = true, CreatedUserId = UserId ?? "System Administrator", CreatedFullName = FullName ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }; await _context.RetirementDeceaseds.AddAsync(retirementDeceased); await _context.SaveChangesAsync(); var _doc = new Domain.Models.Documents.Document(); if (Request.Form.Files != null && Request.Form.Files.Count != 0) { var file = Request.Form.Files[0]; var fileExtension = Path.GetExtension(file.FileName); var doc = await _documentService.UploadFileAsync(file, file.FileName); _doc = await _context.Documents.AsQueryable() .FirstOrDefaultAsync(x => x.Id == doc.Id); if (_doc != null) retirementDeceased.Document = _doc; } await _context.ProfileSalaries.AddAsync(new ProfileSalary { Date = req.Date, SalaryRef = req.Number, CommandNo = "-", SalaryClass = "-", PosNoEmployee = "-", CommandTypeName = "-", SalaryStatus = "DEATH", Profile = profile, CreatedUserId = UserId ?? "System Administrator", CreatedFullName = FullName ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); if (_doc != null) { await _context.ProfilePapers.AddAsync(new ProfilePaper { Detail = "ถึงแก่กรรม", CategoryName = "DEATH", Document = _doc, Profile = profile, CreatedUserId = UserId ?? "System Administrator", CreatedFullName = FullName ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); } var orgPos = await _context.ProfilePositions .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 == profile.OcId) .FirstOrDefaultAsync(); if (orgPos != null) { if (orgPos.Profile != null) { retirementDeceased.RetirementDeceasedNotis.Add(new RetirementDeceasedNoti { CitizenId = orgPos!.Profile!.CitizenId!, Prefix = orgPos!.Profile!.Prefix!.Name, FirstName = orgPos!.Profile!.FirstName!, LastName = orgPos!.Profile!.LastName!, IsSendMail = true, IsSendInbox = true, IsSendNotification = true, OrganizationName = orgPos!.OrganizationPosition!.Organization!.OrganizationOrganization!.Name, PositionName = orgPos!.OrganizationPosition!.PositionMaster!.PositionPath!.Name, ReceiveUser = profile, CreatedUserId = UserId ?? "System Administrator", CreatedFullName = FullName ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); } } await _context.SaveChangesAsync(); return Success(); } /// /// แก้ไข รายละเอียดบันทึกเวียนแจ้งการถึงแก่กรรม /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("{id:length(36)}")] public async Task> Put([FromForm] RetirementDeceasedRequest req, Guid id) { var updated = await _context.RetirementDeceaseds .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Id == id); if (updated == null) return Error(GlobalMessages.RetirementDeceasedNotFound, 404); if (Request.Form.Files != null && Request.Form.Files.Count != 0) { if (updated.Document != null) await _documentService.DeleteFileAsync(updated.Document.Id); var file = Request.Form.Files[0]; var fileExtension = Path.GetExtension(file.FileName); var doc = await _documentService.UploadFileAsync(file, file.FileName); var _doc = await _context.Documents.AsQueryable() .FirstOrDefaultAsync(x => x.Id == doc.Id); if (_doc != null) updated.Document = _doc; } updated.Number = req.Number; updated.Date = req.Date; updated.Location = req.Location; updated.Reason = req.Reason; updated.LastUpdateFullName = FullName ?? "System Administrator"; updated.LastUpdateUserId = UserId ?? ""; updated.LastUpdatedAt = DateTime.Now; await _context.SaveChangesAsync(); return Success(); } /// /// ลบ รายละเอียดบันทึกเวียนแจ้งการถึงแก่กรรม /// /// Id การถึงแก่กรรม /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("{id:length(36)}")] public async Task> Delete(Guid id) { var deleted = await _context.RetirementDeceaseds.AsQueryable() .Include(x => x.Document) .FirstOrDefaultAsync(x => x.Id == id); if (deleted == null) return Error(GlobalMessages.RetirementDeceasedNotFound, 404); if (deleted.Document != null) await _documentService.DeleteFileAsync(deleted.Document.Id); _context.RetirementDeceaseds.Remove(deleted); await _context.SaveChangesAsync(); return Success(); } /// /// List รายชื่อส่งหนังสือเวียน /// /// Id การถึงแก่กรรม /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("detail/{id:length(36)}")] public async Task> GetDetail(Guid id) { var data = await _context.RetirementDeceasedNotis.AsQueryable() .Where(x => x.RetirementDeceased.Id == id) .Select(p => new { p.Id, p.CitizenId, p.Prefix, p.FirstName, p.LastName, p.IsSendMail, p.IsSendInbox, p.IsSendNotification, p.OrganizationName, p.PositionName, ProfileId = p.ReceiveUser.Id, }) .ToListAsync(); return Success(data); } /// /// เพิ่มรายชื่อส่งหนังสือเวียน /// /// Id การถึงแก่กรรม /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("detail/{id:length(36)}")] public async Task> UpdateDetail([FromBody] RetirementDeceasedAddNotiPersonRequest req, Guid id) { var retirementDeceased = await _context.RetirementDeceaseds.AsQueryable() .Include(x => x.RetirementDeceasedNotis) .FirstOrDefaultAsync(x => x.Id == id); if (retirementDeceased == null) return Error(GlobalMessages.RetirementDeceasedNotFound, 404); foreach (var item in req.Persons) { var profile = await _context.Profiles.AsQueryable() .Include(x => x.Prefix) .Include(x => x.Position) .FirstOrDefaultAsync(x => x.Id == item.ProfileId); if (profile == null) continue; retirementDeceased.RetirementDeceasedNotis.Add(new RetirementDeceasedNoti { CitizenId = profile.CitizenId == null ? "" : profile.CitizenId, Prefix = profile.Prefix == null ? "" : profile.Prefix.Name, FirstName = profile.FirstName == null ? "" : profile.FirstName, LastName = profile.LastName == null ? "" : profile.LastName, IsSendMail = item.IsSendMail, IsSendInbox = item.IsSendInbox, IsSendNotification = item.IsSendNotification, OrganizationName = profile.OrganizationOrganization == null ? "" : profile.OrganizationOrganization, PositionName = profile.Position == null ? null : profile.Position.Name, ReceiveUser = profile, CreatedUserId = UserId ?? "System Administrator", CreatedFullName = FullName ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); await _context.SaveChangesAsync(); } return Success(); } /// /// ลบรายชื่อส่งหนังสือเวียน /// /// Id หนังสือเวียน /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("detail/{id:length(36)}")] public async Task> DeleteDetail(Guid id) { var retirementDeceasedNoti = await _context.RetirementDeceasedNotis.AsQueryable() .FirstOrDefaultAsync(x => x.Id == id); if (retirementDeceasedNoti == null) return Error(GlobalMessages.RetirementDeceasedNotiNotFound, 404); _context.RetirementDeceasedNotis.Remove(retirementDeceasedNoti); await _context.SaveChangesAsync(); return Success(); } /// /// Noti ส่งหนังสือเวียน /// /// Id การถึงแก่กรรม /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("noti/{id:length(36)}")] public async Task> NotiDeceased([FromBody] RetirementDeceasedAddNotiPersonRequest req, Guid id) { var items = await _context.RetirementDeceasedNotis.AsQueryable() .Include(x => x.ReceiveUser) .Include(x => x.RetirementDeceased) .ThenInclude(x => x.Profile) .ThenInclude(x => x.Prefix) .Where(x => x.RetirementDeceased.Id == id) .ToListAsync(); var retirementDeceased = await _context.RetirementDeceaseds.AsQueryable() .Include(x => x.DocumentForward) .Where(x => x.Id == id) .FirstOrDefaultAsync(); if (retirementDeceased == null) return Error(GlobalMessages.RetirementDeceasedNotFound, 404); // if (retirementDeceased.DocumentForward == null) // return Error(GlobalMessages.NoFileToUpload, 404); // create command payload var payload_attach = new List(); payload_attach.Add(new PayloadAttachment { name = "หนังสือเวียนถึงแก่กรรม", url = $"{_configuration["APIV2"]}/report/deceased/copy/36/{retirementDeceased.Id}" }); var payload = new CommandPayload() { attachments = payload_attach }; var payload_str = JsonConvert.SerializeObject(payload); foreach (var item in items) { var prefix = item.RetirementDeceased.Profile.Prefix == null ? "" : item.RetirementDeceased.Profile.Prefix.Name; var profile = req.Persons.FirstOrDefault(x => x.ProfileId == item.ReceiveUser.Id); if (profile != null) { await _repositoryNoti.PushNotificationAsync( item.ReceiveUser.Id, $"หนังสือเวียนถึงแก่กรรมของ {prefix}{item.RetirementDeceased.Profile.FirstName} {item.RetirementDeceased.Profile.LastName}", $"แจ้งข่าวการถึงแก่กรรมของ {prefix}{item.RetirementDeceased.Profile.FirstName} {item.RetirementDeceased.Profile.LastName}", payload_str, profile.IsSendInbox, profile.IsSendMail ); item.IsSendMail = profile.IsSendMail; item.IsSendInbox = profile.IsSendInbox; item.IsSendNotification = profile.IsSendNotification; } else { await _repositoryNoti.PushNotificationAsync( item.ReceiveUser.Id, $"หนังสือเวียนถึงแก่กรรมของ {prefix}{item.RetirementDeceased.Profile.FirstName} {item.RetirementDeceased.Profile.LastName}", $"แจ้งข่าวการถึงแก่กรรมของ {prefix}{item.RetirementDeceased.Profile.FirstName} {item.RetirementDeceased.Profile.LastName}", payload_str, item.IsSendInbox, item.IsSendMail ); } } await _context.SaveChangesAsync(); return Success(); } } }