using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using PERMDAL.DTOs; using PERMDAL.Interfaces; using PERMDAL.QueryBuilders; namespace PERMDAL.Implementations; public class PIPDAL : IPIPDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public PIPDAL(IQueryExecutor queryExecutor, AutoNumber autoNumber) { _qe = queryExecutor; _autoNumber = autoNumber; } public async Task GetPIPPlanAsync(int pipPlanId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync(login, PIPQB.GET_BY_ID, new { PIPPlanId = pipPlanId, TenantId = login.ClientId }) .ConfigureAwait(false); public async Task> GetPIPListAsync( int employeeId, short? status, int page, int pageSize, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, PIPQB.GET_LIST, new { TenantId = login.ClientId, EmployeeId = employeeId, Status = status, Offset = (page - 1) * pageSize, PageSize = pageSize }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetActionsByPlanAsync(int pipPlanId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, PIPQB.GET_ACTIONS_BY_PLAN, new { PIPPlanId = pipPlanId }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task InsertPIPPlanAsync(PIPPlanDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "PIPPLAN", login).ConfigureAwait(false); dto.PIPPlanId = auto.StartNumber; await _qe.ExecuteAsync(login, PIPQB.INSERT_PIPPLAN, new { dto.PIPPlanId, dto.AppraisalId, dto.EmployeeId, dto.ManagerId, dto.EndDate, dto.Reason, TenantId = login.ClientId, CreatedBy = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); return dto.PIPPlanId; } public async Task UpdatePIPPlanAsync(PIPPlanDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, PIPQB.UPDATE_PIPPLAN, new { dto.PIPPlanId, dto.EndDate, dto.Reason, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); public async Task ActivatePIPPlanAsync(int pipPlanId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, PIPQB.ACTIVATE_PIPPLAN, new { PIPPlanId = pipPlanId, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); public async Task ClosePIPPlanAsync(int pipPlanId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, PIPQB.CLOSE_PIPPLAN, new { PIPPlanId = pipPlanId, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); public async Task InsertActionAsync(PIPActionDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "PIPACTION", login).ConfigureAwait(false); dto.PIPActionId = auto.StartNumber; await _qe.ExecuteAsync(login, PIPQB.INSERT_ACTION, new { dto.PIPActionId, dto.PIPPlanId, dto.ActionText, dto.DueDate, TenantId = login.ClientId, CreatedBy = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); return dto.PIPActionId; } public async Task UpdateActionAsync(PIPActionDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, PIPQB.UPDATE_ACTION, new { dto.PIPActionId, dto.ActionText, dto.DueDate }, cancellationToken: ct) .ConfigureAwait(false); public async Task CompleteActionAsync(int pipActionId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, PIPQB.COMPLETE_ACTION, new { PIPActionId = pipActionId }, cancellationToken: ct) .ConfigureAwait(false); public async Task ActivePIPExistsAsync(int employeeId, LoginDTO login, CancellationToken ct) { int count = await _qe.ExecuteScalarAsync(login, PIPQB.EXISTS_ACTIVE_PIP, new { EmployeeId = employeeId, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); return count > 0; } public async Task GetActivePIPForEmployeeAsync(int employeeId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync(login, PIPQB.GET_ACTIVE_BY_EMPLOYEE, new { EmployeeId = employeeId, TenantId = login.ClientId }) .ConfigureAwait(false); }