﻿DROP FUNCTION IF EXISTS dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange
GO

CREATE FUNCTION dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange (
   @pOsztalyCsoportId int
  ,@pStartDate datetime
  ,@pEndDate datetime
  ,@pIntezmenyId int
  ,@pTanevId int
)
RETURNS @Result TABLE (
   Id int primary key NOT NULL
  ,Kezdete datetime NOT NULL
  ,Vege datetime NOT NULL
) AS
BEGIN
  DECLARE
     @tanevStart datetime
    ,@tanevEnd datetime
    ,@osztalyId int

  DECLARE @kategoriaId int = (SELECT C_FELADATKATEGORIAID FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId)

  IF EXISTS (SELECT 1 FROM T_OSZTALY_OSSZES WHERE ID = @pOsztalyCsoportId) BEGIN

    INSERT INTO @Result (Id, Kezdete, Vege) /* maga az osztály */
    SELECT
       o.Id
      ,@pStartDate
      ,@pEndDate
    FROM T_OSZTALY_OSSZES o
    WHERE o.ID = @pOsztalyCsoportId
      AND o.C_ALTANEVID = @pTanevID
      AND o.C_ALINTEZMENYID = @pIntezmenyId
      AND o.TOROLT = 'F'

    UNION ALL

    SELECT  /* Az osztály bontott csoportjai */
       cs.ID
      ,@pStartDate
      ,@pEndDate
    FROM T_CSOPORT_OSSZES cs
    WHERE C_OSZTALYBONTASID = @pOsztalyCsoportId
      AND cs.TOROLT = 'F'
      AND cs.C_ALTANEVID = @pTanevID
      AND cs.C_ALINTEZMENYID = @pIntezmenyId

    INSERT INTO @Result (Id, Kezdete, Vege)  /* Az osztály tanulóinak más csoportjai */
    SELECT
       tcs.C_OSZTALYCSOPORTID AS Id
      ,CASE
        WHEN MIN(tcs.C_BELEPESDATUM) > MIN(oszt.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
        WHEN MIN(oszt.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(oszt.C_BELEPESDATUM) > @pStartDate THEN MIN(oszt.C_BELEPESDATUM)
        ELSE @pStartDate
       END AS Kezdete --  A három közül a legnagyobb
      ,CASE
        WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
        WHEN MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(oszt.C_KILEPESDATUM, @pEndDate))
        ELSE @pEndDate -- A három közül a legkisebb
       END AS Vege
    FROM T_TANULOCSOPORT_OSSZES tcs
      INNER JOIN T_TANULOCSOPORT_OSSZES oszt
        ON  oszt.C_TANULOID = tcs.C_TANULOID
        AND oszt.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
        AND oszt.C_BELEPESDATUM <= @pEndDate
        AND (oszt.C_KILEPESDATUM > @pStartDate OR oszt.C_KILEPESDATUM IS NULL)
      INNER JOIN T_CSOPORT_OSSZES cs ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.C_OSZTALYBONTASID IS NULL
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT = 'F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
    WHERE tcs.TOROLT = 'F'
      AND oszt.TOROLT = 'F'
      AND tcs.C_TANEVID = @pTanevId
      AND tcs.C_INTEZMENYID = @pIntezmenyId
      AND tcs.C_BELEPESDATUM <= @pEndDate
      AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
      AND NOT EXISTS (SELECT 1 FROM @Result r WHERE r.ID = tcs.C_OSZTALYCSOPORTID)
    GROUP BY tcs.C_OSZTALYCSOPORTID
  END

  IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NOT NULL AND TOROLT = 'F') BEGIN


    SELECT @osztalyId = C_OSZTALYBONTASID FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId

    INSERT INTO @Result (Id, Kezdete, Vege)  /* Az osztály, amelyiknek a bontása */
    SELECT
       @osztalyId
      ,@pStartDate
      ,@pEndDate

    UNION ALL

    SELECT /* Maga a csoport */
       @pOsztalyCsoportId
      ,@pStartDate
      ,@pEndDate


    INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
    SELECT
       tcs.C_OSZTALYCSOPORTID AS Id
      ,CASE
        WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
        WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
        ELSE @pStartDate
       END AS Kezdete --  A három közül a legnagyobb
      ,CASE
        WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
        WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
        ELSE @pEndDate
       END AS Vege  -- A három közül a legkisebb
    FROM T_TANULOCSOPORT_OSSZES tcs
      INNER JOIN T_TANULOCSOPORT_OSSZES csop
        ON  tcs.C_TANULOID = csop.C_TANULOID
        AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
        AND csop.C_BELEPESDATUM <= @pEndDate
        AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
        AND csop.TOROLT = 'F'
      INNER JOIN T_CSOPORT_OSSZES cs
        ON  cs.ID = tcs.C_OSZTALYCSOPORTID
        AND (cs.C_OSZTALYBONTASID IS NULL OR cs.C_OSZTALYBONTASID = @osztalyId)
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
    WHERE tcs.C_OSZTALYCSOPORTID <> @pOsztalyCsoportId
      AND tcs.C_TANEVID = @pTanevId
      AND tcs.C_INTEZMENYID = @pIntezmenyId
      AND tcs.C_BELEPESDATUM <= @pEndDate
      AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
      AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
    GROUP BY tcs.C_OSZTALYCSOPORTID
  END

  IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NULL AND TOROLT = 'F') BEGIN

    INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
    SELECT
       tcs.C_OSZTALYCSOPORTID AS Id
      ,CASE
        WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
        WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
        ELSE @pStartDate
       END AS Kezdete --  A három közül a legnagyobb
      ,CASE
        WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
        WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
        ELSE @pEndDate
       END AS Vege  -- A három közül a legkisebb
    FROM T_TANULOCSOPORT_OSSZES tcs
      INNER JOIN T_TANULOCSOPORT_OSSZES csop
        ON  tcs.C_TANULOID = csop.C_TANULOID
        AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
        AND csop.C_BELEPESDATUM <= @pEndDate
        AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
        AND csop.TOROLT = 'F'
        AND csop.C_BELEPESDATUM <= ISNULL(tcs.C_KILEPESDATUM, @pEndDate) AND ISNULL(csop.C_KILEPESDATUM, @pEndDate) > tcs.C_BELEPESDATUM
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
    WHERE tcs.C_TANEVID = @pTanevId
      AND tcs.C_INTEZMENYID = @pIntezmenyId
      AND tcs.C_BELEPESDATUM <= @pEndDate
      AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
      AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
    GROUP BY tcs.C_OSZTALYCSOPORTID
  END

  RETURN
END
GO