DROP PROCEDURE IF EXISTS uspValidateOsztalybaSorolasModositasa GO CREATE PROCEDURE dbo.uspValidateOsztalybaSorolasModositasa @pTanevId int ,@pFromOsztalyId int ,@pToOsztalyId int ,@pTanuloId int ,@pDatumTol datetime ,@pDatumIg datetime ,@pFeladatKategoriaId int ,@pIsTorolhetosegVizsgalat bit ,@pIsCheckMaxOsztalyReturnKilepes bit AS BEGIN SET NOCOUNT ON; DECLARE @maxDate datetime ,@darab int ,@tanevUtolsoNap datetime = (SELECT C_UTOLSONAP FROM T_TANEV_OSSZES WHERE ID = @pTanevId) ,@rendszeruzenetId int = (SELECT ID FROM T_FELHASZNALO_OSSZES WHERE C_NYOMTATASINEV = 'Rendszerüzenet' AND C_TANEVID = @pTanevId AND TOROLT = 'F') CREATE TABLE #hibak (Oka int, OsztalyId int, OsztalybontottCsoportId int, Datum datetime, Darab int) -- Okok: -- 1 - ha a vizsgált időszakban van akár csak egyetlen nap is (a legkorábbi ilyen dátumot nevezzük ’X’-nek), -- ahol a tanuló be van sorolva egy olyan csoportba, ami az érintett osztály osztálybontásának van jelölve -- 2 - ha a vizsgált időszakban van akár csak egyetlen nap is (a legkorábbi ilyen dátumot nevezzük ’X’-nek), -- ahol a tanuló be van sorolva legalább egy nem osztálybontott csoportba, de nincs egyetlen osztályhoz sem rendelve -- 3 - ha a vizsgált időszakban van akár csak egyetlen mulasztás is rögzítve a megadott osztályhoz -- 4 - ha a vizsgált időszakban van akár csak egyetlen értékelés is rögzítve a megadott osztályhoz -- 5 - ha a vizsgált időszakban van akár csak egyetlen feljegyzés is rögzítve az érintett tanulónak olyan napra, -- ahol nincs egyetlen további osztályba sem besorolva a tanuló bármely modulban -- 6 - ha a vizsgált időszakban van akár csak egyetlen igazolás is rögzítve az érintett tanulónak olyan napra, -- ahol nincs egyetlen további osztályba sem besorolva a tanuló bármely modulban -- 7 - ha a tanuló már tagja az adott osztálynak -- 8 - ha a tanuló már annyi osztályba van besorolva, amennyi az érintett oktatási-nevelési feladatcsoportban megengedett -- -- NOTE: 5-ös és 6-os esetében, ha lehet majd feladat kategóriához kötni, akkor azokat módosítani kell !!! IF @pIsTorolhetosegVizsgalat = 1 BEGIN INSERT INTO #hibak SELECT 1 AS oka -- 'van osztálybontott csoport besorolása' ,ocso.ID AS OsztalyId ,ocscs.ID AS OsztalybontottCsoportId ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum ,NULL AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_CSOPORT_OSSZES cs ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.TOROLT = 'F' AND cs.C_OSZTALYBONTASID = @pFromOsztalyId INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = @pFromOsztalyId AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) LEFT JOIN T_OSZTALYCSOPORT_OSSZES ocscs ON ocscs.ID = tcs.C_OSZTALYCSOPORTID AND ocscs.TOROLT = 'F' WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) INSERT INTO #hibak SELECT 2 AS oka -- 'van csoport besorolása osztálybesorolás nélkül' ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum ,NULL AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_CSOPORT_OSSZES cs ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.TOROLT = 'F' AND cs.C_OSZTALYBONTASID IS NULL LEFT JOIN ( SELECT tcs2.* FROM T_TANULOCSOPORT_OSSZES tcs2 INNER JOIN T_OSZTALY_OSSZES o ON o.ID = tcs2.C_OSZTALYCSOPORTID AND o.TOROLT = 'F' INNER JOIN T_OSZTALYCSOPORT ocs ON ocs.ID = o.ID AND ocs.TOROLT = 'F' AND (ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs2.TOROLT = 'F' AND tcs2.C_TANEVID = @pTanevId AND tcs2.C_TANULOID = @pTanuloId AND (tcs2.C_BELEPESDATUM <= @pDatumIg AND (tcs2.C_KILEPESDATUM IS NULL OR tcs2.C_KILEPESDATUM >= @pDatumTol)) AND tcs2.C_OSZTALYCSOPORTID <> @pFromOsztalyId ) tcso ON tcso.C_TANULOID = tcso.C_TANULOID INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) AND tcso.ID IS NULL INSERT INTO #hibak SELECT 3 AS oka -- 'van az osztályhoz mulasztása' ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,NULL AS Datum ,COUNT(mul.ID) AS Darab --,tcs.* FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_TANULOMULASZTAS_OSSZES mul ON mul.C_ORATANULOIID = tcs.C_TANULOID AND mul.TOROLT = 'F' INNER JOIN T_TANITASIORA_OSSZES tano ON tano.ID = mul.C_TANITASIORAKID AND tano.TOROLT = 'F' AND tano.C_OSZTALYCSOPORTID = tcs.C_OSZTALYCSOPORTID AND tano.C_DATUM >= @pDatumTol AND tano.C_DATUM <= @pDatumIg INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND tcs.C_OSZTALYCSOPORTID = @pFromOsztalyId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) GROUP BY ocso.ID INSERT INTO #hibak SELECT 4 AS oka -- 'van az osztályhoz értékelés' ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,NULL AS Datum ,COUNT(ert.ID) AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_TANULOERTEKELES_OSSZES ert ON ert.C_TANULOID = tcs.C_TANULOID AND ert.C_OSZTALYCSOPORTID = tcs.C_OSZTALYCSOPORTID AND ert.TOROLT = 'F' AND ert.C_DATUM >= @pDatumTol AND ert.C_DATUM <= @pDatumIg INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND tcs.C_OSZTALYCSOPORTID = @pFromOsztalyId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) GROUP BY ocso.ID SELECT @maxDate = ISNULL(MAX(te.C_ESEMENYDATUMA), @tanevUtolsoNap) ,@darab = COUNT(te.ID) FROM T_TANULOESEMENY_OSSZES te INNER JOIN T_TANULO_TANULOESEMENY tte ON tte.C_TANULOESEMENYID = te.ID WHERE te.TOROLT = 'F' AND tte.C_TANULOID = @pTanuloId AND te.C_ESEMENYDATUMA >= @pDatumTol AND te.C_ESEMENYDATUMA <= @pDatumIg AND te.C_FELJEGYZOID <> @rendszeruzenetId IF @darab > 0 BEGIN IF NOT EXISTS ( SELECT 1 FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALY_OSSZES o ON o.ID = tcs.C_OSZTALYCSOPORTID AND o.TOROLT = 'F' WHERE tcs.C_TANULOID = @pTanuloId AND tcs.TOROLT = 'F' AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @maxDate) AND tcs.C_OSZTALYCSOPORTID <> @pFromOsztalyId ) BEGIN INSERT INTO #hibak SELECT 5 AS oka -- 'van feljegyzés a tanulónak, nincs aktív osztály besorolása' ,NULL AS OsztalyId ,NULL AS OsztalybontottCsoportId ,NULL AS Datum ,@darab AS Darab END END SELECT @maxDate = ISNULL(MAX(i.C_VEGE), @tanevUtolsoNap) ,@darab = COUNT(i.ID) FROM T_IGAZOLAS i WHERE i.TOROLT = 'F' AND i.C_TANULOID = @pTanuloId AND i.C_VEGE >= @pDatumTol AND i.C_KEZDETE <= DATEADD(DAY, 1 ,@pDatumIg) --Egy nappal korábbi dátumot kapunk felületről így ez kell, különben az aznapi igazolásokat nem venné figyelembe IF @darab > 0 BEGIN IF NOT EXISTS ( SELECT 1 FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALY_OSSZES o ON o.ID = tcs.C_OSZTALYCSOPORTID AND o.TOROLT = 'F' WHERE tcs.C_TANULOID = @pTanuloId AND tcs.TOROLT = 'F' AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @maxDate) AND tcs.C_OSZTALYCSOPORTID <> @pFromOsztalyId ) BEGIN INSERT INTO #hibak SELECT 6 AS oka -- 'van igazolás a tanulónak, nincs aktív osztály besorolása' ,NULL AS OsztalyId ,NULL AS OsztalybontottCsoportId ,NULL AS Datum ,@darab AS Darab END END IF @pFromOsztalyId <> @pToOsztalyId BEGIN INSERT INTO #hibak SELECT 7 AS oka -- 'a tanuló már tagja az adott osztálynak' ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum ,NULL AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND tcs.C_OSZTALYCSOPORTID = @pFromOsztalyId AND (tcs.C_BELEPESDATUM <= @pDatumTol AND tcs.C_KILEPESDATUM >= @pDatumTol) END END IF @pIsTorolhetosegVizsgalat = 0 BEGIN IF @pFromOsztalyId <> @pToOsztalyId BEGIN INSERT INTO #hibak SELECT 7 AS oka -- 'a tanuló már tagja az adott osztálynak' ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum ,NULL AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND tcs.C_OSZTALYCSOPORTID = @pToOsztalyId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumIg)) END ELSE BEGIN INSERT INTO #hibak SELECT 7 AS oka ,ocso.ID AS OsztalyId ,NULL AS OsztalybontottCsoportId ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum ,NULL AS Darab FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALY o ON o.ID = tcs.C_OSZTALYCSOPORTID AND o.TOROLT = 'F' INNER JOIN T_OSZTALYCSOPORT_OSSZES ocso ON ocso.ID = tcs.C_OSZTALYCSOPORTID AND ocso.TOROLT = 'F' AND (ocso.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND tcs.C_OSZTALYCSOPORTID = @pToOsztalyId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) END INSERT INTO #hibak SELECT 8 AS oka -- 'a tanuló már tagja a max számú osztálynak' ,NULL AS OsztalyId ,NULL AS OsztalybontottCsoportId ,tcs.MinBesorolasDatum AS Datum ,NULL AS Darab FROM ( SELECT COUNT(tcs.ID) AS Darab ,ISNULL(IIF(@pIsCheckMaxOsztalyReturnKilepes = 1, MIN(tcs.C_KILEPESDATUM), MIN(tcs.C_BELEPESDATUM)), @pDatumTol) AS MinBesorolasDatum FROM T_TANULOCSOPORT_OSSZES tcs INNER JOIN T_OSZTALY o ON o.ID = tcs.C_OSZTALYCSOPORTID AND o.TOROLT = 'F' INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID AND ocs.TOROLT = 'F' AND (ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId OR @pFeladatKategoriaId IS NULL) WHERE tcs.TOROLT = 'F' AND tcs.C_TANEVID = @pTanevId AND tcs.C_TANULOID = @pTanuloId AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol)) AND tcs.C_OSZTALYCSOPORTID <> @pFromOsztalyId ) tcs INNER JOIN T_OKTNEVELESIKATEGORIA_OSSZES onk ON onk.ID = @pFeladatKategoriaId AND onk.TOROLT = 'F' AND onk.C_ALTANEVID = @pTanevId WHERE tcs.Darab >= onk.C_FELADATCSOPORTTANULOOSZTALYK END SELECT * FROM #hibak END GO