﻿DROP PROCEDURE IF EXISTS uspOrarendImport
GO

CREATE PROCEDURE uspOrarendImport
   @pIntezmenyId int
  ,@pTanevId int
  ,@pUserId int
  ,@pImportJson nvarchar(max)
  ,@pIsTorles bit
  ,@pIsModositas bit
  ,@pIsNapirendImport bit
  ,@pOrarendiOraLezarasDateTime datetime = NULL

AS
BEGIN
  SET NOCOUNT ON;

  DECLARE
     @tableNameList nvarchar(2000) = 'T_TEREM_OSSZES'
    ,@actualJson nvarchar(max) = ''
    ,@lastChangedDateTime datetime = GETDATE()

  --Ha törlés van, akkor a kapcsolódások törlésével kell kezdenünk!
  IF (@pIsTorles = 1) BEGIN
    --Órarendi óra kapcsolatainak törlése
    UPDATE tao SET
       tao.C_ORARENDIORAID = NULL
      ,tao.SERIAL = tao.SERIAL + 1
      ,tao.LASTCHANGED = @lastChangedDateTime
      ,tao.MODIFIER = @pUserId
    FROM T_TANITASIORA_OSSZES tao
    WHERE tao.C_INTEZMENYID = @pIntezmenyId
      AND tao.C_TANEVID = @pTanevId
      AND tao.TOROLT = 'F'
      AND EXISTS (
        SELECT TOP 1 ID
        FROM T_ORARENDIORA_OSSZES oo 
        WHERE oo.ID = tao.C_ORARENDIORAID
          AND oo.C_INTEZMENYID = @pIntezmenyId
          AND oo.C_TANEVID = @pTanevId
          AND oo.TOROLT = 'F'
          AND oo.C_IMPORTALT = 'T'
          AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
           OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
      )

    UPDATE hf SET 
       hf.C_ORARENDIORAID = NULL
      ,hf.SERIAL = hf.SERIAL + 1
      ,hf.LASTCHANGED = @lastChangedDateTime
      ,hf.MODIFIER = @pUserId
    FROM T_HAZIFELADATOK_OSSZES hf
    WHERE hf.C_INTEZMENYID = @pIntezmenyId
      AND hf.C_TANEVID = @pTanevId
      AND hf.TOROLT = 'F'
      AND EXISTS (
        SELECT TOP 1 ID
        FROM T_ORARENDIORA_OSSZES oo 
        WHERE oo.ID = hf.C_ORARENDIORAID
          AND oo.C_INTEZMENYID = @pIntezmenyId
          AND oo.C_TANEVID = @pTanevId
          AND oo.TOROLT = 'F'
          AND oo.C_IMPORTALT = 'T'
          AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
           OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
      )

    UPDATE oot SET 
       oot.C_ORARENDIORAID = NULL
      ,oot.SERIAL = oot.SERIAL + 1
      ,oot.LASTCHANGED = @lastChangedDateTime
      ,oot.MODIFIER = @pUserId
    FROM T_ORARENDIORATULAJDONSAG oot
    WHERE oot.C_INTEZMENYID = @pIntezmenyId
      AND oot.C_TANEVID = @pTanevId
      AND oot.TOROLT = 'F'
      AND EXISTS (
        SELECT TOP 1 ID
        FROM T_ORARENDIORA_OSSZES oo
        WHERE oo.ID = oot.C_ORARENDIORAID
          AND oo.C_INTEZMENYID = @pIntezmenyId
          AND oo.C_TANEVID = @pTanevId
          AND oo.TOROLT = 'F'
          AND oo.C_IMPORTALT = 'T'
          AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
           OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
      )

    DELETE hi
    FROM T_HELYETTESITESIIDOSZAK_OSSZES hi
    WHERE EXISTS (
      SELECT TOP 1 ID 
      FROM T_ORARENDIORA_OSSZES oo 
      WHERE oo.ID = hi.C_HELYETTESITETTORARENDID
        AND oo.C_INTEZMENYID = @pIntezmenyId
        AND oo.C_TANEVID = @pTanevId
        AND oo.TOROLT = 'F'
        AND oo.C_IMPORTALT = 'T'
        AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
         OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
    )

    --Órarendi órák törlése
    UPDATE oo SET 
       oo.TOROLT = 'T'
      ,oo.SERIAL = oo.SERIAL + 1
      ,oo.LASTCHANGED = @lastChangedDateTime
      ,oo.MODIFIER = @pUserId
    FROM T_ORARENDIORA_OSSZES oo
    WHERE oo.C_INTEZMENYID = @pIntezmenyId
      AND oo.C_TANEVID = @pTanevId
      AND oo.TOROLT = 'F'
      AND oo.C_IMPORTALT = 'T'
      AND oo.C_ORAERVENYESSEGVEGE <> oo.C_ORAERVENYESSEGKEZDETE
      AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
       OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
  END

  --Ha módosítás van, akkor a már létező órarendi órák módosításával kell kezdenünk!
  IF (@pIsModositas = 1) BEGIN
    --Korábbi órarendi órák lezárása
    UPDATE oo SET 
       oo.C_ORAERVENYESSEGVEGE = @pOrarendiOraLezarasDateTime
      ,oo.SERIAL = oo.SERIAL + 1
      ,oo.LASTCHANGED = @lastChangedDateTime
      ,oo.MODIFIER = @pUserId
    FROM T_ORARENDIORA_OSSZES oo
    WHERE oo.C_INTEZMENYID = @pIntezmenyId
      AND oo.C_TANEVID = @pTanevId
      AND oo.TOROLT = 'F'
      AND (oo.C_ORAERVENYESSEGVEGE IS NULL
       OR oo.C_ORAERVENYESSEGVEGE > @pOrarendiOraLezarasDateTime)
      AND oo.C_ORAERVENYESSEGVEGE <> oo.C_ORAERVENYESSEGKEZDETE
      AND oo.C_ORAERVENYESSEGKEZDETE < @pOrarendiOraLezarasDateTime
      AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
       OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))

    --A korábban felvett, de későbbi időpontra importált órarendi órák törlése
    UPDATE oo SET 
       oo.TOROLT = 'T'
      ,oo.SERIAL = oo.SERIAL + 1
      ,oo.LASTCHANGED = @lastChangedDateTime
      ,oo.MODIFIER = @pUserId
    FROM T_ORARENDIORA_OSSZES oo
    WHERE oo.C_INTEZMENYID = @pIntezmenyId
      AND oo.C_TANEVID = @pTanevId
      AND oo.TOROLT = 'F'
      AND oo.C_IMPORTALT = 'T'
      AND oo.C_ORAERVENYESSEGVEGE <> oo.C_ORAERVENYESSEGKEZDETE
      AND oo.C_ORAERVENYESSEGKEZDETE >= @pOrarendiOraLezarasDateTime
      AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
       OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
  END

  EXECUTE uspTantargyfelosztasImport @pIntezmenyId, @pTanevId, @pUserId, @pImportJson, @pIsTorles

  --NOTE: A törlés azért false, mert a T_TEREM_OSSZES view-ból nem törlünk importnál!
  EXECUTE uspDynamicImportJsonSplit @pIntezmenyId = @pIntezmenyId, @pTanevId = @pTanevId, @pUserId = @pUserId, @pImportJson = @pImportJson, @pIsTorles = 0, @pIsSubTable = 0, @pTableNameList = @tableNameList

  --NOTE: Órarendi óra temp tábla incializálása
  CREATE TABLE #OrarendiOraTempTable (
     ID int
    ,C_TANARID int
    ,C_TANTARGYID int
    ,C_OSZTALYCSOPORTID int
    ,C_TEREMID int
    ,C_FOGLALKOZASID int
    ,C_HETIREND int
    ,C_HETNAPJA int
    ,C_ORASZAM int
    ,C_ORAERVENYESSEGKEZDETE datetime
    ,C_ORAERVENYESSEGVEGE datetime
    ,C_TANORANKIVULIFOGLALKOZAs char(1)
    ,C_EGYEDINAP char(1)
    ,C_ISKEZZELFELVETTEGYEDINAp char(1)
    ,C_CSENGETESIRENDID int
    ,C_CSENGETESIRENDORAID int
    ,C_ORAKEZDETE datetime
    ,C_ORAVEGE datetime
    ,C_BONTOTT char(1)
    ,C_ORATULAJDONOSID int

    ,C_IMPORTALT char(1)
    ,C_INTEZMENYID int
    ,C_TANEVID int
    ,TOROLT char(1)
    ,SERIAL int
    ,LASTCHANGED datetime
    ,CREATED datetime
    ,MODIFIER int
    ,CREATOR int
    ,ELOZOTANEVIREKORDID int
    ,NNID int
    ,Operation int
  )

  INSERT INTO #OrarendiOraTempTable 
  SELECT
     oo.ID
    ,oo.C_TANARID
    ,tt.ID AS C_TANTARGYID
    ,ocs.ID AS C_OSZTALYCSOPORTID
    ,t.ID AS C_TEREMID
    ,fg.ID AS C_FOGLALKOZASID
    ,oo.C_HETIREND
    ,oo.C_HETNAPJA
    ,oo.C_ORASZAM
    ,oo.C_ORAERVENYESSEGKEZDETE
    ,oo.C_ORAERVENYESSEGVEGE
    ,oo.C_TANORANKIVULIFOGLALKOZAS
    ,oo.C_EGYEDINAP
    ,oo.C_ISKEZZELFELVETTEGYEDINAP 
    ,oo.C_CSENGETESIRENDID
    ,oo.C_CSENGETESIRENDORAID
    ,oo.C_ORAKEZDETE
    ,oo.C_ORAVEGE
    ,oo.C_BONTOTT
    ,oo.C_ORATULAJDONOSID

    ,oo.C_IMPORTALT
    ,oo.C_INTEZMENYID
    ,oo.C_TANEVID
    ,oo.TOROLT
    ,oo.SERIAL
    ,oo.LASTCHANGED
    ,oo.CREATED
    ,oo.MODIFIER
    ,oo.CREATOR
    ,oo.ELOZOTANEVIREKORDID
    ,oo.NNID
    ,oo.Operation
  FROM OPENJSON(@pImportJson, N'lax $.ImportJson.T_ORARENDIORA_OSSZES')
  WITH (
     ID int '$.ID'
    ,C_TANARID int '$.C_TANARID'
    ,C_HETIREND int '$.C_HETIREND'
    ,C_HETNAPJA int '$.C_HETNAPJA'
    ,C_ORASZAM int '$.C_ORASZAM'
    ,C_ORAERVENYESSEGKEZDETE datetime '$.C_ORAERVENYESSEGKEZDETE'
    ,C_ORAERVENYESSEGVEGE datetime '$.C_ORAERVENYESSEGVEGE'
    ,C_TANORANKIVULIFOGLALKOZAS char(1) '$.C_TANORANKIVULIFOGLALKOZAS'
    ,C_EGYEDINAP char(1) '$.C_EGYEDINAP'
    ,C_ISKEZZELFELVETTEGYEDINAP char(1) '$.C_ISKEZZELFELVETTEGYEDINAP'
    ,C_CSENGETESIRENDID int '$.C_CSENGETESIRENDID'
    ,C_CSENGETESIRENDORAID int '$.C_CSENGETESIRENDORAID'
    ,C_ORAKEZDETE datetime '$.C_ORAKEZDETE'
    ,C_ORAVEGE datetime '$.C_ORAVEGE'
    ,C_BONTOTT char(1) '$.C_BONTOTT'
    ,C_ORATULAJDONOSID int '$.C_ORATULAJDONOSID'

    ,C_IMPORTALT char(1) '$.C_IMPORTALT'
    ,C_INTEZMENYID int '$.C_INTEZMENYID'
    ,C_TANEVID int '$.C_TANEVID'
    ,TOROLT char(1) '$.TOROLT'
    ,SERIAL int '$.SERIAL'
    ,LASTCHANGED datetime '$.LASTCHANGED'
    ,CREATED datetime '$.CREATED'
    ,MODIFIER int '$.MODIFIER'
    ,CREATOR int '$.CREATOR'
    ,ELOZOTANEVIREKORDID int '$.ELOZOTANEVIREKORDID'
    ,NNID int '$.NNID'
    ,Operation int '$.Operation'

    ,TantargyNev nvarchar(255) '$.TantargyNev'
    ,OsztalyCsoportNev nvarchar(255) '$.OsztalyCsoportNev'
    ,TeremNev nvarchar(255) '$.TeremNev'
  ) oo
    LEFT JOIN T_TANTARGY_OSSZES tt ON
      --NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
      --      Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
      LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(tt.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(oo.TantargyNev)
      AND tt.C_INTEZMENYID = @pIntezmenyId
      AND tt.C_TANEVID = @pTanevId
      AND tt.TOROLT = 'F'
    LEFT JOIN T_OSZTALYCSOPORT_OSSZES ocs ON
      --NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
      --      Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
      LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ocs.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(oo.OsztalyCsoportNev)
      AND ocs.C_INTEZMENYID = @pIntezmenyId
      AND ocs.C_TANEVID = @pTanevId
      AND ocs.TOROLT = 'F'
    LEFT JOIN T_TEREM_OSSZES t ON
      --NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
      --      Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
      LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(t.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(oo.TeremNev)
      AND t.C_INTEZMENYID = @pIntezmenyId
      AND t.C_TANEVID = @pTanevId
      AND t.TOROLT = 'F'
    LEFT JOIN T_FOGLALKOZAS_OSSZES fg ON 
          fg.C_OSZTALYCSOPORTID = ocs.ID
      AND fg.C_TANARID = oo.C_TANARID
      AND fg.C_TANTARGYID = tt.ID
      AND fg.C_INTEZMENYID = @pIntezmenyId
      AND fg.C_TANEVID = @pTanevId
      AND fg.TOROLT = 'F'

  --Órarendi órák beszúrása
  SET @actualJson = ' { "ImportJson":{ "T_ORARENDIORA_OSSZES":' + (
    SELECT
       oo.ID
      ,oo.C_TANARID
      ,oo.C_TANTARGYID
      ,oo.C_OSZTALYCSOPORTID
      ,oo.C_TEREMID
      ,oo.C_FOGLALKOZASID
      ,oo.C_HETIREND
      ,oo.C_HETNAPJA
      ,oo.C_ORASZAM
      ,oo.C_ORAERVENYESSEGKEZDETE
      ,oo.C_ORAERVENYESSEGVEGE
      ,oo.C_TANORANKIVULIFOGLALKOZAS
      ,oo.C_EGYEDINAP
      ,oo.C_ISKEZZELFELVETTEGYEDINAP 
      ,oo.C_CSENGETESIRENDID
      ,oo.C_CSENGETESIRENDORAID
      ,oo.C_ORAKEZDETE
      ,oo.C_ORAVEGE
      ,oo.C_BONTOTT
      ,oo.C_ORATULAJDONOSID

      ,oo.C_IMPORTALT
      ,oo.C_INTEZMENYID
      ,oo.C_TANEVID
      ,oo.TOROLT
      ,oo.SERIAL
      ,oo.LASTCHANGED
      ,oo.CREATED
      ,oo.MODIFIER
      ,oo.CREATOR
      ,oo.ELOZOTANEVIREKORDID
      ,oo.NNID
      ,oo.Operation
    FROM #OrarendiOraTempTable AS oo
    FOR JSON PATH,INCLUDE_NULL_VALUES
  )

  SET @actualJson = @actualJson + ' } }'

  --NOTE: A törlés azért false, mert a T_ORARENDIORA_OSSZES view-ból korábban elvégeztük a törlést, mivel egyéb feltélek is kellettek hozzá, ami nem szerepel a uspDynamicImport-ban.
  EXECUTE uspDynamicImport @pIntezmenyId = @pIntezmenyId, @pTanevId = @pTanevId, @pUserId = @pUserId, @pImportJson = @actualJson, @pIsTorles = 0, @pIsSubTable = 0
  DROP TABLE IF EXISTS #OrarendiOraTempTable 

  --NOTE: Update-elnünk kell a órarendi óráknak a groud id-ját!
  UPDATE oo SET
    oo.C_ORARENDIORAGROUPID = ID
  FROM T_ORARENDIORA_OSSZES oo
  WHERE oo.C_INTEZMENYID = @pIntezmenyId
    AND oo.C_TANEVID = @pTanevId
    AND oo.TOROLT = 'F'
    AND oo.C_IMPORTALT = 'T'
    AND ((@pIsNapirendImport = 0 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'F')
     OR (@pIsNapirendImport = 1 AND oo.C_TANORANKIVULIFOGLALKOZAS = 'T'))
END


GO

