diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index eb7dd6c4..8ff7338a 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -5,6 +5,7 @@ using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Requests; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Query; using Microsoft.Extensions.Configuration; namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests @@ -58,6 +59,21 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests #region " Methods " + #region " Overrides " + + public override async Task GetByIdAsync(Guid id) + { + var data = await _dbContext.Set().AsQueryable() + .Include(x => x.LeaveDocument) + .Include(x => x.LeaveDraftDocument) + .Include(x => x.Type) + .FirstOrDefaultAsync(x => x.Id == id); + + return data; + } + + #endregion + public async Task> GetLeaveRequestByYearAsync(int year) { var data = await _dbContext.Set().AsQueryable() @@ -68,7 +84,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests return data; } - public async Task> GetLeaveRequestByUserIdAsync(Guid keycloakUserId, int year, Guid type, string status) { var rawData = _dbContext.Set().AsQueryable() @@ -87,6 +102,24 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests return await rawData.ToListAsync(); } + public async Task> GetLeaveRequestForAdminAsync(int year, Guid type, string status) + { + var rawData = _dbContext.Set().AsQueryable() + .Include(x => x.Type); + + + if (year != 0) + rawData = (IIncludableQueryable)rawData.Where(x => x.LeaveStartDate.Year == year); + + if (type != Guid.Empty) + rawData = (IIncludableQueryable)rawData.Where(x => x.Type.Id == type); + + if (status.Trim().ToUpper() != "ALL") + rawData = (IIncludableQueryable)rawData.Where(x => x.LeaveStatus == status); + + return await rawData.ToListAsync(); + } + public async Task GetRestDayTotalByYearForUserAsync(Guid keycloakUserId, int year) { var leaveType = await _dbContext.Set().AsQueryable().FirstOrDefaultAsync(l => l.Code.Trim().ToUpper() == "LV-005"); @@ -131,6 +164,18 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests return data; } + public async Task GetLastLeaveRequestByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId) + { + var data = await _dbContext.Set().AsQueryable() + .Include(x => x.Type) + .Where(x => x.KeycloakUserId == keycloakUserId) + .Where(x => x.Type.Id == leaveTypeId) + .OrderByDescending(x => x.LeaveStartDate.Date) + .FirstOrDefaultAsync(); + + return data; + } + #endregion } } diff --git a/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs b/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs index 0efe207b..ec683d4a 100644 --- a/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs +++ b/BMA.EHR.Leave.Service/Controllers/LeaveRequestController.cs @@ -9,6 +9,8 @@ using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Leave.Service.DTOs.LeaveRequest; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Routing; +using Sentry; using Swashbuckle.AspNetCore.Annotations; using System.Security.Claims; @@ -436,6 +438,149 @@ namespace BMA.EHR.Leave.Service.Controllers } + /// + /// LV2_004 - รายละเอียดการลา (USER) + /// + /// + /// + /// เมื่อทำรายการสำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpGet("user/{id:guid}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetLeaveRequestByIdAsync(Guid id) + { + var rawData = await _leaveRequestRepository.GetByIdAsync(id); + + var thisYear = DateTime.Now.Year; + + if (rawData == null) + { + return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); + } + + var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId); + + if (profile == null) + { + return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); + } + + var lastSalary = profile.Salaries.OrderByDescending(x => x.Order).FirstOrDefault(); + var lastSalaryAmount = lastSalary == null ? 0 : lastSalary.Amount ?? 0; + + var lastLeaveRequest = await _leaveRequestRepository.GetLastLeaveRequestByTypeForUserAsync(rawData.KeycloakUserId, rawData.Type.Id); + + var result = new GetLeaveRequestByIdDto + { + Id = rawData.Id, + LeaveTypeName = rawData.Type.Name, + LeaveTypeId = rawData.Type.Id, + FullName = $"{profile.Prefix.Name}{profile.FirstName} {profile.LastName}", + DateSendLeave = rawData.CreatedAt, + Status = rawData.LeaveStatus, + LeaveStartDate = rawData.LeaveStartDate, + LeaveEndDate = rawData.LeaveEndDate, + LeaveWrote = rawData.LeaveWrote, + LeaveAddress = rawData.LeaveAddress, + LeaveNumber = rawData.LeaveNumber, + LeaveDetail = rawData.LeaveDetail, + LeaveDocument = await _minIOService.ImagesPath(rawData.LeaveDocument.Id), + LeaveDraftDocument = await _minIOService.ImagesPath(rawData.LeaveDraftDocument.Id), + + LeaveLastStart = lastLeaveRequest == null ? null : lastLeaveRequest.LeaveStartDate, + LeaveLastEnd = lastLeaveRequest == null ? null : lastLeaveRequest.LeaveEndDate, + LeaveTotal = rawData.LeaveStartDate.DiffDay(rawData.LeaveEndDate), + LeaveBirthDate = profile.BirthDate, + LeaveGovernmentDate = profile.DateAppoint == null ? null : profile.DateAppoint.Value, + + LeaveSalary = lastSalary == null ? 0 : lastSalaryAmount, + LeaveSalaryText = lastSalary == null ? "" : ((int)lastSalaryAmount).ToThaiBahtText(false), + + WifeDayName = rawData.WifeDayName, + WifeDayDateBorn = rawData.WifeDayDateBorn, + RestDayOldTotal = rawData.RestDayOldTotal, + RestDayCurrentTotal = rawData.RestDayCurrentTotal, + OrdainDayStatus = rawData.OrdainDayStatus, + OrdainDayLocationName = rawData.OrdainDayLocationName, + OrdainDayLocationAddress = rawData.OrdainDayLocationAddress, + OrdainDayLocationNumber = rawData.OrdainDayLocationNumber, + OrdainDayOrdination = rawData.OrdainDayOrdination, + OrdainDayBuddhistLentName = rawData.OrdainDayBuddhistLentName, + OrdainDayBuddhistLentAddress = rawData.OrdainDayBuddhistLentAddress, + HajjDayStatus = rawData.HajjDayStatus, + + AbsentDaySummon = rawData.AbsentDaySummon, + AbsentDayLocation = rawData.AbsentDayLocation, + AbsentDayRegistorDate = rawData.AbsentDayRegistorDate, + AbsentDayGetIn = rawData.AbsentDayGetIn, + AbsentDayAt = rawData.AbsentDayAt, + + StudyDaySubject = rawData.StudyDaySubject, + StudyDayDegreeLevel = rawData.StudyDayDegreeLevel, + StudyDayUniversityName = rawData.StudyDayUniversityName, + StudyDayTrainingSubject = rawData.StudyDayTrainingSubject, + StudyDayTrainingName = rawData.StudyDayTrainingName, + StudyDayCountry = rawData.StudyDayCountry, + StudyDayScholarship = rawData.StudyDayScholarship, + + CoupleDayName = rawData.CoupleDayName, + CoupleDayPosition = rawData.CoupleDayPosition, + CoupleDayLevel = rawData.CoupleDayLevel, + CoupleDayLevelCountry = rawData.CoupleDayLevelCountry, + CoupleDayCountryHistory = rawData.CoupleDayCountryHistory, + CoupleDayTotalHistory = rawData.CoupleDayTotalHistory, + CoupleDayStartDateHistory = rawData.CoupleDayStartDateHistory, + CoupleDayEndDateHistory = rawData.CoupleDayEndDateHistory, + CoupleDaySumTotalHistory = rawData.CoupleDaySumTotalHistory, + + }; + + return Success(result); + } + + /// + /// LV2_010 - รายการลา (ADMIN) + /// + /// + /// + /// เมื่อทำรายการสำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpPost("admin")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetLeaveRequestForAdminAsync([FromBody] GetLeaveRequestForAdminDto req) + { + var rawData = await _leaveRequestRepository.GetLeaveRequestForAdminAsync(req.Year, req.Type, req.Status); + + var result = new List(); + + foreach (var item in rawData) + { + var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(item.KeycloakUserId); + var res = new GetLeaveRequestForAdminResultDto + { + Id = item.Id, + LeaveTypeId = item.Type.Id, + LeaveTypeName = item.Type.Name, + FullName = $"{profile.Prefix.Name}{profile.FirstName} {profile.LastName}", + DateSendLeave = item.CreatedAt.Date, + Status = item.LeaveStatus + }; + result.Add(res); + } + + if (req.Keyword != "") + result = result.Where(x => x.FullName.Contains(req.Keyword)).ToList(); + + var pageResult = result.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + + return Success(new { data = pageResult, total = result.Count }); + } #endregion } diff --git a/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestByIdDto.cs b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestByIdDto.cs new file mode 100644 index 00000000..52bcf074 --- /dev/null +++ b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestByIdDto.cs @@ -0,0 +1,116 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; + +namespace BMA.EHR.Leave.Service.DTOs.LeaveRequest +{ + public class GetLeaveRequestByIdDto + { + public Guid Id { get; set; } = Guid.Empty; + + public string LeaveTypeName { get; set; } = string.Empty; + + public Guid LeaveTypeId { get; set; } = Guid.Empty; + + public string FullName { get; set; } = string.Empty; + + public DateTime DateSendLeave { get; set; } = DateTime.MinValue; + + public string Status { get; set; } = string.Empty; + + public DateTime LeaveStartDate { get; set; } = DateTime.Now; + + public DateTime LeaveEndDate { get; set; } = DateTime.Now; + + public string LeaveWrote { get; set; } = string.Empty; + + public string LeaveAddress { get; set; } = string.Empty; + + public string LeaveNumber { get; set; } = string.Empty; + + public string LeaveDetail { get; set; } = string.Empty; + + public string LeaveDocument { get; set; } + + public string LeaveDraftDocument { get; set; } + + public DateTime? LeaveLastStart { get; set; } = DateTime.MinValue; + + public DateTime? LeaveLastEnd { get; set; } = DateTime.MinValue; + + public float LeaveTotal { get; set; } = 0; + + public DateTime? LeaveBirthDate { get; set; } = DateTime.MinValue; + + public DateTime? LeaveGovernmentDate { get; set; } = DateTime.MinValue; + + public double LeaveSalary { get; set; } = 0; + + public string LeaveSalaryText { get; set; } = string.Empty; + + public string WifeDayName { get; set; } = string.Empty; + + public string WifeDayDateBorn { get; set; } = string.Empty; + + public int RestDayOldTotal { get; set; } = 0; + + public int RestDayCurrentTotal { get; set; } = 0; + + public bool OrdainDayStatus { get; set; } = false; + + public string OrdainDayLocationName { get; set; } = string.Empty; + + public string OrdainDayLocationAddress { get; set; } = string.Empty; + + public string OrdainDayLocationNumber { get; set; } = string.Empty; + + public DateTime OrdainDayOrdination { get; set; } = DateTime.Now; + + public string OrdainDayBuddhistLentName { get; set; } = string.Empty; + + public string OrdainDayBuddhistLentAddress { get; set; } = string.Empty; + + public bool HajjDayStatus { get; set; } = false; + + public string AbsentDaySummon { get; set; } = string.Empty; + + public string AbsentDayLocation { get; set; } = string.Empty; + + public DateTime AbsentDayRegistorDate { get; set; } = DateTime.Now; + + public string AbsentDayGetIn { get; set; } = string.Empty; + + public string AbsentDayAt { get; set; } = string.Empty; + + public string StudyDaySubject { get; set; } = string.Empty; + + public string StudyDayDegreeLevel { get; set; } = string.Empty; + + public string StudyDayUniversityName { get; set; } = string.Empty; + + public string StudyDayTrainingSubject { get; set; } = string.Empty; + + public string StudyDayTrainingName { get; set; } = string.Empty; + + public string StudyDayCountry { get; set; } = string.Empty; + + public string StudyDayScholarship { get; set; } = string.Empty; + + public string CoupleDayName { get; set; } = string.Empty; + + public string CoupleDayPosition { get; set; } = string.Empty; + + public string CoupleDayLevel { get; set; } = string.Empty; + + public string CoupleDayLevelCountry { get; set; } = string.Empty; + + public string CoupleDayCountryHistory { get; set; } = string.Empty; + + public string CoupleDayTotalHistory { get; set; } = string.Empty; + + public DateTime CoupleDayStartDateHistory { get; set; } = DateTime.Now; + + public DateTime CoupleDayEndDateHistory { get; set; } = DateTime.Now; + + public string CoupleDaySumTotalHistory { get; set; } = string.Empty; + } +} diff --git a/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminDto.cs b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminDto.cs new file mode 100644 index 00000000..bc78293d --- /dev/null +++ b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminDto.cs @@ -0,0 +1,25 @@ +using Org.BouncyCastle.Asn1.X509; +using System.ComponentModel.DataAnnotations; + +namespace BMA.EHR.Leave.Service.DTOs.LeaveRequest +{ + public class GetLeaveRequestForAdminDto + { + [Required] + public int Year { get; set; } = 0; + + [Required] + public Guid Type { get; set; } = Guid.Empty; + + [Required] + public string Status { get; set; } = string.Empty; + + [Required] + public int Page { get; set; } = 1; + + [Required] + public int PageSize { get; set; } = 10; + + public string Keyword { get; set; } = string.Empty; + } +} diff --git a/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminResultDto.cs b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminResultDto.cs new file mode 100644 index 00000000..998fdfac --- /dev/null +++ b/BMA.EHR.Leave.Service/DTOs/LeaveRequest/GetLeaveRequestForAdminResultDto.cs @@ -0,0 +1,17 @@ +namespace BMA.EHR.Leave.Service.DTOs.LeaveRequest +{ + public class GetLeaveRequestForAdminResultDto + { + public Guid Id { get; set; } = Guid.Empty; + + public string LeaveTypeName { get; set; } = string.Empty; + + public Guid LeaveTypeId { get; set; } = Guid.Empty; + + public string FullName { get; set; } = string.Empty; + + public DateTime DateSendLeave { get; set; } = DateTime.MinValue; + + public string Status { get; set; } = string.Empty; + } +}