using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using OKRDAL.DTOs; using OKRDAL.Interfaces; using OKRDAL.QueryBuilders; namespace OKRDAL.Implementations; public class GoalDAL : IGoalDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public GoalDAL(IQueryExecutor qe, AutoNumber autoNumber) { _qe = qe; _autoNumber = autoNumber; } public async Task GetGoalAsync(int goalId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync(login, GoalQB.GET_GOAL, new { GoalId = goalId, TenantId = login.ClientId }).ConfigureAwait(false); public async Task> GetGoalListAsync( int okrCycleId, int objectiveId, int employeeId, int status, int page, int pageSize, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, GoalQB.GET_GOAL_LIST, new { OKRCycleId = okrCycleId, ObjectiveId = objectiveId, EmployeeId = employeeId, Status = status, TenantId = login.ClientId, Offset = (page - 1) * pageSize, PageSize = pageSize }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task GetGoalListCountAsync( int okrCycleId, int objectiveId, int employeeId, int status, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync(login, GoalQB.GET_GOAL_LIST_COUNT, new { OKRCycleId = okrCycleId, ObjectiveId = objectiveId, EmployeeId = employeeId, Status = status, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task SaveGoalAsync(GoalDTO dto, LoginDTO login, CancellationToken ct) { if (dto.GoalId == 0) { var auto = await _autoNumber.GetAutoNumber(1, "GOAL", login).ConfigureAwait(false); dto.GoalId = auto.StartNumber; dto.TenantId = login.ClientId; dto.CreatedBy = login.UserId; await _qe.ExecuteAsync(login, GoalQB.INSERT_GOAL, dto, cancellationToken: ct).ConfigureAwait(false); return dto.GoalId; } dto.ModifiedBy = login.UserId; await _qe.ExecuteAsync(login, GoalQB.UPDATE_GOAL, dto, cancellationToken: ct).ConfigureAwait(false); return dto.GoalId; } public async Task DeleteGoalAsync(int goalId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, GoalQB.SOFT_DELETE_GOAL, new { GoalId = goalId, TenantId = login.ClientId, ModifiedBy = login.UserId }, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateGoalProgressAsync(int goalId, decimal progress, decimal currentValue, short confidence, short status, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, GoalQB.UPDATE_GOAL_PROGRESS, new { GoalId = goalId, Progress = progress, CurrentValue = currentValue, Confidence = confidence, Status = status, ModifiedBy = login.UserId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateGoalConfidenceAsync(int goalId, short confidence, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, GoalQB.UPDATE_GOAL_CONFIDENCE, new { GoalId = goalId, Confidence = confidence, ModifiedBy = login.UserId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetGoalStatusAsync(int goalId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync(login, GoalQB.GET_GOAL_STATUS, new { GoalId = goalId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetGoalObjectiveIdAsync(int goalId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync(login, GoalQB.GET_OBJECTIVE_ID, new { GoalId = goalId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetGoalProgressForKRAAsync( int employeeId, int okrCycleId, int kraId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, GoalQB.GET_PROGRESS_FOR_KRA, new { EmployeeId = employeeId, OKRCycleId = okrCycleId, KRAId = kraId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task LinkGoalToTaskAsync(int goalId, int taskId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, GoalQB.INSERT_TASK_LINK, new { GoalId = goalId, TaskId = taskId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task UnlinkGoalFromTaskAsync(int goalId, int taskId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, GoalQB.DELETE_TASK_LINK, new { GoalId = goalId, TaskId = taskId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); }