﻿-- =============================================
-- Author:		Telek Ákos
-- Create date: 2018.01.15.
-- Description:	Órarend lekérdezése.
-- =============================================
IF OBJECT_ID('sp_GetOrarend') IS NOT NULL BEGIN
  DROP PROCEDURE sp_GetOrarend
END
GO

CREATE PROCEDURE sp_GetOrarend
   @pIntezmenyId int
  ,@pTanevId int
  ,@pIdoszakKezdete datetime
  ,@pIdoszakVege datetime
  ,@pTanarId int
  ,@pOsztalyCsoportId int
  ,@pTanuloId int
  ,@pCsakOrarendiOrak bit
  ,@pIsNapirend bit = 0 /*0 csak orarendi ora, 1 csak napirend, NULL mindkettő*/
AS
BEGIN
  
  SET NOCOUNT ON;
  DECLARE @sql nvarchar(max) = ''
  
  /* Változók deklarálása */
  SET @sql += N'
	DECLARE 
     @KezdoHet int = DATEPART( ISO_WEEK, @pIdoszakKezdete)
	  ,@ZaroHet int = DATEPART( ISO_WEEK, @pIdoszakVege);


	DECLARE @VegzosUtolsoTanitasiNap datetime;
	SELECT @VegzosUtolsoTanitasiNap = C_DATUM
	FROM T_TANEVRENDJE_OSSZES
	WHERE TOROLT = ''F''
		AND C_TANEVID = @pTanevId
		AND C_NAPTIPUSA = 1402 

  DECLARE @IsVegzosEvfolyam char(1)
  '
  
  /* A kapcsolódó osztálycsoportok összegyűjtése */
  SET @sql += N'
  DECLARE @OsztalyCsoportok table (
     Id int PRIMARY KEY
    ,Nev nvarchar(255)
    ,Oka nvarchar(50)
    ,IsVegzos char(1)
    ,IdoszakVege datetime
  );

  
	IF @pOsztalyCsoportId IS NOT NULL BEGIN
    SELECT @IsVegzosEvfolyam = C_VEGZOSEVFOLYAM 
    FROM T_OSZTALYCSOPORT 
    WHERE ID = @pOsztalyCsoportId  

    INSERT INTO @OsztalyCsoportok (Id, Nev, Oka, IsVegzos, IdoszakVege)
		SELECT kocs.ID, ocs.C_NEV, kocs.OKA, ocs.C_VEGZOSEVFOLYAM, IIF(@IsVegzosEvfolyam = ''T'' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @pIdoszakVege > @VegzosUtolsoTanitasiNap, @VegzosUtolsoTanitasiNap + 1, @pIdoszakVege)
    FROM [dbo].fnGetKapcsolodoOsztalycsoportokByDate(@pOsztalyCsoportId, @pIdoszakKezdete, @pIdoszakVege) kocs
    INNER JOIN T_OSZTALYCSOPORT ocs ON ocs.ID = kocs.ID
	END
  ELSE BEGIN
    IF @pTanuloId IS NOT NULL BEGIN
      
      SELECT @IsVegzosEvfolyam = MAX(ocs.C_VEGZOSEVFOLYAM) 
      FROM T_TANULOCSOPORT_OSSZES tcs
        INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID
      WHERE EXISTS (SELECT 1 FROM T_OSZTALY_OSSZES o WHERE o.ID = ocs.ID)
        AND tcs.C_BELEPESDATUM <= @pIdoszakVege
        AND (tcs.C_KILEPESDATUM > @pIdoszakKezdete OR tcs.C_KILEPESDATUM IS NULL)
            
      INSERT INTO @OsztalyCsoportok (Id, Nev, Oka, IsVegzos, IdoszakVege)    
      SELECT tcs.C_OSZTALYCSOPORTID, ocs.C_NEV, '''' AS Oka, @IsVegzosEvfolyam, IIF(@IsVegzosEvfolyam = ''T'' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @pIdoszakVege > @VegzosUtolsoTanitasiNap, @VegzosUtolsoTanitasiNap + 1, @pIdoszakVege)
      FROM T_TANULOCSOPORT_OSSZES tcs
        INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON tcs.C_OSZTALYCSOPORTID = ocs.ID 
      WHERE tcs.C_TANULOID = @pTanuloId
        AND tcs.C_BELEPESDATUM <= @pIdoszakVege
        AND (tcs.C_KILEPESDATUM > @pIdoszakKezdete OR tcs.C_KILEPESDATUM IS NULL)
      
      
    END
    ELSE BEGIN
  		INSERT INTO @OsztalyCsoportok (Id, Nev, Oka, IsVegzos, IdoszakVege)
  		SELECT ID, C_NEV, '''' AS Oka, C_VEGZOSEVFOLYAM, IIF(C_VEGZOSEVFOLYAM = ''T'' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @pIdoszakVege > @VegzosUtolsoTanitasiNap, @VegzosUtolsoTanitasiNap + 1, @pIdoszakVege)
  		FROM T_OSZTALYCSOPORT_OSSZES 
      WHERE C_TANEVID = @pTanevId AND TOROLT = ''F''
	  END
  END
  
  '

  /* A naptári napok összegyűjtése tanév rendje alapján */
  SET @sql += N'  
  DECLARE @NaptariNapok table (
     Datum datetime
    ,HetirendId int
    ,HetNapjaId int
    ,OrarendiNap char(1)
    ,OsztalyCsoportId int
  );
  
  INSERT INTO @NaptariNapok (
     Datum
    ,HetirendId
    ,HetNapjaId
    ,OrarendiNap
    ,OsztalyCsoportId
  ) SELECT 
       nn.Datum
      ,ISNULL(tr.HetirendId, nn.HetirendId) AS HetirendId
      ,ISNULL(tr.HetNapjaId, nn.HetNapjaId) AS HetNapjaId
      ,ISNULL(tr.OrarendiNap, nn.OrarendiNap) AS OrarendiNap
      ,nn.OsztalyCsoportId
    FROM (
      SELECT 
         nn.C_NAPDATUMA AS Datum
        ,nn.C_HETIREND AS HetirendId
      	,nn.C_HETNAPJA AS HetNapjaId
        ,nn.C_ORARENDINAP AS OrarendiNap
        ,ocs.ID AS OsztalyCsoportId
      FROM T_NAPTARINAP_OSSZES nn
        CROSS JOIN @OsztalyCsoportok ocs
      WHERE nn.TOROLT = ''F''
        AND nn.C_NAPDATUMA >= @pIdoszakKezdete AND nn.C_NAPDATUMA < ocs.IdoszakVege
        AND nn.C_INTEZMENYID = @pIntezmenyId AND nn.C_TANEVID = @pTanevId
    ) nn 
    LEFT JOIN (
      SELECT 
         nn.C_NAPDATUMA AS Datum
        ,tr.C_HETIREND AS HetirendId
        ,tr.C_HETNAPJA AS HetNapjaId
        ,tr.C_ORARENDINAP AS OrarendiNap
        ,ocstr.C_OSZTALYCSOPORTID AS OsztalyCsoportId
      FROM T_NAPTARINAP_OSSZES nn 
        INNER JOIN T_TANEVRENDJE_OSSZES tr ON tr.C_DATUM = nn.C_NAPDATUMA AND nn.C_INTEZMENYID = tr.C_INTEZMENYID AND nn.C_TANEVID = tr.C_TANEVID AND nn.TOROLT = ''F''
        INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr.ID = ocstr.C_TANEVRENDJEID
        INNER JOIN @OsztalyCsoportok ocs ON ocs.Id = ocstr.C_OSZTALYCSOPORTID
      WHERE nn.TOROLT = ''F''
        AND nn.C_INTEZMENYID = @pIntezmenyId AND nn.C_TANEVID = @pTanevId
        AND nn.C_NAPDATUMA >= @pIdoszakKezdete AND nn.C_NAPDATUMA < ocs.IdoszakVege
    ) tr ON nn.Datum = tr.datum AND nn.OsztalyCsoportId = tr.OsztalyCsoportId
    WHERE ISNULL(tr.OrarendiNap, nn.OrarendiNap) = ''T''
	'
  
  /* Órarend lekérdezés */
  IF @pCsakOrarendiOrak = 0 BEGIN
  SET @sql += N'
    DECLARE @OrarendTable TABLE (
       Id int
      ,ORARENDIID int
      ,Datum datetime
      ,Bontott char(1)
      ,Hetirend int
      ,HetNapja int
      ,ErvenyessegKezdete datetime
      ,ErvenyessegVege datetime
      ,OraKezdete datetime
      ,OraVege datetime
      ,Oraszam int
      ,TargyNev nvarchar(300)
      ,TargyNevForMobile nvarchar(300)
      ,TargykategoriaID int
      ,Megtartott char(1)
      ,CsengetesiRendOraID int
      ,MaxNapiOraszam int
      ,OsztalyNev nvarchar(255)
      ,TanevRendOsztalyCsoportId int
      ,MegjelenesOka nvarchar(300)
      ,TanarNev nvarchar(255)
      ,TeremNev nvarchar(255)
      ,OraTipus nvarchar(200)
      ,Hianyzas char(1)
  		,Keses char(1)
			,Ures char(1)
      ,HelyettesitoTanarID int
      ,HelyettesitoTanarNev nvarchar(255)
      ,TanarID int
      ,AdminAltalKiirt  char(1)
      ,GroupId int
      ,Tema nvarchar(max)
      ,TantargyId int
      ,OsztCsopId int  
      ,INDEX IX1 CLUSTERED(Datum, HetNapja, Oraszam, TanevRendOsztalyCsoportId, TantargyId, TanarID)
    )
    INSERT INTO @OrarendTable
    '
    
  END
  
  SET @sql += N'
    SELECT 
       oo.ID AS Id
      ,oo.ID AS ORARENDIID
      ,nn.Datum AS Datum
      ,oo.C_BONTOTT AS Bontott
      ,oo.C_HETIREND AS Hetirend
      ,oo.C_HETNAPJA AS HetNapja
      ,oo.C_ORAERVENYESSEGKEZDETE AS ErvenyessegKezdete
      ,oo.C_ORAERVENYESSEGVEGE AS ErvenyessegVege
      ,nn.Datum + oo.C_ORAKEZDETE AS OraKezdete
      ,nn.Datum + oo.C_ORAVEGE AS OraVege
      ,oo.C_ORASZAM AS Oraszam
      ,ISNULL(tt.C_ROVIDNEV, tt.C_NEV) AS TargyNev
      ,COALESCE(tt.C_ROVIDNEV, tt.C_NEV) AS TargyNevForMobile
      ,tt.C_TARGYKATEGORIA AS TargykategoriaID
      ,''F'' AS Megtartott
      ,csro.ID AS CsengetesiRendOraID
      ,MAX(oo.C_ORASZAM) OVER() AS MaxNapiOraszam /*He?*/
      ,ocs.Nev AS OsztalyNev
      ,nn.OsztalyCsoportId AS TanevRendOsztalyCsoportId
      ,ocs.OKA AS MegjelenesOka
      ,tanar.C_NYOMTATASINEV AS TanarNev
      ,terem.C_NEV AS TeremNev
      ,''OrarendiOra'' AS OraTipus
      ,''F'' AS Hianyzas
  		,''F'' AS Keses
			,''F'' AS Ures
      ,hisz.C_HELYETTESTANAROKID AS HelyettesitoTanarID
      ,helyettes.C_NYOMTATASINEV AS HelyettesitoTanarNev
      ,tanar.ID AS TanarID
      ,NULL AS AdminAltalKiirt
      ,oo.C_ORARENDIORAGROUPID AS GroupId
      ,NULL AS Tema
      ,oo.C_TANTARGYID AS TantargyId
      ,oo.C_OSZTALYCSOPORTID AS OsztCsopId
    FROM T_ORARENDIORA_OSSZES oo
      INNER JOIN @NaptariNapok nn ON (oo.C_HETIREND = 1554 OR nn.HetirendId = oo.C_HETIREND) AND nn.HetnapjaId = oo.C_HETNAPJA  AND oo.C_OSZTALYCSOPORTID = nn.OsztalyCsoportId
      INNER JOIN @OsztalyCsoportok ocs ON nn.OsztalyCsoportId = ocs.Id
      LEFT  JOIN T_CSENGETESIRENDORA_OSSZES csro ON csro.C_CSENGETESIRENDID = oo.C_CSENGETESIRENDID AND csro.C_ORASZAM = oo.C_ORASZAM
  		LEFT  JOIN T_TANTARGY_OSSZES tt ON tt.ID = oo.C_TANTARGYID
  		LEFT  JOIN T_FELHASZNALO_OSSZES tanar ON tanar.ID = oo.C_TANARID
  		LEFT  JOIN T_TEREM_OSSZES terem ON terem.id = oo.C_TEREMID
      LEFT  JOIN T_HELYETTESITESIIDOSZAK_OSSZES hisz ON oo.ID = hisz.C_HELYETTESITETTORARENDID AND hisz.C_HELYETTESITESNAPJA = nn.Datum AND hisz.TOROLT = ''F''
      LEFT  JOIN T_FELHASZNALO_OSSZES helyettes ON hisz.C_HELYETTESTANAROKID = helyettes.ID
    WHERE oo.TOROLT = ''F'' 
      ' + CASE @pIsNapirend WHEN 1 THEN 'AND oo.C_CSENGETESIRENDID IS NULL ' WHEN 0 THEN 'AND oo.C_CSENGETESIRENDID IS NOT NULL ' ELSE '' END + '  
  		AND oo.C_INTEZMENYID = @pIntezmenyId AND oo.C_TANEVID = @pTanevId
      AND oo.C_ORAERVENYESSEGKEZDETE <= ocs.IdoszakVege AND oo.C_ORAERVENYESSEGVEGE > @pIdoszakKezdete  -- C_DATUM
      ' + IIF(@pTanarId IS NULL, '', 'AND (oo.C_TANARID = @pTanarId OR hisz.C_HELYETTESTANAROKID = @pTanarId)') 
  
  
  IF @pCsakOrarendiOrak = 0 BEGIN
    
    /* TanításiÓra lekérdezés */
    SET @sql += N'
    SELECT 
       ISNULL(tn.Id, oo.Id) AS Id
      ,ISNULL(tn.ORARENDIID, oo.ORARENDIID) AS ORARENDIID
      ,ISNULL(tn.Datum, oo.Datum) AS Datum
      ,ISNULL(tn.Bontott, oo.Bontott) AS Bontott
      ,oo.Hetirend AS Hetirend
      ,ISNULL(tn.HetNapja, oo.HetNapja) AS HetNapja
      ,IIF(tn.Id IS NOT NULL, NULL, oo.ErvenyessegKezdete) AS ErvenyessegKezdete
      ,IIF(tn.Id IS NOT NULL, NULL, oo.ErvenyessegVege) AS ErvenyessegVege
      ,ISNULL(tn.OraKezdete, oo.OraKezdete) AS OraKezdete
      ,ISNULL(tn.OraVege, oo.OraVege) AS OraVege
      ,ISNULL(tn.Oraszam, oo.Oraszam) AS Oraszam
      ,ISNULL(tn.TargyNev, oo.TargyNev) AS TargyNev
      ,ISNULL(tn.TargyNevForMobile, oo.TargyNevForMobile) AS TargyNevForMobile
      ,ISNULL(tn.TargykategoriaID, oo.TargykategoriaID) AS TargykategoriaID
      ,ISNULL(tn.Megtartott, oo.Megtartott) AS Megtartott
      ,ISNULL(tn.CsengetesiRendOraID, oo.CsengetesiRendOraID) AS CsengetesiRendOraID
      ,ISNULL(tn.MaxNapiOraszam, oo.MaxNapiOraszam) AS MaxNapiOraszam
      ,ISNULL(tn.OsztalyNev, oo.OsztalyNev) AS OsztalyNev
      ,ISNULL(tn.TanevRendOsztalyCsoportId, oo.TanevRendOsztalyCsoportId) AS TanevRendOsztalyCsoportId
      ,ISNULL(tn.MegjelenesOka, oo.MegjelenesOka) AS MegjelenesOka
      ,ISNULL(tn.TanarNev, oo.TanarNev) AS TanarNev
      ,ISNULL(tn.TeremNev, oo.TeremNev) AS TeremNev 
      ,ISNULL(tn.OraTipus, oo.OraTipus) AS OraTipus
      ,ISNULL(tn.Hianyzas, oo.Hianyzas) AS Hianyzas
      ,ISNULL(tn.Keses, oo.Keses) AS Keses
      ,ISNULL(tn.Ures, oo.Ures) AS Ures
      ,ISNULL(tn.HelyettesitoTanarID, oo.HelyettesitoTanarID) AS HelyettesitoTanarID
      ,ISNULL(tn.HelyettesitoTanarNev, oo.HelyettesitoTanarNev) AS HelyettesitoTanarNev
      ,ISNULL(tn.TanarID, oo.TanarID) AS TanarID
      ,ISNULL(tn.AdminAltalKiirt, oo.AdminAltalKiirt) AS AdminAltalKiirt
      ,ISNULL(tn.GroupId, oo.GroupId) AS GroupId
      ,tn.Tema AS Tema
      ,ISNULL(tn.TantargyId, oo.OsztCsopId) AS TantargyId
      ,ISNULL(tn.OsztCsopId, oo.OsztCsopId) AS OsztCsopId
    FROM @OrarendTable oo
    FULL JOIN (
      SELECT 
         tao.ID AS Id
        ,NULL AS ORARENDIID
        ,tao.C_DATUM AS Datum
        ,tao.C_BONTOTT AS Bontott /*MAJD*/
        ,tao.C_HETNAPJA AS HetNapja
        ,tao.C_ORAKEZDETE AS OraKezdete
        ,tao.C_ORAVEGE AS OraVege
        ,tao.C_ORASZAM AS Oraszam
        ,ISNULL(tt.C_ROVIDNEV, tt.C_NEV) AS TargyNev
        ,COALESCE(tt.C_ROVIDNEV, tt.C_NEV) AS TargyNevForMobile
        ,tt.C_TARGYKATEGORIA AS TargykategoriaID
        ,tao.C_MEGTARTOTT AS Megtartott
        ,tao.C_CSENGETESIRENDORAID AS CsengetesiRendOraID
        ,MAX(tao.C_ORASZAM) OVER() AS MaxNapiOraszam /*He?*/
        ,ocs.Nev AS OsztalyNev
        ,tao.C_OSZTALYCSOPORTID AS TanevRendOsztalyCsoportId
        ,ocs.OKA AS MegjelenesOka
        ,tanar.C_NYOMTATASINEV AS TanarNev
        ,terem.C_NEV AS TeremNev
        ,''TanitasiOra'' AS OraTipus
        ,' + IIF(@pTanuloId IS NULL, '''F''', 'IIF(mh.ID IS NULL, ''F'', ''T'')') + ' AS Hianyzas
        ,' + IIF(@pTanuloId IS NULL, '''F''', 'IIF(mk.ID IS NULL, ''F'', ''T'')') + ' AS Keses
        ,' + IIF(@pTanuloId IS NULL, '''F''', 'IIF(mu.ID IS NULL, ''F'', ''T'')') + ' AS Ures
        ,helyettes.ID HelyettesitoTanarID
        ,helyettes.C_NYOMTATASINEV HelyettesitoTanarNev
        ,tanar.ID AS TanarID
        ,tao.C_ADMINALTALKIIRT AS AdminAltalKiirt
        ,tao.C_ORARENDIORAGROUPID AS GroupId
        ,tao.C_TEMA AS Tema
        ,tao.C_TANTARGYID AS TantargyId
        ,tao.C_OSZTALYCSOPORTID AS OsztCsopId        
      FROM T_TANITASIORA_OSSZES tao
        INNER JOIN @OsztalyCsoportok ocs ON tao.C_OSZTALYCSOPORTID = ocs.Id
        INNER JOIN T_TANTARGY_OSSZES tt ON tao.C_TANTARGYID = tt.ID
        INNER JOIN T_FELHASZNALO_OSSZES tanar ON tao.C_TANARID = tanar.ID
        LEFT  JOIN T_FELHASZNALO_OSSZES helyettes ON helyettes.ID = tao.C_HELYETTESITOTANARID
        INNER JOIN T_TEREM_OSSZES terem ON terem.ID = tao.C_TEREMID
      ' 
      IF @pTanuloId IS NOT NULL BEGIN
      SET @sql += N'
        LEFT JOIN T_TANULOMULASZTAS mh ON mh.C_TANITASIORAKID = tao.ID AND mh.C_ORATANULOIID = @pTanuloId AND mh.C_TIPUS = 1500
        LEFT JOIN T_TANULOMULASZTAS mk ON mk.C_TANITASIORAKID = tao.ID AND mk.C_ORATANULOIID = @pTanuloId AND mk.C_TIPUS = 1499
        LEFT JOIN T_TANULOMULASZTAS mu ON mu.C_TANITASIORAKID = tao.ID AND mu.C_ORATANULOIID = @pTanuloId AND mu.C_TIPUS = 1817
      '
      END
      SET @sql += N'
      WHERE tao.TOROLT = ''F''
        AND tao.C_DATUM >= @pIdoszakKezdete AND tao.C_DATUM < ocs.IdoszakVege
        AND tao.C_TANEVID = @pTanevId
        ' + CASE @pIsNapirend WHEN 1 THEN 'AND tao.C_CSENGETESIRENDID IS NULL ' WHEN 0 THEN 'AND tao.C_CSENGETESIRENDID IS NOT NULL ' ELSE '' END + '  
        ' + IIF(@pTanarId IS NULL, '', 'AND (tao.C_TANARID = @pTanarId OR tao.C_HELYETTESITOTANARID = @pTanarId)')  + '
    ) tn ON tn.Datum = oo.Datum 
        AND tn.HetNapja = oo.HetNapja 
        AND tn.Oraszam = oo.Oraszam 
        AND tn.TanevRendOsztalyCsoportId = oo.TanevRendOsztalyCsoportId 
        AND tn.TantargyId = oo.TantargyId
        AND tn.TanarID = oo.TanarID
    '
  END

  EXEC sp_executesql @sql, N'
  	 @pIntezmenyId int
  	,@pTanevId int
  	,@pIdoszakKezdete datetime
  	,@pIdoszakVege datetime
  	,@pTanarId int
  	,@pOsztalyCsoportId int
  	,@pTanuloId int
  	,@pCsakOrarendiOrak bit
    ,@pIsNapirend bit'
  	,@pIntezmenyId = @pIntezmenyId
  	,@pTanevId = @pTanevId
  	,@pIdoszakKezdete = @pIdoszakKezdete
  	,@pIdoszakVege = @pIdoszakVege
  	,@pTanarId = @pTanarId
  	,@pOsztalyCsoportId = @pOsztalyCsoportId
  	,@pTanuloId = @pTanuloId
  	,@pCsakOrarendiOrak = @pCsakOrarendiOrak
    ,@pIsNapirend = @pIsNapirend

END
GO

