using System.Security.Claims; using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Requests; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Models.Insignias; using BMA.EHR.Domain.Shared; using BMA.EHR.Infrastructure.Persistence; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; 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; public InsigniaManageController(ApplicationDBContext context, MinIOService documentService, InsigniaPeriodsRepository repository, IHttpContextAccessor httpContextAccessor) { _context = context; _documentService = documentService; _repository = repository; _httpContextAccessor = httpContextAccessor; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; #endregion /// /// list จัดสรรเครื่องราช /// /// ปีการจัดสรร /// Id ประเภทเครื่องราช /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("type/{year}/{insigniaTypeId:length(36)}")] public async Task> GetList(int year, Guid insigniaTypeId) { 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([FromForm] InsigniaManageRequest req) { 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, CreatedUserId = FullName ?? "", CreatedFullName = UserId ?? "System Administrator", 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 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("{id:length(36)}")] public async Task> Put([FromForm] InsigniaManageRequest req, Guid insigniaManageId) { 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 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.OrganizationOrganization.Name, 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, }) .FirstOrDefaultAsync(); if (insigniaManageOrg == null) return Error(GlobalMessages.InsigniaManageOrgNotFound); return Success(insigniaManageOrg); } /// /// สร้างหน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("org")] public async Task> PostOrganization([FromBody] InsigniaManageOrganizationRequest req) { var organizationOrganization = await _context.OrganizationOrganizations.AsQueryable() .FirstOrDefaultAsync(x => x.Id == req.OrganizationOrganizationId); if (organizationOrganization == null) return Error(GlobalMessages.OrganizationNotFound); var insigniaManage = await _context.InsigniaManages.AsQueryable() .Include(x => x.InsigniaManageOrganiations) .ThenInclude(x => x.OrganizationOrganization) .FirstOrDefaultAsync(x => x.Id == req.insigniaManageId); if (insigniaManage == null) return Error(GlobalMessages.InsigniaManageNotFound); var total = insigniaManage.InsigniaManageOrganiations.Where(x => x.OrganizationOrganization != organizationOrganization).Sum(x => x.Total); if (req.Total + total > insigniaManage.Total) return Error(GlobalMessages.InsigniaManageOrgLimit); await _context.InsigniaManageOrganiations.AddAsync( new InsigniaManageOrganiation { OrganizationOrganization = organizationOrganization, Total = req.Total, InsigniaManage = insigniaManage, CreatedUserId = FullName ?? "", CreatedFullName = UserId ?? "System Administrator", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }); await _context.SaveChangesAsync(); return Success(); } /// /// ลบหน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// Id หน่วยงานจัดสรรเครื่องราชอิสริยาภรณ์ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("org/{insigniaManageOrgId:length(36)}")] public async Task> DeleteOrganization(Guid insigniaManageOrgId) { 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([FromForm] InsigniaManageOrganizationUpdateRequest req, Guid insigniaManageOrgId) { var uppdated = await _context.InsigniaManageOrganiations.AsQueryable() .Include(x => x.OrganizationOrganization) .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) .ThenInclude(x => x.OrganizationOrganization) .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 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); } /// /// แก้ไขยืมเครื่องราชฯ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("borrow")] public async Task> PostBorrowInsignia([FromForm] InsigniaBorrowRequest req) { var organizationOrganization = await _context.OrganizationOrganizations.AsQueryable() .FirstOrDefaultAsync(x => x.Id == req.BorrowOrganizationId); if (organizationOrganization == null) return Error(GlobalMessages.OrganizationNotFound); var insigniaNoteProfile = await _context.InsigniaNoteProfiles.AsQueryable() .Include(x => x.RequestInsignia) .FirstOrDefaultAsync(x => x.Id == req.InsigniaNoteProfileId); if (insigniaNoteProfile == null) return Error(GlobalMessages.InsigniaRequestProfileNotFound); var insigniaManage = await _context.InsigniaManages.AsQueryable() .FirstOrDefaultAsync(x => x.Year == DateTime.Now.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.OrganizationOrganization == organizationOrganization && x.InsigniaManage == insigniaManage); if (insigniaManageOrganiation == null) return Error(GlobalMessages.InsigniaManageOrgNotFound); var insigniaManageProfile = await _context.InsigniaManageProfiles.AsQueryable() .FirstOrDefaultAsync(x => x.InsigniaNoteProfile == insigniaNoteProfile && x.InsigniaManageOrganiation == insigniaManageOrganiation && 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, BorrowOrganization = organizationOrganization, BorrowDate = req.BorrowDate, InsigniaNoteProfile = insigniaNoteProfile, CreatedUserId = FullName ?? "", CreatedFullName = UserId ?? "System Administrator", 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([FromForm] InsigniaReturnRequest req, Guid insigniaManageProfileId) { var organizationOrganization = await _context.OrganizationOrganizations.AsQueryable() .FirstOrDefaultAsync(x => x.Id == req.ReturnOrganizationId); if (organizationOrganization == null) return Error(GlobalMessages.OrganizationNotFound); 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.ReturnOrganization = organizationOrganization; 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 insigniaType = await _context.InsigniaTypes .FirstOrDefaultAsync(x => x.Id == insigniaTypeId); if (insigniaType == null) return Error(GlobalMessages.InsigniaTypeNotFound); var data = await _context.InsigniaManageProfiles.AsQueryable() .Where(x => x.InsigniaNoteProfile.RequestInsignia.InsigniaType == insigniaType) .Where(x => x.InsigniaManageOrganiation.InsigniaManage.Year == year) .OrderByDescending(x => x.CreatedAt) .Select(p => new { Id = p.Id, Status = p.Status, BorrowOrganization = p.BorrowOrganization == null ? null : p.BorrowOrganization.Name, BorrowOrganizationId = p.BorrowOrganization == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.BorrowOrganization.Id, BorrowDate = p.BorrowDate, ReturnDate = p.ReturnDate, ReturnOrganization = p.ReturnOrganization == null ? null : p.ReturnOrganization.Name, ReturnOrganizationId = p.ReturnOrganization == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ReturnOrganization.Id, ReturnReason = p.ReturnReason, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .ToListAsync(); 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 == null ? null : p.BorrowOrganization.Name, BorrowOrganizationId = p.BorrowOrganization == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.BorrowOrganization.Id, BorrowDate = p.BorrowDate, ReturnDate = p.ReturnDate, ReturnOrganization = p.ReturnOrganization == null ? null : p.ReturnOrganization.Name, ReturnOrganizationId = p.ReturnOrganization == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ReturnOrganization.Id, ReturnReason = p.ReturnReason, LastUpdatedAt = p.LastUpdatedAt, CreatedAt = p.CreatedAt, }) .FirstOrDefaultAsync(); if (data == null) return Error(GlobalMessages.InsigniaBorrowNotFound); return Success(data); } } }