hrms-api-backend/BMA.EHR.Leave/Controllers/LeaveReportController.cs
harid b5c82f4243
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m14s
ปรับรายงานลา #2195
2026-01-19 12:13:45 +07:00

2870 lines
No EOL
170 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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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 = "",
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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,
position = string.IsNullOrEmpty(profile.Position) ? "-" : profile.Position,
positionName = (!string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? string.IsNullOrEmpty(profile.PosExecutiveName)
? string.IsNullOrEmpty(profile.Position)
? "-"
: profile.Position
: profile.PosExecutiveName
: string.IsNullOrEmpty(profile.Position)
? "-"
: string.IsNullOrEmpty(profile.PositionLeaveName)
? profile.Position
: $"{profile.Position}{profile.PositionLeaveName}").ToThaiNumber(),
positionLeaveName = profile!.PositionLeaveName == null ? "-" : profile!.PositionLeaveName.ToThaiNumber(),
posExecutiveName = profile.PosExecutiveName,
organizationName = profile!.Oc!.ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(profile.PositionLeaveName) &&
(profile.PositionLeaveName.Contains("อำนวยการ") || profile.PositionLeaveName.Contains("บริหาร"))
? new[] { (profile!.Oc!.ToThaiNumber()) }
: !string.IsNullOrEmpty(profile.PosExecutiveName)
? new[] { (profile.PosExecutiveName.ToThaiNumber()), (profile!.Oc!.ToThaiNumber()) }
: new[] { (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.GetProfileByAdminRolev4(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
}
else
{
profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId, req.node, req.nodeId, req.StartDate.Date, req.EndDate.Date);
}
// get leave day
var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate);
var leaveTypes = await _leaveTypeRepository.GetAllAsync();
var count = 1;
var employees = new List<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.checkInTime.Trim() != "" ? 0 : 1) // เรียงตามวันที่ลงเวลา
.ThenBy(x => x.remark.Trim() == "" ? 0 : 1) // ข้อมูลที่ไม่มี remark ให้ขึ้นก่อน
.ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue)
.ThenBy(x => x.remark) // จากนั้นจัดเรียงตาม remark
.ToList();
for (int i = 0; i < employees.Count; i++)
{
employees[i].no = i + 1;
}
var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate()}";
var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken);
var organizationName = org == null ? "" : $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}";
var dateTimeStamp = $"ประจำ ณ วัน{req.StartDate.Date.GetThaiDayOfWeek()} ที่ {req.StartDate.Date.ToThaiShortDate()}{enddate}";
var templatePath = Path.Combine(_hostingEnvironment.ContentRootPath, "Reports", "TimeStampRecords.xlsx");
byte[] templateBytes = System.IO.File.ReadAllBytes(templatePath);
using (var stream = new MemoryStream(templateBytes))
using (var package = new ExcelPackage(stream))
{
var worksheet = package.Workbook.Worksheets["Sheet1"] ?? package.Workbook.Worksheets[0];
// กำหนดให้ใช้ฟอนต์ TH SarabunPSK ซึ่งเป็นฟอนต์มาตรฐานราชการไทย
// **ข้อควรระวัง:** หากเครื่องผู้ใช้ไม่มีฟอนต์นี้ติดตั้งอยู่ การจัดหน้าเอกสารจะเพี้ยน
worksheet.Cells.Style.Font.Name = "TH SarabunPSK";
worksheet.Cells["A1:J1"].Merge = true;
worksheet.Cells["A2:J2"].Merge = true;
worksheet.Cells["A3:J3"].Merge = true;
using (var range = worksheet.Cells["A1:J3"])
{
range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
range.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
range.Style.Font.Bold = true;
}
worksheet.Cells[2, 1].Value = organizationName;
worksheet.Cells[3, 1].Value = dateTimeStamp;
int startRow = 5;
int colCount = 10;
int totalRows = employees.Count;
// ตรวจสอบว่ามีข้อมูลหรือไม่
if (totalRows > 0)
{
// เตรียม List<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 = "............................................",
posExOrg = Array.Empty<string>(),
positionSign = "............................................",
updatedAt = "............/............/............",
comment = "......................................................................................................................................................................",
approveType = ""
};
var approvers = list
.Select(x => new
{
fullName = $"{(x.Prefix ?? "")}{(x.FirstName ?? "")} {(x.LastName ?? "")}".Trim(),
positionName = (!string.IsNullOrEmpty(x.PositionLevelName) &&
(x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร"))
? string.IsNullOrEmpty(x.PosExecutiveName)
? string.IsNullOrEmpty(x.PositionName)
? "............................................"
: x.PositionName
: x.PosExecutiveName
: string.IsNullOrEmpty(x.PositionName)
? "............................................"
: string.IsNullOrEmpty(x.PositionLevelName)
? x.PositionName
: $"{x.PositionName}{x.PositionLevelName}").ToThaiNumber(),
posExOrg = !string.IsNullOrEmpty(x.PositionLevelName) &&
(x.PositionLevelName.Contains("อำนวยการ") || x.PositionLevelName.Contains("บริหาร"))
? new[] { (x!.OrganizationName!.ToThaiNumber()) }
: !string.IsNullOrEmpty(x.PosExecutiveName)
? new[] { (x.PosExecutiveName.ToThaiNumber()), (x!.OrganizationName!.ToThaiNumber()) }
: new[] { (x!.OrganizationName!.ToThaiNumber()) },
positionSign = !string.IsNullOrEmpty(x.PositionSign)
? x.PositionSign.Replace("\r", "").Replace("\n", " ")
: "............................................",
updatedAt = x.LastUpdatedAt.HasValue
? x.LastUpdatedAt.Value.Date.ToThaiShortDate().ToThaiNumber()
: "............/............/............",
comment = !string.IsNullOrEmpty(x.Comment)
? x.Comment.Replace("\r", "").Replace("\n", " ").Trim()
: "......................................................................................................................................................................",
approveType = (x.ApproveType ?? "").Trim().ToUpper()
})
.ToList();
// การเจ้าหน้าที่
var sender = approvers
.FirstOrDefault(x => x.approveType == "SENDER")
?? _default;
// ผู้บังคับบัญชา (มีได้มากกว่า 1 คน)
var commanders = approvers
.Where(x => x.approveType == "COMMANDER")
.DefaultIfEmpty(_default)
.ToList();
// ผู้มีอำนาจ
var approver = approvers
.FirstOrDefault(x => x.approveType == "APPROVER")
?? _default;
return new
{
sign = "............................................",
sender = sender,
approver = approver,
commanders = commanders
};
}
}
}