﻿DROP PROCEDURE IF EXISTS uspOrarendekTorlese
GO

CREATE PROCEDURE uspOrarendekTorlese
   @pTanevId int
  ,@pUserId int
  ,@pIntervallumKezdete datetime
  ,@pIntervallumVege datetime
  ,@pNezetTipus int
  ,@pFeladatellatasiHelyJson nvarchar(max) = NULL
  ,@pOsztalyJson nvarchar(max) = NULL
  ,@pCsoportJson nvarchar(max) = NULL
AS
BEGIN
  SET NOCOUNT ON

  CREATE TABLE #OrarendiOrak (Id int, ErvenyessegKezdete datetime, ErvenyessegVege datetime, Oraszam int)

  INSERT INTO #OrarendiOrak
  EXEC uspGetOrarendiOrakForOrarendekTorlese @pTanevId, @pIntervallumKezdete, @pIntervallumVege, @pNezetTipus, @pFeladatellatasiHelyJson, @pOsztalyJson, @pCsoportJson

  -- Jelmagyarázat:
  -- D1: Intervallum kezdete
  -- D2: Intervallum vége
  -- ÉK: Órarend érvényességének kezdete 
  -- ÉV: Órarend érvényességének vége

  UPDATE oo
  SET
     oo.C_ORAERVENYESSEGKEZDETE = CASE
      -- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani
      WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN updateOrak.ErvenyessegKezdete

      -- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani
      WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN DATEADD(day, 1, @pIntervallumVege)

      -- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani
      WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegKezdete

      ELSE oo.C_ORAERVENYESSEGKEZDETE
     END
    ,oo.C_ORAERVENYESSEGVEGE = CASE
      -- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani
      WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN @pIntervallumKezdete

      -- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani
      WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege <= updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegVege

      -- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani
      WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN @pIntervallumKezdete

      ELSE oo.C_ORAERVENYESSEGVEGE
     END
     -- Ha az óra érvényessége teljesen a D1 és D2 között van (D1 <= ÉK <= ÉV <= D2), akkor a teljes elemet törölni kell
     -- vagy ha D1 <= ÉK <= D2 < ÉV és ÉV = D2+1 nappal
    ,oo.TOROLT = IIF((@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegVege <= @pIntervallumVege)
      OR (@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete 
        AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege 
        AND @pIntervallumVege < updateOrak.ErvenyessegVege 
        AND updateOrak.ErvenyessegVege = DATEADD(day, 1, @pIntervallumVege)), 'T', oo.TOROLT)
    ,oo.LASTCHANGED = GETDATE()
    ,oo.MODIFIER = @pUserId
  FROM T_ORARENDIORA_OSSZES oo
  INNER JOIN #OrarendiOrak updateOrak ON updateOrak.Id = oo.ID

  DECLARE @insertId int, @insertErvenyessegKezdete datetime, @insertErvenyessegVege datetime, @insertOraszam int

  -- Kell egy új órarendi elem is azonos GROUPID-val D2+1 naptól ÉV-ig
  DECLARE insertCursor CURSOR FOR
  SELECT
     Id
    ,DATEADD(day, 1, @pIntervallumVege)
    ,ErvenyessegVege
    ,Oraszam
  FROM #OrarendiOrak
  WHERE ErvenyessegKezdete < @pIntervallumKezdete
    AND @pIntervallumVege < ErvenyessegVege

  OPEN insertCursor
  FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam

  WHILE @@FETCH_STATUS = 0
  BEGIN

      EXEC uspCopyOrarendiElem @insertId, NULL, @insertOraszam, @insertErvenyessegKezdete, @insertErvenyessegVege, 0

    FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam

  END
  CLOSE insertCursor
  DEALLOCATE insertCursor

  DECLARE @intezmenyId int = (SELECT TOP 1 C_INTEZMENYID FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @pTanevId)

  EXEC uspGenerateOrarend @intezmenyId, @pTanevId

END
GO