﻿-- =============================================
-- Author:		Sólyom Péter
-- Create date: 2016.02.16.
-- Description:	Órarend lekérdezése.
-- =============================================
IF OBJECT_ID('dbo.sp_GetOrarend') IS NOT NULL BEGIN
  DROP PROCEDURE dbo.sp_GetOrarend
END
GO

CREATE PROCEDURE [dbo].[sp_GetOrarend]
	@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),
	  @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,
	  ISNULL(TanevHetirend, NapHetirend) Hetirend,
	  ISNULL(TanevHetNapja, NapHetNapja) HetNapja,
	  CsengetesiRendId
	INTO #TEMPORARENDINAPOK
	FROM (
	  SELECT
  		NAPTARINAP.Datum Datum,
  		napHetirend.C_HETIREND NapHetirend,
  		napHetirend.C_HETNAPJA NapHetNapja,
  		tanevRendHetirend.C_HETIREND TanevHetirend,
  		tanevRendHetirend.C_HETNAPJA TanevHetNapja,
		tanevRendHetirend.C_CSENGETESIRENDID CsengetesiRendId	
	  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, IIF(C_HETNAPJA = 1407, dbo.fnGetHetNapja(C_NAPDATUMA), C_HETNAPJA) AS C_HETNAPJA from T_NAPTARINAP_OSSZES  WHERE TOROLT = 'F' AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId) napHetirend on  napHetirend.C_NAPDATUMA = NAPTARINAP.Datum
  		LEFT JOIN (SELECT C_DATUM, C_HETIREND,C_CSENGETESIRENDID, IIF(C_HETNAPJA = 1407, dbo.fnGetHetNapja(C_DATUM), C_HETNAPJA) AS C_HETNAPJA from T_TANEVRENDJE_OSSZES  WHERE TOROLT = 'F' AND C_INTEZMENYID = @IntezmenyId AND C_TANEVID=@TanevId) tanevRendHetirend on  tanevRendHetirend.C_DATUM = NAPTARINAP.Datum
  ) NapokHetirenddel
	
	
	-- Vegzosok utolso tanitasi napja
	DECLARE @VegzosUtolsoTanitasiNap_spGetOrarend DATETIME;
		SELECT
			@VegzosUtolsoTanitasiNap_spGetOrarend = 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
  
	DECLARE @tempCsoportok TABLE (CsoportID int PRIMARY KEY, Oka nvarchar(20))
	IF @OsztalyCsoportId IS NOT NULL
		BEGIN
			INSERT INTO @tempCsoportok (CsoportID, Oka)
				SELECT ID as CsoportID, OKA AS Oka
				FROM dbo.fnGetKapcsolodoOsztalycsoportokByDate(@OsztalyCsoportId,@IdoszakKezdete,@IdoszakVege)
		END
	ELSE
		BEGIN
			INSERT INTO @tempCsoportok (CsoportID, Oka)
				SELECT ID as CsoportID, '' AS Oka
				FROM T_OSZTALYCSOPORT_OSSZES WHERE C_TANEVID = @TanevId
		END
	
	
	-- 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(null AS datetime) ErvenyessegKezdete,
		CAST(null AS datetime) ErvenyessegVege,                  
		TANITASIORA.C_ORAKEZDETE OraKezdete,
		TANITASIORA.C_ORAVEGE OraVege, 
		TANITASIORA.C_ORASZAM Oraszam,                     
		ISNULL(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNev,
		COALESCE(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNevForMobile,
		TARGY.C_TARGYKATEGORIA TargykategoriaID,
		TANITASIORA.C_MEGTARTOTT Megtartott,
		TANITASIORA.C_CSENGETESIRENDORAID CsengetesiRendOraID,
		OSZTALY.C_NEV OsztalyNev,
		tcs.OKA AS MegjelenesOka,
		TANAR.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,
		TANAR.ID TanarID,
		TANITASIORA.C_ADMINALTALKIIRT AdminAltalKiirt,
		TANITASIORA.C_TEMA as Tema
		INTO #TEMPORAK
	FROM T_TANITASIORA_OSSZES TANITASIORA
		INNER JOIN @tempCsoportok tcs ON tcs.CsoportID = TANITASIORA.C_OSZTALYCSOPORTID
		LEFT JOIN T_TANTARGY_OSSZES TARGY ON (TARGY.ID = TANITASIORA.C_TANTARGYID  AND TARGY.C_INTEZMENYID = @IntezmenyId AND TARGY.C_TANEVID=@TanevId)
		LEFT JOIN T_ORAK_TANAROK ON TANITASIORA.ID = T_ORAK_TANAROK.C_ORAKID 
		LEFT JOIN T_FELHASZNALO_OSSZES TANAR on T_ORAK_TANAROK.C_TANAROKID = TANAR.ID
		LEFT JOIN T_OSZTALYCSOPORT_OSSZES OSZTALY on (TANITASIORA.C_OSZTALYCSOPORTID = OSZTALY.ID  AND OSZTALY.C_INTEZMENYID = @IntezmenyId AND OSZTALY.C_TANEVID=@TanevId)
		LEFT JOIN T_TEREM_OSSZES TEREM on (TEREM.id = TANITASIORA.C_TEREMID  AND TEREM.C_INTEZMENYID = @IntezmenyId AND TEREM.C_TANEVID=@TanevId)
		LEFT JOIN T_FELHASZNALO_OSSZES HELYETTESTANAR on TANITASIORA.C_HELYETTESITOTANARID = HELYETTESTANAR.ID
	WHERE @CsakOrarendiOrak = 0
		AND TANITASIORA.TOROLT='F'  AND TANITASIORA.C_INTEZMENYID = @IntezmenyId AND TANITASIORA.C_TANEVID=@TanevId
		AND TANITASIORA.C_CSENGETESIRENDORAID IS NOT NULL
		AND (TANITASIORA.C_ORAKEZDETE >= @IdoszakKezdete 
		AND TANITASIORA.C_ORAVEGE <= (CASE WHEN OSZTALY.C_VEGZOSEVFOLYAM = 'T' AND @VegzosUtolsoTanitasiNap_spGetOrarend IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap_spGetOrarend THEN DATEADD(DAY, 1, @VegzosUtolsoTanitasiNap_spGetOrarend) ELSE @IdoszakVege END))
	    AND (@TanarId IS NULL OR ( TANITASIORA.C_HELYETTESITOTANARID = @TanarId OR TANITASIORA.C_ORATULAJDONOSID = @TanarId OR T_ORAK_TANAROK.C_TANAROKID = @TanarId ))
		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())
					AND TANCSOP.C_TANULOID = @TanuloId
			)
		)
	
	
	-- Órarendi órák
	INSERT INTO #TEMPORAK
		SELECT
			OrarendiOrak.Id, ORARENDIID, Bontott, Hetirend, HetNapja, ErvenyessegKezdete, ErvenyessegVege, OraKezdete, OraVege,
			Oraszam, TargyNev, TargyNevForMobile, TargykategoriaID, Megtartott, CsengetesiRendOraID, OsztalyNev, MegjelenesOka, TanarNev, TeremNev, OraTipus, Hianyzas, Keses,
			T_HELYETTESITESIIDOSZAK_OSSZES.C_HELYETTESTANAROKID HelyettesitoTanarID, HELYETTESTANAR.C_NYOMTATASINEV HelyettesitoTanarNev, TanarID,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(HOUR, DATEPART(HOUR, T_ORARENDIORA_OSSZES.C_ORAKEZDETE), DATEADD(MINUTE, DATEPART(MINUTE, T_ORARENDIORA_OSSZES.C_ORAKEZDETE), ORARENDINAPOK.DATUM)) OraKezdete,
				DATEADD(HOUR, DATEPART(HOUR, T_ORARENDIORA_OSSZES.C_ORAVEGE), DATEADD(MINUTE, DATEPART(MINUTE, T_ORARENDIORA_OSSZES.C_ORAVEGE), ORARENDINAPOK.DATUM)) OraVege,
				T_ORARENDIORA_OSSZES.C_ORASZAM Oraszam,
				ISNULL(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNev,
				COALESCE(TARGY.C_ROVIDNEV, targy.C_NEV) TargyNevForMobile,
				TARGY.C_TARGYKATEGORIA TargykategoriaID,
				'F' Megtartott,
				T_ORARENDIORA_OSSZES.C_CSENGETESIRENDORAID CsengetesiRendOraID,
				OSZTALY.C_NEV AS OsztalyNev,
				tcs.OKA AS MegjelenesOka,
				TANAR.C_NYOMTATASINEV TanarNev,
				TEREM.C_NEV TeremNev,
				'OrarendiOra'  OraTipus,
				'F' Hianyzas,
  				'F' Keses,
				TANAR.ID TanarID,
				'F' AdminAltalKiirt,
				NULL AS Tema
			FROM T_ORARENDIORA_OSSZES
				INNER JOIN @tempCsoportok tcs ON tcs.CsoportID = T_ORARENDIORA_OSSZES.C_OSZTALYCSOPORTID				       		
				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 TANAR ON TANAR.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 AND TEREM.C_INTEZMENYID = @IntezmenyId AND TEREM.C_TANEVID=@TanevId)
			WHERE
				T_ORARENDIORA_OSSZES.TOROLT='F' 
				AND T_ORARENDIORA_OSSZES.C_CSENGETESIRENDORAID IS NOT NULL
				AND T_ORARENDIORA_OSSZES.C_INTEZMENYID = @IntezmenyId 
				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_spGetOrarend IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap_spGetOrarend THEN @VegzosUtolsoTanitasiNap_spGetOrarend ELSE @IdoszakVege END) 
				AND ORARENDINAPOK.DATUM BETWEEN @IdoszakKezdete AND (CASE WHEN OSZTALY.C_VEGZOSEVFOLYAM = 'T' AND @VegzosUtolsoTanitasiNap_spGetOrarend IS NOT NULL AND @IdoszakVege > @VegzosUtolsoTanitasiNap_spGetOrarend THEN @VegzosUtolsoTanitasiNap_spGetOrarend ELSE @IdoszakVege END)
				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 (@TanuloId IS NULL OR EXISTS (
						SELECT 1 FROM T_TANULOCSOPORT_OSSZES TANCSOP 
  			  				WHERE
								TANCSOP.C_OSZTALYCSOPORTID = T_ORARENDIORA_OSSZES.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())
    							AND TANCSOP.C_TANULOID = @TanuloId )
  				)
			) OrarendiOrak
				LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES on (OrarendiOrak.ID = T_HELYETTESITESIIDOSZAK_OSSZES.C_HELYETTESITETTORARENDID 
							And T_HELYETTESITESIIDOSZAK_OSSZES.C_HETSORSZAMA >= @KezdoHet
							And (T_HELYETTESITESIIDOSZAK_OSSZES.C_HETSORSZAMA <= @ZaroHet) And T_HELYETTESITESIIDOSZAK_OSSZES.TOROLT = 'F' AND DATEDIFF(DAY, OrarendiOrak.OraKezdete, T_HELYETTESITESIIDOSZAK_OSSZES.C_HELYETTESITESNAPJA) = 0
				)
				LEFT JOIN T_FELHASZNALO_OSSZES HELYETTESTANAR ON HELYETTESTANAR.ID = T_HELYETTESITESIIDOSZAK_OSSZES.C_HELYETTESTANAROKID
			WHERE (@TanarId IS NULL OR OrarendiOrak.TanarID = @TanarId Or T_HELYETTESITESIIDOSZAK_OSSZES.C_HELYETTESTANAROKID = @TanarId)
			AND NOT EXISTS ( 
				SELECT 1 FROM #TEMPORAK TANORAK 
  				WHERE TANORAK.ORARENDIID = OrarendiOrak.ID
  					AND TANORAK.OraKezdete = OrarendiOrak.[OraKezdete]
  					AND TANORAK.OraVege = OrarendiOrak.[OraVege]
        )
	
	SELECT * FROM #TEMPORAK order by orakezdete
	
	DROP TABLE #TEMPORAK
	DROP TABLE #TEMPORARENDINAPOK
END