kreta/Kreta.DataAccess.Migrations/DBScripts/Database/dbo/Stored procedures/sp_GetOrarendOsztalyonkent.sql
2024-03-13 00:33:46 +01:00

260 lines
No EOL
9.9 KiB
Transact-SQL

DROP PROCEDURE IF EXISTS sp_GetOrarendOsztalyonkent
GO
CREATE PROCEDURE sp_GetOrarendOsztalyonkent
@intezmenyId INT,
@tanevId INT,
@osztalyId INT,
@aktivTanevId INT,
@isEgyebFoglalkozasok BIT,
@orarendErvenyessegiDatum DATE,
@isOsztalyTanuloOrarendbenNemLatszik BIT = null
AS
BEGIN
SET NOCOUNT ON;
DECLARE @UtolsoNap DATE = (SELECT TOP 1 C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_NAPTIPUSA = 1395 AND C_TANEVID = @tanevId AND TOROLT = 'F')
,@ElsoNap DATE = (SELECT TOP 1 C_KEZDONAP FROM T_TANEV_OSSZES WHERE ID = @tanevId AND TOROLT = 'F')
,@VizsgaltNap DATE
,@isVegzos VARCHAR(1) = (SELECT TOP 1 C_VEGZOSEVFOLYAM FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @osztalyId)
,@VegzosUtolsoNap DATE = (SELECT TOP 1 C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_TANEVID = @tanevId AND C_NAPTIPUSA = 1402 AND TOROLT = 'F')
,@osztalyNev NVARCHAR(MAX) = (SELECT C_NEV FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @osztalyId)
SET @UtolsoNap = (SELECT IIF(@isVegzos = 'T', @VegzosUtolsoNap, @UtolsoNap))
IF (@tanevId = @aktivTanevId AND @orarendErvenyessegiDatum <= @UtolsoNap)
BEGIN
IF (@orarendErvenyessegiDatum <= @ElsoNap)
BEGIN
SET @VizsgaltNap = (SELECT TOP 1 C_HETKEZDONAPJA FROM T_NAPTARIHET_OSSZES WHERE C_HETSORSZAMA = 1 AND TOROLT = 'F' AND C_TANEVID = @tanevId)
END
ELSE
BEGIN
SET @VizsgaltNap = CONVERT(DATE, @orarendErvenyessegiDatum)
END
END
ELSE
BEGIN
SET @VizsgaltNap = @UtolsoNap
END
SELECT
C_ORASZAM OraSzam
,CONVERT(VARCHAR(5), C_KEZDETE, 108) Kezdete
,CONVERT(VARCHAR(5), C_VEGE, 108) Vege
INTO #CsengetesiRendAdatok
FROM T_CSENGETESIRENDORA_OSSZES CsengetesiRendOra
INNER JOIN T_CSENGETESIREND_OSSZES CsengetesiRend ON CsengetesiRend.Id = CsengetesiRendOra.C_CSENGETESIRENDID
WHERE
CsengetesiRendOra.C_TANEVID = @tanevId
AND CsengetesiRendOra.TOROLT = 'F'
AND CsengetesiRend.TOROLT = 'F'
AND CsengetesiRend.C_AKTIV = 'T'
DECLARE @MinCsengetesiRendOraKezdet NVARCHAR(10) = (SELECT MIN(Kezdete) FROM #CsengetesiRendAdatok)
DECLARE @MinCsengetesiRendOraszam INT = (SELECT MIN(OraSzam) FROM #CsengetesiRendAdatok)
SELECT
OrarendiOra.C_HETIREND HetirendId
,OrarendiOra.C_HETNAPJA HetnapjaId
,CsengetesiRendOra.C_ORASZAM OraSzam
,CONVERT(VARCHAR(5), OrarendiOra.C_ORAKEZDETE, 108) Kezdete
,CONVERT(VARCHAR(5), OrarendiOra.C_ORAVEGE, 108) Vege
,ISNULL(Tantargy.C_NEVNYOMTATVANYBAN, Tantargy.C_NEV) TantargyNev
,Pedagogus.C_NYOMTATASINEV PedagogusNev
,Terem.C_NEV TeremNev
,ocs.C_NEV OsztalyCsoportNev
INTO #OrarendiOrak
FROM T_ORARENDIORA_OSSZES OrarendiOra
INNER JOIN fnGetKapcsolodoOsztalycsoportokByDate(@osztalyId, @VizsgaltNap, @VizsgaltNap) Kapcsolodo ON Kapcsolodo.Id = OrarendiOra.C_OSZTALYCSOPORTID
INNER JOIN T_TANTARGY_OSSZES Tantargy ON Tantargy.Id = OrarendiOra.C_TANTARGYID
INNER JOIN T_FELHASZNALO_OSSZES Pedagogus ON Pedagogus.Id = OrarendiOra.C_TANARID
INNER JOIN T_TEREM_OSSZES Terem ON Terem.Id = OrarendiOra.C_TEREMID
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = OrarendiOra.C_OSZTALYCSOPORTID
LEFT JOIN T_CSENGETESIRENDORA_OSSZES CsengetesiRendOra ON CsengetesiRendOra.Id = OrarendiOra.C_CSENGETESIRENDORAID
LEFT JOIN T_CSOPORT_OSSZES Csoport ON Csoport.Id = Kapcsolodo.Id
WHERE
OrarendiOra.Torolt = 'F'
AND @VizsgaltNap BETWEEN OrarendiOra.C_ORAERVENYESSEGKEZDETE AND OrarendiOra.C_ORAERVENYESSEGVEGE
AND (@isEgyebFoglalkozasok = 1 OR (Csoport.C_TIPUSA IN (SELECT ID FROM fnGetTanoraiCeluCsoportTipusok(@tanevId)) OR Csoport.C_TIPUSA IS NULL))
AND (@isOsztalyTanuloOrarendbenNemLatszik <> 1 OR @isOsztalyTanuloOrarendbenNemLatszik IS NULL OR Tantargy.C_ISOSZTALYORARENDBENEMLATSZIK = 'F')
SELECT
OraSzam
,HetirendId
,HetnapjaId
,OsztalyCsoportNev
,PedagogusNev
,TantargyNev
,TeremNev
,Kezdete
,Vege
INTO #OrarendTEMP
FROM
(
SELECT
MAX(CsengetesiRendAdatok.OraSzam) OraSzam
,OrarendiOrak.HetirendId HetirendId
,OrarendiOrak.HetnapjaId HetnapjaId
,OrarendiOrak.OsztalyCsoportNev OsztalyCsoportNev
,OrarendiOrak.PedagogusNev PedagogusNev
,OrarendiOrak.TantargyNev TantargyNev
,OrarendiOrak.TeremNev TeremNev
,OrarendiOrak.Kezdete Kezdete
,OrarendiOrak.Vege Vege
FROM #CsengetesiRendAdatok CsengetesiRendAdatok
LEFT JOIN #OrarendiOrak OrarendiOrak ON OrarendiOrak.Kezdete >= CsengetesiRendAdatok.Kezdete
WHERE
OrarendiOrak.OraSzam IS NULL
GROUP BY
OrarendiOrak.HetirendId
,OrarendiOrak.HetnapjaId
,OrarendiOrak.OsztalyCsoportNev
,OrarendiOrak.PedagogusNev
,OrarendiOrak.TantargyNev
,OrarendiOrak.TeremNev
,OrarendiOrak.Kezdete
,OrarendiOrak.Vege
UNION
SELECT
MAX(CsengetesiRendAdatok.OraSzam) OraSzam
,OrarendiOrak.HetirendId HetirendId
,OrarendiOrak.HetnapjaId HetnapjaId
,OrarendiOrak.OsztalyCsoportNev OsztalyCsoportNev
,OrarendiOrak.PedagogusNev PedagogusNev
,OrarendiOrak.TantargyNev TantargyNev
,OrarendiOrak.TeremNev TeremNev
,OrarendiOrak.Kezdete Kezdete
,OrarendiOrak.Vege Vege
FROM #CsengetesiRendAdatok CsengetesiRendAdatok
LEFT JOIN #OrarendiOrak OrarendiOrak ON OrarendiOrak.OraSzam = CsengetesiRendAdatok.OraSzam
WHERE
OrarendiOrak.OraSzam IS NOT NULL
GROUP BY
OrarendiOrak.HetirendId
,OrarendiOrak.HetnapjaId
,OrarendiOrak.OsztalyCsoportNev
,OrarendiOrak.PedagogusNev
,OrarendiOrak.TantargyNev
,OrarendiOrak.TeremNev
,OrarendiOrak.Kezdete
,OrarendiOrak.Vege
)OrarendioraOraszammal
INSERT INTO #OrarendTEMP
SELECT
@MinCsengetesiRendOraszam
,OrarendiOrak.HetirendId HetirendId
,OrarendiOrak.HetnapjaId HetnapjaId
,OrarendiOrak.OsztalyCsoportNev OsztalyCsoportNev
,OrarendiOrak.PedagogusNev PedagogusNev
,OrarendiOrak.TantargyNev TantargyNev
,OrarendiOrak.TeremNev TeremNev
,OrarendiOrak.Kezdete Kezdete
,OrarendiOrak.Vege Vege
FROM #orarendiorak OrarendiOrak
WHERE
Kezdete < @MinCsengetesiRendOraKezdet
SELECT
Orarend.OraSzam
,HetirendId
,HetnapjaId
,OsztalyCsoportNev
,PedagogusNev
,TantargyNev
,TeremNev
,IIF(Orarend.Kezdete != CsengetesiRendAdatok.Kezdete OR Orarend.Vege != CsengetesiRendAdatok.Vege, Orarend.Kezdete + ' - ' + Orarend.Vege, '') KezdesVegeIdopont
INTO #Orarend
FROM #OrarendTEMP Orarend
INNER JOIN #CsengetesiRendAdatok CsengetesiRendAdatok on CsengetesiRendAdatok.Oraszam = Orarend.OraSzam
DECLARE @Hetirendek TABLE (Id INT)
DECLARE @HetirendCount INT = (SELECT COUNT(DISTINCT oo.C_HETIREND) FROM T_ORARENDIORA_OSSZES oo WHERE oo.TOROLT='F' AND oo.C_TANEVID=@tanevId)
IF (@HetirendCount=1)
BEGIN
INSERT INTO @Hetirendek
SELECT DISTINCT oo.c_hetirend FROM T_ORARENDIORA_OSSZES oo WHERE oo.TOROLT='F' AND oo.C_TANEVID = @tanevId
END
ELSE
BEGIN
INSERT INTO @Hetirendek
SELECT DISTINCT oo.C_HETIREND from T_ORARENDIORA_OSSZES oo WHERE oo.TOROLT='F' AND oo.C_TANEVID=@tanevId AND oo.C_HETIREND <> 1554
END
DECLARE @Orakezdetek TABLE (Ora INT)
INSERT INTO @orakezdetek
SELECT DISTINCT OraSzam from #CsengetesiRendAdatok
DECLARE @OsszesOra TABLE (Hetirend INT, Nap INT, Oraszam nvarchar(20))
INSERT INTO @OsszesOra
SELECT DISTINCT oo.Id, Nap , OraSzam FROM @Hetirendek oo
CROSS JOIN (SELECT Ora FROM @Orakezdetek) OraSzam (OraSzam)
CROSS JOIN (VALUES (1408),(1409),(1410),(1411),(1412), (1413),(1414)) Nap (Nap)
DECLARE @TenylegesOra TABLE (Hetirend INT, Nap INT, OraSzam NVARCHAR(20), Foglalkozas NVARCHAR(MAX))
DECLARE @Orarend TABLE (osztalyId INT, Ora int, Hetirend INT, Nap INT, Foglalkozas NVARCHAR(MAX))
DECLARE kur CURSOR FOR
SELECT Id FROM @Hetirendek
DECLARE @HetirendId int
OPEN kur
FETCH NEXT FROM kur INTO @HetirendId
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @TenylegesOra
SELECT DISTINCT
@HetirendId
,veg.HetnapjaId
,veg.Oraszam
,STUFF((SELECT DISTINCT
CAST('<b>' + bveg.TantargyNev + '</b>' + CHAR(13) + CHAR(10)
+ IIF(LEN(KezdesVegeIdopont) > 0, ' (' + KezdesVegeIdopont +')' + CHAR(13) + CHAR(10), '')
+ IIF(bveg.OsztalyCsoportNev <> @osztalyNev, bveg.OsztalyCsoportNev + CHAR(13) + CHAR(10), '')
+ bveg.PedagogusNev + CHAR(13) + CHAR(10)
+ bveg.TeremNev + CHAR(13) + CHAR(10) AS VARCHAR(max))
FROM #Orarend bveg
WHERE bveg.HetnapjaId = veg.HetnapjaId
AND bveg.Oraszam = veg.Oraszam
AND (bveg.HetirendId = @HetirendId OR bveg.HetirendId = 1554)
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)'),1,0,'') Foglalkozasok
FROM #Orarend veg
FETCH NEXT FROM kur INTO @HetirendId
END
CLOSE kur
DEALLOCATE kur
/*Végleges órarend*/
INSERT INTO @Orarend
SELECT @osztalyId
, OsszesOra.Oraszam
, OsszesOra.Hetirend
, OsszesOra.Nap
, TenylegesOra.Foglalkozas
FROM @OsszesOra OsszesOra
LEFT JOIN @TenylegesOra TenylegesOra ON OsszesOra.Hetirend = TenylegesOra.Hetirend AND OsszesOra.Nap = TenylegesOra.Nap AND OsszesOra.Oraszam = TenylegesOra.Oraszam
ORDER BY OsszesOra.Hetirend, OsszesOra.Nap, OsszesOra.Oraszam
SELECT
pv.*
, dic.C_NAME HETIREND_DNAME
,@osztalyNev OsztalyNev
FROM @Orarend
PIVOT (MAX(Foglalkozas) FOR Nap IN ([1408],[1409],[1410],[1411],[1412],[1413],[1414]))pv
INNER JOIN T_DICTIONARYITEMBASE_OSSZES dic ON dic.id=Hetirend AND dic.C_TANEVID = @tanevId
INNER JOIN @Orakezdetek ok ON ok.Ora = pv.Ora
ORDER BY Ora
END
DROP TABLE #CsengetesiRendAdatok
DROP TABLE #Orarend
DROP TABLE #OrarendiOrak
GO