kreta/Kreta.DataAccess.Migrations/Scripts/Archive/20180213113421_HELP_28045/fnGetTanorak.sql
2024-03-13 00:33:46 +01:00

330 lines
No EOL
15 KiB
Transact-SQL

IF OBJECT_ID('dbo.fnGetTanorak') IS NOT NULL BEGIN
DROP FUNCTION dbo.fnGetTanorak
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- A Funkció visszaadja egy pedagógus, egy osztály vagy csoport, egy tantárgy vagy egy terem minden
-- naplózatlan, naplózott, megtartott és nem-megtartott, helyettesített, vagy akármilyen óráját
-- egy megadott időszakra
CREATE FUNCTION dbo.fnGetTanorak
(
@tanevId INT, -- Kötelezően átadandó
@kezdoDatum DATETIME = NULL, -- NULL esetén az adott tanév első napjától vizsgálja
@vegDatum DATETIME = NULL, -- NULL esetén az adott tanév utolsó napjáig vizsgálja
@tanarId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek
@tantargyId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek
@teremId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek
@osztalycsoportId INT = NULL, -- NULL esetén minden osztály vagy csoport órái lejönnek
@isKapcsolodoCsoportok BIT = 0 -- 1 esetén az osztály vagy csoport kapcsolódó osztályait is csoportojait is lehozza,
-- csak akkor értelmezhető, ha van @osztalycsoportId is.
)
RETURNS @retTable TABLE (
OraDatuma DATETIME,
OraKezdete DATETIME,
OraVege DATETIME,
HetNapjaId INT,
CsengetesiRendId INT,
CsengetesiRendOraId INT,
Oraszam INT,
OraTulajdonosId INT,
TanarId INT,
HelyettesitoId INT,
OsztalyCsoportId INT,
TantargyId INT,
TeremId INT,
IsHelyettesitett CHAR,
IsNaplozott CHAR,
IsMobilNaplozott CHAR,
IsElmaradt CHAR,
IsOrarendNelkul CHAR,
OrarendiOraId INT,
TanitasiOraId INT
)
BEGIN
-- ------------------------------------------------------------------------------------------------------------------
-- Segédtáblák definiálása
-- ------------------------------------------------------------------------------------------------------------------
DECLARE @Naptar TABLE
(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR)
DECLARE @OsztalyCsoportNaptar TABLE
(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR, OsztalycsoportId INT)
DECLARE @KapcsolodoOsztalyCsoportok TABLE
(OsztalyCsoportId INT PRIMARY KEY)
-- ------------------------------------------------------------------------------------------------------------------
-- Minden hét hetirend ID-jának beállítása
-- ------------------------------------------------------------------------------------------------------------------
DECLARE @MindenHetHetirend INT = 1554
-- ------------------------------------------------------------------------------------------------------------------
-- Aktív csengetési rend megkeresése
-- ------------------------------------------------------------------------------------------------------------------
DECLARE @AktivCsengetesiRendId INT
SELECT TOP 1
@AktivCsengetesiRendId = ID
FROM T_CSENGETESIREND_OSSZES
WHERE C_TANEVID = @tanevId
AND TOROLT = 'F'
AND C_AKTIV = 'T'
-- ------------------------------------------------------------------------------------------------------------------
-- Kezdődátum megkeresése, ha NULL
-- ------------------------------------------------------------------------------------------------------------------
IF (@kezdoDatum IS NULL)
BEGIN
SELECT @kezdoDatum = C_KEZDONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId
END
-- ------------------------------------------------------------------------------------------------------------------
-- Végdátum megkeresése, ha NULL
-- ------------------------------------------------------------------------------------------------------------------
IF (@vegDatum IS NULL)
BEGIN
SELECT @vegDatum = C_UTOLSONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId
END
-- ------------------------------------------------------------------------------------------------------------------
-- Kapcsolódó osztályok és csoportok megkeresése, ha szükséges
-- ------------------------------------------------------------------------------------------------------------------
IF (@osztalycsoportId IS NOT NULL)
BEGIN
IF (@isKapcsolodoCsoportok = 1)
BEGIN
INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId)
SELECT DISTINCT ID FROM dbo.fnGetKapcsolodoOsztalycsoportokByDate(@osztalycsoportId,@kezdoDatum,@vegDatum)
END
IF (@isKapcsolodoCsoportok = 0)
BEGIN
INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId)
VALUES (@osztalycsoportId)
END
END
-- ------------------------------------------------------------------------------------------------------------------
-- Az alapértelmezett naptári napok betétele a segédtáblába
-- ------------------------------------------------------------------------------------------------------------------
INSERT INTO @Naptar
(Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap)
SELECT
nn.C_NAPDATUMA,
ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend),
ISNULL(tr.C_HETNAPJA,nn.C_HETNAPJA),
ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId),
IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),'F','T'),
IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T','T','F')
FROM T_NAPTARINAP_OSSZES nn
LEFT JOIN T_TANEVRENDJE_OSSZES tr
ON tr.C_DATUM = nn.C_NAPDATUMA
AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'T'
AND tr.C_TANEVID = nn.C_TANEVID
AND tr.TOROLT = 'F'
WHERE nn.C_NAPDATUMA >= @kezdoDatum
AND nn.C_NAPDATUMA <= @vegDatum
AND nn.C_TANEVID = @tanevId
AND nn.TOROLT = 'F'
-- ------------------------------------------------------------------------------------------------------------------
-- Az OsztályCsoport-ok esetén érvényes naptári napok betétele a segédtáblába
-- ------------------------------------------------------------------------------------------------------------------
INSERT INTO @OsztalyCsoportNaptar
(Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap, OsztalycsoportId)
SELECT
nn.C_NAPDATUMA,
ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend),
ISNULL(tr.C_HETNAPJA,nn.C_HETNAPJA),
ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId),
IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),'F','T'),
IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T','T','F'),
ocstr.C_OSZTALYCSOPORTID
FROM T_NAPTARINAP_OSSZES nn
INNER JOIN T_TANEVRENDJE_OSSZES tr
ON tr.C_DATUM = nn.C_NAPDATUMA
AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'F'
AND tr.C_TANEVID = nn.C_TANEVID
AND tr.TOROLT = 'F'
INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr
ON ocstr.C_TANEVRENDJEID = tr.ID
WHERE nn.C_NAPDATUMA >= @kezdoDatum
AND nn.C_NAPDATUMA <= @vegDatum
AND nn.C_TANEVID = @tanevId
AND nn.TOROLT = 'F'
-- ------------------------------------------------------------------------------------------------------------------
-- Alapértelmezett órarend összeállítása, az egyedi OsztályCsoportok naptára nélkül
-- ------------------------------------------------------------------------------------------------------------------
INSERT INTO @retTable (
OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam,
OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId,
IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
SELECT
-- Időpont adatok
n.Datum AS OraDatuma,
oo.C_ORAKEZDETE AS OraKezdete,
oo.C_ORAVEGE AS OraVege,
n.HetNapjaId AS HetNapjaId,
oo.C_CSENGETESIRENDID AS CsengetesiRendId,
oo.C_CSENGETESIRENDORAID AS CsengetesiRendOraId,
oo.C_ORASZAM AS Oraszam,
-- Kapcsolati adatok
oo.C_ORATULAJDONOSID AS OraTulajdonosId,
oo.C_TANARID AS TanarId,
hi.C_HELYETTESTANAROKID AS HelyettesitoId,
oo.C_OSZTALYCSOPORTID AS OsztalyCsoportId,
oo.C_TANTARGYID AS TantargyId,
oo.C_TEREMID AS TeremId,
-- Egyéb adatok
IIF(hi.ID IS NULL,'F','T') AS IsHelyettesitett,
'F' AS IsNaplozott,
'F' AS IsMobilNaplozott,
'F' AS IsElmaradt,
'F' AS IsOrarendNelkul,
oo.ID AS OrarendiOraId,
NULL AS TanitasiOraId
FROM T_ORARENDIORA_OSSZES oo
INNER JOIN @Naptar n
ON n.HetNapjaId = oo.C_HETNAPJA
AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND)
AND n.Datum >= oo.C_ORAERVENYESSEGKEZDETE
AND n.Datum <= oo.C_ORAERVENYESSEGVEGE
AND n.IsTanitasiNap = 'T'
AND n.IsOrarendiNap = 'T'
LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi
ON hi.C_HELYETTESITESNAPJA = n.Datum
AND hi.C_HELYETTESITETTORARENDID = oo.ID
AND hi.C_TANEVID = @tanevid
AND hi.TOROLT = 'F'
WHERE oo.C_TANEVID = @tanevid
AND oo.TOROLT = 'F'
AND oo.C_OSZTALYCSOPORTID NOT IN (SELECT OsztalycsoportId FROM @OsztalyCsoportNaptar ocsn WHERE ocsn.Datum = n.Datum)
AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId)
AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId)
-- ------------------------------------------------------------------------------------------------------------------
-- Órarend kiegészítése az egyedi osztályok és csoportok órarendjével
-- ------------------------------------------------------------------------------------------------------------------
INSERT INTO @retTable (
OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam,
OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId,
IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
SELECT
-- Időpont adatok
n.Datum AS OraDatuma,
oo.C_ORAKEZDETE AS OraKezdete,
oo.C_ORAVEGE AS OraVege,
n.HetNapjaId AS HetNapjaId,
oo.C_CSENGETESIRENDID AS CsengetesiRendId,
oo.C_CSENGETESIRENDORAID AS CsengetesiRendOraId,
oo.C_ORASZAM AS Oraszam,
-- Kapcsolati adatok
oo.C_ORATULAJDONOSID AS OraTulajdonosId,
oo.C_TANARID AS TanarId,
hi.C_HELYETTESTANAROKID AS HelyettesitoId,
oo.C_OSZTALYCSOPORTID AS OsztalyCsoportId,
oo.C_TANTARGYID AS TantargyId,
oo.C_TEREMID AS TeremId,
-- Egyéb adatok
IIF(hi.ID IS NULL,'F','T') AS IsHelyettesitett,
'F' AS IsNaplozott,
'F' AS IsMobilNaplozott,
'F' AS IsElmaradt,
'F' AS IsOrarendNelkul,
oo.ID AS OrarendiOraId,
NULL AS TanitasiOraId
FROM T_ORARENDIORA_OSSZES oo
INNER JOIN @OsztalyCsoportNaptar n
ON n.HetNapjaId = oo.C_HETNAPJA
AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND)
AND n.Datum >= oo.C_ORAERVENYESSEGKEZDETE
AND n.Datum <= oo.C_ORAERVENYESSEGVEGE
AND n.OsztalyCsoportId = oo.C_OSZTALYCSOPORTID
AND n.IsTanitasiNap = 'T'
AND n.IsOrarendiNap = 'T'
LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi
ON hi.C_HELYETTESITESNAPJA = n.Datum
AND hi.C_HELYETTESITETTORARENDID = oo.ID
AND hi.C_TANEVID = @tanevid
AND hi.TOROLT = 'F'
WHERE oo.C_TANEVID = @tanevid
AND oo.TOROLT = 'F'
AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId)
AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId)
-- ------------------------------------------------------------------------------------------------------------------
-- Tanítási órák betétele, amikhez nem tartozik órarendi óra
-- ------------------------------------------------------------------------------------------------------------------
INSERT INTO @retTable (
OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam,
OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId,
IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId)
SELECT
-- Időpont adatok
tno.C_DATUM AS OraDatuma,
tno.C_ORAKEZDETE AS OraKezdete,
tno.C_ORAVEGE AS OraVege,
tno.C_HETNAPJA AS HetNapjaId,
tno.C_CSENGETESIRENDID AS CsengetesiRendId,
tno.C_CSENGETESIRENDORAID AS CsengetesiRendOraId,
tno.C_ORASZAM AS Oraszam,
-- Kapcsolati adatok
tno.C_ORATULAJDONOSID AS OraTulajdonosId,
tno.C_TANARID AS TanarId,
tno.C_HELYETTESITOTANARID AS HelyettesitoId,
tno.C_OSZTALYCSOPORTID AS OsztalyCsoportId,
tno.C_TANTARGYID AS TantargyId,
tno.C_TEREMID AS TeremId,
-- Egyéb adatok
IIF(tno.C_HELYETTESITOTANARID IS NULL,'F','T') AS IsHelyettesitett,
'T' AS IsNaplozott,
IIF(tno.C_MOBILNAPLOZOTT = 'T','T','F') AS IsMobilNaplozott,
IIF(tno.C_MEGTARTOTT = 'F','T','F') AS IsElmaradt,
'T' AS IsOrarendNelkul,
NULL AS OrarendiOraId,
tno.ID AS TanitasiOraId
FROM T_TANITASIORA_OSSZES tno
WHERE tno.C_TANEVID = @tanevid
AND tno.TOROLT = 'F'
AND (@osztalycsoportId IS NULL OR (tno.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok)))
AND (@tantargyId IS NULL OR tno.C_TANTARGYID = @tantargyId)
AND (@tanarId IS NULL OR tno.C_HELYETTESITOTANARID = @tanarId OR tno.C_TANARID = @tanarId)
AND 0 = (
SELECT COUNT(1) FROM @retTable r
WHERE tno.C_DATUM = r.OraDatuma
AND tno.C_ORASZAM = r.Oraszam
AND tno.C_ORAKEZDETE = r.OraKezdete
AND tno.C_ORAVEGE = r.OraVege
AND tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId
AND tno.C_TANTARGYID = r.TantargyId
AND tno.C_TANARID = r.TanarId
)
-- ------------------------------------------------------------------------------------------------------------------
-- Naplózott órák betétele, ha volt nekik órarendi órájuk
-- ------------------------------------------------------------------------------------------------------------------
UPDATE r
SET r.IsNaplozott = 'T',
r.IsElmaradt = IIF(tno.C_MEGTARTOTT = 'F','T','F'),
r.TeremId = tno.C_TEREMID,
r.TanitasiOraId = tno.Id,
r.IsHelyettesitett = IIF(tno.C_HELYETTESITOTANARID IS NULL,'F','T'),
r.HelyettesitoId = tno.C_HELYETTESITOTANARID
FROM @retTable r
INNER JOIN T_TANITASIORA_OSSZES tno
ON tno.C_DATUM = r.OraDatuma
AND tno.C_ORASZAM = r.Oraszam
AND tno.C_ORAKEZDETE = r.OraKezdete
AND tno.C_ORAVEGE = r.OraVege
AND tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId
AND tno.C_TANTARGYID = r.TantargyId
AND tno.C_TANARID = r.TanarId
AND tno.C_TANEVID = @tanevid
AND tno.TOROLT = 'F'
RETURN
END
GO