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 MeasureDAL : IMeasureDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public MeasureDAL(IQueryExecutor queryExecutor, AutoNumber autoNumber) { _qe = queryExecutor; _autoNumber = autoNumber; } public async Task GetMeasureAsync(int measureId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync( login, MeasureQB.GET_BY_ID, new { MeasureId = measureId, TenantId = login.ClientId }) .ConfigureAwait(false); public async Task> GetMeasureListAsync( short? status, short? measureType, int page, int pageSize, LoginDTO login, CancellationToken ct) { var param = new { TenantId = login.ClientId, Status = status, MeasureType = measureType, Offset = (page - 1) * pageSize, PageSize = pageSize }; return await _qe.QueryAsync(login, MeasureQB.GET_LIST, param, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); } public async Task> GetMeasureSelectListAsync(CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _qe.QueryWithCriteriaAsync( login, MeasureQB.GET_SELECT_LIST, new { TenantId = login.ClientId }, criteriaDTO, cancellationToken: ct) .ConfigureAwait(false) ?? Enumerable.Empty(); public async Task SaveMeasureAsync(MeasureDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "MEASURE", login).ConfigureAwait(false); dto.MeasureId = auto.StartNumber; var param = new { dto.MeasureId, dto.MeasureName, dto.Description, dto.KRAId, dto.LovTypeId, dto.IsText, dto.Remarks, dto.SortOrder, dto.Status, dto.SourceType, TenantId = login.ClientId, CreatedById = login.UserId, ModifiedById = login.UserId, dto.MeasureType, dto.Unit }; return await _qe.ExecuteAsync(login, MeasureQB.INSERT, param, cancellationToken: ct) .ConfigureAwait(false); } public async Task UpdateMeasureAsync(MeasureDTO dto, LoginDTO login, CancellationToken ct) { var param = new { dto.MeasureId, dto.MeasureName, dto.Description, dto.KRAId, dto.LovTypeId, dto.IsText, dto.Remarks, dto.MeasureType, dto.Unit, dto.Status, TenantId = login.ClientId, ModifiedById = login.UserId }; return await _qe.ExecuteAsync(login, MeasureQB.UPDATE, param, cancellationToken: ct) .ConfigureAwait(false); } public async Task DeleteMeasureAsync(int measureId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync( login, MeasureQB.DELETE, new { MeasureId = measureId, TenantId = login.ClientId }, cancellationToken: ct) .ConfigureAwait(false); public async Task MeasureNameExistsAsync(string name, int excludeMeasureId, LoginDTO login, CancellationToken ct) { int count = await _qe.ExecuteScalarAsync( login, MeasureQB.EXISTS_NAME, new { MeasureName = name, TenantId = login.ClientId, MeasureId = excludeMeasureId }, cancellationToken: ct) .ConfigureAwait(false); return count > 0; } }