using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using MMDAL.CustomCode.PartLevel; using MMDAL.DTO.PartLevel; namespace MMBLL.PartLevel { public class PartDetailBLL : IPartDetailBLL { private readonly IPartDetailDAL _PartDetailDAL; private readonly IQueryExecutor _QueryExecutor; public PartDetailBLL(IPartDetailDAL partDetailDAL, IQueryExecutor queryExecutor) { _PartDetailDAL = partDetailDAL; _QueryExecutor = queryExecutor; } public async Task GetPartDetail(int partDetailId, LoginDTO loginDTO, CancellationToken ct) => await _PartDetailDAL.GetPartDetail(partDetailId, loginDTO, ct).ConfigureAwait(false); public async Task> GetPartDetailLineage( int rootPartDetailId, LoginDTO loginDTO, CancellationToken ct) => await _PartDetailDAL.GetPartDetailLineage(rootPartDetailId, loginDTO, ct).ConfigureAwait(false); public async Task> GetPartDetailList( PartDetailCriteriaDTO criteria, LoginDTO loginDTO, CancellationToken ct) => await _PartDetailDAL.GetPartDetailList(criteria, loginDTO, ct).ConfigureAwait(false); public async Task UpdatePartDetailStatus( UpdatePartDetailStatusDTO dto, LoginDTO loginDTO, CancellationToken ct) { if (dto.PartDetailId <= 0) throw new ArgumentException("PartDetailId is required."); var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { await _PartDetailDAL .UpdatePartDetailStatus(dto.PartDetailId, dto.Status, loginDTO, Trans, ct) .ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans); return SuccessResponse.UpdateSuccess; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } public async Task SyncPartDetailWIP( int partDetailId, decimal wipStock, decimal availableToWork, LoginDTO loginDTO, CancellationToken ct) { if (partDetailId <= 0) throw new ArgumentException("PartDetailId is required."); var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { await _PartDetailDAL .SyncPartDetailWIP(partDetailId, wipStock, availableToWork, loginDTO, Trans, ct) .ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans); return SuccessResponse.UpdateSuccess; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } } }