IF OBJECT_ID('dbo.fnGetTanorak') IS NOT NULL BEGIN
  DROP FUNCTION dbo.fnGetTanorak
END
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- A Funkció visszaadja egy pedagógus, egy osztály vagy csoport, egy tantárgy vagy egy terem minden 
-- naplózatlan, naplózott, megtartott és nem-megtartott, helyettesített, vagy akármilyen óráját 
-- egy megadott időszakra
CREATE FUNCTION dbo.fnGetTanorak 
	( 
		@tanevId INT,					-- Kötelezően átadandó
		@kezdoDatum DATETIME = NULL, 	-- NULL esetén az adott tanév első napjától vizsgálja
		@vegDatum DATETIME = NULL,		-- NULL esetén az adott tanév utolsó napjáig vizsgálja
		@tanarId INT = NULL,			-- NULL esetén minden pedagógus órái lejönnek
		@tantargyId INT = NULL,			-- NULL esetén minden pedagógus órái lejönnek
		@teremId INT = NULL,			-- NULL esetén minden pedagógus órái lejönnek
		@osztalycsoportId INT = NULL,	-- NULL esetén minden osztály vagy csoport órái lejönnek
		@isKapcsolodoCsoportok BIT = 0	-- 1 esetén az osztály vagy csoport kapcsolódó osztályait is csoportojait is lehozza, 
										-- 		csak akkor értelmezhető, ha van @osztalycsoportId is.
	)
RETURNS @retTable TABLE (
   OraDatuma 			DATETIME,
   OraKezdete 			DATETIME,
   OraVege 				DATETIME,
   HetNapjaId 			INT,
   CsengetesiRendId 	INT,
   CsengetesiRendOraId 	INT,
   Oraszam 				INT,
   HetirendId			INT,
   OraTulajdonosId 		INT,
   TanarId 				INT,
   HelyettesitoId 		INT,
   OsztalyCsoportId 	INT,
   TantargyId 			INT,
   TeremId 				INT,
   IsHelyettesitett 	CHAR,
   IsNaplozott 			CHAR,
   IsMobilNaplozott 	CHAR,
   IsElmaradt 			CHAR,
   IsOrarendNelkul 		CHAR,
   OrarendiOraId		INT,
   TanitasiOraId		INT
)
BEGIN  
	-- ------------------------------------------------------------------------------------------------------------------
	-- Segédtáblák definiálása
	-- ------------------------------------------------------------------------------------------------------------------
	DECLARE @Naptar TABLE 
		(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR)
	DECLARE @OsztalyCsoportNaptar TABLE 
		(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR, OsztalycsoportId INT)
	DECLARE @KapcsolodoOsztalyCsoportok TABLE
		(OsztalyCsoportId INT PRIMARY KEY)
	-- ------------------------------------------------------------------------------------------------------------------
	-- Minden hét hetirend ID-jának beállítása
	-- ------------------------------------------------------------------------------------------------------------------
	DECLARE @MindenHetHetirend INT = 1554
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Végzősök utolsó napjának beállítása
	-- ------------------------------------------------------------------------------------------------------------------
	DECLARE @vegzosUtolsoNapDatuma DATE = (SELECT C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_TANEVID = @tanevId AND TOROLT = 'F' AND C_NAPTIPUSA = 1402)

	-- ------------------------------------------------------------------------------------------------------------------
	-- Aktív csengetési rend megkeresése
	-- ------------------------------------------------------------------------------------------------------------------
	DECLARE @AktivCsengetesiRendId INT
	SELECT TOP 1
				@AktivCsengetesiRendId = ID 
	FROM 		T_CSENGETESIREND_OSSZES 
	WHERE 		C_TANEVID = @tanevId 
			AND TOROLT = 'F'
			AND C_AKTIV = 'T'
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Kezdődátum megkeresése, ha NULL
	-- ------------------------------------------------------------------------------------------------------------------
	IF (@kezdoDatum IS NULL)
	BEGIN
		SELECT @kezdoDatum = C_KEZDONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId
	END
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Végdátum megkeresése, ha NULL
	-- ------------------------------------------------------------------------------------------------------------------
	IF (@vegDatum IS NULL)
	BEGIN
		SELECT @vegDatum = C_UTOLSONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId
	END
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Kapcsolódó osztályok és csoportok megkeresése, ha szükséges
	-- ------------------------------------------------------------------------------------------------------------------
	IF (@osztalycsoportId IS NOT NULL)
	BEGIN
		IF (@isKapcsolodoCsoportok = 1)
		BEGIN
			INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId)
			SELECT DISTINCT ID FROM dbo.fnGetKapcsolodoOsztalycsoportokByDate(@osztalycsoportId,@kezdoDatum,@vegDatum)
		END
		IF (@isKapcsolodoCsoportok = 0)
		BEGIN
			INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId)
			VALUES (@osztalycsoportId)
		END
	END
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Az alapértelmezett naptári napok betétele a segédtáblába
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @Naptar 
		(Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap)
	SELECT 
		nn.C_NAPDATUMA,
		ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend),
		IIF(tr.ID IS NOT NULL,tr.C_HETNAPJA,nn.C_HETNAPJA),
		ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId),
		IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),'F','T'),
		IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T','T','F')
	FROM 		T_NAPTARINAP_OSSZES nn
	LEFT JOIN 	T_TANEVRENDJE_OSSZES tr 
			ON 	tr.C_DATUM = nn.C_NAPDATUMA 
			AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'T'
			AND tr.C_TANEVID = nn.C_TANEVID
			AND tr.TOROLT = 'F'
	WHERE 		nn.C_NAPDATUMA >= @kezdoDatum
			AND nn.C_NAPDATUMA <= @vegDatum
			AND nn.C_TANEVID = @tanevId
			AND nn.TOROLT = 'F'
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Az OsztályCsoport-ok esetén érvényes naptári napok betétele a segédtáblába
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @OsztalyCsoportNaptar 
		(Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap, OsztalycsoportId)
	SELECT 
		nn.C_NAPDATUMA,
		ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend),
		IIF(tr.ID IS NOT NULL,tr.C_HETNAPJA,nn.C_HETNAPJA),
		ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId),
		IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),'F','T'),
		COALESCE(tr.C_ORARENDINAP,nn.C_ORARENDINAP, 'F'),
		ocstr.C_OSZTALYCSOPORTID
	FROM 		T_NAPTARINAP_OSSZES nn
	INNER JOIN 	T_TANEVRENDJE_OSSZES tr 
			ON 	tr.C_DATUM = nn.C_NAPDATUMA 
			AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'F'
			AND tr.C_TANEVID = nn.C_TANEVID
			AND tr.TOROLT = 'F'
	INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr
			ON 	ocstr.C_TANEVRENDJEID = tr.ID
	WHERE 		nn.C_NAPDATUMA >= @kezdoDatum
			AND nn.C_NAPDATUMA <= @vegDatum
			AND nn.C_TANEVID = @tanevId
			AND nn.TOROLT = 'F'
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Végzős osztálycsoportok esetén minden nap a végzős dátum után nem tanítási nap
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @OsztalyCsoportNaptar 
		(Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap, OsztalycsoportId)
	SELECT 
		nn.C_NAPDATUMA,
		nn.C_HETIREND,
		nn.C_HETNAPJA,
		@AktivCsengetesiRendId,
		'F',
		'F',
		ocs.ID
	FROM 		T_NAPTARINAP_OSSZES nn
	INNER JOIN 	T_OSZTALYCSOPORT_OSSZES ocs
			ON 	ocs.C_TANEVID = @tanevId
			AND ocs.TOROLT = 'F'
			AND ocs.C_VEGZOSEVFOLYAM = 'T'
	WHERE 		nn.C_NAPDATUMA > @vegzosUtolsoNapDatuma
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Alapértelmezett órarend összeállítása, az egyedi OsztályCsoportok naptára nélkül
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @retTable (	
		OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, HetirendId,
		OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, 
		IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
	SELECT 
		-- Időpont adatok
		n.Datum						AS OraDatuma,
		oo.C_ORAKEZDETE				AS OraKezdete,
		oo.C_ORAVEGE				AS OraVege,
		n.HetNapjaId				AS HetNapjaId,
		oo.C_CSENGETESIRENDID		AS CsengetesiRendId,
		oo.C_CSENGETESIRENDORAID	AS CsengetesiRendOraId,
		oo.C_ORASZAM 				AS Oraszam,
		oo.C_HETIREND				AS HetirendId,
		-- Kapcsolati adatok
		oo.C_ORATULAJDONOSID		AS OraTulajdonosId,
		oo.C_TANARID				AS TanarId,
		hi.C_HELYETTESTANAROKID		AS HelyettesitoId,
		oo.C_OSZTALYCSOPORTID		AS OsztalyCsoportId,
		oo.C_TANTARGYID				AS TantargyId,
		oo.C_TEREMID				AS TeremId,
		-- Egyéb adatok
		IIF(hi.ID IS NULL,'F','T')	AS IsHelyettesitett,
		'F'							AS IsNaplozott,
		'F'							AS IsMobilNaplozott,
		'F'							AS IsElmaradt,
		'F'							AS IsOrarendNelkul,
		oo.ID 						AS OrarendiOraId,
		NULL						AS TanitasiOraId
	FROM 		T_ORARENDIORA_OSSZES oo
	INNER JOIN	@Naptar n
			ON	n.HetNapjaId = oo.C_HETNAPJA
			AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND)
			AND	n.Datum >= oo.C_ORAERVENYESSEGKEZDETE
			AND	n.Datum <= oo.C_ORAERVENYESSEGVEGE
			AND n.IsTanitasiNap = 'T'
			AND n.IsOrarendiNap = 'T'
	LEFT JOIN 	T_HELYETTESITESIIDOSZAK_OSSZES hi 
			ON	hi.C_HELYETTESITESNAPJA = n.Datum
			AND hi.C_HELYETTESITETTORARENDID = oo.ID
			AND hi.C_TANEVID = @tanevid
			AND hi.TOROLT = 'F'
	WHERE		oo.C_TANEVID = @tanevid
			AND oo.TOROLT = 'F'
			AND oo.C_OSZTALYCSOPORTID NOT IN (SELECT OsztalycsoportId FROM @OsztalyCsoportNaptar ocsn WHERE ocsn.Datum = n.Datum)
			AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
			AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId)
			AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId)
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Órarend kiegészítése az egyedi osztályok és csoportok órarendjével
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @retTable (	
		OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, HetirendId,
		OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, 
		IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
	SELECT 
		-- Időpont adatok
		n.Datum						AS OraDatuma,
		oo.C_ORAKEZDETE				AS OraKezdete,
		oo.C_ORAVEGE				AS OraVege,
		n.HetNapjaId				AS HetNapjaId,
		oo.C_CSENGETESIRENDID		AS CsengetesiRendId,
		oo.C_CSENGETESIRENDORAID	AS CsengetesiRendOraId,
		oo.C_ORASZAM 				AS Oraszam,
		oo.C_HETIREND				AS HetirendId,
		-- Kapcsolati adatok
		oo.C_ORATULAJDONOSID		AS OraTulajdonosId,
		oo.C_TANARID				AS TanarId,
		hi.C_HELYETTESTANAROKID		AS HelyettesitoId,
		oo.C_OSZTALYCSOPORTID		AS OsztalyCsoportId,
		oo.C_TANTARGYID				AS TantargyId,
		oo.C_TEREMID				AS TeremId,
		-- Egyéb adatok
		IIF(hi.ID IS NULL,'F','T')	AS IsHelyettesitett,
		'F'							AS IsNaplozott,
		'F'							AS IsMobilNaplozott,
		'F'							AS IsElmaradt,
		'F'							AS IsOrarendNelkul,
		oo.ID 						AS OrarendiOraId,
		NULL						AS TanitasiOraId
	FROM 		T_ORARENDIORA_OSSZES oo
	INNER JOIN	@OsztalyCsoportNaptar n
			ON	n.HetNapjaId = oo.C_HETNAPJA
			AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND)
			AND	n.Datum >= oo.C_ORAERVENYESSEGKEZDETE
			AND	n.Datum <= oo.C_ORAERVENYESSEGVEGE
			AND n.OsztalyCsoportId = oo.C_OSZTALYCSOPORTID
			AND n.IsTanitasiNap = 'T'
			AND n.IsOrarendiNap = 'T'
	LEFT JOIN 	T_HELYETTESITESIIDOSZAK_OSSZES hi 
			ON	hi.C_HELYETTESITESNAPJA = n.Datum
			AND hi.C_HELYETTESITETTORARENDID = oo.ID
			AND hi.C_TANEVID = @tanevid
			AND hi.TOROLT = 'F'
	WHERE		oo.C_TANEVID = @tanevid
			AND oo.TOROLT = 'F'
			AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
			AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId)
			AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId)
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Tanítási órák betétele, amikhez nem tartozik órarendi óra
	-- ------------------------------------------------------------------------------------------------------------------
	INSERT INTO @retTable (	
		OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, HetirendId,
		OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, 
		IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
	SELECT 
		-- Időpont adatok
		tno.C_DATUM					AS OraDatuma,
		tno.C_ORAKEZDETE			AS OraKezdete,
		tno.C_ORAVEGE				AS OraVege,
		tno.C_HETNAPJA				AS HetNapjaId,
		tno.C_CSENGETESIRENDID		AS CsengetesiRendId,
		tno.C_CSENGETESIRENDORAID	AS CsengetesiRendOraId,
		tno.C_ORASZAM 				AS Oraszam,
		NULL						AS HetirendId,
		-- Kapcsolati adatok
		tno.C_ORATULAJDONOSID		AS OraTulajdonosId,
		tno.C_TANARID				AS TanarId,
		tno.C_HELYETTESITOTANARID	AS HelyettesitoId,
		tno.C_OSZTALYCSOPORTID		AS OsztalyCsoportId,
		tno.C_TANTARGYID			AS TantargyId,
		tno.C_TEREMID				AS TeremId,
		-- Egyéb adatok
		IIF(tno.C_HELYETTESITOTANARID IS NULL,'F','T')		AS IsHelyettesitett,
		'T'													AS IsNaplozott,
		IIF(tno.C_MOBILNAPLOZOTT = 'T','T','F') 			AS IsMobilNaplozott,
		IIF(tno.C_MEGTARTOTT = 'F','T','F')					AS IsElmaradt,
		'T'													AS IsOrarendNelkul,
		NULL 												AS OrarendiOraId,
		tno.ID												AS TanitasiOraId
	FROM 		T_TANITASIORA_OSSZES tno
	WHERE		tno.C_TANEVID = @tanevid
			AND tno.TOROLT = 'F'
			AND (@osztalycsoportId IS NULL OR (tno.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
			AND (@tantargyId IS NULL OR tno.C_TANTARGYID = @tantargyId)
			AND (@tanarId IS NULL OR tno.C_HELYETTESITOTANARID = @tanarId OR tno.C_TANARID = @tanarId)
			AND 0 = (
						SELECT COUNT(1) FROM @retTable r
						WHERE 		tno.C_DATUM = r.OraDatuma
								AND tno.C_ORASZAM = r.Oraszam
								AND tno.C_ORAKEZDETE = r.OraKezdete
								AND tno.C_ORAVEGE = r.OraVege
								AND	tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId
								AND	tno.C_TANTARGYID = r.TantargyId
								AND	tno.C_TANARID = r.TanarId
					)
	
	-- ------------------------------------------------------------------------------------------------------------------
	-- Naplózott órák betétele, ha volt nekik órarendi órájuk
	-- ------------------------------------------------------------------------------------------------------------------
	UPDATE 		r
	SET			r.IsNaplozott = 'T',
				r.IsElmaradt = IIF(tno.C_MEGTARTOTT = 'F','T','F'),
				r.TeremId = tno.C_TEREMID,
				r.TanitasiOraId = tno.Id,
				r.IsHelyettesitett = IIF(tno.C_HELYETTESITOTANARID IS NULL,'F','T'),
				r.HelyettesitoId = tno.C_HELYETTESITOTANARID
	FROM		@retTable r
	INNER JOIN 	T_TANITASIORA_OSSZES tno
			ON	tno.C_DATUM = r.OraDatuma
			AND tno.C_ORASZAM = r.Oraszam
			AND tno.C_ORAKEZDETE = r.OraKezdete
			AND tno.C_ORAVEGE = r.OraVege
			AND	tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId
			AND	tno.C_TANTARGYID = r.TantargyId
			AND	tno.C_TANARID = r.TanarId
			AND tno.C_TANEVID = @tanevid
			AND tno.TOROLT = 'F'
	
	RETURN
END
GO