using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.MessageQueue; using BMA.EHR.Application.Requests; using BMA.EHR.Application.Responses.Profiles; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Models.Insignias; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Shared; using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Insignia.Service.Requests; using Elasticsearch.Net; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Swashbuckle.AspNetCore.Annotations; using System.Security.Claims; namespace BMA.EHR.Insignia.Service.Controllers { [Route("api/v{version:apiVersion}/insignia/manage")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("จัดสรรเครื่องราชฯ")] public class InsigniaManageController : BaseController { private readonly ApplicationDBContext _context; private readonly MinIOService _documentService; private readonly IHttpContextAccessor _httpContextAccessor; private readonly InsigniaPeriodsRepository _repository; private readonly NotificationRepository _repositoryNoti; private readonly UserProfileRepository _userProfileRepository; private readonly PermissionRepository _permission; public InsigniaManageController(ApplicationDBContext context, MinIOService documentService, InsigniaPeriodsRepository repository, NotificationRepository repositoryNoti, IHttpContextAccessor httpContextAccessor, UserProfileRepository userProfileRepository, PermissionRepository permission) { _context = context; _documentService = documentService; _repository = repository; _repositoryNoti = repositoryNoti; _httpContextAccessor = httpContextAccessor; _userProfileRepository = userProfileRepository; _permission = permission; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; private string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"]; #endregion /// /// list จัดสรรเครื่องราชฯ /// /// ปีการจัดสรร /// Id ประเภทเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("type/{year}/{insigniaTypeId:length(36)}")] public async Task> GetList(int year, Guid insigniaTypeId) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaType = await _context.InsigniaTypes .FirstOrDefaultAsync(x => x.Id == insigniaTypeId); if (insigniaType == null) return Error(GlobalMessages.InsigniaTypeNotFound); var data = await _context.InsigniaManages.AsQueryable() .Where(x => x.Insignia.InsigniaType == insigniaType) .Where(x => x.Year == year) .OrderByDescending(x => x.CreatedAt) .Select(p => new { Id = p.Id, Insignia = p.Insignia.Name, InsigniaId = p.Insignia.Id, Year = p.Year, Total = p.Total, Allocate = p.InsigniaManageOrganiations.Sum(x => x.Total), Remain = p.Total - p.InsigniaManageOrganiations.Sum(x => x.Total), LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .ToListAsync(); return Success(data); } /// /// get รายละเอียดจัดสรรเครื่องราชฯ /// /// Id จัดสรรเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{insigniaManageId:length(36)}")] public async Task> GetById(Guid insigniaManageId) { var data = await _context.InsigniaManages.AsQueryable() .Where(x => x.Id == insigniaManageId) .Select(p => new { Id = p.Id, Insignia = p.Insignia.Name, InsigniaId = p.Insignia.Id, Year = p.Year, Total = p.Total, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .FirstOrDefaultAsync(); if (data == null) return Error(GlobalMessages.InsigniaManageNotFound, 404); return Success(data); } /// /// สร้างจัดสรรเครื่องราชฯ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost()] public async Task> Post([FromBody] InsigniaManageRequest req) { var getPermission = await _permission.GetPermissionAPIAsync("CREATE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insignia = await _context.Insignias.AsQueryable() .FirstOrDefaultAsync(x => x.Id == req.Insignia); if (insignia == null) return Error(GlobalMessages.InsigniaNotFound); var insigniaManage = await _context.InsigniaManages.AsQueryable() .Where(x => x.Insignia == insignia && x.Year == req.Year) .FirstOrDefaultAsync(); if (insigniaManage != null) return Error(GlobalMessages.InsigniaManageDupicate); await _context.InsigniaManages.AddAsync( new InsigniaManage { Insignia = insignia, Year = req.Year, Total = req.Total, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); await _context.SaveChangesAsync(); return Success(); } /// /// ลบจัดสรรเครื่องราช /// /// Id จัดสรรเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("{insigniaManageId:length(36)}")] public async Task> Delete(Guid insigniaManageId) { var getPermission = await _permission.GetPermissionAPIAsync("DELETE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var deleted = await _context.InsigniaManages.AsQueryable() .Where(x => x.Id == insigniaManageId) .FirstOrDefaultAsync(); if (deleted == null) return Error(GlobalMessages.InsigniaManageNotFound); _context.InsigniaManages.Remove(deleted); await _context.SaveChangesAsync(); return Success(); } /// /// แก้ไขจัดสรรเครื่องราชฯ /// /// Id จัดสรรเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("{insigniaManageId:length(36)}")] public async Task> Put([FromBody] InsigniaManageRequest req, Guid insigniaManageId) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insignia = await _context.Insignias.AsQueryable() .FirstOrDefaultAsync(x => x.Id == req.Insignia); if (insignia == null) return Error(GlobalMessages.InsigniaNotFound); var insigniaManage = await _context.InsigniaManages.AsQueryable() .Where(x => x.Insignia == insignia && x.Year == req.Year && x.Id != insigniaManageId) .FirstOrDefaultAsync(); if (insigniaManage != null) return Error(GlobalMessages.InsigniaManageDupicate); var uppdated = await _context.InsigniaManages.AsQueryable() .Include(x => x.Insignia) .FirstOrDefaultAsync(x => x.Id == insigniaManageId); if (uppdated == null) return Error(GlobalMessages.InsigniaManageNotFound); uppdated.Insignia = insignia; // uppdated.Year = req.Year; uppdated.Total = req.Total; uppdated.LastUpdateFullName = FullName ?? "System Administrator"; uppdated.LastUpdateUserId = UserId ?? ""; uppdated.LastUpdatedAt = DateTime.Now; await _context.SaveChangesAsync(); return Success(); } /// /// list หน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// Id จัดสรรเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("org/{insigniaManageId:length(36)}")] public async Task> GetListOrganization(Guid insigniaManageId) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaManage = await _context.InsigniaManages.AsQueryable() .FirstOrDefaultAsync(x => x.Id == insigniaManageId); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); var insigniaManageOrg = await _context.InsigniaManageOrganiations.AsQueryable() .Where(x => x.InsigniaManage == insigniaManage) .OrderByDescending(x => x.CreatedAt) .Select(p => new { Id = p.Id, OrganizationOrganization = p.Organization, Total = p.Total, Allocate = p.InsigniaManageProfiles.Where(x => x.Status == false).Count(), Remain = p.Total - p.InsigniaManageProfiles.Where(x => x.Status == false).Count(), LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .ToListAsync(); return Success(insigniaManageOrg); } /// /// สร้างหน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("org")] public async Task> PostOrganization([FromBody] InsigniaManageOrganizationRequest req) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaManage = await _context.InsigniaManages.AsQueryable() .Include(x => x.InsigniaManageOrganiations) .FirstOrDefaultAsync(x => x.Id == req.insigniaManageId); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); var insigniaManageOrganiation = await _context.InsigniaManageOrganiations.AsQueryable() .FirstOrDefaultAsync(x => x.OrganizationId == req.OrganizationOrganizationId && x.InsigniaManage == insigniaManage); if (insigniaManageOrganiation != null) return Error(GlobalMessages.InsigniaManageOrgDupicate); var total = insigniaManage.InsigniaManageOrganiations.Where(x => x.OrganizationId != req.OrganizationOrganizationId).Sum(x => x.Total); if (req.Total + total > insigniaManage.Total) return Error(GlobalMessages.InsigniaManageOrgLimit); var ocData = _userProfileRepository.GetOc(req.OrganizationOrganizationId, 0, AccessToken); var root = ocData?.Root ?? null; var rootDnaId = ocData?.RootDnaId ?? null; await _context.InsigniaManageOrganiations.AddAsync( new InsigniaManageOrganiation { OrganizationId = req.OrganizationOrganizationId, Organization = root, Total = req.Total, InsigniaManage = insigniaManage, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, RootDnaId = rootDnaId }); await _context.SaveChangesAsync(); return Success(); } /// /// ลบหน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// Id หน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("org/{insigniaManageOrgId:length(36)}")] public async Task> DeleteOrganization(Guid insigniaManageOrgId) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var deleted = await _context.InsigniaManageOrganiations.AsQueryable() .FirstOrDefaultAsync(x => x.Id == insigniaManageOrgId); if (deleted == null) return Error(GlobalMessages.InsigniaManageNotFound); _context.InsigniaManageOrganiations.Remove(deleted); await _context.SaveChangesAsync(); return Success(); } /// /// แก้ไขหน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// Id หน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("org/{insigniaManageOrgId:length(36)}")] public async Task> PutOrganization([FromBody] InsigniaManageOrganizationUpdateRequest req, Guid insigniaManageOrgId) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var uppdated = await _context.InsigniaManageOrganiations.AsQueryable() .Include(x => x.InsigniaManage) .FirstOrDefaultAsync(x => x.Id == insigniaManageOrgId); if (uppdated == null) return Error(GlobalMessages.InsigniaManageNotFound); var insigniaManage = await _context.InsigniaManages.AsQueryable() .Include(x => x.InsigniaManageOrganiations) .FirstOrDefaultAsync(x => x.Id == uppdated.InsigniaManage.Id); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); var total = insigniaManage.InsigniaManageOrganiations.Where(x => x.Id != insigniaManageOrgId).Sum(x => x.Total); if (req.Total + total > insigniaManage.Total) return Error(GlobalMessages.InsigniaManageOrgLimit); uppdated.Total = req.Total; uppdated.LastUpdateFullName = FullName ?? "System Administrator"; uppdated.LastUpdateUserId = UserId ?? ""; uppdated.LastUpdatedAt = DateTime.Now; await _context.SaveChangesAsync(); return Success(); } /// /// list dashboard หน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// Id จัดสรรเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("org/dashboard/{insigniaManageId:length(36)}")] public async Task> GetListDashboardOrganization(Guid insigniaManageId) { var getPermission = await _permission.GetPermissionAPIAsync("GET", "SYS_INSIGNIA_ALLOCATE"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaManage = await _context.InsigniaManages.AsQueryable() .Include(x => x.InsigniaManageOrganiations) .Select(p => new { Id = p.Id, Insignia = p.Insignia.Name, InsigniaId = p.Insignia.Id, Year = p.Year, Total = p.Total, Allocate = p.InsigniaManageOrganiations.Sum(x => x.Total), Remain = p.Total - p.InsigniaManageOrganiations.Sum(x => x.Total), LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .FirstOrDefaultAsync(x => x.Id == insigniaManageId); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); return Success(insigniaManage); } #region " เรียกคืน " /// /// เรียกคืนเครื่องราชฯ /// /// Request Body /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("reclaim")] public async Task> PostReclaimInsignia([FromBody] InsigniaReclaimRequest req) { var getPermission = await _permission.GetPermissionAPIAsync("CREATE", "SYS_INSIGNIA_RECLAIM"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaNoteProfile = await _context.InsigniaNoteProfiles.AsQueryable() .Include(x => x.RequestInsignia) .Include(x => x.InsigniaNote) //.Include(x => x.Profile) .FirstOrDefaultAsync(x => x.Id == req.InsigniaNoteProfileId); if (insigniaNoteProfile == null) return Error(GlobalMessages.InsigniaRequestProfileNotFound); if (insigniaNoteProfile.Status != "DONE") return Error(GlobalMessages.InsigniaNoReclaim); await _context.InsigniaReclaimProfiles.AddAsync( new InsigniaReclaimProfile { ReclaimDate = req.ReclaimDate, ReclaimOrganizationId = insigniaNoteProfile.RootId, ReclaimOrganization = insigniaNoteProfile.Root, ReclaimReason = req.ReclaimNote, InsigniaNoteProfile = insigniaNoteProfile, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); await _context.SaveChangesAsync(); return Success(); } /// /// แก้ไขรายการเรียกคืนเครื่องราชฯ /// /// /// Request Body /// Id เรียกคืนเครื่องราชฯ /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("reclaim/{insigniaReclaimProfileId:guid}")] public async Task> PutReclaimInsignia([FromBody] UpdateInsigniaReclaimRequest req, Guid insigniaReclaimProfileId) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_RECLAIM"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var uppdated = await _context.InsigniaReclaimProfiles.AsQueryable() .FirstOrDefaultAsync(x => x.Id == insigniaReclaimProfileId); if (uppdated == null) return Error(GlobalMessages.InsigniaReclaimNotFound); uppdated.ReclaimDate = req.ReclaimDate; uppdated.ReclaimReason = req.ReclaimNote; uppdated.LastUpdateFullName = FullName ?? "System Administrator"; uppdated.LastUpdateUserId = UserId ?? ""; uppdated.LastUpdatedAt = DateTime.Now; await _context.SaveChangesAsync(); return Success(); } /// /// ลบเรียกคืนเครื่องราชฯ /// /// /// Id เรียกคืนเครื่องราชฯ /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("reclaim/{insigniaReclaimProfileId:guid}")] public async Task> DeleteReclaimInsignia(Guid insigniaReclaimProfileId) { var getPermission = await _permission.GetPermissionAPIAsync("DELETE", "SYS_INSIGNIA_RECLAIM"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var deleted = await _context.InsigniaReclaimProfiles.AsQueryable() .FirstOrDefaultAsync(x => x.Id == insigniaReclaimProfileId); if (deleted == null) return Error(GlobalMessages.InsigniaReclaimNotFound); _context.InsigniaReclaimProfiles.Remove(deleted); await _context.SaveChangesAsync(); return Success(); } /// /// list รายการเรียกคืนเครื่องราชฯ /// /// ปีที่เรียกคืน /// Id ประเภทเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("reclaim-list")] public async Task> ListReclaimInsignia([FromBody] GetReclaimListRequest req) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_INSIGNIA_RECLAIM"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } InsigniaType? insigniaType = null; if (req.InsigniaTypeId != null) { insigniaType = await _context.InsigniaTypes .FirstOrDefaultAsync(x => x.Id == req.InsigniaTypeId); if (insigniaType == null) return Error(GlobalMessages.InsigniaTypeNotFound); } string role = jsonData["result"]?.ToString(); var nodeId = string.Empty; var profileAdmin = new GetUserOCAllDto(); profileAdmin = await _userProfileRepository.GetUserOCAll(Guid.Parse(UserId!), AccessToken); if (role == "NORMAL" || role == "CHILD") { nodeId = profileAdmin?.Node == 4 ? profileAdmin?.Child4DnaId : profileAdmin?.Node == 3 ? profileAdmin?.Child3DnaId : profileAdmin?.Node == 2 ? profileAdmin?.Child2DnaId : profileAdmin?.Node == 1 ? profileAdmin?.Child1DnaId : profileAdmin?.Node == 0 ? profileAdmin?.RootDnaId : ""; } else if (role == "BROTHER") { nodeId = profileAdmin?.Node == 4 ? profileAdmin?.Child3DnaId : profileAdmin?.Node == 3 ? profileAdmin?.Child2DnaId : profileAdmin?.Node == 2 ? profileAdmin?.Child1DnaId : profileAdmin?.Node == 1 || profileAdmin?.Node == 0 ? profileAdmin?.RootDnaId : ""; } else if (role == "ROOT" || role == "PARENT") { nodeId = profileAdmin?.RootDnaId; } var node = profileAdmin?.Node; var rawData = await _context.InsigniaReclaimProfiles.AsQueryable() .Include(x => x.InsigniaNoteProfile) .ThenInclude(x => x.RequestInsignia) .ThenInclude(x => x.InsigniaType) //.Where(x => x.InsigniaNoteProfile.RequestInsignia.InsigniaType == insigniaType) .Where(x => req.Year == 0 ? x.Id != null : x.ReclaimDate!.Value.Year == req.Year) .OrderByDescending(x => x.CreatedAt) .Select(p => new { Id = p.Id, ReclaimOrganization = p.ReclaimOrganization, ReclaimOrganizationId = p.ReclaimOrganizationId, Profile = p.InsigniaNoteProfile!.ProfileId ?? Guid.Empty, CitizenId = p.InsigniaNoteProfile!.CitizenId ?? string.Empty, Prefix = p.InsigniaNoteProfile!.Prefix ?? string.Empty, FirstName = p.InsigniaNoteProfile!.FirstName ?? string.Empty, LastName = p.InsigniaNoteProfile!.LastName ?? string.Empty, ProfileType = p.InsigniaNoteProfile!.ProfileType ?? string.Empty, Position = p.InsigniaNoteProfile!.Position ?? string.Empty, ReclaimReason = p.ReclaimReason, ReclaimDate = p.ReclaimDate, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, InsigniaNoteProfileId = p.InsigniaNoteProfile.Id, RequestInsignia = p.InsigniaNoteProfile.RequestInsignia == null ? null : p.InsigniaNoteProfile.RequestInsignia.Name, RequestInsigniaId = p.InsigniaNoteProfile.RequestInsignia == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.InsigniaNoteProfile.RequestInsignia.Id, RequestInsigniaShortName = p.InsigniaNoteProfile.RequestInsignia == null ? null : p.InsigniaNoteProfile.RequestInsignia.ShortName, p.InsigniaNoteProfile.DateReceive, p.InsigniaNoteProfile.OrganizationOrganizationSend, p.InsigniaNoteProfile.OrganizationOrganizationReceive, InsigniaNoteProfileStatus = p.InsigniaNoteProfile.Status, p.InsigniaNoteProfile.Issue, p.InsigniaNoteProfile.Date, p.InsigniaNoteProfile.VolumeNo, p.InsigniaNoteProfile.Section, p.InsigniaNoteProfile.Page, p.InsigniaNoteProfile.No, p.InsigniaNoteProfile.DatePayment, p.InsigniaNoteProfile.TypePayment, p.InsigniaNoteProfile.Address, p.InsigniaNoteProfile.Number, p.InsigniaNoteProfile.Salary, RootDnaId = p.InsigniaNoteProfile.RootDnaId, Child1DnaId = p.InsigniaNoteProfile.Child1DnaId, Child2DnaId = p.InsigniaNoteProfile.Child2DnaId, Child3DnaId = p.InsigniaNoteProfile.Child3DnaId, Child4DnaId = p.InsigniaNoteProfile.Child4DnaId, InsigniaTypeId = p.InsigniaNoteProfile.RequestInsignia.InsigniaType.Id }).ToListAsync(); if (req.InsigniaTypeId != null) { rawData = rawData.Where(x => x.InsigniaTypeId == req.InsigniaTypeId).ToList(); } if (role == "OWNER") { node = null; } if (role == "OWNER" || role == "CHILD") { rawData = rawData .Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))).ToList(); } else if (role == "BROTHER") { rawData = rawData .Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : true)))).ToList(); } else if (role == "ROOT") { rawData = rawData .Where(x => x.RootDnaId == Guid.Parse(nodeId!)).ToList(); } else if (role == "PARENT") { rawData = rawData .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null).ToList(); } else if (role == "NORMAL") { rawData = rawData.Where(x => node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null : node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null : node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null : node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null : node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : true ).ToList(); } var data = rawData .Select(p => new { p.Id, ReclaimOrganizationId = p.ReclaimOrganizationId, ReclaimOrganization = p.ReclaimOrganization, p.ReclaimDate, p.ReclaimReason, p.LastUpdatedAt, p.CreatedAt, p.InsigniaNoteProfileId, CitizenId = p.CitizenId, Prefix = p.Prefix, Position = p.Position, FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", ProfileType = p.ProfileType, p.RequestInsignia, p.RequestInsigniaId, p.RequestInsigniaShortName, p.DateReceive, p.OrganizationOrganizationSend, p.OrganizationOrganizationReceive, p.InsigniaNoteProfileStatus, p.Issue, p.Date, p.VolumeNo, p.Section, p.Page, p.No, p.DatePayment, p.TypePayment, p.Address, p.Number, p.Salary, }) .ToList(); return Success(data); } #endregion /// /// ยืมเครื่องราชฯ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("borrow")] public async Task> PostBorrowInsignia([FromBody] InsigniaBorrowRequest req) { var getPermission = await _permission.GetPermissionAPIAsync("CREATE", "SYS_INSIGNIA_BORROW"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaNoteProfile = await _context.InsigniaNoteProfiles.AsQueryable() .Include(x => x.RequestInsignia) .Include(x => x.InsigniaNote) //.Include(x => x.Profile) .FirstOrDefaultAsync(x => x.Id == req.InsigniaNoteProfileId); if (insigniaNoteProfile == null) return Error(GlobalMessages.InsigniaRequestProfileNotFound); if (insigniaNoteProfile.Status != "DONE") return Error(GlobalMessages.InsigniaNoBorrow); var insigniaManage = await _context.InsigniaManages.AsQueryable() .FirstOrDefaultAsync(x => x.Year == insigniaNoteProfile.InsigniaNote.Year && x.Insignia == insigniaNoteProfile.RequestInsignia); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); var insigniaManageOrganiation = await _context.InsigniaManageOrganiations.AsQueryable() .Include(x => x.InsigniaManageProfiles) .FirstOrDefaultAsync(x => x.RootDnaId == insigniaNoteProfile.RootDnaId && x.InsigniaManage.Id == insigniaManage.Id); // แก้เป็นหาจากหน่วยงานยืมเพิม manage id if (insigniaManageOrganiation == null) return Error(GlobalMessages.InsigniaManageOrgNotFound); var insigniaManageProfile = await _context.InsigniaManageProfiles.AsQueryable() .FirstOrDefaultAsync(x => x.InsigniaNoteProfile == insigniaNoteProfile && x.Status == false); if (insigniaManageProfile != null) return Error(GlobalMessages.InsigniaNotReturn); if (insigniaManageOrganiation.Total <= insigniaManageOrganiation.InsigniaManageProfiles.Count()) return Error(GlobalMessages.InsigniaBorrowOrgLimit); await _context.InsigniaManageProfiles.AddAsync( new InsigniaManageProfile { Status = false, InsigniaManageOrganiation = insigniaManageOrganiation, BorrowOrganizationId = insigniaNoteProfile.RootId, BorrowOrganization = insigniaNoteProfile.Root, BorrowDate = req.BorrowDate, InsigniaNoteProfile = insigniaNoteProfile, CreatedFullName = FullName ?? "System Administrator", CreatedUserId = UserId ?? "", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); await _context.SaveChangesAsync(); return Success(); } /// /// คืนเครื่องราชฯ /// /// Id ยืมเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("return/{insigniaManageProfileId:length(36)}")] public async Task> PutReturnInsignia([FromBody] InsigniaReturnRequest req, Guid insigniaManageProfileId) { var getPermission = await _permission.GetPermissionAPIAsync("UPDATE", "SYS_INSIGNIA_BORROW"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var uppdated = await _context.InsigniaManageProfiles.AsQueryable() .FirstOrDefaultAsync(x => x.Id == insigniaManageProfileId); if (uppdated == null) return Error(GlobalMessages.InsigniaManageNotFound); uppdated.Status = true; uppdated.ReturnDate = req.ReturnDate; uppdated.ReturnOrganizationId = uppdated.BorrowOrganizationId; uppdated.ReturnOrganization = uppdated.BorrowOrganization; uppdated.ReturnReason = req.ReturnReason; uppdated.LastUpdateFullName = FullName ?? "System Administrator"; uppdated.LastUpdateUserId = UserId ?? ""; uppdated.LastUpdatedAt = DateTime.Now; await _context.SaveChangesAsync(); return Success(); } /// /// list รายการยืม/คืนเครื่องราชฯ /// /// ปียืมขอ /// Id ประเภทเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("borrow/{year}/{insigniaTypeId:length(36)}")] public async Task> ListBorrowReturnInsignia(int year, Guid insigniaTypeId) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_INSIGNIA_BORROW"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var insigniaType = await _context.InsigniaTypes .FirstOrDefaultAsync(x => x.Id == insigniaTypeId); if (insigniaType == null) return Error(GlobalMessages.InsigniaTypeNotFound); string role = jsonData["result"]?.ToString(); var nodeId = string.Empty; var profileAdmin = new GetUserOCAllDto(); profileAdmin = await _userProfileRepository.GetUserOCAll(Guid.Parse(UserId!), AccessToken); if (role == "NORMAL" || role == "CHILD") { nodeId = profileAdmin?.Node == 4 ? profileAdmin?.Child4DnaId : profileAdmin?.Node == 3 ? profileAdmin?.Child3DnaId : profileAdmin?.Node == 2 ? profileAdmin?.Child2DnaId : profileAdmin?.Node == 1 ? profileAdmin?.Child1DnaId : profileAdmin?.Node == 0 ? profileAdmin?.RootDnaId : ""; } else if (role == "BROTHER") { nodeId = profileAdmin?.Node == 4 ? profileAdmin?.Child3DnaId : profileAdmin?.Node == 3 ? profileAdmin?.Child2DnaId : profileAdmin?.Node == 2 ? profileAdmin?.Child1DnaId : profileAdmin?.Node == 1 || profileAdmin?.Node == 0 ? profileAdmin?.RootDnaId : ""; } else if (role == "ROOT" || role == "PARENT") { nodeId = profileAdmin?.RootDnaId; } var node = profileAdmin?.Node; var rawData = await _context.InsigniaManageProfiles.AsQueryable() .Where(x => x.InsigniaNoteProfile.RequestInsignia.InsigniaType == insigniaType) .Where(x => year == 0 ? x.Id != null : x.InsigniaManageOrganiation.InsigniaManage.Year == year) .OrderByDescending(x => x.CreatedAt) .Select(p => new { Id = p.Id, BorrowOrganization = p.BorrowOrganization, BorrowOrganizationId = p.BorrowOrganizationId, ReturnOrganization = p.ReturnOrganization, ReturnOrganizationId = p.ReturnOrganizationId, Profile = p.InsigniaNoteProfile!.ProfileId ?? Guid.Empty, CitizenId = p.InsigniaNoteProfile!.CitizenId ?? string.Empty, Prefix = p.InsigniaNoteProfile!.Prefix ?? string.Empty, FirstName = p.InsigniaNoteProfile!.FirstName ?? string.Empty, LastName = p.InsigniaNoteProfile!.LastName ?? string.Empty, ProfileType = p.InsigniaNoteProfile!.ProfileType ?? string.Empty, Position = p.InsigniaNoteProfile!.Position ?? string.Empty, Status = p.Status, BorrowDate = p.BorrowDate, ReturnDate = p.ReturnDate, ReturnReason = p.ReturnReason, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, InsigniaNoteProfileId = p.InsigniaNoteProfile.Id, RequestInsignia = p.InsigniaNoteProfile.RequestInsignia == null ? null : p.InsigniaNoteProfile.RequestInsignia.Name, RequestInsigniaId = p.InsigniaNoteProfile.RequestInsignia == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.InsigniaNoteProfile.RequestInsignia.Id, RequestInsigniaShortName = p.InsigniaNoteProfile.RequestInsignia == null ? null : p.InsigniaNoteProfile.RequestInsignia.ShortName, p.InsigniaNoteProfile.DateReceive, p.InsigniaNoteProfile.OrganizationOrganizationSend, p.InsigniaNoteProfile.OrganizationOrganizationReceive, InsigniaNoteProfileStatus = p.InsigniaNoteProfile.Status, p.InsigniaNoteProfile.Issue, p.InsigniaNoteProfile.Date, p.InsigniaNoteProfile.VolumeNo, p.InsigniaNoteProfile.Section, p.InsigniaNoteProfile.Page, p.InsigniaNoteProfile.No, p.InsigniaNoteProfile.DatePayment, p.InsigniaNoteProfile.TypePayment, p.InsigniaNoteProfile.Address, p.InsigniaNoteProfile.Number, p.InsigniaNoteProfile.Salary, RootDnaId = p.InsigniaNoteProfile.RootDnaId, Child1DnaId = p.InsigniaNoteProfile.Child1DnaId, Child2DnaId = p.InsigniaNoteProfile.Child2DnaId, Child3DnaId = p.InsigniaNoteProfile.Child3DnaId, Child4DnaId = p.InsigniaNoteProfile.Child4DnaId, }) .ToListAsync(); if (role == "OWNER") { node = null; } if (role == "OWNER" || role == "CHILD") { rawData = rawData .Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))).ToList(); } else if (role == "BROTHER") { rawData = rawData .Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : true)))).ToList(); } else if (role == "ROOT") { rawData = rawData .Where(x => x.RootDnaId == Guid.Parse(nodeId!)).ToList(); } else if (role == "PARENT") { rawData = rawData .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null).ToList(); } else if (role == "NORMAL") { rawData = rawData.Where(x => node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null : node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null : node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null : node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null : node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : true ).ToList(); } var data = rawData .Select(p => new { p.Id, p.Status, BorrowOrganization = p.BorrowOrganization, BorrowOrganizationId = p.BorrowOrganizationId, p.BorrowDate, p.ReturnDate, ReturnOrganization = p.ReturnOrganization, ReturnOrganizationId = p.ReturnOrganizationId, p.ReturnReason, p.LastUpdatedAt, p.CreatedAt, p.InsigniaNoteProfileId, CitizenId = p.CitizenId, Prefix = p.Prefix, Position = p.Position, FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", ProfileType = p.ProfileType, p.RequestInsignia, p.RequestInsigniaId, p.RequestInsigniaShortName, p.DateReceive, p.OrganizationOrganizationSend, p.OrganizationOrganizationReceive, p.InsigniaNoteProfileStatus, p.Issue, p.Date, p.VolumeNo, p.Section, p.Page, p.No, p.DatePayment, p.TypePayment, p.Address, p.Number, p.Salary, }) .ToList(); return Success(data); } /// /// get รายการยืม/คืนเครื่องราชฯ /// /// Id ประเภทเครื่องราชฯ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("borrow/{insigniaManageProfileId:length(36)}")] public async Task> GetBorrowReturnInsignia(Guid insigniaManageProfileId) { var data = await _context.InsigniaManageProfiles.AsQueryable() .Where(x => x.Id == insigniaManageProfileId) .Select(p => new { Id = p.Id, Status = p.Status, BorrowOrganization = p.BorrowOrganization, BorrowOrganizationId = p.BorrowOrganizationId, BorrowDate = p.BorrowDate, ReturnDate = p.ReturnDate, ReturnOrganization = p.ReturnOrganization, ReturnOrganizationId = p.ReturnOrganizationId, ReturnReason = p.ReturnReason, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .FirstOrDefaultAsync(); if (data == null) return Error(GlobalMessages.InsigniaBorrowNotFound); return Success(data); } } }