hrms-api-backend/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs
2023-12-19 09:31:25 +07:00

636 lines
No EOL
27 KiB
C#

using System.IO.Pipelines;
using BMA.EHR.Application.Repositories;
using BMA.EHR.Application.Repositories.Commands;
using BMA.EHR.Application.Repositories.Leaves.LeaveRequests;
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.Infrastructure.Persistence;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
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 readonly LeaveRequestRepository _leaveRequestRepository;
private readonly UserProfileRepository _userProfileRepository;
private readonly CommandRepository _commandRepository;
#endregion
#region " Constructor and Destructor "
public LeaveReportController(LeaveRequestRepository leaveRequestRepository,
UserProfileRepository userProfileRepository,
CommandRepository commandRepository)
{
_leaveRequestRepository = leaveRequestRepository;
_userProfileRepository = userProfileRepository;
_commandRepository = commandRepository;
}
#endregion
#region " Methods "
#region " Private Methods "
private async Task<dynamic> GetReport01(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var lastLeaveRequest =
await _leaveRequestRepository.GetLastLeaveRequestByTypeForUserAsync(data.KeycloakUserId,
data.Type.Id);
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave9",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leaveDetail = data.LeaveDetail,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
leaveAddress = data.LeaveAddress,
leaveNumber = data.LeaveNumber,
LeaveLastStart = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveStartDate.Date.ToThaiShortDate(),
LeaveLastEnd = lastLeaveRequest == null ? "" : lastLeaveRequest.LeaveEndDate.Date.ToThaiShortDate(),
}
};
}
private async Task<dynamic> GetReport02(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave10",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
wifeDayName = data.WifeDayName ?? "",
wifeDayDateBorn = data.WifeDayDateBorn ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
leaveAddress = data.LeaveAddress,
leaveNumber = data.LeaveNumber,
}
};
}
private async Task<dynamic> GetReport03(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave11",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
restDayOldTotal = data.RestDayOldTotal,
restDayCurrentTotal = data.RestDayCurrentTotal,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
leaveAddress = data.LeaveAddress,
leaveNumber = data.LeaveNumber,
}
};
}
private async Task<dynamic> GetReport04(LeaveRequest data, bool isHajj = false)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
if (isHajj)
{
return new
{
template = "leave13",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate(),
hajjDayStatus = data.HajjDayStatus,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
}
};
}
else
{
return new
{
template = "leave12",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate(),
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate(),
ordainDayStatus = data.OrdainDayStatus,
ordainDayLocationName = data.OrdainDayLocationName,
ordainDayLocationAddress = data.OrdainDayLocationAddress,
ordainDayLocationNumber = data.OrdainDayLocationNumber,
ordainDayOrdination = data.OrdainDayOrdination,
ordainDayBuddhistLentName = data.OrdainDayBuddhistLentName,
ordainDayBuddhistLentAddress = data.OrdainDayBuddhistLentAddress,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
}
};
}
}
private async Task<dynamic> GetReport05(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave14",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
absentDaySummon = data.AbsentDaySummon,
absentDayLocation = data.AbsentDayLocation,
absentDayRegistorDate = data.AbsentDayRegistorDate.Date.ToThaiShortDate(),
absentDayGetIn = data.AbsentDayGetIn,
absentDayAt = data.AbsentDayAt,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
}
};
}
private async Task<dynamic> GetReport06(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave15",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leavebirthDate = data.LeaveBirthDate == null ? "" : data.LeaveBirthDate.Value.Date.ToThaiShortDate(),
leavegovernmentDate = data.LeaveGovernmentDate == null ? "" : data.LeaveGovernmentDate.Value.Date.ToThaiShortDate(),
leaveSalary = data.LeaveSalary,
leaveSalaryText = data.LeaveSalaryText,
studyDaySubject = data.StudyDaySubject ?? "",
studyDayDegreeLevel = data.StudyDayDegreeLevel ?? "",
studyDayUniversityName = data.StudyDayUniversityName ?? "",
studyDayCountry = data.StudyDayCountry ?? "",
studyDayScholarship = data.StudyDayScholarship ?? "",
studyDayTrainingSubject = data.StudyDayTrainingSubject ?? "",
studyDayTrainingName = data.StudyDayTrainingName ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
leaveAddress = data.LeaveAddress,
leaveNumber = data.LeaveNumber,
}
};
}
private async Task<dynamic> GetReport07(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave16",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
fullnameEng = "",
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
}
};
}
private async Task<dynamic> GetReport08(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave17",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leaveSalary = data.LeaveSalary,
leaveSalaryText = data.LeaveSalaryText,
coupleDayName = data.CoupleDayName,
coupleDayLevel = data.CoupleDayLevel,
coupleDayPosition = data.CoupleDayPosition,
coupleDayOrganizationName = "-",
coupleDayLevelCountry = data.CoupleDayLevelCountry,
coupleDayCountryHistory = data.CoupleDayCountryHistory,
coupleDayTotalHistory = data.CoupleDayTotalHistory,
coupleDayStartDateHistory = data.CoupleDayStartDateHistory.Date.ToThaiShortDate(),
coupleDayEndDateHistory = data.CoupleDayEndDateHistory.Date.ToThaiShortDate(),
coupleDaySumTotalHistory = data.CoupleDaySumTotalHistory,
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
LeaveTotal = data.LeaveStartDate.DiffDay(data.LeaveEndDate),
}
};
}
private async Task<dynamic> GetReport09(LeaveRequest data)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var rootOc = _userProfileRepository.GetRootOcId(profile.OcId ?? Guid.Empty);
var approver = string.Empty;
if (rootOc != null)
{
var list = await _commandRepository.GetOrgApproverAsync(rootOc ?? Guid.Empty);
if (list.Count > 0)
approver = list.First().Name;
}
return new
{
template = "leave18",
reportName = $"leave_form",
data = new
{
leaveWrote = data.LeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
dear = approver,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate(),
}
};
}
#endregion
[HttpGet("{id:guid}")]
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);
}
}
[HttpGet("reject/{id:guid}")]
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);
if (profile == null)
{
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
var fullName = $"{profile!.Prefix!.Name}{profile!.FirstName} {profile!.LastName}";
var result = new
{
template = "แบบใบขอยกเลิกวันลา",
reportName = $"leave_cancel_form",
data = new
{
leaveWrote = data.CancelLeaveWrote ?? "",
dateSendLeave = data.CreatedAt.Date.ToThaiShortDate(),
leaveTypeName = data.Type.Name,
fullname = fullName,
positionName = profile!.Position == null ? "-" : profile!.Position!.Name,
positionLeaveName = profile!.Position == null ? "-" : profile!.Position!.Name,
organizationName = profile!.Oc ?? "",
leaveDateStart = data.LeaveStartDate.Date.ToThaiShortDate(),
leaveDateEnd = data.LeaveEndDate.Date.ToThaiShortDate()
}
};
return Success(result);
}
catch (Exception ex)
{
return Error(ex);
}
}
#endregion
}
}