using GB5Shared.DTO.Framework.Criteria; 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 RatingScaleDAL : IRatingScaleDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public RatingScaleDAL(IQueryExecutor queryExecutor, AutoNumber autoNumber) { _qe = queryExecutor; _autoNumber = autoNumber; } public async Task GetRatingScaleAsync(int id, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync( login, RatingScaleQB.GET_BY_ID, new { RatingScaleId = id, TenantId = login.ClientId }) .ConfigureAwait(false); public async Task> GetRatingScaleListAsync( short? status, int page, int pageSize, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, RatingScaleQB.GET_LIST, new { TenantId = login.ClientId, Status = status, Offset = (page - 1) * pageSize, PageSize = pageSize }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetAllActiveRatingScalesAsync(CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _qe.QueryWithCriteriaAsync(login, RatingScaleQB.GET_ALL_ACTIVE, new { TenantId = login.ClientId }, criteriaDTO, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task SaveRatingScaleAsync(RatingScaleDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "RATINGSCALE", login).ConfigureAwait(false); dto.RatingScaleId = auto.StartNumber; return await _qe.ExecuteAsync(login, RatingScaleQB.INSERT, new { dto.RatingScaleId, dto.Code, dto.Name, dto.SlabFrom, dto.SlabTo, dto.GradeLetter, dto.GradeName, dto.SortOrder, dto.Status, TenantId = login.ClientId, CreatedBy = login.UserId, ModifiedBy = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); } public async Task UpdateRatingScaleAsync(RatingScaleDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, RatingScaleQB.UPDATE, new { dto.RatingScaleId, dto.Code, dto.Name, dto.SlabFrom, dto.SlabTo, dto.GradeLetter, dto.GradeName, dto.SortOrder, dto.Status, TenantId = login.ClientId, ModifiedBy = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); public async Task DeleteRatingScaleAsync(int id, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, RatingScaleQB.DELETE, new { RatingScaleId = id, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); public async Task CodeExistsAsync(string code, int excludeId, LoginDTO login, CancellationToken ct) { int count = await _qe.ExecuteScalarAsync(login, RatingScaleQB.EXISTS_CODE, new { Code = code, TenantId = login.ClientId, RatingScaleId = excludeId }, cancellationToken: ct) .ConfigureAwait(false); return count > 0; } public async Task SlabOverlapsAsync(decimal slabFrom, decimal slabTo, int excludeId, LoginDTO login, CancellationToken ct) { int count = await _qe.ExecuteScalarAsync(login, RatingScaleQB.SLAB_OVERLAP, new { TenantId = login.ClientId, RatingScaleId = excludeId, SlabFrom = slabFrom, SlabTo = slabTo }, cancellationToken: ct) .ConfigureAwait(false); return count > 0; } public async Task GetGradeForScoreAsync(decimal score, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync(login, RatingScaleQB.GET_GRADE_FOR_SCORE, new { Score = score, TenantId = login.ClientId }) .ConfigureAwait(false); }