-- =============================================
-- Author:	  	Sólyom Péter
-- Create date: 2016.02.16.
-- Description:	Órarend lekérdezése.
-- =============================================

IF OBJECT_ID('sp_GetOrarendTanoranKivuli') IS NOT NULL BEGIN
  DROP PROCEDURE sp_GetOrarendTanoranKivuli
END
GO

CREATE PROCEDURE [sp_GetOrarendTanoranKivuli]
	@IntezmenyId int,
	@TanevId int,
	@IdoszakKezdete datetime,
	@IdoszakVege datetime,
	@TanarId int,
	@OsztalyCsoportId int,
	@TanuloId int,
	@CsakOrarendiOrak bit
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	DECLARE @KezdoHet int = DATEPART( ISO_WEEK, @IdoszakKezdete);
	DECLARE @ZaroHet int = DATEPART( ISO_WEEK, @IdoszakVege);
	-- Orarendi nap: "Ha nem OrarendiNap, akkor arra a napra ne jelenítse meg az órarendet." Ha C_ORARENDINAP = 'F', akkor OrarendiOra-t nem jelenít meg aznapra...
	/*
		- Jelenleg a T_NAPTARINAP és a T_TANEVRENDJE táblák közül a T_TANEVRENDJE tartalmazza a valid információkat.
		- Kiemelt típusok esetén ne jelenjenek meg az órarendi órák. Ilyen kiemelt naptípusok (jelenleg):
			1386 == Munkaszüneti nap
			1387 == Tanítás nélküli munkanap
			1389 == Egész napos kirándulás
			1391 == Szabadnap (igazgatói hatáskörben)
			1392 == Tanítási szünet
			1396 == Ünnepnap
			1397 == Téli szünet
			1398 == Tavaszi szünet
			1399 == Őszi szünet
			1401 == Vizsganap
	*/
	SELECT 
  	Datum,
	CASE 
		WHEN TanevHetirend is null THEN NapHetirend 
		ELSE TanevHetirend 
	END Hetirend,
	CASE 
		WHEN TanevHetNapja is null THEN NapHetNapja 
		ELSE TanevHetNapja 
	END HetNapja
	INTO 
		#TEMPORARENDINAPOK
	from(
	SELECT
		NAPTARINAP.Datum Datum,
		napHetirend.C_HETIREND NapHetirend,
		napHetirend.C_HETNAPJA NapHetNapja,
		tanevRendHetirend.C_HETIREND TanevHetirend,
		tanevRendHetirend.C_HETNAPJA TanevHetNapja	
	FROM /*ÁTÍRANDÓÓÓ*/
		(
			/*Minden naptári nap, ami az időintervallumba beleesik.*/
			(SELECT C_NAPDATUMA Datum FROM T_NAPTARINAP_OSSZES NAPTARINAP WHERE (TOROLT = 'F' AND C_NAPDATUMA >= @IdoszakKezdete AND C_NAPDATUMA < @IdoszakVege AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId))
			EXCEPT /*Kivéve, ha van aznap kiemelt típusú tanévrendje esemény, vagy olyan esemény, aminél C_ORARENDINAP = 'F'.*/
			(SELECT C_DATUM Datum FROM T_TANEVRENDJE_OSSZES TANEVRENDJE WHERE (TOROLT = 'F' AND (C_NAPTIPUSA IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401) OR C_ORARENDINAP = 'F')  AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId))
			UNION /*Azokat a dátumokat vegyük hozzá, amely napokon van C_ORARENDINAP = 'T' és C_ORARENDINAP = 'F' esemény is felvéve.*/
			(
				SELECT
					Datum
				FROM
					(
						SELECT
							C_DATUM Datum,
							COUNT (C_DATUM) DatumCounter
						FROM
							(SELECT C_DATUM, C_ORARENDINAP FROM T_TANEVRENDJE_OSSZES TANEVRENDJE WHERE (TOROLT = 'F') AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId) TANEVRENDJE1
						GROUP BY
							C_ORARENDINAP,
							C_DATUM
					) TANEVRENDJE2
				GROUP BY
					Datum
				HAVING
					COUNT(Datum) = 2
			)
		) NAPTARINAP
		left join (select C_NAPDATUMA, C_HETIREND, C_HETNAPJA from T_NAPTARINAP_OSSZES  WHERE TOROLT = 'F') napHetirend on  napHetirend.C_NAPDATUMA = NAPTARINAP.Datum
		left join (select C_DATUM, C_HETIREND, C_HETNAPJA from T_TANEVRENDJE_OSSZES  WHERE TOROLT = 'F') tanevRendHetirend on  tanevRendHetirend.C_DATUM = NAPTARINAP.Datum
		) NapokHetirenddel
	-- Vegzosok utolso tanitasi napja
	DECLARE @VegzosUtolsoTanitasiNap DATETIME;
	SELECT
		@VegzosUtolsoTanitasiNap = C_DATUM
	FROM
		T_TANEVRENDJE_OSSZES
	WHERE
		TOROLT = 'F'
		AND C_TANEVID = (SELECT ID FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND C_AKTIV = 'T' AND C_INTEZMENYID = @IntezmenyId)
		AND C_NAPTIPUSA = 1402  AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId
	-- Kapcsolódó csoportok
	 SELECT CsoportID 
	 into #TEMPCSOPORTOK
	 FROM 
			 (
			 SELECT C_CSOPORTOKID CsoportID 
		
					 FROM 
						 T_CSOPORTOK_OSZTALYOK
					 WHERE C_OSZTALYOKID = @OsztalyCsoportId AND @OsztalyCsoportId IS NOT NULL 
				 UNION ALL
					SELECT ID CsoportID FROM T_CSOPORT_OSSZES
					WHERE C_OSZTALYBONTASID = @OsztalyCsoportId --AND C_OSZTALYBONTASID IS NOT NULL
					AND TOROLT='F' AND C_ALINTEZMENYID = @IntezmenyId AND C_ALTANEVID=@TanevId) KapcsolodoCsoportok	
			-- CSAK AKKOR KELL AZ OSZTÁLYOKHOZ KAPCSOLÓDÓ CSOPORTOK IS, HA KIFEJEZETTEN OSZTÁLY ÓRAREND VAN LEKÉRVE
	UNION ALL
	SELECT @OsztalyCsoportId
	-- Tanítási órák
	SELECT
        TANITASIORA.ID Id,
		    TANITASIORA.C_ORARENDIORAID ORARENDIID,	
        TANITASIORA.C_BONTOTT Bontott,
        (   SELECT 
                T_NAPTARINAP_OSSZES.C_HETIREND
            FROM 
                T_NAPTARINAP_OSSZES 
            WHERE 
                T_NAPTARINAP_OSSZES.ID = TANITASIORA.C_NAPTARINAPID
        ) Hetirend,
        TANITASIORA.C_HETNAPJA HetNapja,
        CAST('19000101' AS DATETIME) ErvenyessegKezdete,
        CAST('19000101' AS DATETIME) ErvenyessegVege,                  
        TANITASIORA.C_ORAKEZDETE OraKezdete,
        TANITASIORA.C_ORAVEGE OraVege,                   
        ISNULL(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNev,
        TANITASIORA.C_MEGTARTOTT Megtartott,
        OSZTALY.C_NEV OsztalyNev,
        fh.C_NYOMTATASINEV TanarNev,
        TEREM.C_NEV TeremNev,
        'TanitasiOra' OraTipus,
        CASE WHEN (@TanuloId IS NOT NULL AND
					 (SELECT COUNT(1) 
					  FROM T_TANULOMULASZTAS_OSSZES MULASZTAS 
					  WHERE MULASZTAS.C_ORATANULOIID = @TanuloId
							AND MULASZTAS.C_TANITASIORAKID = TANITASIORA.ID  AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId
							AND MULASZTAS.C_TIPUS = 1500 AND MULASZTAS.TOROLT = 'F') > 0)   --Kreta.Enums.MulasztasTipusEnum.hianyzas
				THEN 'T'
				ELSE 'F'
			END AS Hianyzas,
		CASE WHEN (@TanuloId IS NOT NULL AND
					(SELECT COUNT(1) 
					FROM T_TANULOMULASZTAS_OSSZES MULASZTAS 
					WHERE MULASZTAS.C_ORATANULOIID = @TanuloId
						AND MULASZTAS.C_TANITASIORAKID = TANITASIORA.ID  AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId
						AND MULASZTAS.C_TIPUS = 1499 AND MULASZTAS.TOROLT = 'F') > 0)   --Kreta.Enums.MulasztasTipusEnum.keses
			THEN 'T'
			ELSE 'F'
		END AS Keses,
		TANITASIORA.C_HELYETTESITOTANARID HelyettesitoTanarID,
		HELYETTESTANAR.C_NYOMTATASINEV HelyettesitoTanarNev,
		fh.ID TanarID,
		null as HelyettesitesId,
		TANITASIORA.C_ADMINALTALKIIRT AdminAltalKiirt,
		TANITASIORA.C_TEMA as Tema
			INTO #TEMPORAK
     FROM T_TANITASIORA_OSSZES TANITASIORA
        LEFT JOIN T_TANTARGY_OSSZES TARGY ON (TARGY.ID = TANITASIORA.C_TANTARGYID)
        LEFT JOIN T_ORAK_TANAROK ON TANITASIORA.ID = T_ORAK_TANAROK.C_ORAKID 
        LEFT JOIN T_FELHASZNALO_OSSZES fh on T_ORAK_TANAROK.C_TANAROKID = fh.ID
        LEFT JOIN T_OSZTALYCSOPORT_OSSZES OSZTALY on (TANITASIORA.C_OSZTALYCSOPORTID = OSZTALY.ID  )
        LEFT JOIN T_TEREM_OSSZES TEREM on (TEREM.id = TANITASIORA.C_TEREMID ) 
		LEFT JOIN T_FELHASZNALO_OSSZES HELYETTESTANAR on TANITASIORA.C_HELYETTESITOTANARID = HELYETTESTANAR.ID
     WHERE @CsakOrarendiOrak = 0	-- TANÓRA IS
        AND TANITASIORA.TOROLT='F'  AND TANITASIORA.C_INTEZMENYID = @IntezmenyId AND TANITASIORA.C_TANEVID=@TanevId
        AND TANITASIORA.C_CSENGETESIRENDORAID IS NULL
		AND (TANITASIORA.C_ORAKEZDETE >= @IdoszakKezdete 
				AND TANITASIORA.C_ORAVEGE <= (CASE WHEN OSZTALY.C_VEGZOSEVFOLYAM = 'T' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap THEN @VegzosUtolsoTanitasiNap ELSE @IdoszakVege END))
		AND (@TanarId IS NULL OR ( TANITASIORA.C_HELYETTESITOTANARID = @TanarId OR TANITASIORA.C_ORATULAJDONOSID = @TanarId OR T_ORAK_TANAROK.C_TANAROKID = @TanarId))
		--KAPCSOLÓDÓ CSOPORTOK
        AND (@OsztalyCsoportId IS NULL OR TANITASIORA.C_OSZTALYCSOPORTID IN (SELECT CsoportID FROM #TEMPCSOPORTOK)
				
		)
        AND ( @TanuloId IS NULL
				 OR EXISTS (SELECT 1 
								FROM T_TANULOCSOPORT_OSSZES TANCSOP 
								WHERE TANCSOP.C_OSZTALYCSOPORTID = TANITASIORA.C_OSZTALYCSOPORTID
									AND TANCSOP.TOROLT = 'F'  AND TANCSOP.C_INTEZMENYID = @IntezmenyId AND TANCSOP.C_TANEVID=@TanevId
									AND TANCSOP.C_BELEPESDATUM < GETDATE()
									AND (TANCSOP.C_KILEPESDATUM IS NULL OR TANCSOP.C_KILEPESDATUM >= GETDATE())		-- TÖRÖLT
									AND TANCSOP.C_TANULOID = @TanuloId )
		   )
-- Órarendi órák
INSERT INTO #TEMPORAK
Select 
OrarendiOrak.Id, ORARENDIID, Bontott, Hetirend, HetNapja, ErvenyessegKezdete, ErvenyessegVege, OraKezdete, OraVege,
 TargyNev, Megtartott, OsztalyNev, TanarNev, TeremNev, OraTipus, Hianyzas, Keses,
C_HELYETTESTANAROKID HelyettesitoTanarID, HelyettesitoTanarNev, TanarID,HelyettesitesId,AdminAltalKiirt, Tema
FROM (
  SELECT
    T_ORARENDIORA_OSSZES.ID Id,
	T_ORARENDIORA_OSSZES.ID ORARENDIID,
    T_ORARENDIORA_OSSZES.C_BONTOTT Bontott,
    T_ORARENDIORA_OSSZES.C_HETIREND Hetirend,
    T_ORARENDIORA_OSSZES.C_HETNAPJA HetNapja,
    T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGKEZDETE ErvenyessegKezdete,
    T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGVEGE ErvenyessegVege,
    DATEADD(day, 0, DATEDIFF(day, 0, ORARENDINAPOK.Datum)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, T_ORARENDIORA_OSSZES.C_ORAKEZDETE), T_ORARENDIORA_OSSZES.C_ORAKEZDETE) OraKezdete,
    DATEADD(day, 0, DATEDIFF(day, 0, ORARENDINAPOK.Datum)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, T_ORARENDIORA_OSSZES.C_ORAVEGE), T_ORARENDIORA_OSSZES.C_ORAVEGE) OraVege,
    ISNULL(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNev,
    'F' Megtartott,
    OSZTALY.C_NEV OsztalyNev,
    fh.C_NYOMTATASINEV TanarNev,
    TEREM.C_NEV TeremNev,
    'OrarendiOra'  OraTipus,
    'F' Hianyzas,
	'F' Keses,
  	fh.ID TanarID,
    hi.C_HELYETTESTANAROKID,
	HELYETTESTANAR.C_NYOMTATASINEV as HelyettesitoTanarNev,
	hi.ID as HelyettesitesId,
	'F' AdminAltalKiirt,
	NULL AS Tema
  FROM T_ORARENDIORA_OSSZES
		INNER JOIN #TEMPORARENDINAPOK ORARENDINAPOK ON (( T_ORARENDIORA_OSSZES.C_HETIREND = 1554 OR ORARENDINAPOK.HETIREND = T_ORARENDIORA_OSSZES.C_HETIREND ) AND ORARENDINAPOK.HETNAPJA = T_ORARENDIORA_OSSZES.C_HETNAPJA )
    LEFT JOIN T_TANTARGY_OSSZES TARGY ON TARGY.ID = T_ORARENDIORA_OSSZES.C_TANTARGYID
    LEFT JOIN T_FELHASZNALO_OSSZES fh ON fh.ID = T_ORARENDIORA_OSSZES.C_TANARID
    LEFT JOIN T_OSZTALYCSOPORT_OSSZES OSZTALY ON T_ORARENDIORA_OSSZES.C_OSZTALYCSOPORTID = OSZTALY.ID
    LEFT JOIN T_TEREM_OSSZES TEREM on (TEREM.id = T_ORARENDIORA_OSSZES.C_TEREMID )
    LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi on (T_ORARENDIORA_OSSZES.ID = hi.C_HELYETTESITETTORARENDID) AND (hi.TOROLT = 'F')
	LEFT JOIN T_FELHASZNALO_OSSZES HELYETTESTANAR on hi.C_HELYETTESTANAROKID = HELYETTESTANAR.ID
  WHERE
	T_ORARENDIORA_OSSZES.TOROLT= 'F'
	AND T_ORARENDIORA_OSSZES.C_CSENGETESIRENDORAID IS NULL
	AND T_ORARENDIORA_OSSZES.C_TANEVID = @TanevId
    AND T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGVEGE >= @IdoszakKezdete AND T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGKEZDETE <= (CASE WHEN OSZTALY.C_VEGZOSEVFOLYAM = 'T' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap THEN @VegzosUtolsoTanitasiNap ELSE @IdoszakVege END) 
	AND ORARENDINAPOK.DATUM BETWEEN @IdoszakKezdete AND (CASE WHEN OSZTALY.C_VEGZOSEVFOLYAM = 'T' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap THEN @VegzosUtolsoTanitasiNap ELSE @IdoszakVege END)
	AND TEREM.C_TANEVID = @TanevId
    AND (hi.C_HETSORSZAMA >= @KezdoHet OR hi.ID IS NULL)
    AND (hi.C_HETSORSZAMA <= @ZaroHet OR hi.ID IS NULL)
    --AND ORARENDINAPOK.DATUM BETWEEN  CAST(T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGKEZDETE AS DATE) AND CAST(T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGVEGE AS DATE)
	AND (
		(ORARENDINAPOK.DATUM >= T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGKEZDETE AND ORARENDINAPOK.DATUM < T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGVEGE) 
		OR
		(ORARENDINAPOK.DATUM = T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGKEZDETE AND ORARENDINAPOK.DATUM = T_ORARENDIORA_OSSZES.C_ORAERVENYESSEGVEGE)
	)
  AND (@TanarId IS NULL OR ( T_ORARENDIORA_OSSZES.C_ORATULAJDONOSID = @TanarId OR T_ORARENDIORA_OSSZES.C_TANARID = @TanarId OR hi.C_HELYETTESTANAROKID = @TanarId))
  
   --KAPCSOLÓDÓ CSOPORTOK
    AND ( @OsztalyCsoportId IS NULL OR T_ORARENDIORA_OSSZES.C_OSZTALYCSOPORTID IN (SELECT CsoportID FROM #TEMPCSOPORTOK) )
    AND ( @TanuloId IS NULL
		  OR EXISTS (
        SELECT 1 
			  FROM T_TANULOCSOPORT_OSSZES TANCSOP 
				WHERE TANCSOP.C_OSZTALYCSOPORTID = T_ORARENDIORA_OSSZES.C_OSZTALYCSOPORTID
					AND TANCSOP.C_TANEVID = @TanevId
					AND TANCSOP.C_BELEPESDATUM < GETDATE()
					AND (TANCSOP.C_KILEPESDATUM IS NULL OR TANCSOP.C_KILEPESDATUM >= GETDATE())		-- TÖRÖLT
					AND TANCSOP.C_TANULOID = @TanuloId )
	  )
	  
  ) OrarendiOrak
  WHERE	 NOT EXISTS ( 
      SELECT 1 
      FROM #TEMPORAK TANORAK 
			WHERE TANORAK.ORARENDIID = OrarendiOrak.ID
				AND TANORAK.OraKezdete = OrarendiOrak.[OraKezdete]
				AND TANORAK.OraVege = OrarendiOrak.[OraVege]
    )		-- HA MÁR VAN TANÍTÁSI ÓRA, AMELYIK VALAMELYIK ÓRARENDI ÓRÁBÓL JÖN, AKKOR NEM KELL AHHOZ AZ ÓRARENDI ÓRA IS
  	
  SELECT * FROM #TEMPORAK order by orakezdete
  
	DROP TABLE #TEMPORAK
	DROP TABLE #TEMPCSOPORTOK
	DROP TABLE #TEMPORARENDINAPOK
END
GO

