using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using MMDAL.DTO.BOM; using MMDAL.DTO.Item; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MMDAL.CustomCode.BOM { public interface IBOMDAL { Task GetSelectListBOM(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO); Task GetSelectListBOMDetailsForTransaction(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool Count = false); Task GetBOM(int BOMId, LoginDTO loginDTO); // ── Header ─────────────────────────────────────────────── Task SaveBOMAsync(BOMDTO dto, LoginDTO login); Task UpdateBOMAsync(BOMDTO dto, LoginDTO login); // ── Versioning helpers ─────────────────────────────────── Task GetPreviousVersionAsync(BOMDTO dto, LoginDTO login); Task UpdatePreviousVersionToDateAsync(BOMDTO dto, LoginDTO login); // ── Item lookup ─────────────────────────────────────────── Task GetItemByIdAsync(int itemId, LoginDTO login); // ── Detail ─────────────────────────────────────────────── Task SaveBOMDetailAsync(BOMDetailDTO detail, LoginDTO login); Task UpdateBOMDetailAsync(BOMDetailDTO detail, LoginDTO login); // ── Detail Parameter ───────────────────────────────────── Task SaveBOMDetailParameterAsync(BOMDetailParameterDTO param, LoginDTO login); Task UpdateBOMDetailParameterAsync(BOMDetailParameterDTO param, LoginDTO login); Task DeleteBOM(int BOMId, LoginDTO LoginDTO); /// /// Live recursive-CTE explosion of a single BOM's component tree — no caching/materialized /// view, per design (structural BOM changes must be immediately visible). Flat + parent-pointer /// shaped (Code/Parent/BOMLevel), matching the legacy GB4 response shape. /// Task> GetBOMTree(int bomId, decimal quantityForBom, LoginDTO loginDTO, CancellationToken ct = default); /// /// Real-time cyclical-BOM guard: returns the offending chain if any of the given candidate /// component ItemIds, walked forward through their own active/default BOM, would ever reach /// back to productionItemId. Returns null when no cycle is found. /// Task CheckCyclicalBom(int productionItemId, IEnumerable candidateItemIds, LoginDTO loginDTO, CancellationToken ct = default); } }