fix: Leave Performance

This commit is contained in:
Suphonchai Phoonsawat 2024-07-08 10:50:11 +07:00
parent aaa180e217
commit 9c696be46e
4 changed files with 132 additions and 140 deletions

View file

@ -3,6 +3,7 @@ using System.Net.Http.Headers;
using System.Net.Http.Json; using System.Net.Http.Json;
using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Application.Common.Interfaces;
using BMA.EHR.Application.Messaging; using BMA.EHR.Application.Messaging;
using BMA.EHR.Application.Responses.Leaves;
using BMA.EHR.Domain.Models.HR; using BMA.EHR.Domain.Models.HR;
using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Commons;
using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.Requests;
@ -552,6 +553,48 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return 0; return 0;
} }
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate)
{
var data = await _dbContext.Set<LeaveRequest>().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<List<GetCountApproveLeaveByTypeDto>> GetCountApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate)
{
var data = await _dbContext.Set<LeaveRequest>().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<double> GetSumApproveLeaveByTypeAndRangeForUser(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate) public async Task<double> GetSumApproveLeaveByTypeAndRangeForUser(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
{ {
var data = await _dbContext.Set<LeaveRequest>().AsQueryable() var data = await _dbContext.Set<LeaveRequest>().AsQueryable()

View file

@ -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; }
}
}

View file

@ -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; }
}
}

View file

@ -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;
using BMA.EHR.Application.Repositories.Commands; using BMA.EHR.Application.Repositories.Commands;
using BMA.EHR.Application.Repositories.Leaves.LeaveRequests; 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.Common;
using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Extensions;
using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.Requests;
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
using BMA.EHR.Domain.Shared; using BMA.EHR.Domain.Shared;
using BMA.EHR.Infrastructure.Persistence;
using BMA.EHR.Leave.Service.DTOs.Reports; using BMA.EHR.Leave.Service.DTOs.Reports;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Utilities;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
using System.Globalization;
using System.Security.Claims;
namespace BMA.EHR.Leave.Service.Controllers 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.SearchProfile(null, null, null);
var profile = await _userProfileRepository.GetProfileWithKeycloak(AccessToken); 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 count = 1;
var employees = new List<dynamic>(); var employees = new List<dynamic>();
@ -758,93 +757,40 @@ namespace BMA.EHR.Leave.Service.Controllers
foreach (var p in profile) foreach (var p in profile)
{ {
var sickType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-001"); var keycloakUserId = p.Keycloak ?? Guid.Empty;
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 personalType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-002"); var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001");
if (personalType == null) var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var personalDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
personalType.Id,
req.StartDate,
req.EndDate);
var maternityType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-003"); var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002");
if (maternityType == null) var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var maternityDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
maternityType.Id,
req.StartDate,
req.EndDate);
var wifeType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-004"); var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003");
if (wifeType == null) var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var wifeDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
wifeType.Id,
req.StartDate,
req.EndDate);
var restType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-005"); var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004");
if (restType == null) var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0;
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"); var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005");
if (ordainType == null) var restDayCount = restDay != null ? restDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var ordainDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
ordainType.Id,
req.StartDate,
req.EndDate);
var absentType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-007"); var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006");
if (absentType == null) var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var absentDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
absentType.Id,
req.StartDate,
req.EndDate);
var studyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-008"); var absentDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-007");
if (studyType == null) var absentDayCount = absentDay != null ? absentDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var studyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
studyType.Id,
req.StartDate,
req.EndDate);
var agencyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-009"); var studyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-008");
if (agencyType == null) var studyDayCount = studyDay != null ? studyDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var agencyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
agencyType.Id,
req.StartDate,
req.EndDate);
var coupleType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-010"); var agencyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-009");
if (coupleType == null) var agencyDayCount = agencyDay != null ? agencyDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var coupleDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty,
coupleType.Id,
req.StartDate,
req.EndDate);
var therapyType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-011"); var coupleDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-010");
if (therapyType == null) var coupleDayCount = coupleDay != null ? coupleDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var therapyDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var therapyDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-011");
therapyType.Id, var therapyDayCount = therapyDay != null ? therapyDay.SumLeaveDay : 0;
req.StartDate,
req.EndDate);
var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty,
req.StartDate, req.StartDate,
@ -885,12 +831,10 @@ namespace BMA.EHR.Leave.Service.Controllers
var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT"); var absentCount = processTimeStamps.Count(x => x.CheckOutStatus == "ABSENT");
var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE"); var lateCount = processTimeStamps.Count(x => x.CheckInStatus == "LATE");
var emp = new var emp = new
{ {
no = count, 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, position = p.Position == null ? "" : p.Position,
positionLevel = p.PosLevel == null ? "" : p.PosLevel.PosLevelName, positionLevel = p.PosLevel == null ? "" : p.PosLevel.PosLevelName,
posNo = p.ProfileSalary == null ? "" : p.ProfileSalary.PosNo, posNo = p.ProfileSalary == null ? "" : p.ProfileSalary.PosNo,
@ -970,67 +914,46 @@ namespace BMA.EHR.Leave.Service.Controllers
var count = 1; var count = 1;
var employees = new List<dynamic>(); var employees = new List<dynamic>();
// 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) foreach (var p in profile)
{ {
var sickType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-001"); var keycloakUserId = p.Keycloak ?? Guid.Empty;
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 sickCount = await _leaveRequestRepository.GetCountApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var sickDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001");
sickType.Id, var sickDayCount = sickDay != null ? sickDay.SumLeaveDay : 0;
req.StartDate, var sickCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-001");
req.EndDate); var sickCount = sickCountData != null ? sickCountData.CountLeave : 0;
var personalType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-002"); var personalDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002");
if (personalType == null) var personalDayCount = personalDay != null ? personalDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); var personalCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-002");
var personalDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var personalCount = personalCountData != null ? personalCountData.CountLeave : 0;
personalType.Id,
req.StartDate,
req.EndDate);
var personalCount = await _leaveRequestRepository.GetCountApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var maternityDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003");
personalType.Id, var maternityDayCount = maternityDay != null ? maternityDay.SumLeaveDay : 0;
req.StartDate, var maternityCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-003");
req.EndDate); var maternityCount = maternityCountData != null ? maternityCountData.CountLeave : 0;
var maternityType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-003"); var wifeDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004");
if (maternityType == null) var wifeDayCount = wifeDay != null ? wifeDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); var wifeCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-004");
var maternityDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var wifeCount = wifeCountData != null ? wifeCountData.CountLeave : 0;
maternityType.Id,
req.StartDate,
req.EndDate);
var wifeType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-004"); var restDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005");
if (wifeType == null) var restDayCount = restDay != null ? restDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); var restCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-005");
var wifeDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var restCount = restCountData != null ? restCountData.CountLeave : 0;
wifeType.Id,
req.StartDate,
req.EndDate);
var restType = await _leaveTypeRepository.GetLeaveTypeByCodeAsync("LV-005"); var ordainDay = leaveDays.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006");
if (restType == null) var ordainDayCount = ordainDay != null ? ordainDay.SumLeaveDay : 0;
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); var ordainCountData = leaveCounts.FirstOrDefault(x => x.KeycloakUserId == keycloakUserId && x.LeaveTypeCode == "LV-006");
var restDayCount = await _leaveRequestRepository.GetSumApproveLeaveByTypeAndRangeForUser(p.Keycloak ?? Guid.Empty, var ordainCount = ordainCountData != null ? ordainCountData.CountLeave : 0;
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 timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty, var timeStamps = await _processUserTimeStampRepository.GetTimeStampHistoryByRangeForUserAsync(p.Keycloak ?? Guid.Empty,
req.StartDate, req.StartDate,
@ -1075,7 +998,7 @@ namespace BMA.EHR.Leave.Service.Controllers
var emp = new var emp = new
{ {
no = count, 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 ?? "", posNo = p.PosNoEmployee ?? "",
reason = "", reason = "",
@ -1173,7 +1096,7 @@ namespace BMA.EHR.Leave.Service.Controllers
var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd); 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(); var defaultRound = await _dutyTimeRepository.GetDefaultAsync();