@ForwardOrBackward_IN	SMALLINT
AS 
BEGIN 
SET XACT_ABORT ON
SET NOCOUNT ON
 
    --DECLARE  @ForwardOrBackward_IN SMALLINT = 1;
    -- A. DECLARATION AREA
            
			DECLARE @IsJobFilter BIT = 0, @ForwardOrBackward BIT = 0 ;/* 0 Forward  and  1 Backward */ 

            IF OBJECT_ID('tempdb..#CTMJobFilter') IS NOT NULL DROP TABLE #CTMJobFilter;
			CREATE TABLE #CTMJobFilter (  JobGeneralID                   INTEGER );


           	IF OBJECT_ID('tempdb..#CTMJobRelations') IS NOT NULL DROP TABLE #CTMJobRelations;
			CREATE TABLE #CTMJobRelations ( 
				 JobFromGeneralID               INTEGER 
				,JobToGeneralID                 INTEGER 
				,ConditionGeneralID             INTEGER
				,ConditionName                  VARCHAR(255)
				,ConditionAndOr                 VARCHAR(5)
				,ConditionOdate                 VARCHAR(5)
				,Flag                           TINYINT );

           -- CREATE NONCLUSTERED INDEX ncidx_cjr1 ON #CTMJobRelations (JobFromGeneralID);
			--CREATE NONCLUSTERED INDEX ncidx_cjr2 ON #CTMJobRelations (JobToGeneralID);

            SET @ForwardOrBackward = CASE COALESCE(@ForwardOrBackward_IN, 1) WHEN 1 THEN 0 ELSE 1 END ; -- default will be forward -> 0 as BIT


			-- IF all projects have been sent as input then cancel this filter 
			IF EXISTS (SELECT 1 from #numeric_param_temp)         
			BEGIN
			
                         IF EXISTS ( -- check if is a real filter (not all projects) 
							         SELECT 1 
									 FROM CTM_JobDetails 
									 WHERE JobGeneralID NOT IN (SELECT ProgramID FROM #numeric_param_temp) 					 
						            ) 
									BEGIN
									    SET @IsJobFilter  = 1;
									END
   
			END	;	

               
            IF ( @IsJobFilter  = 1 )
				BEGIN 
                       IF ( @ForwardOrBackward = 0 )
								BEGIN  -- if forward (chaining)
											INSERT INTO #CTMJobFilter(JobGeneralID)
											SELECT jcf.JobToGeneralID AS JobGeneralID 
											FROM  CTM_JobChainingsF jcf
											WHERE EXISTS (SELECT 1 FROM #numeric_param_temp f WHERE f.ProgramID = jcf.JobRootGeneralID)
											GROUP BY jcf.JobToGeneralID ; 

								END
						ELSE
                               BEGIN  -- if backward (chaining)
											INSERT INTO #CTMJobFilter(JobGeneralID)
											SELECT jcb.JobToGeneralID AS JobGeneralID 
											FROM  CTM_JobChainingsB jcb
											WHERE EXISTS (SELECT 1 FROM #numeric_param_temp f WHERE f.ProgramID = jcb.JobRootGeneralID)
											GROUP BY jcb.JobToGeneralID ;	       
								END ;



								-- all common relations
								INSERT INTO #CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
								SELECT m.JobFromGeneralID ,m.JobToGeneralID ,m.ConditionGeneralID ,m.ConditionName ,m.ConditionAndOr ,m.ConditionOdate ,0 AS Flag
								FROM  CTM_JobToCTMJobRelations m 
								WHERE   EXISTS (SELECT 1 FROM #CTMJobFilter f1  WHERE m.JobFromGeneralID = f1.JobGeneralID)
										AND 
										EXISTS (SELECT 1 FROM #CTMJobFilter f2  WHERE m.JobToGeneralID = f2.JobGeneralID) ;
								

								-- add orphan relations
								INSERT INTO #CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
								SELECT CASE IsInCondition WHEN 0 THEN m.JobGeneralID ELSE NULL    END AS JobFromGeneralID 
								      ,CASE IsInCondition WHEN 0 THEN NULL    ELSE m.JobGeneralID END AS JobToGeneralID 
								      ,m.ConditionGeneralID 
									  ,m.ConditionName
									  ,m.ConditionAndOr
									  ,m.ConditionOdate
									  ,1 AS Flag
								FROM  CTM_JobToConditions m
								WHERE EXISTS (SELECT 1 FROM #CTMJobFilter f WHERE m.JobGeneralID = f.JobGeneralID)
										AND m.IsOrphanCondition = 1
										AND m.IsInCondition = @ForwardOrBackward ;
											

								--add isolated nodes
								INSERT INTO #CTMJobRelations (JobFromGeneralID ,Flag)
								SELECT m.JobGeneralID AS JobFromGeneralID ,2 AS Flag
								FROM  CTM_JobDetails m
								WHERE EXISTS (SELECT 1 FROM #CTMJobFilter f WHERE m.JobGeneralID = f.JobGeneralID)
										AND m.IsolationLevel = 0 ; 

                                 

								--add jobs in end/start position (if the case)
								-- fastest version in case of many jobs have to be returned
	                   			INSERT INTO #CTMJobRelations (JobFromGeneralID ,Flag) 
								SELECT m.JobGeneralID AS JobFromGeneralID ,3 AS Flag
								FROM (  
										SELECT JobGeneralID FROM #CTMJobFilter 
								        EXCEPT
										SELECT JobGeneralID 
										FROM (
												SELECT f.JobGeneralID
												FROM #CTMJobFilter f
												WHERE EXISTS (SELECT 1 FROM #CTMJobRelations r1 WHERE r1.JobFromGeneralID = f.JobGeneralID)
												UNION									
												SELECT f.JobGeneralID	 
												FROM #CTMJobFilter f
												WHERE EXISTS (SELECT 1 FROM #CTMJobRelations r2 WHERE r2.JobToGeneralID = f.JobGeneralID)
											   ) x
									  ) m ;

							
										

				END
            ELSE
				BEGIN       --no job filter so direction is not important / also orphan condition are included too
				            -- all common relations
                             INSERT INTO #CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
							 SELECT JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,0 AS Flag
							 FROM  CTM_JobToCTMJobRelations;

							 
							--add  orphan relations
							INSERT INTO #CTMJobRelations (JobFromGeneralID ,JobToGeneralID ,ConditionGeneralID ,ConditionName ,ConditionAndOr ,ConditionOdate ,Flag)
							SELECT   CASE IsInCondition WHEN 0 THEN m.JobGeneralID ELSE NULL    END AS JobFromGeneralID 
								    ,CASE IsInCondition WHEN 0 THEN NULL    ELSE m.JobGeneralID END AS JobToGeneralID 
								    ,m.ConditionGeneralID 
									,m.ConditionName
									,m.ConditionAndOr
									,m.ConditionOdate
									,1 AS Flag
							FROM  CTM_JobToConditions m
							WHERE m.IsOrphanCondition = 1;

											
							--add isolated nodes
							INSERT INTO #CTMJobRelations (JobFromGeneralID ,Flag)
							SELECT m.JobGeneralID AS JobFromGeneralID  ,2 AS Flag
							FROM  CTM_JobDetails m
							WHERE m.IsolationLevel = 0 ; 

				END; 


			 --OUTPUT
			SELECT  
			        o.JobFromGeneralID 
				--,jd1.JobName AS JobFromName ,jd1.ProcName AS JobFromProcName ,jd1.JobDescription AS JobFromDescription
			    	,o.JobToGeneralID   
				--,jd2.JobName AS JobToName   ,jd2.ProcName AS JobToProcName   ,jd2.JobDescription AS JobToDescription
				    ,o.ConditionGeneralID AS ConditionGeneralID 
				    ,o.ConditionName
					,o.ConditionAndOr
					,o.ConditionOdate
				--,o.Flag
			FROM #CTMJobRelations o 
				--LEFT OUTER JOIN CTM_JobDetails jd1       ON o.JobFromGeneralID = jd1.JobGeneralID
				--LEFT OUTER JOIN CTM_JobDetails jd2       ON o.JobToGeneralID   = jd2.JobGeneralID
			ORDER BY o.JobFromGeneralID ,o.JobToGeneralID ,o.ConditionGeneralID;

           --CLEAN-UP
	       IF OBJECT_ID('tempdb..#CTMJobRelations')        IS NOT NULL DROP TABLE #CTMJobRelations;
           IF OBJECT_ID('tempdb..#CTMJobFilter')           IS NOT NULL DROP TABLE #CTMJobFilter;
END;
