using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.Commands; using BMA.EHR.Application.Repositories.Leaves.LeaveRequests; using BMA.EHR.Application.Repositories.Leaves.TimeAttendants; using BMA.EHR.Application.Repositories.MetaData; using BMA.EHR.Application.Responses.Profiles; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.TimeAttendants; using BMA.EHR.Domain.Shared; using BMA.EHR.Leave.Service.DTOs.Reports; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing.Template; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OfficeOpenXml; using OfficeOpenXml.Style; using Swashbuckle.AspNetCore.Annotations; using System.Globalization; using System.Security.Claims; namespace BMA.EHR.Leave.Service.Controllers { [Route("api/v{version:apiVersion}/leave/report")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("API ระบบลงเวลาและการลา (ดึงข้อมูลสำหรับนำไปออกรายงาน)")] public class LeaveReportController : BaseController { #region " Fields " private static CultureInfo _culture = new CultureInfo("th-TH"); private readonly LeaveRequestRepository _leaveRequestRepository; private readonly UserProfileRepository _userProfileRepository; private readonly CommandRepository _commandRepository; private readonly LeaveTypeRepository _leaveTypeRepository; private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository; private readonly DutyTimeRepository _dutyTimeRepository; private readonly UserDutyTimeRepository _userDutyTimeRepository; private readonly HolidayRepository _holidayRepository; private readonly UserCalendarRepository _userCalendarRepository; private readonly IHttpContextAccessor _httpContextAccessor; private readonly PermissionRepository _permission; private readonly LeaveBeginningRepository _leaveBeginningRepository; private readonly IWebHostEnvironment _hostingEnvironment; #endregion #region " Constructor and Destructor " public LeaveReportController(LeaveRequestRepository leaveRequestRepository, UserProfileRepository userProfileRepository, CommandRepository commandRepository, LeaveTypeRepository leaveTypeRepository, ProcessUserTimeStampRepository processUserTimeStampRepository, DutyTimeRepository dutyTimeRepository, UserDutyTimeRepository userDutyTimeRepository, HolidayRepository holidayRepository, UserCalendarRepository userCalendarRepository, IHttpContextAccessor httpContextAccessor, PermissionRepository permission, LeaveBeginningRepository leaveBeginningRepository, IWebHostEnvironment hostingEnvironment) { _leaveRequestRepository = leaveRequestRepository; _userProfileRepository = userProfileRepository; _commandRepository = commandRepository; _leaveTypeRepository = leaveTypeRepository; _processUserTimeStampRepository = processUserTimeStampRepository; _dutyTimeRepository = dutyTimeRepository; _userDutyTimeRepository = userDutyTimeRepository; _holidayRepository = holidayRepository; _userCalendarRepository = userCalendarRepository; _httpContextAccessor = httpContextAccessor; _permission = permission; _leaveBeginningRepository = leaveBeginningRepository; _hostingEnvironment = hostingEnvironment; } private class LoopDate { public DateTime date { get; set; } public bool isHoliday { get; set; } public bool isWeekEnd { get; set; } public string dateRemark { get; set; } } private class DateResultReport { public int no { get; set; } public string fullName { get; set; } public string dutyTimeName { get; set; } public string checkInLocation { get; set; } public string checkInTime { get; set; } public string checkOutLocation { get; set; } public string checkOutTime { get; set; } public string remark { get; set; } public string checkInDate { get; set; } public string checkedOutDate { get; set; } public DateTime? checkInTimeRaw { get; set; } public DateTime? checkOutTimeRaw { get; set; } } #endregion #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"); private string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"]; private Guid OcId { get { if (UserId != null || UserId != "") return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken); else return Guid.Empty; } } #endregion #region " Methods " #region " Private Methods " private async Task GetReport01(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave9"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; var lastLeaveRequest = await _leaveRequestRepository.GetLastLeaveRequestByTypeForUserAsync2(data.KeycloakUserId, data.Type.Id, data.CreatedAt); var startFiscalYear = new DateTime(data.LeaveStartDate.Year - 1, 10, 1); var endFiscalYear = data.CreatedAt; var thisYear = data.LeaveStartDate.Year; var toDay = data.LeaveStartDate.Date; if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) thisYear = thisYear + 1; var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, data.Type.Id, data.KeycloakUserId); var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); if (leaveData != null) { sumLeave += leaveData.BeginningLeaveDays; } var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave9", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leaveDetail = data.LeaveDetail.ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), //data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), leaveAddress = data.LeaveAddress.ToThaiNumber(), leaveNumber = data.LeaveNumber.ToThaiNumber(), LeaveLastStart = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveLastEnd = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveSummary = sumLeave.ToString().ToThaiNumber(), LeaveRemain = (data.Type.Limit - sumLeave).ToString().ToThaiNumber(), LeaveAll = (data.LeaveTotal + sumLeave).ToString().ToThaiNumber(), Type1 = data.Type.Name == "ลาป่วย" ? "🗹" : "☐", Type2 = data.Type.Name == "ลากิจส่วนตัว" ? "🗹" : "☐", Type3 = data.Type.Name == "ลาคลอดบุตร" ? "🗹" : "☐", leaveS1 = data.Type.Name == "ลาป่วย" ? sumLeave.ToString().ToThaiNumber() : "", leaveS2 = data.Type.Name == "ลากิจส่วนตัว" ? sumLeave.ToString().ToThaiNumber() : "", leaveS3 = data.Type.Name == "ลาคลอดบุตร" ? sumLeave.ToString().ToThaiNumber() : "", leaveT1 = data.Type.Name == "ลาป่วย" ? data.LeaveTotal.ToString().ToThaiNumber() : "", leaveT2 = data.Type.Name == "ลากิจส่วนตัว" ? data.LeaveTotal.ToString().ToThaiNumber() : "", leaveT3 = data.Type.Name == "ลาคลอดบุตร" ? data.LeaveTotal.ToString().ToThaiNumber() : "", leaveA1 = data.Type.Name == "ลาป่วย" ? (data.LeaveTotal + sumLeave).ToString().ToThaiNumber() : "", leaveA2 = data.Type.Name == "ลากิจส่วนตัว" ? (data.LeaveTotal + sumLeave).ToString().ToThaiNumber() : "", leaveA3 = data.Type.Name == "ลาคลอดบุตร" ? (data.LeaveTotal + sumLeave).ToString().ToThaiNumber() : "", approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport02(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave10"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave10", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, wifeDayName = data.WifeDayName ?? "", wifeDayDateBorn = data.WifeDayDateBorn == null || data.WifeDayDateBorn == "" ? "" : DateTime.Parse(data.WifeDayDateBorn).ToThaiShortDate().ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), //data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), leaveAddress = data.LeaveAddress.ToThaiNumber(), leaveNumber = data.LeaveNumber.ToThaiNumber(), approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport03(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave11"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; var startFiscalYear = new DateTime(data.LeaveStartDate.Year - 1, 10, 1); var endFiscalYear = data.CreatedAt; var thisYear = data.LeaveStartDate.Year; var toDay = data.LeaveStartDate.Date; if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) thisYear = thisYear + 1; var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, data.Type.Id, data.KeycloakUserId); //var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, rawData.Type.Id, rawData.KeycloakUserId); //var leaveSummary = leaveData == null ? 0.0 : leaveData.LeaveDaysUsed; //var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); if (leaveData != null) { sumLeave += leaveData.BeginningLeaveDays; } //var sumLeave = leaveData == null ? 0.0 : leaveData.LeaveDaysUsed; var leaveLimit = leaveData == null ? 0.0 : leaveData.LeaveDays; var extendLeave = leaveLimit - 10; var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave11", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, restDayOldTotal = extendLeave.ToString().ToThaiNumber(), restDayCurrentTotal = (10).ToString().ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), leaveAddress = data.LeaveAddress.ToThaiNumber(), leaveNumber = data.LeaveNumber.ToThaiNumber(), LeaveRemain = (leaveLimit - sumLeave).ToString().ToThaiNumber(), leaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), // วันลาปัจจุบัน LeaveSummary = sumLeave.ToString().ToThaiNumber(), // วันลาครั้งก่อน LeaveAll = (data.LeaveTotal + sumLeave).ToString().ToThaiNumber(), // ลาครั้งนี้ + ครั้งก่อน LeaveLimit = leaveLimit.ToString().ToThaiNumber(), // สิทธิ์การลา approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport04(LeaveRequest data, bool isHajj = false) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, isHajj ? "leave13": "leave12"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} if (data != null && data.LeaveSubTypeName == "ลาประกอบพิธีฮัจญ์" && isHajj == false) { isHajj = true; } var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); if (isHajj == true) { return new { template = "leave13", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(), hajjDayStatus = data.HajjDayStatus, leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(),//data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), hajjStatus = data.HajjDayStatus == true ? "☐ ยังไม่เคย 🗹 เคย" : "🗹 ยังไม่เคย ☐ เคย", approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } else { return new { template = "leave12", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate().ToThaiNumber(), leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(), ordainDayStatus = data.OrdainDayStatus, ordainDayLocationName = data.OrdainDayLocationName.ToThaiNumber(), ordainDayLocationAddress = data.OrdainDayLocationAddress.ToThaiNumber(), ordainDayLocationNumber = data.OrdainDayLocationNumber.ToThaiNumber(), ordainDayOrdination = data.OrdainDayOrdination.ToThaiShortDate().ToThaiNumber(), ordainDayBuddhistLentName = data.OrdainDayBuddhistLentName.ToThaiNumber(), ordainDayBuddhistLentAddress = data.OrdainDayBuddhistLentAddress.ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(),//data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), ordainStatus = data.OrdainDayStatus == true ? "☐ ยังไม่เคย 🗹 เคย" : "🗹 ยังไม่เคย ☐ เคย", approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } } private async Task GetReport05(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave14"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave14", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, absentDaySummon = data.AbsentDaySummon.ToThaiNumber(), absentDayLocation = data.AbsentDayLocation.ToThaiNumber(), absentDayRegistorDate = data.AbsentDayRegistorDate.Date.ToThaiShortDate().ToThaiNumber(), absentDayGetIn = data.AbsentDayGetIn.ToThaiNumber(), absentDayAt = data.AbsentDayAt.ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), //data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport06(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave15"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave15", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate().ToThaiNumber(), leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate().ToThaiNumber(), leaveSalary = data.LeaveSalary == null ? "" : data.LeaveSalary.Value.ToNumericText().ToThaiNumber(), leaveSalaryText = data.LeaveSalaryText.ToThaiNumber(), studyDaySubject = data.StudyDaySubject.ToThaiNumber() ?? "", studyDayDegreeLevel = data.StudyDayDegreeLevel.ToThaiNumber() ?? "", studyDayUniversityName = data.StudyDayUniversityName.ToThaiNumber() ?? "", studyDayCountry = data.StudyDayCountry.ToThaiNumber() ?? "", studyDayScholarship = data.StudyDayScholarship.ToThaiNumber() ?? "", studyDayTrainingSubject = data.StudyDayTrainingSubject.ToThaiNumber() ?? "", studyDayTrainingName = data.StudyDayTrainingName.ToThaiNumber() ?? "", leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), //data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), leaveAddress = data.LeaveAddress.ToThaiNumber(), leaveNumber = data.LeaveNumber.ToThaiNumber(), Type1 = data.LeaveSubTypeName == "ศึกษาต่อ" ? "🗹" : "☐", Type2 = data.LeaveSubTypeName == "ฝึกอบรม" ? "🗹" : "☐", Type3 = data.LeaveSubTypeName == "ปฎิบัติการวิจัย" ? "🗹" : "☐", Type4 = data.LeaveSubTypeName == "ดูงาน" ? "🗹" : "☐", country1 = data.LeaveSubTypeName == "ศึกษาต่อ" ? data.StudyDayCountry.ToThaiNumber() ?? "" : "", country2 = data.LeaveSubTypeName != "ศึกษาต่อ" ? data.StudyDayCountry.ToThaiNumber() ?? "" : "", scholarship1 = data.LeaveSubTypeName == "ศึกษาต่อ" ? data.StudyDayScholarship.ToThaiNumber() ?? "" : "☐", scholarship2 = data.LeaveSubTypeName != "ศึกษาต่อ" ? data.StudyDayScholarship.ToThaiNumber() ?? "" : "☐", approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport07(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} //var profileLeave = await _userProfileRepository.GetProfileLeaveByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profileLeave == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave16"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave16", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, fullnameEng = "", position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), profileType = profile.ProfileType, birthDate = profile.BirthDate.ToThaiShortDate().ToThaiNumber(), retireDate = profile.RetireDate.ToThaiShortDate().ToThaiNumber(), govAge = profile.GovAge.ToThaiNumber(), age = profile.Age.ToThaiNumber(), dateAppoint = profile.DateAppoint.ToThaiShortDate().ToThaiNumber(), dateCurrent = profile.DateCurrent.ToThaiShortDate().ToThaiNumber(), amount = ((double)profile.Amount).ToNumericText().ToThaiNumber(), telephoneNumber = profile.TelephoneNumber == null ? "" : profile.TelephoneNumber.ToThaiNumber(), posLevel = profile.PosLevel.ToThaiNumber(), posType = profile.PosType.ToThaiNumber(), currentAddress = profile.CurrentAddress.ToThaiNumber(), oc = profile.Oc.ToThaiNumber(), root = profile.Root.ToThaiNumber(), child1 = profile.Child1 == null ? "" : profile.Child1!.ToThaiNumber(), child2 = profile.Child2 == null ? "" : profile.Child2!.ToThaiNumber(), child3 = profile.Child3 == null ? "" : profile.Child3!.ToThaiNumber(), child4 = profile.Child4 == null ? "" : profile.Child4!.ToThaiNumber(), positions = profile.Positions.Select(x => new { positionName = x.PositionName == null ? "" : x.PositionName.ToThaiNumber(), dateStart = x.DateStart.ToThaiShortDate().ToThaiNumber(), dateEnd = x.DateEnd.ToThaiShortDate().ToThaiNumber(), positionType = x.PositionType == null ? "" : x.PositionType.ToThaiNumber(), positionLevel = x.PositionLevel == null ? "" : x.PositionLevel.ToThaiNumber(), orgRoot = x.OrgRoot == null ? "" : x.OrgRoot.ToThaiNumber(), orgChild1 = x.OrgChild1 == null ? "" : x.OrgChild1.ToThaiNumber(), orgChild2 = x.OrgChild2 == null ? "" : x.OrgChild2.ToThaiNumber(), orgChild3 = x.OrgChild3 == null ? "" : x.OrgChild3.ToThaiNumber(), orgChild4 = x.OrgChild4 == null ? "" : x.OrgChild4.ToThaiNumber(), }).ToList(), educations = profile.Educations.Select(x => new { educationLevel = x.EducationLevel == null ? "" : x.EducationLevel.ToThaiNumber(), institute = x.Institute == null ? "" : x.Institute.ToThaiNumber(), country = x.Country == null ? "" : x.Country.ToThaiNumber(), finishDate = x.FinishDate == null ? "-" : x.FinishDate.Value.ToThaiShortDate().ToThaiNumber() }).ToList(), //positionName = profileLeave.PositionName, approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport08(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave17"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave17", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leaveSalary = data.LeaveSalary == null ? "" : data.LeaveSalary.Value.ToNumericText().ToThaiNumber(), leaveSalaryText = data.LeaveSalaryText.ToThaiNumber(), coupleDayName = data.CoupleDayName.ToThaiNumber(), coupleDayLevel = data.CoupleDayLevel.ToThaiNumber(), coupleDayPosition = data.CoupleDayPosition.ToThaiNumber(), coupleDayOrganizationName = "-", coupleDayLevelCountry = data.CoupleDayLevelCountry.ToThaiNumber(), coupleDayCountryHistory = data.CoupleDayCountryHistory == null ? "-" : data.CoupleDayCountryHistory!.ToThaiNumber() ?? "", coupleDayTotalHistory = data.CoupleDayTotalHistory == null ? "-" : data.CoupleDayTotalHistory!.ToThaiNumber(), coupleDayStartDateHistory = data.CoupleDayStartDateHistory == null ? "-" : data.CoupleDayStartDateHistory.Value.Date.ToThaiShortDate().ToThaiNumber(), coupleDayEndDateHistory = data.CoupleDayEndDateHistory == null ? "-" : data.CoupleDayEndDateHistory.Value.Date.ToThaiShortDate().ToThaiNumber(), coupleDaySumTotalHistory = data.CoupleDaySumTotalHistory == null ? "-" : data.CoupleDaySumTotalHistory!.ToThaiNumber(), leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), LeaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), //data.LeaveStartDate.DiffDay(data.LeaveEndDate).ToString().ToThaiNumber(), approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } private async Task GetReport09(LeaveRequest data) { //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} //var profileLeave = await _userProfileRepository.GetProfileLeaveByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profileLeave == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave18"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); return new { template = "leave18", reportName = $"leave_form", data = new { leaveWrote = data.LeaveWrote.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, leaveSubTypeName = data.LeaveSubTypeName != null ? data.LeaveSubTypeName.ToThaiNumber() : "", dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), profileType = profile.ProfileType, birthDate = profile.BirthDate.ToThaiShortDate().ToThaiNumber(), retireDate = profile.RetireDate.ToThaiShortDate().ToThaiNumber(), govAge = profile.GovAge.ToThaiNumber(), age = profile.Age.ToThaiNumber(), dateAppoint = profile.DateAppoint.ToThaiShortDate().ToThaiNumber(), dateCurrent = profile.DateCurrent.ToThaiShortDate().ToThaiNumber(), amount = ((double)profile.Amount).ToNumericText().ToThaiNumber(), telephoneNumber = profile.TelephoneNumber == null ? "" : profile.TelephoneNumber.ToThaiNumber(), posLevel = profile.PosLevel.ToThaiNumber(), posType = profile.PosType.ToThaiNumber(), currentAddress = profile.CurrentAddress.ToThaiNumber(), oc = profile.Oc.ToThaiNumber(), root = profile.Root.ToThaiNumber(), child1 = profile.Child1 == null ? "" : profile.Child1!.ToThaiNumber(), child2 = profile.Child2 == null ? "" : profile.Child2!.ToThaiNumber(), child3 = profile.Child3 == null ? "" : profile.Child3!.ToThaiNumber(), child4 = profile.Child4 == null ? "" : profile.Child4!.ToThaiNumber(), positions = profile.Positions.Select(x => new { positionName = x.PositionName == null ? "" : x.PositionName.ToThaiNumber(), dateStart = x.DateStart.ToThaiShortDate().ToThaiNumber(), dateEnd = x.DateEnd.ToThaiShortDate().ToThaiNumber(), positionType = x.PositionType == null ? "" : x.PositionType.ToThaiNumber(), positionLevel = x.PositionLevel == null ? "" : x.PositionLevel.ToThaiNumber(), orgRoot = x.OrgRoot == null ? "" : x.OrgRoot.ToThaiNumber(), orgChild1 = x.OrgChild1 == null ? "" : x.OrgChild1.ToThaiNumber(), orgChild2 = x.OrgChild2 == null ? "" : x.OrgChild2.ToThaiNumber(), orgChild3 = x.OrgChild3 == null ? "" : x.OrgChild3.ToThaiNumber(), orgChild4 = x.OrgChild4 == null ? "" : x.OrgChild4.ToThaiNumber(), }).ToList(), educations = profile.Educations.Select(x => new { educationLevel = x.EducationLevel == null ? "" : x.EducationLevel.ToThaiNumber(), institute = x.Institute == null ? "" : x.Institute.ToThaiNumber(), country = x.Country == null ? "" : x.Country.ToThaiNumber(), finishDate = x.FinishDate == null ? "-" : x.FinishDate.Value.ToThaiShortDate().ToThaiNumber() }).ToList(), Type1 = profile.ProfileType == "OFFICER" ? "🗹" : "☐", Type2 = profile.ProfileType != "OFFICER" ? "🗹" : "☐", approve = approveResult, leaveStatus = data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveStatus != null && data.LeaveStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; } #endregion /// /// LV2_033 - รายงานการลา /// /// รหัสของรายการขอลา /// เป็นการแสดงรายงานการขอลาไปพิธีอัจย์หรือไม่? /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetReport(Guid id, [FromQuery] bool hajj = false) { try { var data = await _leaveRequestRepository.GetByIdAsync(id); if (data == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } dynamic result = new { }; switch (data.Type.Code.Trim().ToUpper()) { case "LV-001": case "LV-002": case "LV-003": { result = await GetReport01(data); break; } case "LV-004": { result = await GetReport02(data); break; } case "LV-005": { result = await GetReport03(data); break; } case "LV-006": { result = await GetReport04(data, hajj); break; } case "LV-007": { result = await GetReport05(data); break; } case "LV-008": { result = await GetReport06(data); break; } case "LV-009": { result = await GetReport07(data); break; } case "LV-010": { result = await GetReport08(data); break; } case "LV-011": { result = await GetReport09(data); break; } } return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_034 - รายงานการยกเลิกการลา /// /// รหัสของรายการขอลา /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("reject/{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetCancelReport(Guid id) { try { var data = await _leaveRequestRepository.GetByIdAsync(id); if (data == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } //var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken); //if (profile == null) //{ // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); //} var profile = await _userProfileRepository.GetProfileLeaveReportByKeycloakIdAsync(data.KeycloakUserId, AccessToken, "leave9"); if (profile == null) { return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); } var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}"; //var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty, AccessToken); //var approver = string.Empty; //if (rootOc != null) //{ // var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty); // if (list.Count > 0) // approver = list.First().Name; //} var Oc = profile.isCommission == false ? profile.Oc.ToThaiNumber() : profile.Oc.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber(); var approveResult = await GetApproverData(data.Approvers); var result = new { template = "แบบใบขอยกเลิกวันลา", reportName = $"leave_cancel_form", data = new { leaveWrote = data.CancelLeaveWrote!.ToThaiNumber() ?? "", dateSendLeave = data.CreatedAt.Date.ToThaiShortDate().ToThaiNumber(), leaveTypeName = data.Type.Name, fullname = fullName, position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position, positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? string.IsNullOrEmpty(profile.PosExecutiveName) ? string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position : profile.PosExecutiveName : string.IsNullOrEmpty(profile.Position) ? "-" : string.IsNullOrEmpty(profile.PositionLeaveName) ? profile.Position : $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(), positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(), posExecutiveName = profile.PosExecutiveName, organizationName = profile!.Oc!.ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) && (profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร")) ? new[] { Oc } : !string.IsNullOrEmpty(profile.PosExecutiveName) ? new[] { profile.PosExecutiveName.ToThaiNumber(), Oc } : new[] { Oc }, leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(), leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(), dear = data.CommanderPosition == null ? data.Dear : data.CommanderPosition.ToThaiNumber(), leaveTotal = data.LeaveTotal.ToString().ToThaiNumber(), profileType = data.ProfileType, leaveReasonDelete = data.LeaveCancelComment == null ? "" : data.LeaveCancelComment!.ToThaiNumber(), leaveDetail = data.LeaveDetail.ToThaiNumber(), Type1 = profile.ProfileType == "OFFICER" ? "🗹" : "☐", Type2 = profile.ProfileType != "OFFICER" ? "🗹" : "☐", Type3 = "☐", approve = approveResult, approverComment = !string.IsNullOrEmpty(data.LeaveDirectorComment) ? data.LeaveDirectorComment.Replace("\r", "").Replace("\n", "").Trim().ToThaiNumber() : "......................", approverUpdatedAt = data.LastUpdatedAt.HasValue ? data.LastUpdatedAt.Value.ToThaiShortDate().ToThaiNumber() : "...... /...... /......", leaveStatus = data.LeaveCancelStatus != null && data.LeaveCancelStatus!.ToUpper() == "APPROVE" ? "🗹 อนุญาต ☐ ไม่อนุญาต" : data.LeaveCancelStatus != null && data.LeaveCancelStatus!.ToUpper() == "REJECT" ? "☐ อนุญาต 🗹 ไม่อนุญาต" : "☐ อนุญาต ☐ ไม่อนุญาต" } }; return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_035 - รายงานสำหรับการลางานของข้าราชการ-กรุงเทพมหานครสามัญ และลูกจ้างประจำกรุงเทพมหานคร /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("leaveday/{type}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetLeaveDayReport([FromBody] GetLeaveDetailByNodeReportDto req, string type) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var profile = new List(); 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; } if (type.Trim().ToUpper() == "OFFICER") { profile = await _userProfileRepository.GetProfileByAdminRolev4(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } else { profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } // get leave day var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); var leaveTypes = await _leaveTypeRepository.GetAllAsync(); var count = 1; var employees = new List(); // กรองตามที่ fe ส่งมา if ((role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "PARENT" || role == "BROTHER") /*&& req.node > profileAdmin?.Node*/) { profile = profile .Where(x => req.node == 4 ? x.OrgChild4Id == req.nodeId : req.node == 3 ? x.OrgChild3Id == req.nodeId : req.node == 2 ? x.OrgChild2Id == req.nodeId : req.node == 1 ? x.OrgChild1Id == req.nodeId : req.node == 0 ? x.OrgRootId == req.nodeId : true) .ToList(); } var reportType = req!.Type!.Trim().ToUpper(); var year = req.EndDate.Year; var profileList = profile.Select(x => new ProfileData { Id = x.Id, Prefix = x.Prefix ?? "", FirstName = x.FirstName ?? "", LastName = x.LastName ?? "", DateStart = x.DateStart ?? x.DateAppoint, DateAppoint = x.DateAppoint, }).Distinct().ToList(); var beginningData = await _leaveBeginningRepository.GetAllByYearAsync(year); // sum all user //var sickDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-001")?.Id ?? Guid.Empty, profileList!); //var personalDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-002")?.Id ?? Guid.Empty, profileList!); //var maternityDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-003")?.Id ?? Guid.Empty, profileList!); //var wifeDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-004")?.Id ?? Guid.Empty, profileList!); //var restDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-005")?.Id ?? Guid.Empty, profileList!); //var ordainDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-006")?.Id ?? Guid.Empty, profileList!); //var absentDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-007")?.Id ?? Guid.Empty, profileList!); //var studyDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-008")?.Id ?? Guid.Empty, profileList!); //var agencyDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-009")?.Id ?? Guid.Empty, profileList!); //var coupleDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-010")?.Id ?? Guid.Empty, profileList!); //var therapyDaySumALL = await _leaveBeginningRepository.GetAllByYearAndTypeAsync(year, leaveTypes.FirstOrDefault(x => x.Code == "LV-011")?.Id ?? Guid.Empty, profileList!); foreach (var p in profile) { var keycloakUserId = p.Keycloak ?? Guid.Empty; if (reportType == "FULL") { var sickDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-001"); var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); var sickDayCount = sickDaySum != null ? sickDaySum.LeaveDaysUsed : 0; var sickCount = sickDaySum != null ? sickDaySum.LeaveCount : 0; var personalDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-002"); var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); var personalDayCount = personalDaySum != null ? personalDaySum.LeaveDaysUsed : 0; var personalCount = personalDaySum != null ? personalDaySum.LeaveCount : 0; var maternityDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-003"); var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); var maternityDayCount = maternityDaySum != null ? maternityDaySum.LeaveDaysUsed : 0; var maternityCount = maternityDaySum != null ? maternityDaySum.LeaveCount : 0; var wifeDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-004"); var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); var wifeDayCount = wifeDaySum != null ? wifeDaySum.LeaveDaysUsed : 0; var wifeCount = wifeDaySum != null ? wifeDaySum.LeaveCount : 0; var restDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-005"); var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); var restDayCount = restDaySum != null ? restDaySum.LeaveDaysUsed : 0; var restCount = restDaySum != null ? restDaySum.LeaveCount : 0; var ordainDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-006"); var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); var ordainDayCount = ordainDaySum != null ? ordainDaySum.LeaveDaysUsed : 0; var ordainCount = ordainDaySum != null ? ordainDaySum.LeaveCount : 0; var absentDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-007"); var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007"); var absentDayCount = absentDaySum != null ? absentDaySum.LeaveDaysUsed : 0; var absentCount = absentDaySum != null ? absentDaySum.LeaveCount : 0; var studyDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-008"); var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008"); var studyDayCount = studyDaySum != null ? studyDaySum.LeaveDaysUsed : 0; var studyCount = studyDaySum != null ? studyDaySum.LeaveCount : 0; var agencyDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-009"); var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009"); var agencyDayCount = agencyDaySum != null ? agencyDaySum.LeaveDaysUsed : 0; var agencyCount = agencyDaySum != null ? agencyDaySum.LeaveCount : 0; var coupleDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-010"); var coupleDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-010"); var coupleDayCount = coupleDaySum != null ? coupleDaySum.LeaveDaysUsed : 0; var coupleCount = coupleDaySum != null ? coupleDaySum.LeaveCount : 0; var therapyDaySum = beginningData.FirstOrDefault(x => x.ProfileId == p.Id && x.LeaveType.Code == "LV-011"); var therapyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-011"); var therapyDayCount = therapyDaySum != null ? therapyDaySum.LeaveDaysUsed : 0; var therapyCount = therapyDaySum != null ? therapyDaySum.LeaveCount : 0; var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, req.StartDate, req.EndDate); var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); } //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? defaultRound; /* var processTimeStamps = timeStamps .Select(d => new { d.Id, CheckInStatus = DateTime.Parse(d.CheckIn.ToString("yyyy-MM-dd HH:mm")) > DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.StartTimeMorning}") ? "LATE" : "NORMAL", CheckOutStatus = d.CheckOut == null ? "" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}") ? "LATE" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeMorning}") ? "ABSENT" : "NORMAL", });*/ /*var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE");*/ var absentCount1 = timeStamps.Count(d => d.CheckOutStatus == "ABSENT" || d.CheckInStatus == "ABSENT"); // นับจำนวนที่มี CheckOutStatus == "ABSENT" var lateCount1 = timeStamps.Count(d => d.CheckInStatus == "LATE"); // นับจำนวนที่มี CheckInStatus == "LATE" var emp = new { no = count, fullName = $"{p.Prefix}{p.FirstName} {p.LastName}", position = p.Position == null ? "" : p.Position, positionLevel = p.PositionLevel == null ? "" : p.PositionLevel, posNo = p.PosNo == null ? "" : p.PosNo, reason = "", sickDayCount = sickDayCount, maternityDayCount = maternityDayCount, wifeDayCount = wifeDayCount, personalDayCount = personalDayCount, restDayCount = restDayCount, ordainDayCount = ordainDayCount, absentDayCount = absentDayCount, studyDayCount = studyDayCount, agencyDayCount = agencyDayCount, coupleDayCount = coupleDayCount, therapyDayCount = therapyDayCount, absentTotal = absentCount1, lateTotal = lateCount1, sickCount = sickCount, maternityCount = maternityCount, wifeCount = wifeCount, personalCount = personalCount, restCount = restCount, ordainCount = ordainCount, absentCount = absentCount, studyCount = studyCount, agencyCount = agencyCount, coupleCount = coupleCount, therapyCount = therapyCount, leaveTotal = sickCount + maternityCount + wifeCount + personalCount + restCount + ordainCount + absentCount + studyCount + agencyCount + coupleCount + therapyCount }; employees.Add(emp); count++; } else { var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0; var sickCount = sickDay != null ? sickDay.CountLeaveDay : 0; var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0; var personalCount = personalDay != null ? personalDay.CountLeaveDay : 0; var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0; var maternityCount = maternityDay != null ? maternityDay.CountLeaveDay : 0; var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0; var wifeCount = wifeDay != null ? wifeDay.CountLeaveDay : 0; var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); var restDayCount = restDay != null ? restDay.SumLeaveDay : 0; var restCount = restDay != null ? restDay.CountLeaveDay : 0; var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0; var ordainCount = ordainDay != null ? ordainDay.CountLeaveDay : 0; var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007"); var absentDayCount = absentDay != null ? absentDay.SumLeaveDay : 0; var absentCount = absentDay != null ? absentDay.CountLeaveDay : 0; var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008"); var studyDayCount = studyDay != null ? studyDay.SumLeaveDay : 0; var studyCount = studyDay != null ? studyDay.CountLeaveDay : 0; var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009"); var agencyDayCount = agencyDay != null ? agencyDay.SumLeaveDay : 0; var agencyCount = agencyDay != null ? agencyDay.CountLeaveDay : 0; var coupleDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-010"); var coupleDayCount = coupleDay != null ? coupleDay.SumLeaveDay : 0; var coupleCount = coupleDay != null ? coupleDay.CountLeaveDay : 0; var therapyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-011"); var therapyDayCount = therapyDay != null ? therapyDay.SumLeaveDay : 0; var therapyCount = therapyDay != null ? therapyDay.CountLeaveDay : 0; var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, req.StartDate, req.EndDate); var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); } //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? defaultRound; /* var processTimeStamps = timeStamps .Select(d => new { d.Id, CheckInStatus = DateTime.Parse(d.CheckIn.ToString("yyyy-MM-dd HH:mm")) > DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.StartTimeMorning}") ? "LATE" : "NORMAL", CheckOutStatus = d.CheckOut == null ? "" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}") ? "LATE" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeMorning}") ? "ABSENT" : "NORMAL", });*/ /*var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE");*/ var absentCount2 = timeStamps.Count(d => d.CheckOutStatus == "ABSENT" || d.CheckInStatus == "ABSENT"); // นับจำนวนที่มี CheckOutStatus == "ABSENT" var lateCount2 = timeStamps.Count(d => d.CheckInStatus == "LATE"); // นับจำนวนที่มี CheckInStatus == "LATE" var emp = new { no = count, fullName = $"{p.Prefix}{p.FirstName} {p.LastName}", position = p.Position == null ? "" : p.Position, positionLevel = p.PositionLevel == null ? "" : p.PositionLevel, posNo = p.PosNo == null ? "" : p.PosNo, reason = "", sickDayCount = sickDayCount, maternityDayCount = maternityDayCount, wifeDayCount = wifeDayCount, personalDayCount = personalDayCount, restDayCount = restDayCount, ordainDayCount = ordainDayCount, absentDayCount = absentDayCount, studyDayCount = studyDayCount, agencyDayCount = agencyDayCount, coupleDayCount = coupleDayCount, therapyDayCount = therapyDayCount, absentTotal = absentCount2, lateTotal = lateCount2, sickCount = sickCount, maternityCount = maternityCount, wifeCount = wifeCount, personalCount = personalCount, restCount = restCount, ordainCount = ordainCount, absentCount = absentCount, studyCount = studyCount, agencyCount = agencyCount, coupleCount = coupleCount, therapyCount = therapyCount, leaveTotal = sickCount + maternityCount + wifeCount + personalCount + restCount + ordainCount + absentCount + studyCount + agencyCount + coupleCount + therapyCount }; employees.Add(emp); count++; } } var leaveTitleType = ""; if (req.Type.Trim().ToUpper() == "FULL") { leaveTitleType = "หนึ่งปี"; } else if (req.Type.Trim().ToUpper() == "HAFT") { leaveTitleType = "ครึ่งปี"; } else if (req.Type.Trim().ToUpper() == "MONTH") { leaveTitleType = "หนึ่งเดือน"; } var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate().ToThaiNumber()}"; var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken); var organizationName = $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}"; var result = new { template = "LeaveYear-Officer", reportName = "LeaveYear-Officer", data = new { dateTimeStamp = $"วันที่ {req.StartDate.Date.ToThaiShortDate().ToThaiNumber()}{enddate}", //organizationName = profile?.FirstOrDefault()?.Oc ?? "", organizationName = organizationName, headerText = type.Trim().ToUpper() == "OFFICER" ? "ข้าราชการสามัญ" : "ลูกจ้างประจำ", leaveTitleType = leaveTitleType, employees = employees, } }; return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_035 - รายงานสำหรับการลางานของข้าราชการ-กรุงเทพมหานครสามัญ และลูกจ้างประจำกรุงเทพมหานคร /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("leavedayRetire")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetLeaveDayRetireReport([FromBody] GetLeaveDetailByNodeReportDto req) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_SALARY_OFFICER"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var profile = new List(); profile = await _userProfileRepository.GetProfileWithKeycloakAllOfficerRetireFilterAndRevisionAndDate(AccessToken, req.node, req.nodeId, jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD" || jsonData["result"] == "BROTHER", req.isRetirement ?? true, req.revisionId, req.StartDate, req.EndDate); // get leave day var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); var leaveTypes = await _leaveTypeRepository.GetAllAsync(); var count = 1; var employees = new List(); foreach (var p in profile) { var keycloakUserId = p.Keycloak ?? Guid.Empty; var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0; var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0; var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0; var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0; var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); var restDayCount = restDay != null ? restDay.SumLeaveDay : 0; var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0; var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007"); var absentDayCount = absentDay != null ? absentDay.SumLeaveDay : 0; var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008"); var studyDayCount = studyDay != null ? studyDay.SumLeaveDay : 0; var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009"); var agencyDayCount = agencyDay != null ? agencyDay.SumLeaveDay : 0; var coupleDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-010"); var coupleDayCount = coupleDay != null ? coupleDay.SumLeaveDay : 0; var therapyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-011"); var therapyDayCount = therapyDay != null ? therapyDay.SumLeaveDay : 0; var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, req.StartDate, req.EndDate); var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); } //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? defaultRound; /* var processTimeStamps = timeStamps .Select(d => new { d.Id, CheckInStatus = DateTime.Parse(d.CheckIn.ToString("yyyy-MM-dd HH:mm")) > DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.StartTimeMorning}") ? "LATE" : "NORMAL", CheckOutStatus = d.CheckOut == null ? "" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}") ? "LATE" : DateTime.Parse(d.CheckOut.Value.ToString("yyyy-MM-dd HH:mm")) < DateTime.Parse($"{d.CheckIn.Date.ToString("yyyy-MM-dd")} {duty.EndTimeMorning}") ? "ABSENT" : "NORMAL", }); var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE");*/ var absentCount = timeStamps.Count(d => d.CheckOutStatus == "ABSENT"); // นับจำนวนที่มี CheckOutStatus == "ABSENT" var lateCount = timeStamps.Count(d => d.CheckInStatus == "LATE"); // นับจำนวนที่มี CheckInStatus == "LATE" var emp = new { no = count, fullName = $"{p.Prefix}{p.FirstName} {p.LastName}", position = p.Position == null ? "" : p.Position, positionLevel = p.PositionLevel == null ? "" : p.PositionLevel, posNo = p.PosNo == null ? "" : p.PosNo, reason = "", sickDayCount = sickDayCount, maternityDayCount = maternityDayCount, wifeDayCount = wifeDayCount, personalDayCount = personalDayCount, restDayCount = restDayCount, ordainDayCount = ordainDayCount, absentDayCount = absentDayCount, studyDayCount = studyDayCount, agencyDayCount = agencyDayCount, coupleDayCount = coupleDayCount, therapyDayCount = therapyDayCount, absentTotal = absentCount, lateTotal = lateCount, leaveTotal = sickDayCount + maternityDayCount + wifeDayCount + personalDayCount + restDayCount + ordainDayCount + absentDayCount + studyDayCount + agencyDayCount + coupleDayCount + therapyDayCount }; employees.Add(emp); count++; } var leaveTitleType = ""; if (req.Type.Trim().ToUpper() == "FULL") { leaveTitleType = "หนึ่งปี"; } else if (req.Type.Trim().ToUpper() == "HAFT") { leaveTitleType = "ครึ่งปี"; } else if (req.Type.Trim().ToUpper() == "MONTH") { leaveTitleType = "หนึ่งเดือน"; } var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate().ToThaiNumber()}"; var result = new { template = "LeaveYear-OfficerRetire", reportName = "LeaveYear-OfficerRetire", data = new { dateTimeStamp = $"วันที่ {req.StartDate.Date.ToThaiShortDate().ToThaiNumber()}{enddate}", organizationName = profile?.FirstOrDefault()?.Oc ?? "", headerText = "ข้าราชการสามัญ", leaveTitleType = leaveTitleType, employees = employees, } }; return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("time-records/{type}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetTimeRecordsOfficerReport([FromBody] GetLeaveDetailByNodeReportDto req, string type) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var profile = new List(); 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; } if (type.Trim().ToUpper() == "OFFICER") { profile = await _userProfileRepository.GetProfileByAdminRolev4(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } else { profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } var date = req.StartDate.Date; var holidays = await _holidayRepository.GetHolidayAsync(req.StartDate.Date, req.EndDate.Date); var weekend = _holidayRepository.GetWeekEnd(req.StartDate.Date, req.EndDate.Date); var excludeDates = holidays.Union(weekend).ToList(); var dateList = new List(); for (DateTime i = req.StartDate.Date; i <= req.EndDate.Date; i = i.AddDays(1)) { //if (excludeDates.Contains(i)) //{ // dateList.Add(new LoopDate // { // date = i, // isHoliday = true, // }); //} if (holidays.Contains(i)) { var d = await _holidayRepository.GetHolidayAsync(i); dateList.Add(new LoopDate { date = i, isHoliday = true, isWeekEnd = false, dateRemark = d }); } else if (weekend.Contains(i)) { dateList.Add(new LoopDate { date = i, isHoliday = true, isWeekEnd = false, dateRemark = "วันหยุด" }); } else { dateList.Add(new LoopDate { date = i, isHoliday = false, isWeekEnd = false, dateRemark = "" }); } } var employees = new List(); var count = 1; var restTotal = 0; var sickTotal = 0; var lateTotal = 0; var wfhTotal = 0; var studyTotal = 0; var workTotal = 0; var seminarTotal = 0; // กรองตามที่ fe ส่งมา if ((role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "PARENT" || role == "BROTHER") /*&& req.node > profileAdmin?.Node*/) { profile = profile .Where(x => req.node == 4 ? x.OrgChild4Id == req.nodeId : req.node == 3 ? x.OrgChild3Id == req.nodeId : req.node == 2 ? x.OrgChild2Id == req.nodeId : req.node == 1 ? x.OrgChild1Id == req.nodeId : req.node == 0 ? x.OrgRootId == req.nodeId : true) .ToList(); } var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); } foreach (var dd in dateList) { foreach (var p in profile) { var keycloakUserId = p.Keycloak ?? Guid.Empty; var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date); var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}"; // _userProfileRepository.GetUserFullName(keycloakUserId, AccessToken); //var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); //if (defaultRound == null) //{ // return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); //} // ให้ใช้วันที่จาก loop date แทน var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id, dd.date); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? defaultRound; // check วันลาของแต่ละคน var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date); var remarkStr = string.Empty; if (leaveReq != null) { switch (leaveReq.Type.Code.ToUpper()) { case "LV-001": case "LV-002": case "LV-005": remarkStr += leaveReq.Type.Name; var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper(); if(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date) { if (leaveRange == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRange == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; // var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); // if (leaveRangeEnd == "MORNING") // remarkStr += "ครึ่งวันเช้า"; // else if (leaveRangeEnd == "AFTERNOON") // remarkStr += "ครึ่งวันบ่าย"; var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); if (leaveRange != leaveRangeEnd) { if (leaveRangeEnd == "MORNING") remarkStr += " - ครึ่งวันเช้า"; else if (leaveRangeEnd == "AFTERNOON") remarkStr += " - ครึ่งวันบ่าย"; } } else { if(dd.date == leaveReq.LeaveStartDate.Date) { if (leaveRange == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRange == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; } else if(dd.date == leaveReq.LeaveEndDate.Date) { var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); if (leaveRangeEnd == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRangeEnd == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; } else { remarkStr += "เต็มวัน"; } } // if (leaveRange == "MORNING") // remarkStr += "ครึ่งวันเช้า"; // else if (leaveRange == "AFTERNOON") // remarkStr += "ครึ่งวันบ่าย"; // var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); // if (leaveRange != leaveRangeEnd) // { // if (leaveRangeEnd == "MORNING") // remarkStr += " - ครึ่งวันเช้า"; // else if (leaveRangeEnd == "AFTERNOON") // remarkStr += " - ครึ่งวันบ่าย"; // } break; default: remarkStr += leaveReq.Type.Name; break; } } else { if (timeStamps == null) { if (dd.date <= DateTime.Now.Date) { remarkStr = "ขาดราชการ"; if (dd.isHoliday == true) { remarkStr = $"วันหยุด ({dd.dateRemark})"; } else if (dd.isWeekEnd) { remarkStr = dd.dateRemark; } } else remarkStr = ""; } else { // check status ของการลงเวลา if (timeStamps.CheckOut != null) { if (timeStamps.CheckOutStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "LATE") { remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); lateTotal += 1; } else remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : ""; //remarkStr = ""; } else { if (timeStamps.CheckInStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "LATE") { remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); lateTotal += 1; } else //remarkStr = ""; remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : ""; } } } var emp = new DateResultReport { no = count, fullName = fullName, dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.", checkInLocation = timeStamps == null ? "" : timeStamps.CheckInPOI, checkInTime = timeStamps == null ? "" : $"{timeStamps.CheckIn.ToString("HH:mm")} น.", checkOutLocation = timeStamps == null ? "" : timeStamps.CheckOutPOI ?? "", checkOutTime = timeStamps == null ? "" : timeStamps.CheckOut != null ? $"{timeStamps.CheckOut.Value.ToString("HH:mm")} น." : "", remark = remarkStr, checkInDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() : timeStamps.CheckIn.Date.ToThaiFullDate2(), checkedOutDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() : timeStamps.CheckOut != null ? timeStamps.CheckOut.Value.ToThaiFullDate2() : "", checkInTimeRaw = timeStamps?.CheckIn, checkOutTimeRaw = timeStamps?.CheckOut, }; if (timeStamps != null) { workTotal += 1; if (!timeStamps.IsLocationCheckIn) { if (timeStamps.CheckInLocationName == "ปฏิบัติงานที่บ้าน") wfhTotal += 1; else if (timeStamps.CheckInLocationName == "ไปประชุม / อบรม / สัมมนา") seminarTotal += 1; } } if (leaveReq != null) { switch (leaveReq.Type.Code.ToUpper()) { case "LV-001": case "LV-002": sickTotal += 1; break; case "LV-005": restTotal += 1; break; case "LV-008": studyTotal += 1; break; } } employees.Add(emp); count++; } } employees = employees.OrderBy(x => x.checkInDate).ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue).ToList(); for (int i = 0; i < employees.Count; i++) { employees[i].no = i + 1; } var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate()}"; var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken); var organizationName = $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}"; var item = new { dateTimeStamp = $"ณ วัน{req.StartDate.Date.GetThaiDayOfWeek()} ที่ {req.StartDate.Date.ToThaiShortDate()}{enddate}", //organizationName = profile?.FirstOrDefault()?.Oc ?? "", organizationName = organizationName, officerTotal = profile?.Count, workTotal = workTotal, restTotal = restTotal, sickTotal = sickTotal, lateTotal = lateTotal, wfhTotal = wfhTotal, seminarTotal = seminarTotal, studyTotal = studyTotal, type = type.Trim().ToUpper() == "OFFICER" ? "ข้าราชการทั้งหมด" : "ลูกจ้างประจำทั้งหมด", employees = employees }; //วันที่ออก var result = new { template = "TimeStamp", reportName = "TimeStamp", data = item, }; return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("download/time-records/{type}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetTimeRecordsNewOfficerReport([FromBody] GetLeaveDetailByNodeReportDto req, string type) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_WORK_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var profile = new List(); 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; } if (type.Trim().ToUpper() == "OFFICER") { profile = await _userProfileRepository.GetProfileByAdminRolev4(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } else { profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date); } // Child กรองตามที่ fe ส่งมาอีกชั้น if ((role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "PARENT" || role == "BROTHER") /*&& req.node > profileAdmin?.Node*/) { profile = profile .Where(x => req.node == 4 ? x.OrgChild4Id == req.nodeId : req.node == 3 ? x.OrgChild3Id == req.nodeId : req.node == 2 ? x.OrgChild2Id == req.nodeId : req.node == 1 ? x.OrgChild1Id == req.nodeId : req.node == 0 ? x.OrgRootId == req.nodeId : true) .ToList(); } var date = req.StartDate.Date; var holidays = await _holidayRepository.GetHolidayAsync(req.StartDate.Date, req.EndDate.Date); var weekend = _holidayRepository.GetWeekEnd(req.StartDate.Date, req.EndDate.Date); var excludeDates = holidays.Union(weekend).ToList(); var dateList = new List(); for (DateTime i = req.StartDate.Date; i <= req.EndDate.Date; i = i.AddDays(1)) { if (holidays.Contains(i)) { var d = await _holidayRepository.GetHolidayAsync(i); dateList.Add(new LoopDate { date = i, isHoliday = true, isWeekEnd = false, dateRemark = d }); } else if (weekend.Contains(i)) { dateList.Add(new LoopDate { date = i, isHoliday = true, isWeekEnd = false, dateRemark = "วันหยุด" }); } else { dateList.Add(new LoopDate { date = i, isHoliday = false, isWeekEnd = false, dateRemark = "" }); } } var employees = new List(); var count = 1; var restTotal = 0; var sickTotal = 0; var lateTotal = 0; var wfhTotal = 0; var studyTotal = 0; var workTotal = 0; var seminarTotal = 0; var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); } foreach (var dd in dateList) { foreach (var p in profile) { var keycloakUserId = p.Keycloak ?? Guid.Empty; var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date); var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}"; var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id, dd.date); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? defaultRound; // check วันลาของแต่ละคน var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date); var remarkStr = string.Empty; if (leaveReq != null) { switch (leaveReq.Type.Code.ToUpper()) { case "LV-001": case "LV-002": case "LV-005": remarkStr += leaveReq.Type.Name; var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper(); if(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date) { if (leaveRange == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRange == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; // var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); // if (leaveRangeEnd == "MORNING") // remarkStr += "ครึ่งวันเช้า"; // else if (leaveRangeEnd == "AFTERNOON") // remarkStr += "ครึ่งวันบ่าย"; var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); if (leaveRange != leaveRangeEnd) { if (leaveRangeEnd == "MORNING") remarkStr += " - ครึ่งวันเช้า"; else if (leaveRangeEnd == "AFTERNOON") remarkStr += " - ครึ่งวันบ่าย"; } } else { if(dd.date == leaveReq.LeaveStartDate.Date) { if (leaveRange == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRange == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; } else if(dd.date == leaveReq.LeaveEndDate.Date) { var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); if (leaveRangeEnd == "MORNING") remarkStr += "ครึ่งวันเช้า"; else if (leaveRangeEnd == "AFTERNOON") remarkStr += "ครึ่งวันบ่าย"; } else { remarkStr += "เต็มวัน"; } } // if (leaveRange == "MORNING") // remarkStr += "ครึ่งวันเช้า"; // else if (leaveRange == "AFTERNOON") // remarkStr += "ครึ่งวันบ่าย"; // // var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); // // if (leaveRangeEnd == "MORNING") // // remarkStr += "ครึ่งวันเช้า"; // // else if (leaveRangeEnd == "AFTERNOON") // // remarkStr += "ครึ่งวันบ่าย"; // var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper(); // if (leaveRange != leaveRangeEnd) // { // if (leaveRangeEnd == "MORNING") // remarkStr += " - ครึ่งวันเช้า"; // else if (leaveRangeEnd == "AFTERNOON") // remarkStr += " - ครึ่งวันบ่าย"; // } break; default: remarkStr += leaveReq.Type.Name; break; } } else { if (timeStamps == null) { if (dd.date <= DateTime.Now.Date) { remarkStr = "ขาดราชการ"; if (dd.isHoliday == true) { remarkStr = $"วันหยุด ({dd.dateRemark})"; } else if (dd.isWeekEnd) { remarkStr = dd.dateRemark; } } else remarkStr = ""; } else { // check status ของการลงเวลา if (timeStamps.CheckOut != null) { if (timeStamps.CheckOutStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "LATE") { remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); lateTotal += 1; } else remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : ""; } else { if (timeStamps.CheckInStatus == "ABSENT") remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); else if (timeStamps.CheckInStatus == "LATE") { remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : ""); lateTotal += 1; } else remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : ""; } } } var emp = new DateResultReport { no = count, fullName = fullName, dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.", checkInLocation = timeStamps == null ? "" : timeStamps.CheckInPOI, checkInTime = timeStamps == null ? "" : $"{timeStamps.CheckIn.ToString("HH:mm")} น.", checkOutLocation = timeStamps == null ? "" : timeStamps.CheckOutPOI ?? "", checkOutTime = timeStamps == null ? "" : timeStamps.CheckOut != null ? $"{timeStamps.CheckOut.Value.ToString("HH:mm")} น." : "", remark = remarkStr, checkInDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() : timeStamps.CheckIn.Date.ToThaiFullDate2(), checkedOutDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() : timeStamps.CheckOut != null ? timeStamps.CheckOut.Value.ToThaiFullDate2() : "", checkInTimeRaw = timeStamps == null ? dd.date.Date : timeStamps?.CheckIn, checkOutTimeRaw = timeStamps == null ? dd.date.Date : timeStamps?.CheckOut != null ? timeStamps?.CheckOut : null, }; if (timeStamps != null) { workTotal += 1; if (!timeStamps.IsLocationCheckIn) { if (timeStamps.CheckInLocationName == "ปฏิบัติงานที่บ้าน") wfhTotal += 1; else if (timeStamps.CheckInLocationName == "ไปประชุม / อบรม / สัมมนา") seminarTotal += 1; } } if (leaveReq != null) { switch (leaveReq.Type.Code.ToUpper()) { case "LV-001": case "LV-002": sickTotal += 1; break; case "LV-005": restTotal += 1; break; case "LV-008": studyTotal += 1; break; } } employees.Add(emp); count++; } } //employees = employees.OrderBy(x => x.checkInDate).ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue).ToList(); employees = employees .OrderBy(x => x.checkInTime.Trim() != "" ? 0 : 1) // เรียงตามวันที่ลงเวลา .ThenBy(x => x.remark.Trim() == "" ? 0 : 1) // ข้อมูลที่ไม่มี remark ให้ขึ้นก่อน .ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue) .ThenBy(x => x.remark) // จากนั้นจัดเรียงตาม remark .ToList(); for (int i = 0; i < employees.Count; i++) { employees[i].no = i + 1; } var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate()}"; var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken); var organizationName = org == null ? "" : $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}"; var dateTimeStamp = $"ประจำ ณ วัน{req.StartDate.Date.GetThaiDayOfWeek()} ที่ {req.StartDate.Date.ToThaiShortDate()}{enddate}"; var templatePath = Path.Combine(_hostingEnvironment.ContentRootPath, "Reports", "TimeStampRecords.xlsx"); byte[] templateBytes = System.IO.File.ReadAllBytes(templatePath); using (var stream = new MemoryStream(templateBytes)) using (var package = new ExcelPackage(stream)) { var worksheet = package.Workbook.Worksheets["Sheet1"] ?? package.Workbook.Worksheets[0]; // กำหนดให้ใช้ฟอนต์ TH SarabunPSK ซึ่งเป็นฟอนต์มาตรฐานราชการไทย // **ข้อควรระวัง:** หากเครื่องผู้ใช้ไม่มีฟอนต์นี้ติดตั้งอยู่ การจัดหน้าเอกสารจะเพี้ยน worksheet.Cells.Style.Font.Name = "TH SarabunPSK"; worksheet.Cells["A1:J1"].Merge = true; worksheet.Cells["A2:J2"].Merge = true; worksheet.Cells["A3:J3"].Merge = true; using (var range = worksheet.Cells["A1:J3"]) { range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; range.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; range.Style.Font.Bold = true; } worksheet.Cells[2, 1].Value = organizationName; worksheet.Cells[3, 1].Value = dateTimeStamp; int startRow = 5; int colCount = 10; int totalRows = employees.Count; // ตรวจสอบว่ามีข้อมูลหรือไม่ if (totalRows > 0) { // เตรียม List สำหรับใช้กับ LoadFromArrays var data = new List(totalRows); for (int i = 0; i < totalRows; i++) { var emp = employees[i]; data.Add(new object[] { emp.no, emp.fullName, emp.dutyTimeName, emp.checkInDate, emp.checkInLocation, emp.checkInTime, emp.checkedOutDate, emp.checkOutLocation, emp.checkOutTime, emp.remark }); } // เขียนข้อมูลลง Excel ครั้งเดียว worksheet.Cells[startRow, 1].LoadFromArrays(data); // กำหนดสไตล์ตัวบาง + ขอบ using (var range = worksheet.Cells[startRow, 1, startRow + totalRows - 1, colCount]) { range.Style.Font.Bold = false; range.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; range.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; range.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; range.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Top; // Center Align: คอลัมน์ 1 (A), 3 (C), 4 (D), 6 (F), 7 (G), 9 (I) var centerColumns = new[] { 1, 3, 4, 6, 7, 9 }; foreach (var col in centerColumns) { worksheet.Cells[startRow, col, startRow + totalRows - 1, col].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; } // Left Align: คอลัมน์ 2 (B), 5 (E), 8 (H), 10 (J) var leftColumns = new[] { 2, 5, 8, 10 }; foreach (var col in leftColumns) { worksheet.Cells[startRow, col, startRow + totalRows - 1, col].Style.HorizontalAlignment = ExcelHorizontalAlignment.Left; } } } else { // กรณีไม่มีข้อมูล ใส่ข้อความแจ้ง worksheet.Cells[startRow, 1].Value = "ไม่มีข้อมูล"; worksheet.Cells[startRow, 1, startRow, colCount].Merge = true; worksheet.Cells[startRow, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; worksheet.Cells[startRow, 1].Style.Font.Bold = true; } // ส่วนสรุปท้ายตาราง int lastRow = startRow + totalRows + 2; worksheet.Cells[lastRow, 2].Value = type.Trim().ToUpper() == "OFFICER" ? "ข้าราชการทั้งหมด" : "ลูกจ้างประจำทั้งหมด"; worksheet.Cells[lastRow, 5].Value = profile?.Count; worksheet.Cells[lastRow, 6].Value = "คน"; worksheet.Cells[lastRow, 8].Value = "นอกสถานที่ตั้ง"; worksheet.Cells[lastRow + 1, 2].Value = "มาปฏิบัติราชการ"; worksheet.Cells[lastRow + 1, 5].Value = workTotal; worksheet.Cells[lastRow + 1, 6].Value = "คน"; worksheet.Cells[lastRow + 1, 8].Value = "WFH"; worksheet.Cells[lastRow + 1, 9].Value = wfhTotal; worksheet.Cells[lastRow + 1, 10].Value = "คน"; worksheet.Cells[lastRow + 2, 2].Value = "ลาพักผ่อน"; worksheet.Cells[lastRow + 2, 5].Value = restTotal; worksheet.Cells[lastRow + 2, 6].Value = "คน"; worksheet.Cells[lastRow + 2, 8].Value = "อบรม ประชุม สัมมนาฯ"; worksheet.Cells[lastRow + 2, 9].Value = seminarTotal; worksheet.Cells[lastRow + 2, 10].Value = "คน"; worksheet.Cells[lastRow + 3, 2].Value = "ลาป่วย/ลากิจ"; worksheet.Cells[lastRow + 3, 5].Value = sickTotal; worksheet.Cells[lastRow + 3, 6].Value = "คน"; worksheet.Cells[lastRow + 4, 2].Value = "มาสาย"; worksheet.Cells[lastRow + 4, 5].Value = lateTotal; worksheet.Cells[lastRow + 4, 6].Value = "คน"; worksheet.Cells[lastRow + 6, 2].Value = "เรียน"; worksheet.Cells[lastRow + 7, 2].Value = "เพื่อโปรดทราบ"; worksheet.Cells[lastRow + 7, 9].Value = "ทราบ"; worksheet.Cells[lastRow + 7, 9].Style.Font.Bold = true; worksheet.Cells[lastRow + 7, 9].Style.Font.Size = 22; worksheet.Cells[lastRow + 8, 2].Value = "................................"; worksheet.Cells[lastRow + 8, 9].Value = "................................"; worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); var fileBytes = package.GetAsByteArray(); return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "TimeStampRecords.xlsx"); } } catch (Exception ex) { return Error(ex); } } /// /// LV2_035 - รายงานการเข้างานสาย จำแนกเป็นรายบุคคลและหรือรายหน่วยงาน/ส่วนราชการ /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("late/{type}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetLateReport([FromBody] GetLeaveDetailByNodeReportDto req, string type) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_WORK_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } var employees = new List(); var count = 1; 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 getDefaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (getDefaultRound == null) { return Error("ไม่พบรอบลงเวลา Default", StatusCodes.Status404NotFound); } var userTimeStamps = await _processUserTimeStampRepository.GetTimestampByDateLateAsync(type.Trim().ToUpper(), role, nodeId, profileAdmin.Node, req.nodeId, req.node, req.StartDate, req.EndDate); foreach (var p in userTimeStamps) { var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}"; UserDutyTime? effectiveDate = null; effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.ProfileId ?? Guid.Empty); //return Error($"{data.Id} PF{data.FirstName} {data.LastName} : {GlobalMessages.DataNotFound}", StatusCodes.Status404NotFound); //var userRound = await _dutyTimeRepository.GetByIdAsync(profile.DutyTimeId ?? Guid.Empty); var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); var duty = userRound ?? getDefaultRound; // var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id); // var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty; // var userRound = await _dutyTimeRepository.GetByIdAsync(roundId); // var duty = userRound; // if (duty == null) // { // duty = await _dutyTimeRepository.GetDefaultAsync(); // if (duty == null) // { // return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound); // } // } DateTime? checkIn = p.CheckIn; DateTime? checkOut = p.CheckOut ?? null; var emp = new { no = count, fullName = fullName, dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.", checkInLocation = p.CheckInPOI, checkInTime = checkIn?.ToString("HH:mm") is string timeIn ? $"{timeIn} น." : "", checkOutLocation = p.CheckOutPOI ?? "", checkOutTime = checkOut?.ToString("HH:mm") is string timeOut ? $"{timeOut} น." : "", remark = "", checkInDate = checkIn?.ToThaiFullDate2()?.ToThaiNumber() ?? "", checkedOutDate = checkOut?.ToThaiFullDate2()?.ToThaiNumber() ?? "", }; employees.Add(emp); count++; } var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate().ToThaiNumber()}"; var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken); var organizationName = $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}"; var item = new { dateTimeStamp = $"ณ วันที่ {req.StartDate.Date.ToThaiShortDate().ToThaiNumber()}{enddate}", //organizationName = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken)?.Root ?? "", organizationName = organizationName, employees = employees }; var result = new { template = "late", reportName = "late", data = item }; return Success(result); } catch (Exception ex) { return Error(ex); } } /// /// LV2_035 - รายงานการลางาน จำแนกตามเพศ ประเภทการลา หน่วยงาน/ส่วนราชการ /// /// /// /// เมื่อทำรายการสำเร็จ /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("leave2/{type}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetLeave2Report([FromBody] GetLeave2DetailByNodeReportDto req, string type) { try { var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT"); var jsonData = JsonConvert.DeserializeObject(getPermission); if (jsonData["status"]?.ToString() != "200") { return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); } 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 leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByRootAndRange(req.StartDate, req.EndDate, type, jsonData["result"]?.ToString(), nodeId, profileAdmin?.Node, req.nodeId, req.node); var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate().ToThaiNumber()}"; // var thisYear = req.StartDate.Year; // var toDay = req.StartDate.Date; // if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) // thisYear = thisYear + 1; // var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, type, data.KeycloakUserId); var result = new { template = "leave2", reportName = "leave2", data = new { dateTimeStamp = $"ณ วันที่ {req.StartDate.Date.ToThaiShortDate().ToThaiNumber()}{enddate}", employees = leaveDays } }; return Success(result); } catch (Exception ex) { return Error(ex); } } #endregion private async Task GetApproverData(List list) { var _default = new { fullName = "............................................", positionName = "............................................", posExOrg = Array.Empty(), positionSign = "............................................", updatedAt = "............/............/............", comment = "......................................................................................................................................................................", approveType = "" }; var approvers = list .Select(x => new { fullName = $"{(x.Prefix ?? "")}{(x.FirstName ?? "")} {(x.LastName ?? "")}".Trim(), positionName = (!string.IsNullOrEmpty(x.PositionLevelName) && (x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร")) ? string.IsNullOrEmpty(x.PosExecutiveName) ? string.IsNullOrEmpty(x.PositionName) ? "............................................" : x.PositionName : x.PosExecutiveName : string.IsNullOrEmpty(x.PositionName) ? "............................................" : string.IsNullOrEmpty(x.PositionLevelName) ? x.PositionName : $"{x.PositionName}{x.PositionLevelName}").ToThaiNumber(), posExOrg = !string.IsNullOrEmpty(x.PositionLevelName) && (x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร")) ? new[] { (x!.OrganizationName.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.")).ToThaiNumber() } : !string.IsNullOrEmpty(x.PosExecutiveName) ? new[] { x.PosExecutiveName.ToThaiNumber(), x!.OrganizationName.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber() } : new[] { x!.OrganizationName.Replace("สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร", "สำนักงาน ก.ก.").ToThaiNumber() }, positionSign = !string.IsNullOrEmpty(x.PositionSign) ? x.PositionSign.Replace("\r", "").Replace("\n", " ").ToThaiNumber() : "............................................", updatedAt = x.LastUpdatedAt.HasValue ? x.LastUpdatedAt.Value.Date.ToThaiShortDate().ToThaiNumber() : "............/............/............", comment = !string.IsNullOrEmpty(x.Comment) ? (x.Comment.Replace("\r", "").Replace("\n", " ").Trim()).ToThaiNumber() : "......................................................................................................................................................................", approveType = (x.ApproveType ?? "").Trim().ToUpper() }) .ToList(); // การเจ้าหน้าที่ var sender = approvers .FirstOrDefault(x => x.approveType == "SENDER") ?? _default; // ผู้บังคับบัญชา (มีได้มากกว่า 1 คน) var commanders = approvers .Where(x => x.approveType == "COMMANDER") .DefaultIfEmpty(_default) .ToList(); // ผู้มีอำนาจ var approver = approvers .FirstOrDefault(x => x.approveType == "APPROVER") ?? _default; return new { sign = "............................................", sender = sender, approver = approver, commanders = commanders }; } } }