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 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<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)
{
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.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<dynamic>();
@ -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<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)
{
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();