using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using QMSDAL.CustomCode.PcsCardMaterial; using QMSDAL.CustomCode.PcsCardStage; using QMSDAL.DTO; using static GB5Shared.GB5Constant.Constant; namespace QMSBLL.PcsCardMaterial { public class PcsCardMaterialBLL : IPcsCardMaterialBLL { private readonly IPcsCardMaterialDAL _MaterialDAL; private readonly IPcsCardStageDAL _StageDAL; private readonly IQueryExecutor _QueryExecutor; private readonly AutoNumber _AutoNumber; public PcsCardMaterialBLL( IPcsCardMaterialDAL materialDAL, IPcsCardStageDAL stageDAL, IQueryExecutor queryExecutor, AutoNumber autoNumber) { _MaterialDAL = materialDAL; _StageDAL = stageDAL; _QueryExecutor = queryExecutor; _AutoNumber = autoNumber; } public async Task> GetByStageAsync( int pcsCardStaeId, LoginDTO login, CancellationToken ct = default) { try { return await _MaterialDAL.GetByStageIdAsync(pcsCardStaeId, login, ct).ConfigureAwait(false); } catch (Exception) { throw; } } public async Task SaveAllAsync( PcsStageMaterialsDTO dto, LoginDTO login, CancellationToken ct = default) { if (dto == null) throw new ArgumentNullException(nameof(dto)); // Validate each material has a batch number var materialList = dto.Materials?.ToList() ?? new List(); foreach (var m in materialList) { if (string.IsNullOrWhiteSpace(m.BatchNo)) return "Batch number is required for all material entries."; } // Verify stage exists var stage = await _StageDAL .GetByIdAsync(dto.PcsCardStaeId, login, ct).ConfigureAwait(false); if (stage == null) return $"Stage {dto.PcsCardStaeId} not found."; // Assign unique IDs before insert — one batch allocation for all rows if (materialList.Count > 0) { var auto = await _AutoNumber .GetNumberAsync(materialList.Count, AUTONUMBERCONSTANT.PCSCARDMATERIAL, login) .ConfigureAwait(false); for (int i = 0; i < materialList.Count; i++) materialList[i].PcsCardMaterialId = auto.StartNumber + i; } var Trans = await _QueryExecutor.BeginTransactionAsync(login); try { await _MaterialDAL .SaveAllAsync(dto.PcsCardStaeId, materialList, login, Trans, ct) .ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans); return "Details saved successfully."; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } } }