using BMA.EHR.Application.Repositories; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Models.Placement; using BMA.EHR.Domain.Shared; using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Placement.Service.Requests; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Swashbuckle.AspNetCore.Annotations; using System.Security.Claims; using System.Security.Cryptography; namespace BMA.EHR.Placement.Service.Controllers { [Route("api/v{version:apiVersion}/placement/receive")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("ระบบรับโอน")] public class PlacementReceiveController : BaseController { private readonly PlacementRepository _repository; private readonly ApplicationDBContext _context; private readonly MinIOService _documentService; private readonly IHttpContextAccessor _httpContextAccessor; public PlacementReceiveController(PlacementRepository repository, ApplicationDBContext context, MinIOService documentService, IHttpContextAccessor httpContextAccessor) { _repository = repository; _context = context; _documentService = documentService; _httpContextAccessor = httpContextAccessor; } #region " Properties " private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; private bool? PlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1"); #endregion /// /// list รอบเครื่องราช /// /// ประเภทเครื่องราช(insignia=เครื่องราช,coin=เหรียญ) /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{type}")] public async Task> GetList(string type) { var insigniaPeriods = await _context.InsigniaPeriods.AsQueryable() .Where(x => x.Type == type) .OrderByDescending(x => x.Year) .ThenByDescending(x => x.StartDate) .Select(p => new { period_id = p.Id, period_amount = p.Amount, period_name = p.Name, period_start = p.StartDate, period_end = p.EndDate, period_year = p.Year, period_doc = p.ReliefDoc == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ReliefDoc.Id, }) .ToListAsync(); var data = new List(); foreach (var insigniaPeriod in insigniaPeriods) { var _data = new { period_id = insigniaPeriod.period_id, period_amount = insigniaPeriod.period_amount, period_name = insigniaPeriod.period_name, period_start = insigniaPeriod.period_start, period_end = insigniaPeriod.period_end, period_year = insigniaPeriod.period_year, period_doc = insigniaPeriod.period_doc == Guid.Parse("00000000-0000-0000-0000-000000000000") ? null : await _documentService.ImagesPath(insigniaPeriod.period_doc), }; data.Add(_data); } return Success(data); } /// /// get รายละเอียดรอบเครื่องราช /// /// Id เครื่องราช /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{id:length(36)}")] public async Task> GetById(Guid id) { var data = await _context.InsigniaPeriods.AsQueryable() .Where(x => x.Id == id) .Select(p => new { period_id = p.Id, period_amount = p.Amount, period_name = p.Name, period_start = p.StartDate, period_end = p.EndDate, period_year = p.Year, period_doc = p.ReliefDoc == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ReliefDoc.Id, }) .FirstOrDefaultAsync(); if (data == null) return Error(GlobalMessages.DataNotFound, 404); var _data = new { period_id = data.period_id, period_amount = data.period_amount, period_name = data.period_name, period_start = data.period_start, period_end = data.period_end, period_year = data.period_year, period_doc = data.period_doc == Guid.Parse("00000000-0000-0000-0000-000000000000") ? null : await _documentService.ImagesPath(data.period_doc), }; return Success(_data); } /// /// สร้างรอบเครื่องราช /// /// ประเภทเครื่องราช(insignia=เครื่องราช,coin=เหรียญ) /// ชื่อรอบ /// ปีที่เสนอ /// วันที่เริ่มต้น /// วันที่สิ้นสุด /// จำนวนวันแจ้งเตือน /// เอกสารประกอบ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("{type}")] public async Task> Post([FromForm] InsigniaPeriodRequest req, string type) { var period = new InsigniaPeriod { Name = Request.Form.ContainsKey("Name") ? Request.Form["Name"] : "", Year = Request.Form.ContainsKey("Year") ? Int32.Parse(Request.Form["Year"]) : DateTime.Now.Year, StartDate = Request.Form.ContainsKey("StartDate") ? DateTime.Parse(Request.Form["StartDate"]) : DateTime.Now, EndDate = Request.Form.ContainsKey("EndDate") ? DateTime.Parse(Request.Form["EndDate"]) : DateTime.Now, Amount = Request.Form.ContainsKey("Amount") ? Request.Form["Amount"] : "", Type = type.Trim().ToUpper(), CreatedUserId = FullName ?? "", CreatedFullName = UserId ?? "System Administrator", CreatedAt = DateTime.Now, LastUpdateFullName = FullName ?? "System Administrator", LastUpdateUserId = UserId ?? "", LastUpdatedAt = DateTime.Now, }; await _context.InsigniaPeriods.AddAsync(period); await _context.SaveChangesAsync(); 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); period.ReliefDoc = doc; } // await _context.InsigniaPeriods.AddAsync(period); await _context.SaveChangesAsync(); return Success(); } /// /// ลบรอบเครื่องราช /// /// Id เครื่องราช /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpDelete("{id:length(36)}")] public async Task> Delete(Guid id) { var deleted = await _context.InsigniaPeriods.AsQueryable() .Include(x => x.ReliefDoc) .FirstOrDefaultAsync(x => x.Id == id); if (deleted == null) return NotFound(); _context.InsigniaPeriods.Remove(deleted); await _context.SaveChangesAsync(); if (deleted.ReliefDoc != null) await _documentService.DeleteFileAsync(deleted.ReliefDoc.Id); return Success(); } /// /// แก้ไขรอบเครื่องราช /// /// Id เครื่องราช /// ชื่อรอบ /// ปีที่เสนอ /// วันที่เริ่มต้น /// วันที่สิ้นสุด /// จำนวนวันแจ้งเตือน /// เอกสารประกอบ /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPut("{id:length(36)}")] public async Task> Put([FromForm] InsigniaPeriodRequest req, Guid id) { if (req == null) return BadRequest(); var uppdated = await _context.InsigniaPeriods.AsQueryable() .Include(x => x.ReliefDoc) .FirstOrDefaultAsync(x => x.Id == id); if (uppdated == null) return NotFound(); uppdated.Name = Request.Form.ContainsKey("Name") ? Request.Form["Name"] : ""; uppdated.Year = Request.Form.ContainsKey("Year") ? Int32.Parse(Request.Form["Year"]) : DateTime.Now.Year; uppdated.StartDate = Request.Form.ContainsKey("StartDate") ? DateTime.Parse(Request.Form["StartDate"]) : DateTime.Now; uppdated.EndDate = Request.Form.ContainsKey("EndDate") ? DateTime.Parse(Request.Form["EndDate"]) : DateTime.Now; uppdated.Amount = Request.Form.ContainsKey("Amount") ? Request.Form["Amount"] : ""; uppdated.LastUpdateFullName = FullName ?? "System Administrator"; uppdated.LastUpdateUserId = UserId ?? ""; uppdated.LastUpdatedAt = DateTime.Now; if (Request.Form.Files != null && Request.Form.Files.Count != 0) { if (uppdated.ReliefDoc != null) await _documentService.DeleteFileAsync(uppdated.ReliefDoc.Id); var file = Request.Form.Files[0]; var fileExtension = Path.GetExtension(file.FileName); var doc = await _documentService.UploadFileAsync(file, file.FileName); uppdated.ReliefDoc = doc; } await _context.SaveChangesAsync(); return Success(); } } }