﻿DROP PROCEDURE IF EXISTS uspGenerateOrarend
GO

CREATE PROCEDURE uspGenerateOrarend
   @pIntezmenyId int
  ,@pTanevId int
  ,@pIdoszakKezdete datetime = NULL
  ,@pIdoszakVege datetime = NULL
  ,@pOrarendiOraId int = NULL
  ,@pOsztalycsoportId int = NULL
  ,@pIsTeljesTanev BIT = 0
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE 
     @sql nvarchar(max) = N''
    ,@aktivCsengetesirend int;

  SELECT 
     @pIdoszakKezdete = ISNULL(@pIdoszakKezdete, C_KEZDONAP)
    ,@pIdoszakVege = ISNULL(@pIdoszakVege, C_UTOLSONAP) 
  FROM T_TANEV 
  WHERE ID = @pTanevId

  SELECT @aktivCsengetesirend = ID 
  FROM T_CSENGETESIREND 
  WHERE C_TANEVID = @pTanevId
    AND TOROLT = 'F'
    AND C_AKTIV = 'T'

  IF @pOrarendiOraId IS NOT NULL BEGIN
    IF (SELECT TOROLT FROM T_ORARENDIORA_OSSZES WHERE ID = @pOrarendiOraId) = 'T' BEGIN
      DELETE orr 
      FROM T_ORAREND_OSSZES orr
      WHERE orr.C_ORARENDIORAID = @pOrarendiOraId 
    END
    ELSE BEGIN
      DELETE orr 
      FROM T_ORAREND_OSSZES orr
      WHERE orr.C_ORARENDIORAID = @pOrarendiOraId 
        AND (C_DATUM < @pIdoszakKezdete OR C_DATUM >= @pIdoszakVege)
    END
  END
  ELSE BEGIN
    DELETE orr 
    FROM T_ORAREND_OSSZES orr
      INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.ID = orr.C_ORARENDIORAID 
    WHERE oo.TOROLT = 'T' AND oo.C_TANEVID = @pTanevId
  END

    SET @sql += N'

    CREATE TABLE #Osztalycsoport (
       Id int
      ,IdoszakVege datetime
      ,TanevId int
      ,IsVegzos char(1)
    )

    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''
    
    --PRINT ''Osztálycsoport insert''

    INSERT INTO #Osztalycsoport (Id, IdoszakVege, TanevId, IsVegzos)
    SELECT ocs.ID, IIF(C_VEGZOSEVFOLYAM = ''T'' AND @pIsTeljesTanev = 0 , @VegzosUtolsoTanitasiNap, @pIdoszakVege), ocs.C_TANEVID, C_VEGZOSEVFOLYAM
    FROM T_OSZTALYCSOPORT_OSSZES ocs
    ' + IIF(@pOrarendiOraId IS NULL, '', 'INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_OSZTALYCSOPORTID = ocs.ID AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL)) AND oo.ID = @pOrarendiOraId') + '
    WHERE ocs.TOROLT = ''F'' ' + IIF(@pOsztalycsoportId IS NULL, '', 'AND ocs.ID = @pOsztalycsoportId') + '

    --PRINT ''Osztálycsoport update''
    IF(@pIsTeljesTanev = 0) BEGIN
    UPDATE ocs SET
      ocs.IdoszakVege = NewVegeDatum
    FROM #OsztalyCsoport ocs
      INNER JOIN (
        SELECT MIN(tr.C_DATUM) 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''
      END;'

  IF @pOsztalycsoportId IS NOT NULL OR @pOrarendiOraId IS NOT NULL BEGIN
    SET @sql += N'
      CREATE TABLE #OrarendiOra (
          Id int primary key
      );
    
      --PRINT ''OrarendiOraTemp insert''
      INSERT INTO #OrarendiOra (id)
      SELECT ID
      FROM T_ORARENDIORA_OSSZES oo
      WHERE (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
        ' + IIF(@pOsztalycsoportId IS NULL, '', 'AND  oo.C_OSZTALYCSOPORTID = @pOsztalycsoportId') 
          + IIF(@pOrarendiOraId IS NULL, '', 'AND ID = @pOrarendiOraId') + '
      '
  END
  SET @sql += N'
    CREATE TABLE #NaptariNap (
       C_TANEVID int
      ,C_INTEZMENYID int
      ,C_NAPDATUMA datetime
      ,C_HETNAPJA int
      ,C_HETIREND int 
      ,C_EGYEDINAP char(1) COLLATE Hungarian_CI_AI
      ,C_CSENGETESIRENDID int
      ,INDEX IX_001 CLUSTERED (C_TANEVID, C_HETNAPJA, C_INTEZMENYID, C_NAPDATUMA)
    )

    INSERT INTO #NaptariNap (
       C_TANEVID
      ,C_INTEZMENYID
      ,C_NAPDATUMA
      ,C_HETNAPJA 
      ,C_HETIREND 
      ,C_EGYEDINAP 
      ,C_CSENGETESIRENDID
    ) SELECT 
       nn.C_TANEVID
      ,nn.C_INTEZMENYID
      ,nn.C_NAPDATUMA
      ,nn.C_HETNAPJA 
      ,IIF(nn.C_HETIREND = 1554, nh.C_HETIREND, nn.C_HETIREND) 
      ,ISNULL(tr.C_EGYEDINAP, ''F'')
      ,nn.C_AKTIVCSENGETESIRENDID
    FROM T_NAPTARINAP_OSSZES nn
      LEFT JOIN T_TANEVRENDJE_OSSZES tr ON tr.C_DATUM = nn.C_NAPDATUMA AND tr.C_TANEVID = nn.C_TANEVID AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''T'' AND tr.TOROLT = ''F''
    INNER JOIN T_NAPTARIHET_OSSZES nh ON nn.C_NAPDATUMA BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA AND nn.C_TANEVID = nh.C_TANEVID 
    WHERE nn.C_TANEVID = @pTanevId AND nn.TOROLT = ''F'' 
      AND (@pIsTeljesTanev = 1 OR nn.C_ORARENDINAP = ''T'')
      AND nn.C_NAPDATUMA BETWEEN @pIdoszakKezdete AND @pIdoszakVege
      ' + IIF(@pOrarendiOraId IS NULL, '', 'AND nn.C_HETNAPJA = (SELECT C_HETNAPJA FROM T_ORARENDIORA_OSSZES WHERE ID = @pOrarendiOraId)') + '

    CREATE TABLE #NaptariNapOsztalycsoport (
       C_TANEVID int
      ,C_INTEZMENYID int
      ,C_NAPDATUMA datetime
      ,C_HETNAPJA int
      ,C_HETIREND int 
      ,C_EGYEDINAP char(1) COLLATE Hungarian_CI_AI
      ,C_OSZTALYCSOPORTID int
      ,C_CSENGETESIRENDID int
      ,INDEX IX_001 CLUSTERED (C_TANEVID, C_HETNAPJA, C_INTEZMENYID, C_NAPDATUMA, C_OSZTALYCSOPORTID)
    )
    IF(@pIsTeljesTanev = 0) BEGIN
    INSERT INTO #NaptariNapOsztalycsoport (
       C_TANEVID
      ,C_INTEZMENYID
      ,C_NAPDATUMA
      ,C_HETNAPJA 
      ,C_HETIREND 
      ,C_EGYEDINAP
      ,C_OSZTALYCSOPORTID
      ,C_CSENGETESIRENDID
    ) SELECT 
       tr.C_TANEVID
      ,tr.C_INTEZMENYID
      ,tr.C_DATUM
      ,tr.C_HETNAPJA 
      ,IIF(tr.C_HETIREND = 1554, nh.C_HETIREND, tr.C_HETIREND)  
      ,tr.C_EGYEDINAP
      ,ocstr.C_OSZTALYCSOPORTID
      ,tr.C_CSENGETESIRENDID
    FROM T_TANEVRENDJE_OSSZES tr 
      INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON ocstr.C_TANEVRENDJEID = tr.ID
    INNER JOIN T_NAPTARIHET_OSSZES nh ON tr.C_DATUM BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA AND tr.C_TANEVID = nh.C_TANEVID 
    WHERE tr.C_TANEVID = @pTanevId 
      AND tr.TOROLT = ''F'' 
      AND tr.C_ORARENDINAP = ''T''
      AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''F'' 
      AND tr.C_DATUM BETWEEN @pIdoszakKezdete AND @pIdoszakVege
      ' + IIF(@pOsztalycsoportId IS NULL, '', 'AND ocstr.C_OSZTALYCSOPORTID = @pOsztalycsoportId' ) + '
      END;'

  SET @sql += N'
      CREATE TABLE #Orarend (
       Datum datetime
      ,OrarendiOraId int
      ,PRIMARY KEY CLUSTERED (Datum, OrarendioraId)
    );

    --PRINT ''NaptárinapTemp insert''
    INSERT INTO #Orarend (
       Datum
      ,OrarendiOraId
    )'
  SET @sql += N'
    SELECT nn.C_NAPDATUMA, oo.ID 
    FROM #NaptariNap nn
      INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
        AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND) 
        AND nn.C_EGYEDINAP = oo.C_EGYEDINAP 
        AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
        AND oo.C_TANEVID = nn.C_TANEVID
        AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
        AND oo.C_ORAERVENYESSEGKEZDETE <= nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE > nn.C_NAPDATUMA
      INNER JOIN #Osztalycsoport ocs ON ocs.Id = oo.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
      '+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID')  + '
    WHERE NOT EXISTS (
        SELECT 1 FROM T_TANEVRENDJE_OSSZES tr2
          INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr2.ID = ocstr.C_TANEVRENDJEID
        WHERE tr2.C_OSSZESCSOPORTRAVONATKOZIK = ''F''  AND tr2.TOROLT = ''F''
          AND ocs.Id = ocstr.C_OSZTALYCSOPORTID AND nn.C_NAPDATUMA = tr2.C_DATUM)
      AND (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
    
    UNION ALL
    
    SELECT nn.C_NAPDATUMA, oo.ID 
    FROM #NaptariNap nn
      INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
        AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND) 
        AND nn.C_EGYEDINAP = oo.C_EGYEDINAP 
        AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
        AND oo.C_TANEVID = nn.C_TANEVID
        AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
        AND oo.C_ORAERVENYESSEGKEZDETE = nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE = nn.C_NAPDATUMA
      INNER JOIN #Osztalycsoport ocs ON ocs.Id = oo.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
       '+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID')  + '
    WHERE NOT EXISTS (
        SELECT 1 FROM T_TANEVRENDJE_OSSZES tr2
          INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr2.ID = ocstr.C_TANEVRENDJEID
        WHERE tr2.C_OSSZESCSOPORTRAVONATKOZIK = ''F''  AND tr2.TOROLT = ''F''
          AND ocs.Id = ocstr.C_OSZTALYCSOPORTID AND nn.C_NAPDATUMA = tr2.C_DATUM)
      AND (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
    
    UNION ALL'
    
    SET @sql += N'
    SELECT nn.C_NAPDATUMA, oo.ID 
    FROM #NaptariNapOsztalycsoport nn
      INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
        AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND) 
        AND nn.C_EGYEDINAP = oo.C_EGYEDINAP 
        AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
        AND oo.C_TANEVID = nn.C_TANEVID
        AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
        AND oo.C_ORAERVENYESSEGKEZDETE <= nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE > nn.C_NAPDATUMA
        AND oo.C_OSZTALYCSOPORTID = nn.C_OSZTALYCSOPORTID
      INNER JOIN #Osztalycsoport ocs ON ocs.Id = nn.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
      '+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID')  + '
    WHERE (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)

    UNION ALL 

    SELECT nn.C_NAPDATUMA, oo.ID 
    FROM #NaptariNapOsztalycsoport nn
      INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
        AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND) 
        AND nn.C_EGYEDINAP = oo.C_EGYEDINAP 
        AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
        AND oo.C_TANEVID = nn.C_TANEVID
        AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
        AND oo.C_ORAERVENYESSEGKEZDETE = nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE = nn.C_NAPDATUMA
        AND oo.C_OSZTALYCSOPORTID = nn.C_OSZTALYCSOPORTID
      INNER JOIN #Osztalycsoport ocs ON ocs.Id = nn.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
      '+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID')  + '
    WHERE (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
    ' 
 
  SET @sql += N'
    --PRINT ''MERGE''
    MERGE T_ORAREND_OSSZES trg
    USING #Orarend src ON
        trg.C_ORARENDIORAID = src.OrarendioraId AND src.Datum = trg.C_DATUM  
      WHEN NOT MATCHED BY TARGET THEN
        INSERT (
           C_ORARENDIORAID 
          ,C_DATUM
          ,C_TANEVID
          ,C_INTEZMENYID
        ) VALUES (
           src.OrarendiOraId
          ,src.Datum
          ,@pTanevId
          ,@pIntezmenyId
        )
      WHEN NOT MATCHED BY SOURCE AND trg.C_TANEVID = @pTanevId AND trg.C_DATUM BETWEEN @pIdoszakKezdete AND @pIdoszakVege 
        ' + IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'AND trg.C_ORARENDIORAID IN (SELECT Id FROM #OrarendiOra)')  + '
      THEN
        DELETE
       --OUTPUT $action, DELETED.C_DATUM, DELETED.C_ORARENDIORAID, INSERTED.C_DATUM, INSERTED.C_ORARENDIORAID
      ;
    '
  EXEC sp_executesql @sql,N'
     @pIntezmenyId int
    ,@pTanevId int
    ,@pIdoszakKezdete datetime
    ,@pIdoszakVege datetime
    ,@pOrarendiOraId int
    ,@pOsztalycsoportId int
    ,@aktivCsengetesirend int
    ,@pIsTeljesTanev BIT'
    ,@pIntezmenyId = @pIntezmenyId
    ,@pTanevId = @pTanevId
    ,@pIdoszakKezdete = @pIdoszakKezdete
    ,@pIdoszakVege = @pIdoszakVege
    ,@pOrarendiOraId = @pOrarendiOraId
    ,@pOsztalycsoportId = @pOsztalycsoportId
    ,@aktivCsengetesirend = @aktivCsengetesirend
    ,@pIsTeljesTanev = @pIsTeljesTanev;
  EXEC uspGenerateTeljesOrarend @pIntezmenyId, @pTanevId, @pOrarendiOraId;

END
GO
