using SqlKata.Compilers; namespace JdeScoping.DataAccess.QueryBuilders; /// /// Builds MIS extraction queries for work order step matching. /// Uses SQL extraction functions to retrieve criteria from Search.Criteria JSON. /// public sealed class MisQueryBuilder : IMisQueryBuilder { private readonly SqlServerCompiler _compiler; /// /// Initializes a new instance of MisQueryBuilder. /// /// The SqlKata SQL Server compiler. public MisQueryBuilder(SqlServerCompiler compiler) { _compiler = compiler; } /// /// Builds the complete MIS extraction SQL including temp table setup and data population. /// Uses extraction functions to get filter criteria from the database. /// /// The search ID to extract criteria from. /// The SQL statements for MIS extraction. public IReadOnlyList BuildMisExtractionSql(int searchId) { var statements = new List(); // Create #TempMisData temp table statements.Add(BuildTempMisDataTableSql()); // Build and execute MIS CTE query to populate temp table statements.Add(BuildMisCteSql()); return statements; } private static string BuildTempMisDataTableSql() { return """ IF OBJECT_ID('tempdb.dbo.#TempMisData', 'U') IS NOT NULL BEGIN DROP TABLE #TempMisData; END CREATE TABLE #TempMisData ( WorkOrderNumber BIGINT, ItemNumber VARCHAR(25), ItemDescription VARCHAR(30), BranchCode VARCHAR(12), WorkCenterCode VARCHAR(12), StepTimestamp DATETIME, SequenceNumber DECIMAL(7, 2), FunctionCode VARCHAR(15), FunctionOperationDescription VARCHAR(80), MatchedSequenceNumber DECIMAL(7, 2), RoutingMatch BIT, MasterMatch BIT, MisNumber VARCHAR(32), RevID VARCHAR(32), CharNumber VARCHAR(32), MisSequenceNumber VARCHAR(32), TestDescription VARCHAR(2000), SamplingType VARCHAR(32), SamplingValue VARCHAR(32), ToolsGauges VARCHAR(2000), WorkInstructions VARCHAR(2000), Status VARCHAR(32), ReleaseDate DATETIME ); """; } private static string BuildMisCteSql() { // The SQL uses temp tables (#P_ItemNumbers, #P_WorkCenters, #P_OperatorIDs) // and variables (@MinDt, @MaxDt) that were already populated by the main search query builder. // This query uses dynamic join/filter conditions based on what filters exist. return """ -- Build MIS extraction using existing temp tables and date variables DECLARE @HasMisItemFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_ItemNumbers) THEN 1 ELSE 0 END; DECLARE @HasMisWorkCenterFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_WorkCenters) THEN 1 ELSE 0 END; DECLARE @HasMisOperatorFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_OperatorIDs) THEN 1 ELSE 0 END; DECLARE @HasMisTimespanFilter BIT = CASE WHEN @MinDt IS NOT NULL OR @MaxDt IS NOT NULL THEN 1 ELSE 0 END; WITH MIS_CTE AS( SELECT DISTINCT wo.WorkOrderNumber, wo.ItemNumber, wo.BranchCode, wo.RoutingType, wo.IssueDate, wos.WorkCenterCode, wos.StepNumber, wos.EndDT, wos.FunctionCode, wos.FunctionOperationDescription FROM dbo.WorkOrderStep AS wos INNER JOIN dbo.WorkOrder AS wo ON (wos.WorkOrderNumber = wo.WorkOrderNumber AND LTRIM(wos.BranchCode) = wo.BranchCode) LEFT OUTER JOIN dbo.WorkOrderTime AS wot ON (wos.WorkOrderNumber = wot.WorkOrderNumber AND LTRIM(wos.BranchCode) = wot.BranchCode AND wos.StepNumber = wot.StepNumber) LEFT OUTER JOIN #P_ItemNumbers p_in ON (@HasMisItemFilter = 0 OR wo.ItemNumber = p_in.ItemNumber) LEFT OUTER JOIN #P_WorkCenters p_wc ON (@HasMisWorkCenterFilter = 0 OR wos.WorkCenterCode = p_wc.Code) LEFT OUTER JOIN #P_OperatorIDs p_oi ON (@HasMisOperatorFilter = 0 OR wot.AddressNumber = p_oi.AddressNumber) WHERE (@HasMisItemFilter = 0 OR p_in.ItemNumber IS NOT NULL) AND (@HasMisWorkCenterFilter = 0 OR p_wc.Code IS NOT NULL) AND (@HasMisOperatorFilter = 0 OR p_oi.AddressNumber IS NOT NULL) AND (@HasMisTimespanFilter = 0 OR ((@MinDt IS NULL OR wos.EndDT >= @MinDt OR wot.GlDate >= @MinDt) AND (@MaxDt IS NULL OR wos.EndDT <= @MaxDt OR wot.GlDate <= @MaxDt))) ) INSERT INTO #TempMisData ( WorkOrderNumber, ItemNumber, ItemDescription, BranchCode, WorkCenterCode, StepTimestamp, SequenceNumber, FunctionCode, FunctionOperationDescription, MatchedSequenceNumber, RoutingMatch, MasterMatch, MisNumber, RevID, CharNumber, MisSequenceNumber, TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions, Status, ReleaseDate ) SELECT mm.WorkOrderNumber, mm.ItemNumber, mm.ItemDescription, mm.BranchCode, mm.WorkCenterCode, mm.StepTimestamp, mm.SequenceNumber, mm.FunctionCode, mm.FunctionOperationDescription, mm.MatchedSequenceNumber, mm.RoutingMatch, mm.MasterMatch, mm.MisNumber, mm.RevID, mm.CharNumber, mm.MisSequenceNumber, mm.TestDescription, mm.SamplingType, mm.SamplingValue, mm.ToolsGauges, mm.WorkInstructions, mm.Status, mm.ReleaseDate FROM MIS_CTE c CROSS APPLY dbo.fn_MatchMIS(c.WorkOrderNumber, c.ItemNumber, c.BranchCode, c.RoutingType, c.IssueDate, c.WorkCenterCode, c.StepNumber, c.EndDT, c.FunctionCode, c.FunctionOperationDescription) AS mm; """; } }