using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using MMDAL.CustomCode.PartLevel; using MMDAL.DTO.PartLevel; using static GB5Shared.GB5Constant.Constant; namespace MMBLL.PartLevel { public class PartPositionBLL : IPartPositionBLL { private readonly IPartPositionDAL _PartPositionDAL; private readonly AutoNumber _AutoNumber; public PartPositionBLL(IPartPositionDAL partPositionDAL, AutoNumber autoNumber) { _PartPositionDAL = partPositionDAL; _AutoNumber = autoNumber; } public async Task GetPartPosition( int partPositionId, LoginDTO loginDTO, CancellationToken ct) => await _PartPositionDAL.GetPartPosition(partPositionId, loginDTO, ct).ConfigureAwait(false); public async Task> GetPartPositionList( int storeId, int pageOffset, int pageSize, LoginDTO loginDTO, CancellationToken ct) => await _PartPositionDAL.GetPartPositionList(storeId, pageOffset, pageSize, loginDTO, ct).ConfigureAwait(false); public async Task> GetPartShortage( int? maxPriority, LoginDTO loginDTO, CancellationToken ct) => await _PartPositionDAL.GetPartShortage(maxPriority, loginDTO, ct).ConfigureAwait(false); // MERGE-based initialisation from TSTOCKLEDGER — no explicit transaction needed; // the MERGE statement in PartPositionQB is atomic per row. public async Task InitialisePartPosition( InitialisePartPositionDTO dto, LoginDTO loginDTO, CancellationToken ct) { if (dto.ItemId <= 0) throw new ArgumentException("ItemId is required."); if (dto.StoreId <= 0) throw new ArgumentException("StoreId is required."); var auto = await _AutoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.PARTPOSITION, loginDTO); await _PartPositionDAL.InitialisePartPosition(dto, auto.StartNumber, loginDTO, ct).ConfigureAwait(false); return SuccessResponse.SaveSuccess; } } }