DROP PROCEDURE IF EXISTS uspGetPedagogusAltalAdottErtekelesek
GO

CREATE PROCEDURE uspGetPedagogusAltalAdottErtekelesek
    @pTanarId int
   ,@pEvkozi int
   ,@pFelevi int
   ,@pEvvegi int
   ,@pTanevId int
   ,@pFelevVegeNaptipusId int
   ,@pErtekelesmodSuly bit = 0
   ,@pIntezmenyId int
   ,@pFeladatKategoriaId int = NULL
AS BEGIN

  SET NOCOUNT ON;

  DECLARE  @osztalyId int = 0
          ,@tantargyId int = 0
          ,@rowId int = 0
          ,@maxCharNumErtekelesSzoveg int = 20
          ,@felevVege date
          ,@isVegzos char
          ,@VegzosUtolsoNap datetime
          ,@UtolsoNap datetime
          ,@VizsgaltNap datetime
          ,@UtolsoNapTanev datetime
          ,@UtolsoNapTanevRendje datetime

  CREATE TABLE #oldalTabla (
     Sorszam nvarchar(10)
    ,ID int
    ,Nev nvarchar(500)
    ,OktAzon nvarchar(12)
    ,Besorolas nvarchar(100)
    ,[109] nvarchar(1000)
    ,[110] nvarchar(1000)
    ,[111] nvarchar(1000)
    ,[112] nvarchar(1000)
    ,[101] nvarchar(1000)
    ,FelevJegy nvarchar(100)
    ,[201] nvarchar(1000)
    ,[202] nvarchar(1000)
    ,[203] nvarchar(1000)
    ,[204] nvarchar(1000)
    ,[205] nvarchar(1000)
    ,[206] nvarchar(1000)
    ,EvvegeJegy nvarchar(100)
    ,AtlagSulyozottAtlag nvarchar(100)
  )

  CREATE TABLE #oldalAtlagTabla (
     [109] nvarchar(100)
    ,[110] nvarchar(100)
    ,[111] nvarchar(100)
    ,[112] nvarchar(100)
    ,[101] nvarchar(100)
    ,FelevJegy nvarchar(100)
    ,[201] nvarchar(100)
    ,[202] nvarchar(100)
    ,[203] nvarchar(100)
    ,[204] nvarchar(100)
    ,[205] nvarchar(100)
    ,[206] nvarchar(100)
    ,EvvegeJegy nvarchar(100)
    ,AtlagSulyozottAtlag nvarchar(100)
  )

  SELECT @felevVege = ISNULL(C_DATUM,GETDATE()) FROM T_TANEVRENDJE WHERE C_TANEVID = @pTanevId AND C_NAPTIPUSA = @pFelevVegeNaptipusId
  SELECT TOP 1 @UtolsoNapTanevRendje = C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_NAPTIPUSA = 1395 AND C_TANEVID = @pTanevId AND TOROLT = 'F'
  SELECT TOP 1 @UtolsoNapTanev = C_UTOLSOTANITASINAP FROM T_TANEV_OSSZES WHERE ID = @pTanevId AND TOROLT = 'F'
  --súlyok
  SELECT
     em.ID AS ID
    ,dib.C_NAME AS C_NAME
    ,em.C_SULY AS C_SULY
    ,CAST(em.C_SULY AS nvarchar) + '%' AS C_SULYSZAZALEK
    ,' (' + NCHAR(97 + ROW_NUMBER() OVER(ORDER BY dib.C_ORDER ASC) - 1) + ')' AS Row#
  INTO #tempSulyozas
  FROM T_ERTEKELESMOD_OSSZES em
    INNER JOIN T_DICTIONARYITEMBASE_OSSZES dib ON dib.ID = em.ID AND dib.C_TANEVID = em.C_ALTANEVID AND dib.TOROLT='F'
  WHERE em.TOROLT = 'F'
    AND em.C_ALTANEVID = @pTanevId

  --megjelenítendő tgy-ocs-evg hármasok
  SELECT
     ROW_NUMBER () OVER (ORDER BY TARGYKATEGSORREND, EVFOLYAMSORREND, OSZTALYCSOPORTNEV, TARGYNEV) AS SORSZAM
    ,TANTARGYID
    ,OSZTALYID
    ,CAST(ROW_NUMBER ( ) OVER (ORDER BY TARGYKATEGSORREND, EVFOLYAMSORREND, OSZTALYCSOPORTNEV, TARGYNEV) AS nvarchar(10)) + '. ' + NEV AS NEV
  INTO #tempFoglalkozasok
  FROM (
    SELECT
       tgy.ID AS TANTARGYID
      ,ocs.ID AS OSZTALYID
      ,dibKateg.C_ORDER AS TARGYKATEGSORREND
      ,dibEvf.C_ORDER AS EVFOLYAMSORREND
      ,ocs.C_NEV AS OSZTALYCSOPORTNEV
      ,tgy.C_NEV AS TARGYNEV
      ,ocs.C_NEV + '-' + tgy.C_NEV AS NEV
    FROM T_FOGLALKOZAS_OSSZES f
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = f.C_OSZTALYCSOPORTID AND (ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) AND ocs.TOROLT = 'F'
      INNER JOIN T_TANTARGY_OSSZES tgy ON tgy.ID = f.C_TANTARGYID AND tgy.TOROLT = 'F'
      INNER JOIN T_DICTIONARYITEMBASE_OSSZES dibKateg ON dibKateg.ID = tgy.C_TARGYKATEGORIA AND dibKateg.C_TANEVID=f.C_TANEVID AND dibKateg.TOROLT='F'
      LEFT JOIN T_DICTIONARYITEMBASE_OSSZES AS dibEvf ON dibEvf.ID = ocs.C_EVFOLYAMTIPUSA AND dibEvf.C_TANEVID=f.C_TANEVID AND dibEvf.TOROLT='F'
    WHERE f.TOROLT = 'F' AND f.C_TANARID = @pTanarId AND f.C_TANEVID=@pTanevId

    UNION

    SELECT
       tgy.ID AS TANTARGYID
      ,ocs.ID AS OSZTALYID
      ,dibKateg.C_ORDER AS TARGYKATEGSORREND
      ,dibEvf.C_ORDER AS EVFOLYAMSORREND
      ,ocs.C_NEV AS OSZTALYCSOPORTNEV
      ,tgy.C_NEV AS TARGYNEV
      ,ocs.C_NEV + '-' + tgy.C_NEV AS NEV
    FROM T_TANULOERTEKELES_OSSZES te
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = te.C_OSZTALYCSOPORTID AND (ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) AND ocs.TOROLT = 'F'
      INNER JOIN T_TANTARGY_OSSZES tgy ON tgy.ID = te.C_TANTARGYID AND tgy.TOROLT = 'F'
      LEFT JOIN T_DICTIONARYITEMBASE_OSSZES AS dibKateg ON dibKateg.ID = tgy.C_TARGYKATEGORIA AND dibKateg.C_TANEVID = tgy.C_TANEVID AND dibKateg.TOROLT='F'
      LEFT JOIN T_DICTIONARYITEMBASE_OSSZES AS dibEvf ON dibEvf.ID = ocs.C_EVFOLYAMTIPUSA AND dibEvf.C_TANEVID = ocs.C_TANEVID AND dibEvf.TOROLT='F'
    WHERE te.TOROLT = 'F' AND te.C_ERTEKELOID = @pTanarId AND te.C_TANEVID = @pTanevId
  ) AS FOGLALKOZASOK

  CREATE TABLE #tempErtekeles (
     ID int
    ,TANULOID int
    ,NEV nvarchar(255)
    ,OKTAZON nvarchar(255)
    ,C_BELEPESDATUM nvarchar(15)
    ,C_KILEPESDATUM nvarchar(15)
    ,OSZTID int
    ,ERTEKELESDATUMA nvarchar(255)
    ,ERTEKELESTIPUSA int
    ,ERTEKELESMODJA int
    ,ERTEKELES nvarchar(MAX)
    ,OSZTALYZAT int
    ,HONAP int
  )
  SELECT * FROM #tempFoglalkozasok
  ORDER BY SORSZAM;

  DECLARE foglCur CURSOR FOR
    SELECT TANTARGYID,OSZTALYID FROM #tempFoglalkozasok

  OPEN foglCur
    FETCH NEXT FROM foglCur INTO @tantargyId,@osztalyId

  WHILE @@FETCH_STATUS = 0
  BEGIN

    DELETE FROM #tempErtekeles
    SET @isVegzos = (SELECT TOP 1 C_VEGZOSEVFOLYAM FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @osztalyId)
    SET @VegzosUtolsoNap = (SELECT dbo.fnGetOsztalyVegzosTanitasiNap(@osztalyId, @pIntezmenyId, @pTanevId))
    SET @UtolsoNap = IIF(@isVegzos = 'T', COALESCE(@VegzosUtolsoNap, @UtolsoNapTanevRendje, @UtolsoNapTanev), ISNULL(@UtolsoNapTanevRendje, @UtolsoNapTanev))
    SET @VizsgaltNap = (SELECT IIF(@UtolsoNap > GETDATE(), GETDATE(), @UtolsoNap))

    INSERT INTO #tempErtekeles
    SELECT DISTINCT
       te.ID
      ,tcs.C_TANULOID AS TANULOID
      ,fh.C_NYOMTATASINEV AS NEV
      ,fh.C_OKTATASIAZONOSITO AS OKTAZON
      ,COALESCE(FORMAT(tcs.C_BELEPESDATUM, 'yyyy. MM. dd'), '') AS C_BELEPESDATUM
      ,COALESCE(FORMAT(tcs.C_KILEPESDATUM, 'yyyy. MM. dd'), '') AS C_KILEPESDATUM
      ,tcs.C_OSZTALYCSOPORTID AS OSZTID
      ,te.C_DATUM AS ERTEKELESDATUMA
      ,te.C_TIPUSID AS ERTEKELESTIPUSA
      ,te.C_ERTEKELESMODID AS ERTEKELESMODJA
      ,(IIF(C_TIPUSID NOT IN (@pEvkozi, @pFelevi, @pEvvegi),'{','') +
        CASE WHEN dibJegy.C_VALUE IS NOT NULL
              THEN CONVERT(nvarchar, dibJegy.C_VALUE)
             WHEN C_ERTEKELESSZOVEG IS NOT NULL
              THEN '['+ IIF (LEN(C_ERTEKELESSZOVEG) > @maxCharNumErtekelesSzoveg ,STUFF(C_ERTEKELESSZOVEG, @maxCharNumErtekelesSzoveg, 1000000, '...'),C_ERTEKELESSZOVEG)+']'
             ELSE CONVERT(nvarchar, C_ERTEKELESSZAZALEK) + '%' END +
        IIF(C_TIPUSID NOT IN (@pEvkozi, @pFelevi, @pEvvegi),'}' ,'' ) +
        IIF(@pErtekelesmodSuly = 1 AND C_TIPUSID = @pEvkozi,SULYOZAS.Row#,'')
       ) AS ERTEKELES
      ,dibJegy.C_VALUE AS OSZTALYZAT
      ,CASE
          WHEN MONTH(C_DATUM) >= 9 THEN 100
          WHEN MONTH(C_DATUM) > 1 AND MONTH(C_DATUM) < 9 THEN 200
          WHEN C_DATUM > @felevVege THEN 200
          ELSE 100 END + MONTH(C_DATUM) AS HONAP
      FROM T_TANULOCSOPORT_OSSZES tcs
        INNER JOIN T_FELHASZNALO_OSSZES fh ON fh.ID = tcs.C_TANULOID AND fh.TOROLT = 'F' AND fh.C_TANEVID = @pTanevId
        LEFT JOIN T_TANULOERTEKELES_OSSZES te ON te.C_TANTARGYID = @tantargyId AND te.C_TANULOID = tcs.C_TANULOID AND te.TOROLT = 'F' AND te.C_TANEVID = @pTanevId AND te.C_ERTEKELOID = @pTanarId
        LEFT JOIN T_DICTIONARYITEMBASE_OSSZES AS dibJegy ON dibJegy.ID = te.C_ERTEKELESOSZTALYZATID AND dibJegy.TOROLT = 'F' AND dibJegy.C_TANEVID = @pTanevId
        LEFT JOIN #tempSulyozas AS SULYOZAS on SULYOZAS.ID = te.C_ERTEKELESMODID
    WHERE tcs.C_TANEVID = @pTanevId
      AND tcs.C_OSZTALYCSOPORTID = @osztalyId
      AND tcs.TOROLT = 'F'

    INSERT INTO #oldalTabla
    SELECT
       CAST(ROW_NUMBER () OVER (ORDER BY NEV) AS nvarchar(10)) + '.' AS '#'
      ,RESULT.*
    FROM (
      SELECT
         PIVOTERTEKEL.TANULOID AS ID
        ,NEV AS 'Név'
        ,OKTAZON AS 'Okt. azonosító'
        ,BESOROLAS AS 'Csoport tagja'
        ,[109] AS Szeptember
        ,[110] AS Október
        ,[111] AS November
        ,[112] AS December
        ,[101] AS 'Január / I.'
        ,FELEV.JEGY AS [I. félév]
        ,[201] AS 'Január / II.'
        ,[202] AS Február
        ,[203] AS Március
        ,[204] AS Április
        ,[205] AS Május
        ,[206] AS Június
        ,EVVEGE.JEGY AS [II. félév]
        ,ATLAG.SULYOZOTTATLAG AS 'Átlag'
      FROM (
        SELECT DISTINCT
           T1.NEV
          ,T1.OKTAZON
          ,T1.C_BELEPESDATUM + ' - ' + T1.C_KILEPESDATUM AS BESOROLAS
          ,STUFF ((
            SELECT ', ' + ISNULL(T2.ERTEKELES, '')
            FROM #tempErtekeles AS T2
            WHERE T1.TANULOID = T2.TANULOID AND T1.HONAP = T2.HONAP
              AND T1.ERTEKELESTIPUSA NOT IN (@pFelevi, @pEvvegi)
              AND T2.ERTEKELESTIPUSA NOT IN (@pFelevi, @pEvvegi)
            ORDER BY ERTEKELESDATUMA
            FOR XML PATH ('')
          ), 1, 2, '') AS ERTEKELESEK
          ,T1.HONAP
          ,T1.TANULOID
        FROM #tempErtekeles AS T1
      ) AS ERDEMJEGYEK
      PIVOT (MAX(ERTEKELESEK) FOR HONAP IN ([109], [110], [111], [112], [101], [201], [202], [203], [204], [205], [206])) AS PIVOTERTEKEL
      LEFT JOIN (
        SELECT
           TANULOID
          ,AVG(OSZTALYZAT) AS JEGY
        FROM #tempErtekeles
        WHERE ERTEKELESTIPUSA = @pFelevi
        GROUP BY TANULOID
      ) AS FELEV ON PIVOTERTEKEL.TANULOID = FELEV.TANULOID
      LEFT JOIN (
        SELECT
           TANULOID
          ,AVG(OSZTALYZAT) AS JEGY
        FROM #tempErtekeles
        WHERE ERTEKELESTIPUSA = @pEvvegi
        GROUP BY TANULOID
      ) AS EVVEGE ON PIVOTERTEKEL.TANULOID = EVVEGE.TANULOID
      LEFT JOIN (
        SELECT
           TANULOID
          ,ROUND(AVG(CAST(OSZTALYZAT AS FLOAT)), 2) AS ATLAG
          ,ROUND(SUM(OSZTALYZAT * ISNULL(em.C_SULY, 100) / 100.0) / SUM(ISNULL(em.C_SULY, 100) / 100.0), 2) AS SULYOZOTTATLAG
        FROM #tempErtekeles AS tempErtekeles
          LEFT JOIN T_ERTEKELESMOD_OSSZES AS em ON em.ID = tempErtekeles.ERTEKELESMODJA AND em.TOROLT = 'F' AND em.C_ALTANEVID = @pTanevId
        WHERE ERTEKELESTIPUSA = @pEvkozi AND OSZTALYZAT IS NOT NULL
        GROUP BY TANULOID
      ) AS ATLAG ON PIVOTERTEKEL.TANULOID = ATLAG.TANULOID
    ) AS RESULT
    ORDER BY NEV;

    INSERT INTO #oldalAtlagTabla
    SELECT
       [109] AS Szeptember
      ,[110] AS Október
      ,[111] AS November
      ,[112] AS December
      ,[101] AS 'Január / I.'
      ,FELEV.JEGY AS [I. félév]
      ,[201] AS 'Január / II.'
      ,[202] AS Február
      ,[203] AS Március
      ,[204] AS Április
      ,[205] AS Május
      ,[206] AS Június
      ,EVVEGE.JEGY AS [II. félév]
      ,ATLAG.ATLAG AS 'Átlag'
    FROM (
      SELECT
         ert.HONAP
        ,ROUND(SUM(ert.OSZTALYZAT * ISNULL(em.C_SULY, 100) / 100.0) / SUM(ISNULL(em.C_SULY, 100) / 100.0), 2) AS SULYOZOTTATLAG
      FROM #tempErtekeles ert
        LEFT JOIN T_ERTEKELESMOD_OSSZES AS em ON em.ID = ert.ERTEKELESMODJA AND em.TOROLT = 'F' AND em.C_ALTANEVID = @pTanevId
      WHERE ert.ERTEKELESTIPUSA = @pEvkozi AND ert.OSZTALYZAT IS NOT NULL
      GROUP BY ert.HONAP
    ) AS a
    PIVOT (MAX(SULYOZOTTATLAG) FOR HONAP IN ([109], [110], [111], [112], [101], [201], [202], [203], [204], [205], [206])) AS PIVOTERTEKEL
    OUTER APPLY (
      SELECT
        ROUND(AVG(OSZTALYZAT * 1.0), 2) AS JEGY
      FROM #tempErtekeles
      WHERE ERTEKELESTIPUSA = @pFelevi AND OSZTALYZAT IS NOT NULL
    ) AS FELEV
    OUTER APPLY (
      SELECT
        ROUND(AVG(OSZTALYZAT * 1.0), 2) AS JEGY
      FROM #tempErtekeles
      WHERE ERTEKELESTIPUSA = @pEvvegi AND OSZTALYZAT IS NOT NULL
    ) AS EVVEGE
    OUTER APPLY (
      SELECT
        ROUND(AVG(AtlagSulyozottAtlag * 1.0), 2) AS ATLAG
      FROM #oldalTabla
    ) AS ATLAG

    IF EXISTS (SELECT 1 FROM #oldalAtlagTabla)
    BEGIN
      INSERT INTO #oldalTabla
      SELECT
         NULL
        ,NULL
        ,'Átlag'
        ,NULL
        ,NULL
        ,oat.*
      FROM #oldalAtlagTabla oat
    END
    ELSE
    BEGIN
      INSERT INTO #oldalTabla
      SELECT
         NULL
        ,NULL
        ,'Átlag'
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,FELEV.JEGY
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,NULL
        ,EVVEGE.JEGY
        ,ATLAG.ATLAG
      FROM (
        SELECT
          ROUND(AVG(AtlagSulyozottAtlag * 1.0), 2) AS ATLAG
        FROM #oldalTabla
      ) AS ATLAG
      OUTER APPLY (
        SELECT
          ROUND(AVG(OSZTALYZAT * 1.0), 2) AS JEGY
        FROM #tempErtekeles
        WHERE ERTEKELESTIPUSA = @pEvvegi AND OSZTALYZAT IS NOT NULL
      ) AS EVVEGE
      OUTER APPLY (
        SELECT
          ROUND(AVG(OSZTALYZAT * 1.0), 2) AS JEGY
        FROM #tempErtekeles
        WHERE ERTEKELESTIPUSA = @pFelevi AND OSZTALYZAT IS NOT NULL
      ) AS FELEV
    END

    SELECT
       ot.Sorszam AS '#'
      ,ot.ID AS ID
      ,ot.Nev AS 'Név'
      ,ot.OktAzon AS 'Okt. azonosító'
      ,ot.Besorolas AS 'Csoport tagja'
      ,ot.[109] AS Szeptember
      ,ot.[110] AS Október
      ,ot.[111] AS November
      ,ot.[112] AS December
      ,ot.[101] AS 'Január / I.'
      ,ot.FelevJegy AS [I. félév]
      ,ot.[201] AS 'Január / II.'
      ,ot.[202] AS Február
      ,ot.[203] AS Március
      ,ot.[204] AS Április
      ,ot.[205] AS Május
      ,ot.[206] AS Június
      ,ot.EvvegeJegy AS [II. félév]
      ,ot.AtlagSulyozottAtlag AS 'Átlag'
    FROM #oldalTabla ot

    TRUNCATE TABLE #oldalTabla
    TRUNCATE TABLE #oldalAtlagTabla

    FETCH NEXT FROM foglCur INTO @tantargyId,@osztalyId
  END

  CLOSE foglCur
  DEALLOCATE foglCur

  SELECT
     ID
    ,Row# AS 'Jelmagyarázat'
    ,C_NAME AS 'Értékelésmód'
    ,C_SULYSZAZALEK AS 'Értékelés súlyozása'
  FROM #tempSulyozas
  ORDER BY Row#;

  -- Iktatás adatok
  SELECT
     f.ID AS PedagogusId
    ,f.C_OKTATASIAZONOSITO AS PedagogusOktAzon
    ,mua.C_FELADATELLATASIHELYID AS FeladatEllatasiHelyId
  FROM T_FELHASZNALO_OSSZES AS f
    INNER JOIN T_MUNKAUGYIADATOK_OSSZES AS mua ON mua.C_ALKALMAZOTTID = f.ID AND mua.TOROLT='F'
  WHERE f.ID = @pTanarId AND f.C_TANEVID = @pTanevId AND f.TOROLT='F'
END

GO
