hrms-api-backend/BMA.EHR.Leave/Controllers/LeaveReportController.cs
waruneeauy d831b208de Merge branch 'develop' into dev
* develop:
  update LeaveController to handle additional leave range options for check-in and check-out statuses
  update LeaveController to pass currentDate parameter to GetLastEffectRound method
  update LeaveReportController to pass date parameter to GetLastEffectRound method
  update GetLastEffectRound method to accept effectiveDate parameter and adjust usage in LeaveReportController
  add noti discord
  fix build report
  fix build report to v2 and add noti
  remove build forgejo, move to dev branch
2026-01-11 20:39:39 +07:00

2651 lines
No EOL
152 KiB
C#

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.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<dynamic> GetReport01(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}";
var lastLeaveRequest =
await _leaveRequestRepository.GetLastLeaveRequestByTypeForUserAsync(data.KeycloakUserId,
data.Type.Id, data.LeaveStartDate.Date);
var startFiscalYear = new DateTime(data.LeaveStartDate.Year - 1, 10, 1);
var endFiscalYear = data.LeaveStartDate.Date.AddDays(-1); // นับจากวันที่ยื่นลา
var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear);
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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber(),
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<dynamic> GetReport02(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix}{profile!.FirstName} {profile!.LastName}";
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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> GetReport03(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
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.LeaveStartDate.Date.AddDays(-1); // นับจากวันที่ยื่นลา
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 = leaveData == null ? 0.0 : leaveData.LeaveDaysUsed;
var leaveLimit = leaveData == null ? 0.0 : leaveData.LeaveDays;
var extendLeave = leaveLimit - 10;
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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> GetReport04(LeaveRequest data, bool isHajj = false)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> GetReport05(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> GetReport06(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> 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 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 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 = "",
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
profileType = profile.ProfileType,
birthDate = profileLeave.BirthDate.ToThaiShortDate().ToThaiNumber(),
retireDate = profileLeave.RetireDate.ToThaiShortDate().ToThaiNumber(),
govAge = profileLeave.GovAge.ToThaiNumber(),
age = profileLeave.Age.ToThaiNumber(),
dateAppoint = profileLeave.DateAppoint.ToThaiShortDate().ToThaiNumber(),
dateCurrent = profileLeave.DateCurrent.ToThaiShortDate().ToThaiNumber(),
amount = ((double)profileLeave.Amount).ToNumericText().ToThaiNumber(),
telephoneNumber = profileLeave.TelephoneNumber == null ? "" : profileLeave.TelephoneNumber.ToThaiNumber(),
posLevel = profileLeave.PosLevel.ToThaiNumber(),
posType = profileLeave.PosType.ToThaiNumber(),
currentAddress = profileLeave.CurrentAddress.ToThaiNumber(),
oc = profileLeave.Oc.ToThaiNumber(),
root = profileLeave.Root.ToThaiNumber(),
child1 = profileLeave.Child1 == null ? "" : profileLeave.Child1!.ToThaiNumber(),
child2 = profileLeave.Child2 == null ? "" : profileLeave.Child2!.ToThaiNumber(),
child3 = profileLeave.Child3 == null ? "" : profileLeave.Child3!.ToThaiNumber(),
child4 = profileLeave.Child4 == null ? "" : profileLeave.Child4!.ToThaiNumber(),
positions = profileLeave.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 = profileLeave.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<dynamic> GetReport08(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
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<dynamic> 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 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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.Oc!.ToThaiNumber() ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate().ToThaiNumber(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate().ToThaiNumber(),
profileType = profile.ProfileType,
birthDate = profileLeave.BirthDate.ToThaiShortDate().ToThaiNumber(),
retireDate = profileLeave.RetireDate.ToThaiShortDate().ToThaiNumber(),
govAge = profileLeave.GovAge.ToThaiNumber(),
age = profileLeave.Age.ToThaiNumber(),
dateAppoint = profileLeave.DateAppoint.ToThaiShortDate().ToThaiNumber(),
dateCurrent = profileLeave.DateCurrent.ToThaiShortDate().ToThaiNumber(),
amount = ((double)profileLeave.Amount).ToNumericText().ToThaiNumber(),
telephoneNumber = profileLeave.TelephoneNumber == null ? "" : profileLeave.TelephoneNumber.ToThaiNumber(),
posLevel = profileLeave.PosLevel.ToThaiNumber(),
posType = profileLeave.PosType.ToThaiNumber(),
currentAddress = profileLeave.CurrentAddress.ToThaiNumber(),
oc = profileLeave.Oc.ToThaiNumber(),
root = profileLeave.Root.ToThaiNumber(),
child1 = profileLeave.Child1 == null ? "" : profileLeave.Child1!.ToThaiNumber(),
child2 = profileLeave.Child2 == null ? "" : profileLeave.Child2!.ToThaiNumber(),
child3 = profileLeave.Child3 == null ? "" : profileLeave.Child3!.ToThaiNumber(),
child4 = profileLeave.Child4 == null ? "" : profileLeave.Child4!.ToThaiNumber(),
positions = profileLeave.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 = profileLeave.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
/// <summary>
/// LV2_033 - รายงานการลา
/// </summary>
/// <param name="id">รหัสของรายการขอลา</param>
/// <param name="hajj">เป็นการแสดงรายงานการขอลาไปพิธีอัจย์หรือไม่?</param>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet("{id:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> 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);
}
}
/// <summary>
/// LV2_034 - รายงานการยกเลิกการลา
/// </summary>
/// <param name="id">รหัสของรายการขอลา</param>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet("reject/{id:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> 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 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 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,
positionName = profile!.Position == null ? "-" : profile!.Position.ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
organizationName = profile!.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()
: "......................",
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);
}
}
/// <summary>
/// LV2_035 - รายงานสำหรับการลางานของข้าราชการ-กรุงเทพมหานครสามัญ และลูกจ้างประจำกรุงเทพมหานคร
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("leaveday/{type}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetLeaveDayReport([FromBody] GetLeaveDetailByNodeReportDto req, string type)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var profile = new List<GetProfileByKeycloakIdRootDto>();
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.GetProfileByAdminRole(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<dynamic>();
// กรองตามที่ 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,
}).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 = sickDay != null ? sickDay.CountLeaveDay : 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 = personalDay != null ? personalDay.CountLeaveDay : 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 = maternityDay != null ? maternityDay.CountLeaveDay : 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 = wifeDay != null ? wifeDay.CountLeaveDay : 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 = restDay != null ? restDay.CountLeaveDay : 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 = ordainDay != null ? ordainDay.CountLeaveDay : 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 = absentDay != null ? absentDay.CountLeaveDay : 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 = studyDay != null ? studyDay.CountLeaveDay : 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 = agencyDay != null ? agencyDay.CountLeaveDay : 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 = coupleDay != null ? coupleDay.CountLeaveDay : 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 = 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 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);
}
}
/// <summary>
/// LV2_035 - รายงานสำหรับการลางานของข้าราชการ-กรุงเทพมหานครสามัญ และลูกจ้างประจำกรุงเทพมหานคร
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("leavedayRetire")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetLeaveDayRetireReport([FromBody] GetLeaveDetailByNodeReportDto req)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_SALARY_OFFICER");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var profile = new List<GetProfileByKeycloakIdRootDto>();
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<dynamic>();
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);
}
}
/// <summary>
/// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("time-records/{type}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetTimeRecordsOfficerReport([FromBody] GetLeaveDetailByNodeReportDto req, string type)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var profile = new List<GetProfileByKeycloakIdRootDto>();
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<LoopDate>();
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<DateResultReport>();
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 (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);
}
}
/// <summary>
/// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("download/time-records/{type}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetTimeRecordsNewOfficerReport([FromBody] GetLeaveDetailByNodeReportDto req, string type)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_WORK_REPORT");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var profile = new List<GetProfileByKeycloakIdRootDto>();
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<LoopDate>();
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<DateResultReport>();
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 (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.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 = 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<object[]> สำหรับใช้กับ LoadFromArrays
var data = new List<object[]>(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);
}
}
/// <summary>
/// LV2_035 - รายงานการเข้างานสาย จำแนกเป็นรายบุคคลและหรือรายหน่วยงาน/ส่วนราชการ
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("late/{type}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetLateReport([FromBody] GetLeaveDetailByNodeReportDto req, string type)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_WORK_REPORT");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var employees = new List<dynamic>();
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 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}";
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);
}
}
/// <summary>
/// LV2_035 - รายงานการลางาน จำแนกตามเพศ ประเภทการลา หน่วยงาน/ส่วนราชการ
/// </summary>
/// <returns>
/// </returns>
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("leave2/{type}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetLeave2Report([FromBody] GetLeave2DetailByNodeReportDto req, string type)
{
try
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT");
var jsonData = JsonConvert.DeserializeObject<JObject>(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 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<object> GetApproverData(List<LeaveRequestApprover> list)
{
var _default = new
{
fullName = "......................",
positionName = "......................",
positionSign = "......................",
updatedAt = "...... /...... /......",
comment = "......................",
approveType = ""
};
var approvers = list
.Select(x => new
{
fullName = $"{(x.Prefix ?? "")}{(x.FirstName ?? "")} {(x.LastName ?? "")}".Trim(),
positionName = x.PositionName ?? "......................",
positionSign = x.PositionSign ?? "......................",
updatedAt = x.LastUpdatedAt.HasValue
? x.LastUpdatedAt.Value.Date.ToThaiShortDate().ToThaiNumber()
: "...... /...... /......",
comment = (x.Comment ?? "")
.Replace("\r", "")
.Replace("\n", "")
.Trim(),
approveType = (x.ApproveType ?? "").Trim().ToUpper()
})
.ToList();
var sender = approvers
.FirstOrDefault(x => x.approveType == "SENDER")
?? _default;
var approver = approvers
.FirstOrDefault(x => x.approveType == "APPROVER")
?? _default;
var commanders = approvers
.Where(x => x.approveType == "COMMANDER")
.DefaultIfEmpty(_default)
.ToList();
return new
{
sender = sender,
approver = approver,
commanders = commanders
};
}
}
}