﻿DROP PROCEDURE IF EXISTS uspGetKozpontiOrakOrarend
GO
CREATE PROCEDURE [uspGetKozpontiOrakOrarend]
   @pIntezmenyId int
  ,@pTanevId int
  ,@pIdoszakKezdete datetime
  ,@pIdoszakVege datetime  
AS
BEGIN 
  SET NOCOUNT ON;
  DECLARE
     @sql nvarchar(max) = N''
    ,@sqlOrarendiora nvarchar(max) = N''

  SET @sql += N'
  CREATE TABLE #OsztalyCsoportok (
     Id int
    ,Nev nvarchar(255)
    ,Oka nvarchar(50)
    ,IsVegzos char(1)
    ,IdoszakKezdete datetime
    ,IdoszakVege datetime
    ,INDEX IX1 CLUSTERED(Id, IdoszakKezdete, IdoszakVege)
  );
  CREATE TABLE #NaptariNapok (
     Datum datetime
    ,HetirendId int
    ,HetNapjaId int
    ,OrarendiNap char(1)
    ,OsztalyCsoportId int
    ,HetSorszam int
    ,CsengetesiRendId int
    ,Nev nvarchar(255)
    ,Oka nvarchar(50)
    ,IsVegzos char(1)
    ,IdoszakKezdete datetime
    ,IdoszakVege datetime
    ,IsEgyediNap char(1) COLLATE DATABASE_DEFAULT
    ,PRIMARY KEY CLUSTERED (OsztalyCsoportId, Datum, HetNapjaId, HetirendId)
  );
  CREATE TABLE #OrarendTable (
     Id int
    ,ORARENDIID int
    ,Datum datetime
    ,Bontott char(1)
    ,Hetirend int
    ,HetNapja int
    ,HetSorszam int
    ,ErvenyessegKezdete datetime
    ,ErvenyessegVege datetime
    ,OraKezdete datetime
    ,OraVege datetime
    ,Oraszam int
    ,TargyNev nvarchar(300)
    ,TargyNevForMobile nvarchar(300)
    ,TargykategoriaID int
    ,Megtartott char(1)
    ,CsengetesiRendOraID int
    ,CsengetesiRendID int
    ,MaxNapiOraszam int
    ,OsztalyNev nvarchar(255)
    ,TanevRendOsztalyCsoportId int
    ,MegjelenesOka nvarchar(300)
    ,TanarNev nvarchar(255)
    ,TeremNev nvarchar(255)
    ,TeremId int
    ,OraTipus nvarchar(200)
    ,Hianyzas char(1)
    ,Keses char(1)
    ,Ures char(1)
    ,HelyettesitoTanarID int
    ,HelyettesitoTanarNev nvarchar(255)
    ,HelyettesitesId int
    ,TanarID int
    ,AdminAltalKiirt  char(1)
    ,GroupId int
    ,Tema nvarchar(max)
    ,TantargyId int
    ,OsztCsopId int
    ,IsEgyediNap char(1)
    ,TeremTobbOratLehetTartani char(1)
    ,KozpontiOraGroupId uniqueidentifier
    ,KozpontilagToroltOraGroupId uniqueidentifier
    ,INDEX IX1 CLUSTERED(Datum, HetNapja, Oraszam, TanevRendOsztalyCsoportId, TantargyId, TanarID)
  );'
  /* 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 = MIN(C_DATUM)
  FROM T_TANEVRENDJE_OSSZES
  WHERE TOROLT = ''F''
    AND C_TANEVID = @pTanevId
    AND C_NAPTIPUSA IN (1402, 7600, 7601, 7602, 7603, 1395) --
    AND C_OSSZESCSOPORTRAVONATKOZIK = ''T''
  DECLARE @IsVegzosEvfolyam char(1)
  '
  /* A kapcsolódó osztálycsoportok összegyűjtése */
  
    SET @sql += N'
    --Performancia noveles miatt

      INSERT INTO #OsztalyCsoportok (Id, Nev, Oka, IsVegzos, IdoszakKezdete, IdoszakVege)
      SELECT ID, C_NEV, '''' AS Oka, C_VEGZOSEVFOLYAM, @pIdoszakKezdete
        ,IIF(C_VEGZOSEVFOLYAM = ''T'' AND @VegzosUtolsoTanitasiNap IS NOT NULL AND @pIdoszakVege > @VegzosUtolsoTanitasiNap, @VegzosUtolsoTanitasiNap + 1, @pIdoszakVege)
      FROM T_OSZTALYCSOPORT_OSSZES ocs
      WHERE ocs.C_TANEVID = @pTanevId
        AND ocs.TOROLT = ''F''
   '
  SET @sql += N'
    UPDATE ocs SET
      ocs.IdoszakVege = NewVegeDatum
    FROM #OsztalyCsoportok ocs
      INNER JOIN (
        SELECT MIN(tr.C_DATUM) + 1 AS NewVegeDatum, ocstr.C_OSZTALYCSOPORTID
        FROM T_TANEVRENDJE_OSSZES tr
          INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON  ocstr.C_TANEVRENDJEID = tr.ID
        WHERE tr.C_OSSZESCSOPORTRAVONATKOZIK = ''F''
          AND tr.TOROLT = ''F''
          AND tr.C_NAPTIPUSA IN (1402, 7600, 7601, 7602, 7603)
          AND tr.C_TANEVID = @pTanevId
        GROUP BY ocstr.C_OSZTALYCSOPORTID
      ) x ON x.C_OSZTALYCSOPORTID = ocs.Id
    WHERE ocs.IsVegzos = ''T''
  '
  /* A naptári napok összegyűjtése tanév rendje alapján */
  SET @sql += N'
  INSERT INTO #NaptariNapok (
     Datum
    ,HetirendId
    ,HetNapjaId
    ,OrarendiNap
    ,OsztalyCsoportId
    ,HetSorszam
    ,CsengetesiRendId
    ,Nev
    ,Oka
    ,IsVegzos
    ,IdoszakKezdete
    ,IdoszakVege
    ,IsEgyediNap
  ) 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
      ,ISNULL(tr.HetSorszam, nn.HetSorszam) AS HetSorszam
      ,ISNULL(tr.CsengetesiRendId, nn.CsengetesiRendId) AS CsengetesiRendId
      ,ISNULL(tr.Nev, nn.Nev)
      ,ISNULL(tr.Oka, nn.Oka)
      ,ISNULL(tr.IsVegzos, nn.IsVegzos)
      ,ISNULL(tr.IdoszakKezdete, nn.IdoszakKezdete)
      ,ISNULL(tr.IdoszakVege, nn.IdoszakVege)
      ,COALESCE(tr.IsEgyediNap, nn.IsEgyediNap, ''F'')
    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
        ,nn.C_HETSORSZAMA AS HetSorszam
        ,tr.C_CSENGETESIRENDID AS CsengetesiRendId
        ,ocs.Nev
        ,ocs.Oka
        ,ocs.IsVegzos
        ,ocs.IdoszakKezdete
        ,ocs.IdoszakVege
        ,tr.C_EGYEDINAP AS IsEgyediNap
      FROM T_NAPTARINAP_OSSZES nn
        INNER JOIN #OsztalyCsoportok ocs ON ocs.IdoszakKezdete <= nn.C_NAPDATUMA AND ocs.IdoszakVege > nn.C_NAPDATUMA
        LEFT 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 tr.TOROLT = ''F'' AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''T''
      WHERE nn.TOROLT = ''F''
        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
        ,nn.C_HETSORSZAMA AS HetSorszam
        ,tr.C_CSENGETESIRENDID AS CsengetesiRendId
        ,ocs.Nev
        ,ocs.Oka
        ,ocs.IsVegzos
        ,ocs.IdoszakKezdete
        ,ocs.IdoszakVege
        ,tr.C_EGYEDINAP AS IsEgyediNap
      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 tr.TOROLT = ''F'' AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''F''
        INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr.ID = ocstr.C_TANEVRENDJEID
        INNER JOIN #OsztalyCsoportok ocs ON ocs.Id = ocstr.C_OSZTALYCSOPORTID AND ocs.IdoszakKezdete <= nn.C_NAPDATUMA AND ocs.IdoszakVege > nn.C_NAPDATUMA
      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''
 --   SELECT * FROM #NaptariNapok
  '

  SET @sql += N'
    SELECT  DISTINCT
       oo.ID AS Id
      ,oo.TOROLT
      ,oo.ID AS ORARENDIID
      ,nn.Datum AS Datum
      ,oo.C_BONTOTT AS Bontott
      ,oo.C_HETIREND AS Hetirend
      ,oo.C_HETNAPJA AS HetNapja
      ,nn.HetSorszam AS HetSorszam
      ,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
      ,csro.C_CSENGETESIRENDID AS CsengetesiRendID
      ,MAX(oo.C_ORASZAM) OVER() AS MaxNapiOraszam
      ,nn.Nev AS OsztalyNev
      ,nn.OsztalyCsoportId AS TanevRendOsztalyCsoportId
      ,nn.OKA AS MegjelenesOka
      ,tanar.C_NYOMTATASINEV AS TanarNev
      ,terem.C_NEV AS TeremNev
      ,terem.ID AS TeremId
      ,''OrarendiOra'' AS OraTipus
      ,''F'' AS Hianyzas
      ,''F'' AS Keses
      ,''F'' AS Ures
      ,hisz.C_HELYETTESTANAROKID AS HelyettesitoTanarID
      ,helyettes.C_NYOMTATASINEV AS HelyettesitoTanarNev
      ,hisz.Id AS HelyettesitesId
      ,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
      ,oo.C_EGYEDINAP as IsEgyediNap
      ,ISNULL(terem.C_TOBBORATLEHETTARTANI,''F'') as TeremTobbOratLehetTartani
      ,oo.C_KOZPONTIORAGROUPID as KozpontiOraGroupId
    ,oo.C_KOZPONTILAGTOROLTORAGROUPID as KozpontilagToroltOraGroupId
      ,csoport.C_OSZTALYBONTASID AS OsztalyBontasId
    FROM T_ORARENDIORA_OSSZES oo
      INNER JOIN #OsztalyCsoportok ocs ON ocs.ID = oo.C_OSZTALYCSOPORTID
      INNER JOIN #NaptariNapok nn ON  nn.HetnapjaId = oo.C_HETNAPJA
        AND ocs.ID = nn.OsztalyCsoportId
        AND nn.Datum >= oo.C_ORAERVENYESSEGKEZDETE
        AND ((nn.Datum < oo.C_ORAERVENYESSEGVEGE) OR (oo.C_ORAERVENYESSEGKEZDETE = oo.C_ORAERVENYESSEGVEGE AND nn.Datum = oo.C_ORAERVENYESSEGKEZDETE))
        AND (oo.C_HETIREND = 1554 OR nn.HetirendId = oo.C_HETIREND)
        AND C_TANEVID = @pTanevId
        AND oo.C_EGYEDINAP = nn.IsEgyediNap
      INNER JOIN T_TANTARGY_OSSZES tt ON tt.ID = oo.C_TANTARGYID AND tt.TOROLT = ''F''
      INNER JOIN T_FELHASZNALO_OSSZES tanar ON tanar.ID = oo.C_TANARID AND tanar.TOROLT = ''F''
      LEFT  JOIN T_TEREM_OSSZES terem ON terem.id = oo.C_TEREMID AND terem.TOROLT = ''F''
      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 AND helyettes.TOROLT = ''F''
      LEFT JOIN T_CSENGETESIRENDORA_OSSZES csro ON csro.C_CSENGETESIRENDID = ISNULL(nn.CsengetesiRendId, oo.C_CSENGETESIRENDID) AND csro.C_ORASZAM = oo.C_ORASZAM AND csro.TOROLT = ''F''
      LEFT JOIN T_CSOPORT csoport ON csoport.ID = oo.C_OSZTALYCSOPORTID and csoport.TOROLT = ''F''
    WHERE oo.C_TANEVID = @pTanevId'

  EXEC sp_executesql @sql, N'
     @pIntezmenyId int
    ,@pTanevId int
    ,@pIdoszakKezdete datetime
    ,@pIdoszakVege datetime'
    ,@pIntezmenyId = @pIntezmenyId
    ,@pTanevId = @pTanevId
    ,@pIdoszakKezdete = @pIdoszakKezdete
    ,@pIdoszakVege = @pIdoszakVege
END
GO
