diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index 578c700e..42bfc239 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -3,6 +3,7 @@ using System.Net.Http.Headers; using System.Net.Http.Json; using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Application.Messaging; +using BMA.EHR.Application.Responses.Leaves; using BMA.EHR.Domain.Models.HR; using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Requests; @@ -552,6 +553,48 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests return 0; } + public async Task> GetSumApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate) + { + var data = await _dbContext.Set().AsQueryable() + .Include(x => x.Type) + .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) + .Where(x => x.LeaveStatus == "APPROVE").ToListAsync(); + + var res = (from d in data + group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp + select new GetSumApproveLeaveByTypeDto + { + KeycloakUserId = grp.Key.KeycloakUserId, + LeaveTypeId = grp.Key.LeaveTypeId, + LeaveTypeCode = grp.Key.LeaveTypeCode, + SumLeaveDay = grp.Sum(x => x.LeaveTotal) + }) + .ToList(); + + return res; + } + + public async Task> GetCountApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate) + { + var data = await _dbContext.Set().AsQueryable() + .Include(x => x.Type) + .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) + .Where(x => x.LeaveStatus == "APPROVE").ToListAsync(); + + var res = (from d in data + group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp + select new GetCountApproveLeaveByTypeDto + { + KeycloakUserId = grp.Key.KeycloakUserId, + LeaveTypeId = grp.Key.LeaveTypeId, + LeaveTypeCode = grp.Key.LeaveTypeCode, + CountLeave = grp.Count() + }) + .ToList(); + + return res; + } + public async Task GetSumApproveLeaveByTypeAndRangeForUser(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate) { var data = await _dbContext.Set().AsQueryable() diff --git a/BMA.EHR.Application/Responses/Leaves/GetCountApproveLeaveByTypeDto.cs b/BMA.EHR.Application/Responses/Leaves/GetCountApproveLeaveByTypeDto.cs new file mode 100644 index 00000000..2d32ae49 --- /dev/null +++ b/BMA.EHR.Application/Responses/Leaves/GetCountApproveLeaveByTypeDto.cs @@ -0,0 +1,13 @@ +namespace BMA.EHR.Application.Responses.Leaves +{ + public class GetCountApproveLeaveByTypeDto + { + public Guid KeycloakUserId { get; set; } + + public Guid LeaveTypeId { get; set; } + + public string LeaveTypeCode { get; set; } = string.Empty; + + public int CountLeave { get; set; } + } +} diff --git a/BMA.EHR.Application/Responses/Leaves/GetSumApproveLeaveByTypeDto.cs b/BMA.EHR.Application/Responses/Leaves/GetSumApproveLeaveByTypeDto.cs new file mode 100644 index 00000000..5d73e0aa --- /dev/null +++ b/BMA.EHR.Application/Responses/Leaves/GetSumApproveLeaveByTypeDto.cs @@ -0,0 +1,13 @@ +namespace BMA.EHR.Application.Responses.Leaves +{ + public class GetSumApproveLeaveByTypeDto + { + public Guid KeycloakUserId { get; set; } + + public Guid LeaveTypeId { get; set; } + + public string LeaveTypeCode { get; set; } = string.Empty; + + public double SumLeaveDay { get; set; } + } +} diff --git a/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs b/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs index 4ae61aef..b6625a52 100644 --- a/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave.Service/Controllers/LeaveReportController.cs @@ -1,7 +1,3 @@ -using System.Data.Common; -using System.Globalization; -using System.IO.Pipelines; -using System.Security.Claims; using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories.Commands; using BMA.EHR.Application.Repositories.Leaves.LeaveRequests; @@ -10,14 +6,13 @@ using BMA.EHR.Application.Repositories.MetaData; using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Models.Leave.Requests; -using BMA.EHR.Domain.Models.Leave.TimeAttendants; using BMA.EHR.Domain.Shared; -using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Leave.Service.DTOs.Reports; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Org.BouncyCastle.Utilities; using Swashbuckle.AspNetCore.Annotations; +using System.Globalization; +using System.Security.Claims; namespace BMA.EHR.Leave.Service.Controllers { @@ -751,6 +746,10 @@ namespace BMA.EHR.Leave.Service.Controllers //var profile = await _userProfileRepository.SearchProfile(null, null, null); var profile = await _userProfileRepository.GetProfileWithKeycloak(AccessToken); + // get leave day + var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); + var leaveTypes = await _leaveTypeRepository.GetAllAsync(); + var count = 1; var employees = new List(); @@ -758,93 +757,40 @@ namespace BMA.EHR.Leave.Service.Controllers foreach (var p in profile) { - var sickType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-001"); - if (sickType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var sickDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - sickType.Id, - req.StartDate, - req.EndDate); + var keycloakUserId = p.Keycloak ?? Guid.Empty; - var personalType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-002"); - if (personalType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var personalDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - personalType.Id, - req.StartDate, - req.EndDate); + var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); + var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0; - var maternityType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-003"); - if (maternityType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var maternityDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - maternityType.Id, - req.StartDate, - req.EndDate); + var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); + var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0; - var wifeType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-004"); - if (wifeType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var wifeDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - wifeType.Id, - req.StartDate, - req.EndDate); + var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); + var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0; - var restType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-005"); - if (restType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var restDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - restType.Id, - req.StartDate, - req.EndDate); + var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); + var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0; - var ordainType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-006"); - if (ordainType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var ordainDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - ordainType.Id, - req.StartDate, - req.EndDate); + var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); + var restDayCount = restDay != null ? restDay.SumLeaveDay : 0; - var absentType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-007"); - if (absentType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var absentDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - absentType.Id, - req.StartDate, - req.EndDate); + var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); + var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0; - var studyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-008"); - if (studyType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var studyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - studyType.Id, - req.StartDate, - req.EndDate); + var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007"); + var absentDayCount = absentDay != null ? absentDay.SumLeaveDay : 0; - var agencyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-009"); - if (agencyType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var agencyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - agencyType.Id, - req.StartDate, - req.EndDate); + var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008"); + var studyDayCount = studyDay != null ? studyDay.SumLeaveDay : 0; - var coupleType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-010"); - if (coupleType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var coupleDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - coupleType.Id, - req.StartDate, - req.EndDate); + var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009"); + var agencyDayCount = agencyDay != null ? agencyDay.SumLeaveDay : 0; - var therapyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-011"); - if (therapyType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var therapyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - therapyType.Id, - req.StartDate, - req.EndDate); + 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, @@ -885,12 +831,10 @@ namespace BMA.EHR.Leave.Service.Controllers var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE"); - - var emp = new { no = count, - fullName = _userProfileRepository.GetUserFullName(p.Keycloak ?? Guid.Empty, AccessToken), + fullName = $"{p.Prefix}{p.FirstName} {p.LastName}",// _userProfileRepository.GetUserFullName(p.Keycloak ?? Guid.Empty, AccessToken), position = p.Position == null ? "" : p.Position, positionLevel = p.PosLevel == null ? "" : p.PosLevel.PosLevelName, posNo = p.ProfileSalary == null ? "" : p.ProfileSalary.PosNo, @@ -970,67 +914,46 @@ namespace BMA.EHR.Leave.Service.Controllers var count = 1; var employees = new List(); + // get leave day + var leaveDays = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); + var leaveCounts = await _leaveRequestRepository.GetCountApproveLeaveByTypeAndRange(req.StartDate, req.EndDate); + var leaveTypes = await _leaveTypeRepository.GetAllAsync(); + foreach (var p in profile) { - var sickType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-001"); - if (sickType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var sickDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - sickType.Id, - req.StartDate, - req.EndDate); + var keycloakUserId = p.Keycloak ?? Guid.Empty; - var sickCount = await _leaveRequestRepository.GetCountApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - sickType.Id, - req.StartDate, - req.EndDate); + var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); + var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0; + var sickCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001"); + var sickCount = sickCountData != null ? sickCountData.CountLeave : 0; - var personalType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-002"); - if (personalType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var personalDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - personalType.Id, - req.StartDate, - req.EndDate); + var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); + var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0; + var personalCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002"); + var personalCount = personalCountData != null ? personalCountData.CountLeave : 0; - var personalCount = await _leaveRequestRepository.GetCountApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - personalType.Id, - req.StartDate, - req.EndDate); + var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); + var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0; + var maternityCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003"); + var maternityCount = maternityCountData != null ? maternityCountData.CountLeave : 0; - var maternityType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-003"); - if (maternityType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var maternityDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - maternityType.Id, - req.StartDate, - req.EndDate); + var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); + var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0; + var wifeCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004"); + var wifeCount = wifeCountData != null ? wifeCountData.CountLeave : 0; - var wifeType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-004"); - if (wifeType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var wifeDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - wifeType.Id, - req.StartDate, - req.EndDate); + var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); + var restDayCount = restDay != null ? restDay.SumLeaveDay : 0; + var restCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005"); + var restCount = restCountData != null ? restCountData.CountLeave : 0; - var restType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-005"); - if (restType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var restDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - restType.Id, - req.StartDate, - req.EndDate); - - var ordainType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-006"); - if (ordainType == null) - return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var ordainDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, - ordainType.Id, - req.StartDate, - req.EndDate); + var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); + var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0; + var ordainCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006"); + var ordainCount = ordainCountData != null ? ordainCountData.CountLeave : 0; var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, req.StartDate, @@ -1075,7 +998,7 @@ namespace BMA.EHR.Leave.Service.Controllers var emp = new { no = count, - fullName = _userProfileRepository.GetUserFullName(p.Keycloak ?? Guid.Empty, AccessToken), + fullName = $"{p.Prefix}{p.FirstName} {p.LastName}",// _userProfileRepository.GetUserFullName(p.Keycloak ?? Guid.Empty, AccessToken), posNo = p.PosNoEmployee ?? "", reason = "", @@ -1173,7 +1096,7 @@ namespace BMA.EHR.Leave.Service.Controllers var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd); - var fullName = _userProfileRepository.GetUserFullName(keycloakUserId, AccessToken); + var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}"; // _userProfileRepository.GetUserFullName(keycloakUserId, AccessToken); var defaultRound = await _dutyTimeRepository.GetDefaultAsync();