﻿
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

DROP PROCEDURE IF EXISTS dbo.sp_GetOrarend
GO

CREATE PROCEDURE dbo.sp_GetOrarend
   @pIntezmenyId int
  ,@pTanevId int
  ,@pIdoszakKezdete date
  ,@pIdoszakVege date
  ,@pTanarId int = NULL 
  ,@pIsHelyettesitesNelkul bit = 0
  ,@pOsztalyCsoportId int = NULL
  ,@pTanuloId int = NULL
  ,@pTantargyId int = NULL
  ,@pTeremId int = NULL
  ,@pCsakOrarendiOrak bit
  ,@pIsNapirend bit = 0 
  ,@pFeladatKategoriaId int = NULL
  ,@pOrakezdete time = NULL
  ,@pOravege time = NULL
  ,@pHetnapja int = NULL
  ,@pIsKozpontilagToroltOrak int = 0
  ,@pOszlopok nvarchar(4000) = '*' -- sql injection rulez
AS
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX) = '';
--SET @pOrakezdete = CONVERT(datetime, CONVERT(TIME, @pOrakezdete));
--SET @pOravege = CONVERT(datetime, CONVERT(TIME, @pOravege));

-- DROP TABLE IF EXISTS #KapcsolodoCsoportok
SET @SQL += '
CREATE TABLE #KapcsolodoCsoportok(
    ID int NOT NULL,
    Kezdete date NOT NULL,
    Vege date NOT NULL,
    IsOsztaly bit,
    PRIMARY KEY CLUSTERED(ID, Kezdete, Vege)
);
';

-- Összes osztályhoz vagy csoporthoz kapcsolódó további osztályok vagy csoportok megkeresése
IF @pOsztalyCsoportId IS NOT NULL
SET @SQL += '
    INSERT INTO #KapcsolodoCsoportok(ID, Kezdete, Vege, IsOsztaly)
    SELECT DISTINCT ID, Kezdete, Vege, 1 as IsOsztaly
    FROM dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange(@pOsztalyCsoportId, @pIdoszakKezdete, @pIdoszakVege, @pIntezmenyId, @pTanevId) t;
';

-- Összes a tanulóhoz kapcsolódó további osztályok vagy csoportok megkeresése (amelyek még nincsenek meg)
IF @pTanuloId IS NOT NULL
SET @SQL += '
    INSERT INTO #KapcsolodoCsoportok(ID, Kezdete, Vege, IsOsztaly)
    SELECT DISTINCT tcs.C_OSZTALYCSOPORTID AS ID, tcs.C_BELEPESDATUM AS Kezdete, ISNULL(tcs.C_KILEPESDATUM, t.C_UTOLSONAP) AS Vege, 0 As IsOsztaly
    FROM T_TANULOCSOPORT_OSSZES tcs
    INNER JOIN T_TANEV_OSSZES t on t.ID = tcs.C_TANEVID
    WHERE t.TOROLT = ''F''
    AND tcs.C_INTEZMENYID = @pIntezmenyId
    AND tcs.C_TANEVID = @pTanevId
    AND tcs.C_TANULOID = @pTanuloId
    AND tcs.TOROLT = ''F''
    AND tcs.C_BELEPESDATUM <= @pIdoszakVege
    AND (tcs.C_KILEPESDATUM > @pIdoszakKezdete OR tcs.C_KILEPESDATUM IS NULL)
    AND NOT EXISTS(SELECT * FROM #KapcsolodoCsoportok k WHERE k.ID = tcs.C_OSZTALYCSOPORTID);
';

-- Fő lekérdezés
SET @SQL += '
SELECT ' + @pOszlopok + '
FROM (
    SELECT 
         ISNULL(tn.Id, oo.Id) AS Id
        ,ISNULL(tn.ORARENDIID, oo.ORARENDIID) AS ORARENDIID
        ,ISNULL(tn.Datum, oo.Datum) AS Datum
        ,ISNULL(tn.Bontott, oo.Bontott) AS Bontott
        ,ISNULL(tn.Hetirend, oo.Hetirend) AS Hetirend
        ,ISNULL(tn.HetNapja, oo.HetNapja) AS HetNapja
        ,ISNULL(tn.HetSorszam, oo.HetSorszam) AS HetSorszam
        ,IIF(tn.Id IS NOT NULL, NULL, oo.ErvenyessegKezdete) AS ErvenyessegKezdete
        ,IIF(tn.Id IS NOT NULL, NULL, oo.ErvenyessegVege) AS ErvenyessegVege
        ,ISNULL(tn.OraKezdet, oo.OraKezdet) AS OraKezdete
        ,ISNULL(tn.OraVeg, oo.OraVeg) AS OraVege
        ,ISNULL(tn.Oraszam, oo.Oraszam) AS Oraszam
        ,ISNULL(tantargy.C_ROVIDNEV, tantargy.C_NEV) AS TargyNev -- [3]: itt kellene javítani ISNULL helyett COALESCE
        ,COALESCE(tantargy.C_ROVIDNEV, tantargy.C_NEV) AS TargyNevForMobile
        ,tantargy.C_TARGYKATEGORIA AS TargykategoriaID
        ,ISNULL(tn.Megtartott, oo.Megtartott) AS Megtartott
        ,ISNULL(tn.CsengetesiRendOraID, oo.CsengetesiRendOraID) AS CsengetesiRendOraID
        ,ISNULL(tn.CsengetesiRendID, oo.CsengetesiRendID) AS CsengetesiRendID
        ,CAST(ISNULL(oo.MaxOraszam, 48) AS INT) AS MaxNapiOraszam
        ,osztaly.C_NEV AS OsztalyNev
        ,ISNULL(tn.TanevRendOsztalyCsoportId, oo.TanevRendOsztalyCsoportId) AS TanevRendOsztalyCsoportId
        ,ISNULL(tn.MegjelenesOka, oo.MegjelenesOka) AS MegjelenesOka
        ,tanar.C_NYOMTATASINEV AS TanarNev
        ,tanar.C_IDPEGYEDIAZONOSITO AS TanarIdpUniqueId
        ,terem.C_NEV AS TeremNev
        ,ISNULL(tn.TeremId, oo.TeremId) AS TeremId
        ,ISNULL(tn.OraTipus, oo.OraTipus) AS OraTipus
        ,ISNULL(tn.Hianyzas, oo.Hianyzas) AS Hianyzas
        ,ISNULL(tn.Keses, oo.Keses) AS Keses
        ,ISNULL(tn.Ures, oo.Ures) AS Ures
        ,ISNULL(tn.HelyettesitoTanarID, oo.HelyettesitoTanarID) AS HelyettesitoTanarID
        ,helyettes.C_NYOMTATASINEV AS HelyettesitoTanarNev
        ,helyettes.C_IDPEGYEDIAZONOSITO AS HelyettesitoTanarIdpUniqueId
        ,oo.HelyettesitesId AS HelyettesitesId
        ,ISNULL(tn.TanarID, oo.TanarID) AS TanarID
        ,ISNULL(tn.AdminAltalKiirt, oo.AdminAltalKiirt) AS AdminAltalKiirt
        ,ISNULL(tn.GroupId, oo.GroupId) AS GroupId
        ,tn.Tema AS Tema
        ,tn.EvesOraSorszam AS EvesOraSorszam
        ,ISNULL(tn.TantargyId, oo.TantargyId) AS TantargyId
        ,ISNULL(tn.OsztCsopId, oo.OsztCsopId) AS OsztCsopId
        ,csoport.C_OSZTALYBONTASID AS OsztalyBontasId
        ,ISNULL(tn.IsEgyediNap, oo.IsEgyediNap) as IsEgyediNap
        ,terem.C_TOBBORATLEHETTARTANI AS TeremTobbOratLehetTartani
        ,oo.KozpontiOraGroupId
        ,oo.KozpontilagToroltOraGroupId
        ,ISNULL(oo.CREATED, tn.CREATED) CREATED
        ,ISNULL(oo.LASTCHANGED, tn.LASTCHANGED) LASTCHANGED
    FROM (
        -- Órarendi órák + helyettesítések
        SELECT 
             orr.C_ORARENDIORAID AS Id
            ,orr.C_ORARENDIORAID AS ORARENDIID
            ,orr.C_DATUM AS Datum
            ,orr.C_BONTOTT AS Bontott
            ,orr.C_HETIREND AS Hetirend
            ,orr.C_HETNAPJA AS HetNapja
            ,orr.C_HETSORSZAMA AS HetSorszam
            ,orr.C_ORAERVENYESSEGKEZDETE AS ErvenyessegKezdete
            ,orr.C_ORAERVENYESSEGVEGE AS ErvenyessegVege
            ,CAST(orr.C_DATUM AS DATETIME) + CAST(orr.C_ORAKEZDETE AS DATETIME) AS OraKezdet
            ,CAST(orr.C_DATUM AS DATETIME) + CAST(orr.C_ORAVEGE AS DATETIME) AS OraVeg
            ,orr.C_ORAKEZDETE AS OraKezdete
            ,orr.C_ORAVEGE AS OraVege
            ,orr.C_ORASZAM AS Oraszam
            ,orr.C_MAXORASZAM AS MaxOraszam
            ,''F'' AS Megtartott
            ,csro.ID AS CsengetesiRendOraID
            ,csro.C_CSENGETESIRENDID AS CsengetesiRendID
            ,orr.C_OSZTALYCSOPORTID AS TanevRendOsztalyCsoportId
            ,'''' AS MegjelenesOka
            ,orr.C_TEREMID AS TeremId
            ,''OrarendiOra'' AS OraTipus
            ,''F'' AS Hianyzas
            ,''F'' AS Keses
            ,''F'' AS Ures
            ,orr.C_HELYETTESTANAROKID AS HelyettesitoTanarID
            ,orr.C_HELYETTESITESID AS HelyettesitesId
            ,orr.C_TANARID AS TanarID
            ,NULL AS AdminAltalKiirt
            ,orr.C_ORARENDIORAGROUPID AS GroupId
            ,NULL AS Tema
            ,orr.C_TANTARGYID AS TantargyId
            ,orr.C_OSZTALYCSOPORTID AS OsztCsopId
            ,orr.C_EGYEDINAP as IsEgyediNap
            ,orr.C_KOZPONTIORAGROUPID as KozpontiOraGroupId
            ,orr.C_KOZPONTILAGTOROLTORAGROUPID as KozpontilagToroltOraGroupId
            ,orr.CREATED
            ,orr.LASTCHANGED
        FROM T_ORARENDTELJES_OSSZES orr
        LEFT JOIN T_CSENGETESIRENDORA_OSSZES csro ON csro.C_CSENGETESIRENDID = orr.C_CSENGETESIRENDID AND csro.C_ORASZAM = orr.C_ORASZAM AND csro.TOROLT = ''F''
        LEFT JOIN #KapcsolodoCsoportok kocs ON orr.C_OSZTALYCSOPORTID = kocs.Id AND orr.C_DATUM >= kocs.Kezdete AND orr.C_DATUM < kocs.Vege
        WHERE 0 = 0
        AND orr.C_INTEZMENYID = @pIntezmenyId
        AND orr.C_TANEVID =  @pTanevId
        AND orr.C_DATUM >= @pIdoszakKezdete 
        AND orr.C_DATUM < @pIdoszakVege 
        AND ((@pIsNapirend = 1 OR @pIsNapirend IS NULL) OR csro.ID IS NOT NULL)
        AND ((@pIsNapirend = 0 OR @pIsNapirend IS NULL) OR orr.C_CSENGETESIRENDID IS NULL)
        AND ((@pIsNapirend = 0 OR @pIsNapirend = 1) OR ((orr.C_CSENGETESIRENDID IS NOT NULL AND csro.C_CSENGETESIRENDID IS NOT NULL) OR (orr.C_CSENGETESIRENDID IS NULL AND csro.C_CSENGETESIRENDID IS NULL)))
        AND (@pTantargyId IS NULL OR orr.C_TANTARGYID = @pTantargyId)
        AND ((@pOravege IS NULL OR @pOrakezdete IS NULL) OR (orr.C_ORAVEGE > @pOrakezdete AND orr.C_ORAKEZDETE < @pOravege))
        AND (@pHetnapja IS NULL OR orr.C_HETNAPJA = @pHetnapja)
        AND (@pTeremId IS NULL OR orr.C_TEREMID = @pTeremId)
        AND (@pOsztalyCsoportId IS NULL OR kocs.Id IS NOT NULL)
        AND (@pTanuloId IS NULL OR kocs.Id IS NOT NULL)
        AND (@pFeladatKategoriaId IS NULL OR orr.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
        AND ((@pOsztalyCsoportId IS NULL AND @pTanuloId IS NULL) OR orr.C_ISOSZTALYORARENDBENEMLATSZIK = ''F'')
        AND (
            ((@pTanarId IS NULL AND @pIsHelyettesitesNelkul = 1) AND (orr.C_TANARID IS NOT NULL OR orr.C_HELYETTESTANAROKID IS NULL))
            OR
            ((@pTanarId IS NULL AND @pIsHelyettesitesNelkul = 0) AND (orr.C_TANARID IS NOT NULL OR orr.C_HELYETTESTANAROKID IS NOT NULL))
            OR
            ((@pTanarId IS NOT NULL AND @pIsHelyettesitesNelkul = 1) AND orr.C_TANARID = @pTanarId)
            OR
            ((@pTanarId IS NOT NULL AND @pIsHelyettesitesNelkul = 0) AND (orr.C_TANARID = @pTanarId OR orr.C_HELYETTESTANAROKID = @pTanarId))
        )

    ) oo
    FULL JOIN (
        -- Tanítási órák + helyettesítések
        SELECT
             tao.ID AS Id
            ,NULL AS ORARENDIID
            ,CAST(tao.C_DATUM AS DATE) AS Datum
            ,tao.C_BONTOTT AS Bontott
            ,1554 AS Hetirend
            ,tao.C_HETNAPJA AS HetNapja
            ,tao.C_HETSORSZAMA AS HetSorszam
            ,tao.C_ORAKEZDETE AS OraKezdet
            ,tao.C_ORAVEGE AS OraVeg
            ,CAST(tao.C_ORAKEZDETE AS TIME) AS OraKezdete
            ,CAST(tao.C_ORAVEGE AS TIME) AS OraVege
            ,tao.C_ORASZAM AS Oraszam
            ,tao.C_MEGTARTOTT AS Megtartott
            ,tao.C_CSENGETESIRENDORAID AS CsengetesiRendOraID
            ,tao.C_CSENGETESIRENDID AS CsengetesiRendID
            ,tao.C_OSZTALYCSOPORTID AS TanevRendOsztalyCsoportId
            ,'''' AS MegjelenesOka
            ,tao.C_TEREMID as TeremId
            ,''TanitasiOra'' AS OraTipus
            ,IIF(mh.ID IS NULL, ''F'', ''T'') AS Hianyzas
            ,IIF(mk.ID IS NULL, ''F'', ''T'') AS Keses
            ,IIF(mu.ID IS NULL, ''F'', ''T'') AS Ures
            ,tao.C_HELYETTESITOTANARID AS HelyettesitoTanarID
            ,tao.C_TANARID AS TanarID
            ,tao.C_ADMINALTALKIIRT AS AdminAltalKiirt
            ,tao.C_ORARENDIORAGROUPID AS GroupId
            ,tao.C_TEMA AS Tema
            ,tao.C_TANTARGYID AS TantargyId
            ,tao.C_OSZTALYCSOPORTID AS OsztCsopId
            ,tao.C_EGYEDINAP as IsEgyediNap
            ,tao.C_ORAEVESSORSZAMA AS EvesOraSorszam
            ,tao.CREATED
            ,tao.LASTCHANGED
        FROM T_TANITASIORA_OSSZES tao
        INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tao.C_OSZTALYCSOPORTID AND ocs.TOROLT = ''F'' AND ocs.C_INTEZMENYID = @pIntezmenyId AND ocs.C_TANEVID = @pTanevId
        INNER JOIN T_TANTARGY_OSSZES tt ON tao.C_TANTARGYID = tt.ID AND tt.C_INTEZMENYID = @pIntezmenyId AND tt.C_TANEVID = @pTanevId
        LEFT JOIN #KapcsolodoCsoportok kocs ON tao.C_OSZTALYCSOPORTID = kocs.Id AND tao.C_DATUM >= kocs.Kezdete AND tao.C_DATUM < kocs.Vege
        LEFT JOIN T_TANULOMULASZTAS_OSSZES mh ON mh.C_TANITASIORAKID = tao.ID AND mh.C_ORATANULOIID = @pTanuloId AND mh.C_TIPUS = 1500 AND mh.TOROLT = ''F''
        LEFT JOIN T_TANULOMULASZTAS_OSSZES mk ON mk.C_TANITASIORAKID = tao.ID AND mk.C_ORATANULOIID = @pTanuloId AND mk.C_TIPUS = 1499 AND mk.TOROLT = ''F''
        LEFT JOIN T_TANULOMULASZTAS_OSSZES mu ON mu.C_TANITASIORAKID = tao.ID AND mu.C_ORATANULOIID = @pTanuloId AND mu.C_TIPUS = 1817 AND mu.TOROLT = ''F''
        WHERE 0 = 0
        AND (@pCsakOrarendiOrak = 0)
        AND tao.TOROLT = ''F''
        AND tao.C_INTEZMENYID = @pIntezmenyId
        AND tao.C_TANEVID = @pTanevId
        AND tao.C_DATUM >= @pIdoszakKezdete 
        AND tao.C_DATUM < @pIdoszakVege
        AND (@pOsztalyCsoportId IS NULL OR kocs.Id IS NOT NULL)
        AND (@pTanuloId IS NULL OR kocs.Id IS NOT NULL)
        AND ((@pIsNapirend = 0 OR @pIsNapirend IS NULL) OR tao.C_CSENGETESIRENDID IS NULL)
        AND ((@pIsNapirend = 1 OR @pIsNapirend IS NULL) OR tao.C_CSENGETESIRENDID IS NOT NULL)
        AND ((@pTanarId IS NULL OR @pIsHelyettesitesNelkul = 1) OR (tao.C_TANARID = @pTanarId OR tao.C_HELYETTESITOTANARID = @pTanarId))
        AND ((@pTanarId IS NULL OR @pIsHelyettesitesNelkul = 0) OR (tao.C_TANARID = @pTanarId))
        AND (@pTantargyId IS NULL OR tao.C_TANTARGYID = @pTantargyId)
        AND ((@pOravege IS NULL OR @pOrakezdete IS NULL) OR (CAST(tao.C_ORAVEGE AS TIME) > @pOrakezdete AND CAST(tao.C_ORAKEZDETE AS TIME) < @pOravege))
        AND (@pHetnapja IS NULL OR tao.C_HETNAPJA = @pHetnapja)
        AND (@pTeremId IS NULL OR tao.C_TEREMID = @pTeremId)
        AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
        AND (@pTanuloId IS NULL OR ((mu.C_TIPUS <> 1817 OR mu.C_TIPUS IS NULL) OR (tt.C_ISOSZTALYORARENDBENEMLATSZIK = ''F'')))

    ) tn ON  0 = 0
         AND tn.Datum = oo.Datum
         AND tn.HetNapja = oo.HetNapja
         AND ((@pIsNapirend IS NULL OR @pIsNapirend = 0) OR (tn.OraKezdete = oo.OraKezdete AND tn.OraVege = oo.OraVege))
         AND ((@pIsNapirend IS NULL OR @pIsNapirend = 1) OR (tn.Oraszam = oo.Oraszam))
         AND (@pIsNapirend IS NOT NULL OR ((tn.CsengetesiRendID IS NULL AND tn.OraKezdete = oo.OraKezdete AND tn.OraVege = oo.OraVege) OR (tn.CsengetesiRendID IS NOT NULL AND tn.Oraszam = oo.Oraszam)))
         AND tn.TanevRendOsztalyCsoportId = oo.TanevRendOsztalyCsoportId
         AND tn.TantargyId = oo.TantargyId
         AND tn.TanarID = oo.TanarID

    LEFT JOIN T_TANTARGY_OSSZES tantargy ON tantargy.ID = ISNULL(tn.TantargyId, oo.TantargyId) AND (@pOsztalyCsoportId IS NULL OR tantargy.C_ISOSZTALYORARENDBENEMLATSZIK = ''F'') AND tantargy.C_INTEZMENYID = @pIntezmenyId AND tantargy.C_TANEVID = @pTanevId
    LEFT JOIN T_FELHASZNALO_OSSZES tanar ON tanar.ID = ISNULL(tn.TanarID, oo.TanarID) AND tanar.C_INTEZMENYID = @pIntezmenyId AND tanar.C_TANEVID = @pTanevId
    LEFT JOIN T_TEREM_OSSZES terem ON terem.ID = ISNULL(tn.TeremId, oo.TeremId) AND terem.C_INTEZMENYID = @pIntezmenyId AND terem.C_TANEVID = @pTanevId
    LEFT JOIN T_CSOPORT_OSSZES csoport ON csoport.ID = ISNULL(tn.OsztCsopId, oo.OsztCsopId) AND csoport.C_ALINTEZMENYID = @pIntezmenyId AND csoport.C_ALTANEVID = @pTanevId
    LEFT JOIN T_FELHASZNALO_OSSZES helyettes ON helyettes.ID = ISNULL(tn.HelyettesitoTanarID, oo.HelyettesitoTanarID) AND helyettes.C_INTEZMENYID = @pIntezmenyId AND helyettes.C_TANEVID = @pTanevId
    LEFT JOIN T_OSZTALYCSOPORT_OSSZES osztaly ON osztaly.ID = ISNULL(tn.OsztCsopId, oo.OsztCsopId) AND (@pFeladatKategoriaId IS NULL OR osztaly.C_FELADATKATEGORIAID = @pFeladatKategoriaId) AND osztaly.C_INTEZMENYID = @pIntezmenyId AND osztaly.C_TANEVID = @pTanevId
) main
OPTION (OPTIMIZE FOR UNKNOWN)
';

EXEC sp_executesql 
    @stmt = @SQL
   ,@params = N'
    @pIntezmenyId int
   ,@pTanevId int
   ,@pIdoszakKezdete date
   ,@pIdoszakVege date
   ,@pTanarId int
   ,@pIsHelyettesitesNelkul bit
   ,@pOsztalyCsoportId int
   ,@pTanuloId int
   ,@pTantargyId int
   ,@pTeremId int
   ,@pCsakOrarendiOrak bit
   ,@pIsNapirend bit
   ,@pFeladatKategoriaId int
   ,@pOrakezdete time
   ,@pOravege time
   ,@pHetnapja int
   ,@pIsKozpontilagToroltOrak int'
   ,@pIntezmenyId = @pIntezmenyId
   ,@pTanevId = @pTanevId
   ,@pIdoszakKezdete = @pIdoszakKezdete
   ,@pIdoszakVege = @pIdoszakVege
   ,@pTanarId = @pTanarId 
   ,@pIsHelyettesitesNelkul = @pIsHelyettesitesNelkul
   ,@pOsztalyCsoportId = @pOsztalyCsoportId
   ,@pTanuloId = @pTanuloId
   ,@pTantargyId = @pTantargyId
   ,@pTeremId = @pTeremId
   ,@pCsakOrarendiOrak = @pCsakOrarendiOrak
   ,@pIsNapirend = @pIsNapirend
   ,@pFeladatKategoriaId = @pFeladatKategoriaId
   ,@pOrakezdete = @pOrakezdete
   ,@pOravege = @pOravege
   ,@pHetnapja = @pHetnapja
   ,@pIsKozpontilagToroltOrak = @pIsKozpontilagToroltOrak
GO