using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.PartLevel; using MMDAL.Query.PartLevel; namespace MMDAL.CustomCode.PartLevel { public class PartPositionDAL : IPartPositionDAL { private readonly IQueryExecutor _QueryExecutor; public PartPositionDAL(IQueryExecutor queryExecutor) => _QueryExecutor = queryExecutor; public async Task GetPartPosition(int partPositionId, LoginDTO loginDTO, CancellationToken ct) => await _QueryExecutor .QuerySingleAsync(loginDTO, PartPositionQB.GET_PARTPOSITION, new { PartPositionId = partPositionId }, cancellationToken: ct) .ConfigureAwait(false); public async Task GetPartPositionByKey( int itemId, int? partDimId, int storeId, int? lotId, LoginDTO loginDTO, CancellationToken ct) => await _QueryExecutor .QuerySingleAsync(loginDTO, PartPositionQB.GET_PARTPOSITION_BY_KEY, new { ItemId = itemId, PartDimId = partDimId, StoreId = storeId, LotId = lotId }, cancellationToken: ct) .ConfigureAwait(false); public async Task> GetPartPositionList( int storeId, int pageOffset, int pageSize, LoginDTO loginDTO, CancellationToken ct) => await _QueryExecutor .QueryAsync(loginDTO, PartPositionQB.GET_PARTPOSITION_LIST, new { StoreId = storeId, PageOffset = pageOffset, PageSize = pageSize }, cancellationToken: ct) .ConfigureAwait(false) ?? []; public async Task> GetPartShortage( int? maxPriority, LoginDTO loginDTO, CancellationToken ct) { // maxPriority filter is applied in the BLL before calling; no dynamic SQL needed here return await _QueryExecutor .QueryAsync(loginDTO, PartPositionQB.GET_PART_SHORTAGE, null, cancellationToken: ct) .ConfigureAwait(false) ?? []; } public async Task UpdateAllocate(int partPositionId, decimal quantity, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.UPDATE_PARTPOSITION_ALLOCATE, new { PartPositionId = partPositionId, Quantity = quantity }, tx, cancellationToken: ct) .ConfigureAwait(false); public async Task UpdateIssue(int partPositionId, decimal quantity, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.UPDATE_PARTPOSITION_ISSUE, new { PartPositionId = partPositionId, Quantity = quantity }, tx, cancellationToken: ct) .ConfigureAwait(false); public async Task UpdateConsume(int partPositionId, decimal quantity, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.UPDATE_PARTPOSITION_CONSUME, new { PartPositionId = partPositionId, Quantity = quantity }, tx, cancellationToken: ct) .ConfigureAwait(false); public async Task UpdateRelease(int partPositionId, decimal quantity, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.UPDATE_PARTPOSITION_RELEASE, new { PartPositionId = partPositionId, Quantity = quantity }, tx, cancellationToken: ct) .ConfigureAwait(false); public async Task InsertPartPosition(PartPositionDTO dto, int newId, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.INSERT_PARTPOSITION, new { PartPositionId = newId, dto.ItemId, dto.PartDimId, dto.StoreId, dto.LotId, dto.Available }, tx, cancellationToken: ct) .ConfigureAwait(false); public async Task InitialisePartPosition( InitialisePartPositionDTO dto, int newPartPositionId, LoginDTO loginDTO, CancellationToken ct) => await _QueryExecutor .ExecuteAsync(loginDTO, PartPositionQB.INITIALISE_PARTPOSITION, new { dto.StoreId, dto.ItemId, ResetToZero = dto.ResetToZero ? 1 : 0, NewPartPositionId = newPartPositionId }, cancellationToken: ct) .ConfigureAwait(false); } }