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 AppraisalTypeDAL : IAppraisalTypeDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public AppraisalTypeDAL(IQueryExecutor queryExecutor, AutoNumber autoNumber) { _qe = queryExecutor; _autoNumber = autoNumber; } public async Task GetAppraisalTypeAsync(int id, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync( login, AppraisalTypeQB.GET_BY_ID, new { AppraisalTypeId = id, TenantId = login.ClientId }) .ConfigureAwait(false); public async Task> GetAppraisalTypeKRAsAsync( int appraisalTypeId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync( login, AppraisalTypeQB.GET_KRAS, new { AppraisalTypeId = appraisalTypeId }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetMeasuresForKRAsAsync( IEnumerable kraIds, LoginDTO login, CancellationToken ct) { var ids = kraIds.ToList(); if (!ids.Any()) return Enumerable.Empty(); return await _qe.QueryAsync( login, AppraisalTypeQB.GET_MEASURES_FOR_KRAS, new { KRAIds = ids }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); } public async Task> GetAppraisalTypeListAsync( short? status, int page, int pageSize, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, AppraisalTypeQB.GET_LIST, new { TenantId = login.ClientId, Status = status, Offset = (page - 1) * pageSize, PageSize = pageSize }, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetAppraisalTypeSelectListAsync( CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _qe.QueryWithCriteriaAsync( login, AppraisalTypeQB.GET_SELECT_LIST, new { TenantId = login.ClientId }, criteriaDTO, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task InsertAppraisalTypeAsync(AppraisalTypeDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "APPRAISALTYPE", login).ConfigureAwait(false); dto.AppraisalTypeId = auto.StartNumber; await _qe.ExecuteAsync(login, AppraisalTypeQB.INSERT, new { dto.AppraisalTypeId, dto.AppraisalTypeCode, dto.AppraisalTypeName, dto.Description, dto.MeasureWeightage, dto.GoalWeightage, dto.Remarks, dto.SortOrder, dto.Status, dto.SourceType, TenantId = login.ClientId, dto.Nature, CreatedById = login.UserId, ModifiedById = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); return dto.AppraisalTypeId; } public async Task UpdateAppraisalTypeAsync(AppraisalTypeDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, AppraisalTypeQB.UPDATE, new { dto.AppraisalTypeId, dto.AppraisalTypeCode, dto.AppraisalTypeName, dto.Description, dto.MeasureWeightage, dto.GoalWeightage, dto.Remarks, dto.Nature, dto.Status, TenantId = login.ClientId, ModifiedById = login.UserId }, cancellationToken: ct) .ConfigureAwait(false); public async Task DeleteAppraisalTypeKRAsAndMeasuresAsync(int appraisalTypeId, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync(login, AppraisalTypeQB.DELETE_MEASURES_FOR_TYPE, new { AppraisalTypeId = appraisalTypeId }, cancellationToken: ct) .ConfigureAwait(false); await _qe.ExecuteAsync(login, AppraisalTypeQB.DELETE_KRAS, new { AppraisalTypeId = appraisalTypeId }, cancellationToken: ct) .ConfigureAwait(false); } public async Task InsertKRAAsync( AppraisalTypeKRADTO kra, int appraisalTypeId, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "APPRAISALTYPEKRA", login).ConfigureAwait(false); kra.AppraisalTypeKRAId = auto.StartNumber; await _qe.ExecuteAsync(login, AppraisalTypeQB.INSERT_KRA, new { kra.AppraisalTypeKRAId, AppraisalTypeId = appraisalTypeId, kra.SlNo, kra.KRAId, kra.KRAMeasureWeightage, kra.KRAGoalWeightage }, cancellationToken: ct) .ConfigureAwait(false); return kra.AppraisalTypeKRAId; } public async Task InsertMeasureAsync( AppraisalTypeMeasureDTO measure, int appraisalTypeKRAId, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "APPRAISALTYPEMEASURE", login).ConfigureAwait(false); measure.AppraisalTypeMeasureId = auto.StartNumber; await _qe.ExecuteAsync(login, AppraisalTypeQB.INSERT_MEASURE, new { measure.AppraisalTypeMeasureId, AppraisalTypeKRAId = appraisalTypeKRAId, measure.SlNo, measure.MeasureId, measure.Weightage }, cancellationToken: ct) .ConfigureAwait(false); } public async Task DeleteAppraisalTypeAsync(int id, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, AppraisalTypeQB.DELETE, new { AppraisalTypeId = 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, AppraisalTypeQB.EXISTS_CODE, new { AppraisalTypeCode = code, TenantId = login.ClientId, AppraisalTypeId = excludeId }, cancellationToken: ct) .ConfigureAwait(false); return count > 0; } }