DROP PROCEDURE IF EXISTS uspValidateCsoportbaSorolasModositasa
GO

CREATE PROCEDURE dbo.uspValidateCsoportbaSorolasModositasa 
   @pTanevId int
  ,@pCsoportId int
  ,@pTanuloId int
  ,@pDatumTol datetime
  ,@pDatumIg datetime
  ,@pIsTorolhetosegVizsgalat bit
  ,@pFeladatKategoriaId int = NULL  
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @osztalybontasId int = (SELECT C_OSZTALYBONTASID FROM T_CSOPORT WHERE ID = @pCsoportId)

  CREATE TABLE #hibak (Oka int, Datum datetime, Darab int)

  IF @pIsTorolhetosegVizsgalat = 0
  BEGIN
    INSERT INTO #hibak
    SELECT 
        1 AS Oka -- 'a tanuló már tagja az adott csoportnak'
      ,IIF(tcs.C_BELEPESDATUM <= @pDatumTol, @pDatumTol, tcs.C_BELEPESDATUM) AS Datum
      ,NULL AS Darab
    FROM T_TANULOCSOPORT_OSSZES tcs
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID
        AND ocs.TOROLT = 'F'
        AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
    WHERE tcs.TOROLT = 'F'
      AND tcs.C_TANEVID = @pTanevId
      AND tcs.C_TANULOID = @pTanuloId
      AND tcs.C_OSZTALYCSOPORTID = @pCsoportId
      AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol))

    INSERT INTO #hibak
    SELECT
        2 AS Oka -- 'a tanuló nem tagja egy osztálynak sem'
      ,MIN(C_NAPDATUMA) AS Datum
      ,NULL AS Darab
    FROM T_NAPTARINAP_OSSZES nn
    WHERE nn.TOROLT = 'F'
      AND nn.C_TANEVID = @pTanevId
      AND nn.C_NAPDATUMA BETWEEN @pDatumTol AND @pDatumIg
      AND NOT EXISTS 
      (
        SELECT 1
        FROM T_TANULOCSOPORT_OSSZES tcs
          INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON tcs.C_OSZTALYCSOPORTID = ocs.ID
            AND ocs.TOROLT = 'F'
            AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
          INNER JOIN T_OSZTALY_OSSZES o ON ocs.ID = o.ID
            AND o.TOROLT = 'F'
        WHERE tcs.TOROLT = 'F'
          AND tcs.C_TANEVID = @pTanevId
          AND tcs.C_TANULOID = @pTanuloId
          AND nn.C_NAPDATUMA >= tcs.C_BELEPESDATUM 
          AND (nn.C_NAPDATUMA <= tcs.C_KILEPESDATUM OR tcs.C_KILEPESDATUM IS NULL)
      )
    HAVING COUNT(1) > 0
    IF @osztalybontasId IS NOT NULL
    BEGIN
      INSERT INTO #hibak
      SELECT
         3 AS Oka -- 'a tanuló nem tagja az osztálybontott csoport osztályának'
        ,MIN(C_NAPDATUMA) AS Datum
        ,NULL AS Darab
      FROM T_NAPTARINAP_OSSZES nn
      WHERE nn.TOROLT = 'F'
        AND nn.C_TANEVID = @pTanevId
        AND nn.C_NAPDATUMA BETWEEN @pDatumTol AND @pDatumIg
        AND NOT EXISTS 
        (
          SELECT 1
          FROM T_TANULOCSOPORT_OSSZES tcs
            INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON tcs.C_OSZTALYCSOPORTID = ocs.ID
              AND ocs.TOROLT = 'F'
              AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
            INNER JOIN T_OSZTALY_OSSZES o ON ocs.ID = o.ID
              AND o.TOROLT = 'F'
              AND o.ID = @osztalybontasId
          WHERE tcs.TOROLT = 'F'
            AND tcs.C_TANEVID = @pTanevId
            AND tcs.C_TANULOID = @pTanuloId
            AND nn.C_NAPDATUMA >= tcs.C_BELEPESDATUM 
            AND (nn.C_NAPDATUMA <= tcs.C_KILEPESDATUM OR tcs.C_KILEPESDATUM IS NULL)
        )
      HAVING COUNT(1) > 0
    END
  END
  ELSE
  BEGIN
    INSERT INTO #hibak
    SELECT
       4 AS Oka -- 'van a csoporthoz mulasztása' 
      ,NULL AS Datum
      ,COUNT(mul.ID) AS Darab
    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 ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID
        AND ocs.TOROLT = 'F'
        AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
    WHERE tcs.TOROLT = 'F'
      AND tcs.C_TANEVID = @pTanevId
      AND tcs.C_TANULOID = @pTanuloId
      AND tcs.C_OSZTALYCSOPORTID = @pCsoportId
      AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol))
    GROUP BY ocs.ID

    INSERT INTO #hibak
    SELECT
       5 AS Oka -- 'van a csoporthoz értékelés'
      ,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 ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID
        AND ocs.TOROLT = 'F'
        AND (@pFeladatKategoriaId IS NULL OR ocs.C_FELADATKATEGORIAID = @pFeladatKategoriaId)
    WHERE tcs.TOROLT = 'F'
      AND tcs.C_TANEVID = @pTanevId
      AND tcs.C_TANULOID = @pTanuloId
      AND tcs.C_OSZTALYCSOPORTID = @pCsoportId
      AND (tcs.C_BELEPESDATUM <= @pDatumIg AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= @pDatumTol))
    GROUP BY ocs.ID
  END

  SELECT * FROM #hibak

END
GO