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

98 lines
No EOL
4.3 KiB
Transact-SQL

DROP PROCEDURE IF EXISTS uspOrarendekTorlese
GO
CREATE PROCEDURE uspOrarendekTorlese
@pTanevId int
,@pUserId int
,@pIntervallumKezdete datetime
,@pIntervallumVege datetime
,@pNezetTipus int
,@pFeladatellatasiHelyJson nvarchar(max) = NULL
,@pOsztalyJson nvarchar(max) = NULL
,@pCsoportJson nvarchar(max) = NULL
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #OrarendiOrak (Id int, ErvenyessegKezdete datetime, ErvenyessegVege datetime, Oraszam int)
INSERT INTO #OrarendiOrak
EXEC uspGetOrarendiOrakForOrarendekTorlese @pTanevId, @pIntervallumKezdete, @pIntervallumVege, @pNezetTipus, @pFeladatellatasiHelyJson, @pOsztalyJson, @pCsoportJson
-- Jelmagyarázat:
-- D1: Intervallum kezdete
-- D2: Intervallum vége
-- ÉK: Órarend érvényességének kezdete
-- ÉV: Órarend érvényességének vége
UPDATE oo
SET
oo.C_ORAERVENYESSEGKEZDETE = CASE
-- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani
WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN updateOrak.ErvenyessegKezdete
-- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani
WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN DATEADD(day, 1, @pIntervallumVege)
-- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani
WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegKezdete
ELSE oo.C_ORAERVENYESSEGKEZDETE
END
,oo.C_ORAERVENYESSEGVEGE = CASE
-- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani
WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN @pIntervallumKezdete
-- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani
WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege <= updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegVege
-- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani
WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN @pIntervallumKezdete
ELSE oo.C_ORAERVENYESSEGVEGE
END
-- Ha az óra érvényessége teljesen a D1 és D2 között van (D1 <= ÉK <= ÉV <= D2), akkor a teljes elemet törölni kell
-- vagy ha D1 <= ÉK <= D2 < ÉV és ÉV = D2+1 nappal
,oo.TOROLT = IIF((@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegVege <= @pIntervallumVege)
OR (@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete
AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege
AND @pIntervallumVege < updateOrak.ErvenyessegVege
AND updateOrak.ErvenyessegVege = DATEADD(day, 1, @pIntervallumVege)), 'T', oo.TOROLT)
,oo.LASTCHANGED = GETDATE()
,oo.MODIFIER = @pUserId
FROM T_ORARENDIORA_OSSZES oo
INNER JOIN #OrarendiOrak updateOrak ON updateOrak.Id = oo.ID
DECLARE @insertId int, @insertErvenyessegKezdete datetime, @insertErvenyessegVege datetime, @insertOraszam int
-- Kell egy új órarendi elem is azonos GROUPID-val D2+1 naptól ÉV-ig
DECLARE insertCursor CURSOR FOR
SELECT
Id
,DATEADD(day, 1, @pIntervallumVege)
,ErvenyessegVege
,Oraszam
FROM #OrarendiOrak
WHERE ErvenyessegKezdete < @pIntervallumKezdete
AND @pIntervallumVege < ErvenyessegVege
OPEN insertCursor
FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC uspCopyOrarendiElem @insertId, NULL, @insertOraszam, @insertErvenyessegKezdete, @insertErvenyessegVege, 0
FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam
END
CLOSE insertCursor
DEALLOCATE insertCursor
DECLARE @intezmenyId int = (SELECT TOP 1 C_INTEZMENYID FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @pTanevId)
EXEC uspGenerateOrarend @intezmenyId, @pTanevId
END
GO