using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.MessageQueue; using BMA.EHR.Application.Responses; using BMA.EHR.Application.Responses.Profiles; using BMA.EHR.Discipline.Service.Requests; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Models.Discipline; using BMA.EHR.Domain.Shared; using BMA.EHR.Domain.Extensions; using BMA.EHR.Infrastructure.Persistence; // using BMA.EHR.Placement.Service.Requests; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using System.Security.Claims; namespace BMA.EHR.DisciplineSuspend.Service.Controllers { [Route("api/v{version:apiVersion}/discipline/report")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("ระบบวินัยรายงาน")] public class DisciplineReportController : BaseController { private readonly DisciplineDbContext _context; private readonly MinIODisciplineService _documentService; private readonly IHttpContextAccessor _httpContextAccessor; private readonly PermissionRepository _permission; private readonly UserProfileRepository _userProfileRepository; public DisciplineReportController(DisciplineDbContext context, MinIODisciplineService documentService, IHttpContextAccessor httpContextAccessor, PermissionRepository permission, UserProfileRepository userProfileRepository) { // _repository = repository; _context = context; _documentService = documentService; _httpContextAccessor = httpContextAccessor; _permission = permission; _userProfileRepository = userProfileRepository; } #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 /// /// รายชื่อออกคำสั่งลงโทษ /// /// /// /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("{type}")] public async Task> GetReportDiscipline([FromBody] DisciplineReportRequest req, string type) { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var data_search1 = await _context.DisciplineComplaints .Include(x => x.DisciplineComplaint_Profiles) .Where(x => req.status.Trim().ToUpper() == "ALL" ? true : (x.Status != null && x.Status.Contains(req.status.Trim().ToUpper()))) .Where(x => req.offenseDetail.Trim().ToUpper() == "ALL" ? true : (x.OffenseDetails != null && x.OffenseDetails.Contains(req.status.Trim().ToUpper()))) // .Where(x => req.disciplinaryFaultLevel.Trim().ToUpper() == "ALL" ? true : (x.DisciplinaryFaultLevel != null && x.DisciplinaryFaultLevel.Contains(req.status.Trim().ToUpper()))) .OrderByDescending(x => x.CreatedAt) .ToListAsync(); var mapData1 = data_search1 .SelectMany((d) => d.DisciplineComplaint_Profiles.Select((profile) => new { fullName = $"{profile.Prefix}{profile.FirstName} {profile.LastName}", citizenId = profile.CitizenId, position = profile.Position, posLevel = profile.posLevelName, oc = profile.Organization, CreatedAt = profile.CreatedAt, offense = d.OffenseDetails != null && d.OffenseDetails != "" ? d.OffenseDetails == "NOT_SPECIFIED" ? "ความผิดวินัยยังไม่ระบุ" : d.OffenseDetails == "NOT_DEADLY" ? "ความผิดวินัยไม่ร้ายแรง" : d.OffenseDetails == "DEADLY" ? "ความผิดวินัยร้ายแรง" : "" : "", faultLevel = "", Child4Id = profile.child4DnaId, Child4 = profile.child4, Child3Id = profile.child3DnaId, Child3 = profile.child3, Child2Id = profile.child2DnaId, Child2 = profile.child2, Child1Id = profile.child1DnaId, Child1 = profile.child1, RootId = profile.rootDnaId, Root = profile.root, PosType = profile.posTypeName, PosLevel = profile.posLevelName })) .Where(x => req.node == 4 ? x.Child4Id == req.nodeId : (req.node == 3 ? x.Child3Id == req.nodeId : (req.node == 2 ? x.Child2Id == req.nodeId : (req.node == 1 ? x.Child1Id == req.nodeId : (req.node == 0 ? x.RootId == req.nodeId : (req.node == null ? true : true)))))) .Where(x => jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD" ? true : (req.node == 0 ? x.Child1Id == null : (req.node == 1 ? x.Child2Id == null : (req.node == 2 ? x.Child3Id == null : (req.node == 3 ? x.Child4Id == null : true))))) .Where(x => string.IsNullOrEmpty(req.posType) || x.PosType == req.posType) .Where(x => string.IsNullOrEmpty(req.posLevel) || x.PosLevel == req.posLevel) .OrderByDescending(x => x.CreatedAt) .ToList(); var groupedResult1 = mapData1 .GroupBy(x => x.fullName) .Select(g => new { one = g.Count(), // Count of records per fullName two = 0, three = 0, g.Where(x => x.fullName != null || x.fullName != "").FirstOrDefault()?.fullName, g.Where(x => x.citizenId != null || x.citizenId != "").FirstOrDefault()?.citizenId, g.Where(x => x.position != null || x.position != "").FirstOrDefault()?.position, g.Where(x => x.posLevel != null || x.posLevel != "").FirstOrDefault()?.posLevel, oc = (g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 == null ? "" : g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 + "\n") + (g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 == null ? "" : g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 + "\n") + (g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 == null ? "" : g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 + "\n") + (g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 == null ? "" : g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 + "\n") + (g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root == null ? "" : g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root), g.Where(x => x.offense != null || x.offense != "").FirstOrDefault()?.offense, g.Where(x => x.faultLevel != null || x.faultLevel != "").FirstOrDefault()?.faultLevel, }) .ToList(); var data_search2 = await _context.DisciplineInvestigates .Include(x => x.DisciplineInvestigate_ProfileComplaints) .Where(x => req.status.Trim().ToUpper() == "ALL" ? true : (x.Status != null && x.Status.Contains(req.status.Trim().ToUpper()))) .Where(x => req.offenseDetail.Trim().ToUpper() == "ALL" ? true : (x.OffenseDetails != null && x.OffenseDetails.Contains(req.status.Trim().ToUpper()))) // .Where(x => req.disciplinaryFaultLevel.Trim().ToUpper() == "ALL" ? true : (x.DisciplinaryFaultLevel != null && x.DisciplinaryFaultLevel.Contains(req.status.Trim().ToUpper()))) .OrderByDescending(x => x.CreatedAt) .ToListAsync(); var mapData2 = data_search2 .SelectMany((d) => d.DisciplineInvestigate_ProfileComplaints.Select((profile) => new { fullName = $"{profile.Prefix}{profile.FirstName} {profile.LastName}", citizenId = profile.CitizenId, position = profile.Position, posLevel = profile.posLevelName, oc = profile.Organization, CreatedAt = profile.CreatedAt, offense = d.OffenseDetails != null && d.OffenseDetails != "" ? d.OffenseDetails == "NOT_SPECIFIED" ? "ความผิดวินัยยังไม่ระบุ" : d.OffenseDetails == "NOT_DEADLY" ? "ความผิดวินัยไม่ร้ายแรง" : d.OffenseDetails == "DEADLY" ? "ความผิดวินัยร้ายแรง" : "" : "", faultLevel = "", Child4Id = profile.child4DnaId, Child4 = profile.child4, Child3Id = profile.child3DnaId, Child3 = profile.child3, Child2Id = profile.child2DnaId, Child2 = profile.child2, Child1Id = profile.child1DnaId, Child1 = profile.child1, RootId = profile.rootDnaId, Root = profile.root, PosType = profile.posTypeName, PosLevel = profile.posLevelName })) .Where(x => req.node == 4 ? x.Child4Id == req.nodeId : (req.node == 3 ? x.Child3Id == req.nodeId : (req.node == 2 ? x.Child2Id == req.nodeId : (req.node == 1 ? x.Child1Id == req.nodeId : (req.node == 0 ? x.RootId == req.nodeId : (req.node == null ? true : true)))))) .Where(x => jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD" ? true : (req.node == 0 ? x.Child1Id == null : (req.node == 1 ? x.Child2Id == null : (req.node == 2 ? x.Child3Id == null : (req.node == 3 ? x.Child4Id == null : true))))) .Where(x => string.IsNullOrEmpty(req.posType) || x.PosType == req.posType) .Where(x => string.IsNullOrEmpty(req.posLevel) || x.PosLevel == req.posLevel) .OrderByDescending(x => x.CreatedAt) .ToList(); var groupedResult2 = mapData2 .GroupBy(x => x.fullName) .Select(g => new { one = 0, two = g.Count(), // Count of records per fullName three = 0, g.Where(x => x.fullName != null || x.fullName != "").FirstOrDefault()?.fullName, g.Where(x => x.citizenId != null || x.citizenId != "").FirstOrDefault()?.citizenId, g.Where(x => x.position != null || x.position != "").FirstOrDefault()?.position, g.Where(x => x.posLevel != null || x.posLevel != "").FirstOrDefault()?.posLevel, oc = (g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 == null ? "" : g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 + "\n") + (g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 == null ? "" : g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 + "\n") + (g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 == null ? "" : g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 + "\n") + (g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 == null ? "" : g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 + "\n") + (g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root == null ? "" : g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root), g.Where(x => x.offense != null || x.offense != "").FirstOrDefault()?.offense, g.Where(x => x.faultLevel != null || x.faultLevel != "").FirstOrDefault()?.faultLevel, }) .ToList(); var data_search3 = await _context.DisciplineDisciplinarys .Include(x => x.DisciplineDisciplinary_ProfileComplaintInvestigates) .Where(x => req.status.Trim().ToUpper() == "ALL" ? true : (x.Status != null && x.Status.Contains(req.status.Trim().ToUpper()))) .Where(x => req.offenseDetail.Trim().ToUpper() == "ALL" ? true : (x.OffenseDetails != null && x.OffenseDetails.Contains(req.status.Trim().ToUpper()))) .Where(x => req.disciplinaryFaultLevel.Trim().ToUpper() == "ALL" ? true : (x.DisciplinaryFaultLevel != null && x.DisciplinaryFaultLevel.Contains(req.status.Trim().ToUpper()))) .OrderByDescending(x => x.CreatedAt) .ToListAsync(); var mapData3 = data_search3 .SelectMany((d) => d.DisciplineDisciplinary_ProfileComplaintInvestigates.Select((profile) => new { fullName = $"{profile.Prefix}{profile.FirstName} {profile.LastName}", citizenId = profile.CitizenId, position = profile.Position, posLevel = profile.posLevelName, oc = profile.Organization, CreatedAt = profile.CreatedAt, offense = d.OffenseDetails != null && d.OffenseDetails != "" ? d.OffenseDetails == "NOT_SPECIFIED" ? "ความผิดวินัยยังไม่ระบุ" : d.OffenseDetails == "NOT_DEADLY" ? "ความผิดวินัยไม่ร้ายแรง" : d.OffenseDetails == "DEADLY" ? "ความผิดวินัยร้ายแรง" : "" : "", faultLevel = d.DisciplinaryFaultLevel, Child4Id = profile.child4DnaId, Child4 = profile.child4, Child3Id = profile.child3DnaId, Child3 = profile.child3, Child2Id = profile.child2DnaId, Child2 = profile.child2, Child1Id = profile.child1DnaId, Child1 = profile.child1, RootId = profile.rootDnaId, Root = profile.root, PosType = profile.posTypeName, PosLevel = profile.posLevelName })) .Where(x => req.node == 4 ? x.Child4Id == req.nodeId : (req.node == 3 ? x.Child3Id == req.nodeId : (req.node == 2 ? x.Child2Id == req.nodeId : (req.node == 1 ? x.Child1Id == req.nodeId : (req.node == 0 ? x.RootId == req.nodeId : (req.node == null ? true : true)))))) .Where(x => jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD" ? true : (req.node == 0 ? x.Child1Id == null : (req.node == 1 ? x.Child2Id == null : (req.node == 2 ? x.Child3Id == null : (req.node == 3 ? x.Child4Id == null : true))))) .Where(x => string.IsNullOrEmpty(req.posType) || x.PosType == req.posType) .Where(x => string.IsNullOrEmpty(req.posLevel) || x.PosLevel == req.posLevel) .OrderByDescending(x => x.CreatedAt) .ToList(); var groupedResult3 = mapData3 .GroupBy(x => x.fullName) .Select(g => new { one = 0, two = 0, three = g.Count(), // Count of records per fullName g.Where(x => x.fullName != null || x.fullName != "").FirstOrDefault()?.fullName, g.Where(x => x.citizenId != null || x.citizenId != "").FirstOrDefault()?.citizenId, g.Where(x => x.position != null || x.position != "").FirstOrDefault()?.position, g.Where(x => x.posLevel != null || x.posLevel != "").FirstOrDefault()?.posLevel, oc = (g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 == null ? "" : g.Where(x => x.Child4 != null || x.Child4 != "").FirstOrDefault()?.Child4 + "\n") + (g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 == null ? "" : g.Where(x => x.Child3 != null || x.Child3 != "").FirstOrDefault()?.Child3 + "\n") + (g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 == null ? "" : g.Where(x => x.Child2 != null || x.Child2 != "").FirstOrDefault()?.Child2 + "\n") + (g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 == null ? "" : g.Where(x => x.Child1 != null || x.Child1 != "").FirstOrDefault()?.Child1 + "\n") + (g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root == null ? "" : g.Where(x => x.Root != null || x.Root != "").FirstOrDefault()?.Root), g.Where(x => x.offense != null || x.offense != "").FirstOrDefault()?.offense, g.Where(x => x.faultLevel != null || x.faultLevel != "").FirstOrDefault()?.faultLevel, }) .ToList(); var resultSum = groupedResult1.Concat(groupedResult2).Concat(groupedResult3).ToArray(); var groupedResult = resultSum .GroupBy(x => x.fullName) .Select(g => new { // g.Where(x => x.no != null || x.no != "").FirstOrDefault()?.no, g.Where(x => x.fullName != null || x.fullName != "").FirstOrDefault()?.fullName, g.Where(x => x.citizenId != null || x.citizenId != "").FirstOrDefault()?.citizenId, g.Where(x => x.position != null || x.position != "").FirstOrDefault()?.position, g.Where(x => x.posLevel != null || x.posLevel != "").FirstOrDefault()?.posLevel, g.Where(x => x.oc != null || x.oc != "").FirstOrDefault()?.oc, g.Where(x => x.offense != null || x.offense != "").FirstOrDefault()?.offense, g.Where(x => x.faultLevel != null || x.faultLevel != "").FirstOrDefault()?.faultLevel, one = g.Sum(x => x.one), // Replace `score` with actual field name two = g.Sum(x => x.two), // Replace `score` with actual field name three = g.Sum(x => x.three), // Replace `score` with actual field name }) .OrderBy(x => x.citizenId) .ToList(); var resultMap = new List(); var count = 1; foreach (var p in groupedResult) { var emp = new { no = count, fullName = p.fullName, citizenId = p.citizenId, position = p.position, posLevel = p.posLevel, oc = p.oc, offense = p.offense, faultLevel = p.faultLevel, one = p.one, two = p.two, three = p.three, }; resultMap.Add(emp); count++; } var result = new { template = "reportDiscipline", reportName = "xlsx-report", data = new { year = (req.year + 543).ToString().ToThaiNumber(), dateCurrent = $"ณ วันที่ {DateTime.Now.Date.ToThaiShortDate().ToThaiNumber()}", data = resultMap } }; return Success(result); } } }