﻿-- =============================================
-- Description: <Előszedjük a tanuló értékeléseket a megadott paraméterek alapján>
-- =============================================
DROP PROCEDURE IF EXISTS uspGetTanuloErtekelesListDataSet
GO

CREATE PROCEDURE uspGetTanuloErtekelesListDataSet
   @pTanevId int
  ,@pId int = NULL
  ,@pTanuloIdsString nvarchar(max) = NULL
  ,@pOsztalyCsoportId int = NULL
  ,@pCsoportTipusId int = NULL
  ,@pTantargyUidsString nvarchar(max) = NULL
  ,@pErtekeloId int = NULL
  ,@pOsztalyzatId int = NULL
  ,@pErtekelesModId int = NULL
  ,@pTipusId int = NULL
  ,@pIsBizonyitvanyTipusuErtekelesekIncluded char = NULL
  ,@pDatumTol datetime = NULL
  ,@pDatumIg datetime = NULL
  ,@pRogzitesDatumTol datetime = NULL
  ,@pRogzitesDatumIg datetime = NULL
  ,@pErtekelesSzoveg nvarchar(max) = NULL
  ,@pErtekelesTema nvarchar(255) = NULL
  ,@pKellKapcsolodoCsoportok char = 'F'
  ,@pFeladatKategoriaId int = NULL
  ,@pOktatasiNevelesiFeladatId int = NULL
  ,@pFeladatEllatasiHelyId int = NULL
  ,@pEgyszerAdhatoTanuloErtekelesTipusIdListString nvarchar(255) = NULL
  ,@pSpecialisErtekelesOsztalyzatEnumId int = NULL
  ,@pSpecialisErtekelesOsztalyzatSzoveg nvarchar(255) = NULL
  ,@pSpecialisErtekelesOsztalyzatSzovegRovidNev nvarchar(3) = NULL
  ,@pSpecialisErtekelesOsztalyzatId int = NULL
  ,@pSpecialisErtekelesOsztalyzatTema nvarchar(255) = NULL
  ,@pIsMagatartasSzorgalom char(1) = NULL
AS
BEGIN

  SET NOCOUNT ON;

  DECLARE
     @sql nvarchar(max)
    ,@preSelectSql nvarchar(max) = ''
    ,@selectSql nvarchar(max) = N''
    ,@joinSql nvarchar(max)
    ,@whereSql nvarchar(max)
    ,@postSelectSql nvarchar(max) = ''
  IF @pTanuloIdsString IS NOT NULL AND LEN(@pTanuloIdsString)>0
  BEGIN
    SET @selectSql = N'
    CREATE TABLE #TanuloIds (
      TanuloId int PRIMARY KEY
    )

    INSERT INTO #TanuloIds(TanuloId)
    SELECT value FROM STRING_SPLIT(@pTanuloIdsString, '','')

    CREATE TABLE #TantargyUids (
      TantargyUid NVARCHAR(10)
    )

    INSERT INTO #TantargyUids(TantargyUid)
    SELECT value FROM STRING_SPLIT(@pTantargyUidsString, '','')
    '
  END
  SET @selectSql += N'
    --NOTE: Azért kell a DISTINCT, ha ugyanoda ki-/besorolgatják a tanulót!
    SELECT DISTINCT
       ert.ID AS ID
      ,ert.C_DATUM AS Datum
      ,ert.C_ROGZITESDATUM AS RogzitesDatum
      ,ert.C_TIPUSID AS TipusId
      ,ert.C_ISERTESITESELKULDVE AS IsErtesitesElkuldve
      ,ert.C_ERTEKELESMODID AS ErtekelesModId
      ,ert.C_ERTEKELESTEMA AS ErtekelesTema
      ,ert.C_ERTEKELESOSZTALYZATID AS ErtekelesOsztalyzatId
      ,ert.C_ERTEKELESSZOVEG AS ErtekelesSzoveg
      ,ert.C_ERTEKELESSZOVEGFORMAZOTT AS ErtekelesSzovegFormazott
      ,ert.C_ERTEKELESSZAZALEK AS ErtekelesSzazalek
      ,ert.C_ISMAGATARTASSZORGALOM AS IsMagatartasSzorgalom
      ,ert.C_MAGATARTASOSZTALYZATID AS MagatartasOsztalyzatId
      ,ert.C_MAGATARTASSZOVEG AS MagatartasSzoveg
      ,ert.C_MAGATARTASSZOVEGFORMAZOTT AS MagatartasSzovegFormazott
      ,ert.C_MAGATARTASERTEKID AS MagatartasErtekId
      ,ert.C_SZORGALOMOSZTALYZATID AS SzorgalomOsztalyzatId
      ,ert.C_SZORGALOMSZOVEG AS SzorgalomSzoveg
      ,ert.C_SZORGALOMSZOVEGFORMAZOTT AS SzorgalomSzovegFormazott
      ,ert.C_SZORGALOMERTEKID AS SzorgalomErtekId
      ,ert.CREATED AS Created
      ,ert.C_OSZTALYCSOPORTID AS OsztalyCsoportId
      ,ert.C_ERTEKELESSZOVEGROVIDNEV AS SzovegesErtekelesRovidNev
      ,ISNULL(suly.C_SULY, 100) AS ErtekelesSuly
      ,tantargy.ID AS TantargyId
      ,ISNULL(tantargy.C_NEV, ''Magatartás/Szorgalom'') AS TantargyNev
      ,tantargy.C_TARGYKATEGORIA AS TantargyKategoriaId
      ,fotargy.ID AS FotargyId
      ,fotargy.C_NEV AS FotargyNev
      ,fotargy.C_TARGYKATEGORIA AS FotargyTantargyKategoriaId
      ,tanulo.ID AS TanuloId
      ,tanulo.C_NYOMTATASINEV AS TanuloNev
      ,IIF(tanulo.C_NEVSORREND = ''T'',
        tanulo.C_UTONEV + '' '' + tanulo.C_VEZETEKNEV,
        tanulo.C_VEZETEKNEV + '' '' + tanulo.C_UTONEV
      ) AS TanuloNevElotagNelkul
      ,tanulo.C_OKTATASIAZONOSITO AS TanuloOktatasiAzonosito
      ,tanulo.C_SZULETESIHELY AS TanuloSzuletesiHely
      ,tanulo.C_SZULETESIDATUM AS TanuloSzuletesiIdo
      ,tanulo.C_ANYJANEVE AS TanuloAnyjaNeve
      ,tanar.ID AS ErtekeloId
      ,tanar.C_NYOMTATASINEV AS ErtekeloNyomtatasiNev
      ,IIF(tanar.C_NEVSORREND = ''T'',
        tanar.C_UTONEV + '' '' + tanar.C_VEZETEKNEV,
        tanar.C_VEZETEKNEV + '' '' + tanar.C_UTONEV
      ) AS ErtekeloNyomtatasiNevElotagNelkul
      ,ocs.C_NEV AS OsztalyCsoportNev
      ,ocs.C_FELADATKATEGORIAID AS FeladatKategoriaId
      ,rogziteskoriTanuloOsztaly.ID AS RogziteskoriTanuloOsztalyId
      ,rogziteskoriTanuloOsztaly.C_NEV AS RogziteskoriTanuloOsztalyNev
      ,rogziteskoriTanuloOsztaly.C_EVFOLYAMTIPUSA AS RogziteskoriTanuloOsztalyEvfolyamTipusId
    FROM T_TANULOERTEKELES_OSSZES ert'

  SET @joinSql = N'
      LEFT JOIN T_TANARIATLAGSULY_OSSZES suly ON suly.C_TANEVID = ert.C_TANEVID AND suly.TOROLT = ''F''
        AND suly.C_ERTEKELESMODID = ert.C_ERTEKELESMODID
      LEFT JOIN T_TANTARGY_OSSZES tantargy ON tantargy.C_TANEVID = ert.C_TANEVID AND tantargy.TOROLT = ''F''
        AND tantargy.ID = ert.C_TANTARGYID
      LEFT JOIN T_TANTARGY_OSSZES fotargy ON fotargy.C_TANEVID = ert.C_TANEVID AND fotargy.TOROLT = ''F''
        AND fotargy.ID = tantargy.C_FOTARGYID
      LEFT JOIN T_OSZTALYCSOPORT_OSSZES rogziteskoriTanuloOsztaly ON rogziteskoriTanuloOsztaly.C_TANEVID = ert.C_TANEVID AND rogziteskoriTanuloOsztaly.TOROLT = ''F''
        AND rogziteskoriTanuloOsztaly.ID = ert.C_ROGZITESKORITANULOOSZTALYID
      INNER JOIN T_FELHASZNALO_OSSZES tanulo ON tanulo.C_TANEVID = ert.C_TANEVID AND tanulo.TOROLT = ''F''
        AND tanulo.ID = ert.C_TANULOID
      INNER JOIN T_FELHASZNALO_OSSZES tanar ON tanar.C_TANEVID = ert.C_TANEVID AND tanar.TOROLT = ''F''
        AND tanar.ID = ert.C_ERTEKELOID
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.C_TANEVID = ert.C_TANEVID AND ocs.TOROLT = ''F''
        AND ocs.ID = ert.C_OSZTALYCSOPORTID'

  SET @whereSql = N'
    WHERE ert.C_TANEVID = @pTanevId
      AND ert.TOROLT = ''F'''

  IF @pId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ert.ID = @pId'
  END

  IF (@pTanuloIdsString IS NOT NULL AND LEN(@pTanuloIdsString) > 0) BEGIN
    SET @joinSql += N'
      INNER JOIN #TanuloIds tanuloIds ON tanuloids.TanuloId = ert.C_TANULOID'
  END

  IF @pOsztalyCsoportId IS NOT NULL BEGIN

  SET @preSelectSql += N'
    CREATE TABLE #OsztalyCsoportIdList(
      ID int PRIMARY KEY
    )
    INSERT INTO #OsztalyCsoportIdList (ID)'

  IF(@pKellKapcsolodoCsoportok = 'T') BEGIN

    SET @preSelectSql += N'
      SELECT ID
      FROM fnGetKapcsolodoOsztalycsoportok(@pOsztalyCsoportId)'
  END
  ELSE BEGIN
    SET @preSelectSql += N'
      VALUES (@pOsztalyCsoportId)'
  END
  
  SET @joinSql += N'
    LEFT JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_TANEVID = ert.C_TANEVID AND tcs.TOROLT = ''F''
      AND tcs.C_TANULOID = tanulo.ID
      AND tcs.C_BELEPESDATUM <= GETDATE()
      AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= GETDATE())'

    SET @whereSql += N'
      AND ert.C_OSZTALYCSOPORTID IN (SELECT ID FROM #OsztalyCsoportIdList)
      AND EXISTS (
        SELECT 1
        FROM
          T_TANULOCSOPORT_OSSZES tcs
        WHERE tcs.C_TANEVID = ert.C_TANEVID
          AND tcs.TOROLT = ''F''
          AND tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
          AND tcs.C_TANULOID = ert.C_TANULOID
      )'

    SET @postSelectSql += N'
      DROP TABLE IF EXISTS #OsztalyCsoportIdList'
  END

  IF @pCsoportTipusId IS NOT NULL BEGIN
    SET @joinSql += N'
      LEFT JOIN T_CSOPORT_OSSZES csoport ON csoport.C_ALTANEVID = ert.C_TANEVID AND csoport.TOROLT = ''F''
        AND csoport.ID = ocs.ID'

    SET @whereSql += N'
      AND csoport.C_TIPUSA = @pCsoportTipusId'
  END

  IF (@pTantargyUidsString IS NOT NULL AND LEN(@pTantargyUidsString) > 0) BEGIN
    SET @whereSql += N'
      AND ((CONVERT(NVARCHAR(MAX), tantargy.ID) IN (SELECT TantargyUid FROM #TantargyUids)
        OR (ert.C_TANTARGYID IS NULL 
          AND (
            EXISTS(
              SELECT 1 FROM #TantargyUids WHERE TantargyUid = ''Magatartas'' 
                AND (ert.C_MAGATARTASERTEKID IS NOT NULL 
                  OR ert.C_MAGATARTASOSZTALYZATID IS NOT NULL 
                  OR ert.C_MAGATARTASSZOVEG IS NOT NULL 
                  OR ert.C_MAGATARTASSZOVEGFORMAZOTT IS NOT NULL)
            ) 
            OR EXISTS(
              SELECT 1 FROM #TantargyUids WHERE TantargyUid = ''Szorgalom'') 
                AND (ert.C_SZORGALOMERTEKID IS NOT NULL 
                  OR ert.C_SZORGALOMOSZTALYZATID IS NOT NULL 
                  OR ert.C_SZORGALOMSZOVEG IS NOT NULL 
                  OR ert.C_SZORGALOMSZOVEGFORMAZOTT IS NOT NULL)
            )
          )
        )
      )'
  END

  IF(@pIsMagatartasSzorgalom IS NOT NULL) BEGIN
    SET @whereSql += N'
      AND ert.C_ISMAGATARTASSZORGALOM = @pIsMagatartasSzorgalom'
  END

  IF @pErtekeloId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND tanar.ID = @pErtekeloId'
  END

  IF @pOsztalyzatId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND (ert.C_ERTEKELESOSZTALYZATID = @pOsztalyzatId OR
        ert.C_MAGATARTASOSZTALYZATID = @pOsztalyzatId OR
        ert.C_SZORGALOMOSZTALYZATID = @pOsztalyzatId)'
  END

  IF @pErtekelesModId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ert.C_ERTEKELESMODID = @pErtekelesModId'
  END

  IF @pTipusId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ert.C_TIPUSID = @pTipusId'
  END

  IF (@pIsBizonyitvanyTipusuErtekelesekIncluded = 'F') BEGIN
	SET @whereSql += N' 
	  AND ert.C_TIPUSID NOT IN (' + @pEgyszerAdhatoTanuloErtekelesTipusIdListString + ')'
  END

  IF @pDatumTol IS NOT NULL BEGIN
    --NOTE: Ide az adott nap 00:00:00 időponttal fog bejönni.
    SET @whereSql += N'
      AND ert.C_DATUM >= @pDatumTol'
  END

  IF @pDatumIg IS NOT NULL BEGIN
    --NOTE: Ide az adott nap 23:59:59 időponttal fog bejönni.
    SET @whereSql += N'
      AND ert.C_DATUM <= @pDatumIg'
  END

  IF @pRogzitesDatumTol IS NOT NULL
  BEGIN
    --NOTE: Ide az adott nap 00:00:00 időponttal fog bejönni.
    SET @whereSql += N'
      AND ert.C_ROGZITESDATUM >= @pRogzitesDatumTol'
  END

  IF @pRogzitesDatumIg IS NOT NULL BEGIN
    --NOTE: Ide az adott nap 23:59:59 időponttal fog bejönni.
    SET @whereSql += N'
      AND ert.C_ROGZITESDATUM <= @pRogzitesDatumIg'
  END

  IF @pErtekelesSzoveg IS NOT NULL BEGIN
    SET @whereSql += N'
      AND (ert.C_ERTEKELESSZOVEG LIKE ''%'' + @pErtekelesSzoveg + ''%'' OR
        ert.C_MAGATARTASSZOVEG LIKE ''%'' + @pErtekelesSzoveg + ''%'' OR
        ert.C_SZORGALOMSZOVEG LIKE ''%'' + @pErtekelesSzoveg + ''%'')'
  END

  IF @pErtekelesTema IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ert.C_ERTEKELESTEMA LIKE ''%'' + @pErtekelesTema + ''%'''
  END

  IF @pFeladatKategoriaId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId'
  END

  IF @pOktatasiNevelesiFeladatId IS NOT NULL BEGIN

    SET @joinSql += N'
      INNER JOIN T_FELADATELLATASIHELY_OSSZES feh ON feh.C_TANEVID = ert.C_TANEVID 
        AND feh.ID = ocs.C_FELADATELLATASIHELYID
        AND feh.TOROLT = ''F'''

    SET @whereSql += N'
      AND feh.C_OKTATASINEVELESIFELADATTIPUS = @pOktatasiNevelesiFeladatId'
  END

  IF @pFeladatEllatasiHelyId IS NOT NULL BEGIN
    SET @whereSql += N'
      AND ocs.C_FELADATELLATASIHELYID = @pFeladatEllatasiHelyId'
  END

  IF (@pSpecialisErtekelesOsztalyzatEnumId) IS NOT NULL BEGIN
    IF (@pSpecialisErtekelesOsztalyzatEnumId = 1/*NOTE: NemIrt*/) BEGIN
      SET @whereSql += N'
        --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
        AND (ert.C_TIPUSID NOT IN (' + @pEgyszerAdhatoTanuloErtekelesTipusIdListString + ') AND
            LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ert.C_ERTEKELESSZOVEG),CHAR(160),CHAR(32)),CHAR(32),''(¤¤)''),''¤)(¤'',''''),''(¤¤)'',CHAR(32)))) = LOWER(@pSpecialisErtekelesOsztalyzatSzoveg) AND
            LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ert.C_ERTEKELESSZOVEGROVIDNEV),CHAR(160),CHAR(32)),CHAR(32),''(¤¤)''),''¤)(¤'',''''),''(¤¤)'',CHAR(32)))) = LOWER(@pSpecialisErtekelesOsztalyzatSzovegRovidNev))'
    END

    IF (@pSpecialisErtekelesOsztalyzatEnumId = 2/*NOTE: Dicseret*/ OR
        @pSpecialisErtekelesOsztalyzatEnumId = 3/*NOTE: Kituno*/) BEGIN
      SET @whereSql += N'
        --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
        AND (ert.C_TIPUSID IN (' + @pEgyszerAdhatoTanuloErtekelesTipusIdListString + ') AND
            ert.C_ERTEKELESOSZTALYZATID = @pSpecialisErtekelesOsztalyzatId AND
            LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ert.C_ERTEKELESTEMA),CHAR(160),CHAR(32)),CHAR(32),''(¤¤)''),''¤)(¤'',''''),''(¤¤)'',CHAR(32)))) = LOWER(@pSpecialisErtekelesOsztalyzatTema))'
    END

    IF (@pSpecialisErtekelesOsztalyzatEnumId = 4/*NOTE: Mentesitve*/) BEGIN
      SET @whereSql += N'
        --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
        AND (ert.C_TIPUSID IN (' + @pEgyszerAdhatoTanuloErtekelesTipusIdListString + ') AND
            LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ert.C_ERTEKELESSZOVEG),CHAR(160),CHAR(32)),CHAR(32),''(¤¤)''),''¤)(¤'',''''),''(¤¤)'',CHAR(32)))) = LOWER(@pSpecialisErtekelesOsztalyzatSzoveg) AND
            LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(ert.C_ERTEKELESSZOVEGROVIDNEV),CHAR(160),CHAR(32)),CHAR(32),''(¤¤)''),''¤)(¤'',''''),''(¤¤)'',CHAR(32)))) = LOWER(@pSpecialisErtekelesOsztalyzatSzovegRovidNev))'
    END
  END

  SET @sql = @preSelectSql + @selectSql + @joinSql + @whereSql + @postSelectSql

  EXEC sp_executesql @sql, N'
     @pTanevId int
    ,@pId int = NULL
    ,@pTanuloIdsString nvarchar(MAX) = NULL
    ,@pOsztalyCsoportId int = NULL
    ,@pCsoportTipusId int = NULL
    ,@pTantargyUidsString nvarchar(MAX) = NULL
    ,@pErtekeloId int = NULL
    ,@pOsztalyzatId int = NULL
    ,@pErtekelesModId int = NULL
	,@pTipusId int = NULL
    ,@pIsBizonyitvanyTipusuErtekelesekIncluded char = NULL
    ,@pDatumTol datetime = NULL
    ,@pDatumIg datetime = NULL
    ,@pRogzitesDatumTol datetime = NULL
    ,@pRogzitesDatumIg datetime = NULL
    ,@pErtekelesSzoveg nvarchar(max) = NULL
    ,@pErtekelesTema nvarchar(255) = NULL
    ,@pFeladatKategoriaId int = NULL
    ,@pOktatasiNevelesiFeladatId int = NULL
    ,@pFeladatEllatasiHelyId int = NULL
    ,@pSpecialisErtekelesOsztalyzatSzoveg nvarchar(255) = NULL
    ,@pSpecialisErtekelesOsztalyzatSzovegRovidNev nvarchar(3) = NULL
    ,@pSpecialisErtekelesOsztalyzatId int = NULL
    ,@pSpecialisErtekelesOsztalyzatTema nvarchar(255) = NULL
    ,@pIsMagatartasSzorgalom char(1) = NULL'
    ,@pTanevId = @pTanevId
    ,@pId = @pId
    ,@pTanuloIdsString = @pTanuloIdsString
    ,@pOsztalyCsoportId = @pOsztalyCsoportId
    ,@pCsoportTipusId = @pCsoportTipusId
    ,@pTantargyUidsString = @pTantargyUidsString
    ,@pErtekeloId = @pErtekeloId
    ,@pOsztalyzatId = @pOsztalyzatId
    ,@pErtekelesModId = @pErtekelesModId
	,@pTipusId = @pTipusId
    ,@pIsBizonyitvanyTipusuErtekelesekIncluded = @pIsBizonyitvanyTipusuErtekelesekIncluded
    ,@pDatumTol = @pDatumTol
    ,@pDatumIg = @pDatumIg
    ,@pRogzitesDatumTol = @pRogzitesDatumTol
    ,@pRogzitesDatumIg = @pRogzitesDatumIg
    ,@pErtekelesSzoveg = @pErtekelesSzoveg
    ,@pErtekelesTema = @pErtekelesTema
    ,@pFeladatKategoriaId = @pFeladatKategoriaId
    ,@pOktatasiNevelesiFeladatId = @pOktatasiNevelesiFeladatId
    ,@pFeladatEllatasiHelyId = @pFeladatEllatasiHelyId
    ,@pSpecialisErtekelesOsztalyzatSzoveg = @pSpecialisErtekelesOsztalyzatSzoveg
    ,@pSpecialisErtekelesOsztalyzatSzovegRovidNev = @pSpecialisErtekelesOsztalyzatSzovegRovidNev
    ,@pSpecialisErtekelesOsztalyzatId = @pSpecialisErtekelesOsztalyzatId
    ,@pSpecialisErtekelesOsztalyzatTema = @pSpecialisErtekelesOsztalyzatTema
    ,@pIsMagatartasSzorgalom = @pIsMagatartasSzorgalom

END
GO
