﻿DROP PROCEDURE IF EXISTS sp_GetDokumentumMulasztasok
GO

-- ===========================================================================
-- Description: Dokumentumokban használt mulasztás összesítő osztály alapján
-- ===========================================================================
CREATE PROCEDURE sp_GetDokumentumMulasztasok
   @osztalyId int
  ,@tanevId int
  ,@elmeletiOraPercben int = 45
  ,@gyakorlatiOraPercben int = 45
  ,@ertekelesTipus int
  ,@iskolaErdekuSzamit bit
  ,@isMuveszetOktatasi bit = 0
  ,@negyedevreSzamoltMulasztasok bit = 1
AS
BEGIN
  SET NOCOUNT ON;

  CREATE TABLE #Tanulo (
     TanuloId int
    ,TanuloCsoportId int
    ,BelepesDatum date
    ,KilepesDatum date
    ,PRIMARY KEY (TanuloId, TanuloCsoportId, BelepesDatum)
  )

  INSERT INTO #Tanulo
  SELECT
     TanuloId
    ,TanuloCsoportId
    ,BelepesDatum
    ,KilepesDatum
  FROM fnGetDokumentumOsztalyokCsoportokTanuloi(@tanevId, @osztalyId, 'T')

  DECLARE
     @IdoszakUtolsoNap int
    ,@IdoszakElsoNap int
    ,@IdoszakKezdete date
    ,@IdoszakVege date
    ,@KeresztFeleves nvarchar(1)
    ,@kategoriaId int
    ,@intezmenyId int

SET @intezmenyId = (SELECT C_INTEZMENYID FROM T_TANEV_OSSZES WHERE ID = @tanevId AND TOROLT = 'F')
  SELECT
     @KeresztFeleves = C_KERESZTFELEVES
    ,@kategoriaId = C_FELADATKATEGORIAID
  FROM T_OSZTALYCSOPORT_OSSZES
  WHERE ID = @osztalyId

  SET @IdoszakUtolsoNap =
    CASE @KeresztFeleves
        WHEN 'F' THEN
            CASE @ertekelesTipus
              WHEN 1519 THEN 1400   --Félévi jegy/értékelés      ->   Első félév vége 
              WHEN 1520 THEN 1395   --Év végi jegy/értékelés     ->   Utolsó tanítási nap
              WHEN 1522 THEN 1403   --I. né. jegy/értékelés      ->   I. negyedév vége
              WHEN 1524 THEN 1400   --II. né. jegy/értékelés     ->   Első félév vége
              WHEN 1523 THEN 1404   --III. né. jegy/értékelés    ->   III. negyedév vége
              WHEN 1525 THEN 1395   --IV. né. jegy/értékelés     ->   Utolsó tanítási nap
            END
        WHEN 'T' THEN
            CASE @ertekelesTipus
              WHEN 1519 THEN 1395   --Félévi jegy/értékelés      ->   Utolsó tanítási nap
              WHEN 1520 THEN 1400   --Év végi jegy/értékelés     ->   Első félév vége
              WHEN 1522 THEN 1404   --I. né. jegy/értékelés      ->   III. negyedév vége
              WHEN 1524 THEN 1395   --II. né. jegy/értékelés     ->   Utolsó tanítási nap    
              WHEN 1523 THEN 1403   --III. né. jegy/értékelés    ->   I. negyedév vége
              WHEN 1525 THEN 1400   --IV. né. jegy/értékelés     ->   Első félév vége
            END
    END

  SET @IdoszakElsoNap =
    CASE @KeresztFeleves
        WHEN 'F' THEN
            CASE @ertekelesTipus
              WHEN 1519 THEN 1394   --Félévi jegy/értékelés     ->    Első tanítási nap
              WHEN 1520 THEN 1394   --Év végi jegy/értékelés    ->    Első tanítási nap
              WHEN 1522 THEN 1394   --I. né. jegy/értékelés     ->    Első tanítási nap  
              WHEN 1524 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1403,1394)   --II. né. jegy/értékelés    ->    I. negyedév vége
              WHEN 1523 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1400,1394)   --III. né. jegy/értékelés   ->    Első félév vége
              WHEN 1525 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1404,1394)   --IV. né. jegy/értékelés    ->    III. negyedév vége
            END
        WHEN 'T' THEN
            CASE @ertekelesTipus
              WHEN 1519 THEN 1400   --Félévi jegy/értékelés     ->    Első félév vége 
              WHEN 1520 THEN 1394   --Év végi jegy/értékelés    ->    Első tanítási nap 
              WHEN 1522 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1400,1394)   --I. né. jegy/értékelés     ->    Első félév vége  
              WHEN 1524 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1404,1394)   --II. né. jegy/értékelés    ->    III. negyedév vége 
              WHEN 1523 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1394,1394)   --III. né. jegy/értékelés   ->    Első tanítási nap
              WHEN 1525 THEN IIF(@negyedevreSzamoltMulasztasok = 1, 1403,1394)   --IV. né. jegy/értékelés    ->    I. negyedév vége 
            END
    END

  CREATE TABLE #SzurtCsoportTipus (
    CsoportTipusId int PRIMARY KEY
  )

  IF @isMuveszetOktatasi = 0 BEGIN
    INSERT INTO #SzurtCsoportTipus
    SELECT ID
    FROM fnGetTanoraiCeluCsoportTipusok(@tanevId)
  END
  ELSE BEGIN
    IF @kategoriaId = 7555 -- AMI-s csoportot kérünk le
    BEGIN
      INSERT INTO #SzurtCsoportTipus (CsoportTipusId)
      SELECT ID
      FROM T_CSOPORTTIPUS_OSSZES
      WHERE C_ALTANEVID = @tanevId
        AND TOROLT = 'F'
        AND C_ISMUVESZETI = 'T'
    END
    ELSE
    BEGIN
      INSERT INTO #SzurtCsoportTipus (CsoportTipusId)
      SELECT C_TIPUSA
      FROM T_CSOPORT_OSSZES
      WHERE TOROLT = 'F'
        AND C_ALTANEVID = @tanevId
        AND ID = @osztalyId
    END
  END

  SET @IdoszakKezdete = (SELECT TOP 1 DATEADD(day, IIF((@KeresztFeleves = 'F' AND @ertekelesTipus IN (1519,1520,1522)) OR (@KeresztFeleves = 'T' AND @ertekelesTipus IN (1520,1522,1523)), 0, 1), C_DATUM) FROM T_TANEVRENDJE_OSSZES WHERE C_NAPTIPUSA = @IdoszakElsoNap AND C_TANEVID = @tanevId AND TOROLT='F')

  SET @IdoszakVege = (SELECT TOP 1 C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_NAPTIPUSA = @IdoszakUtolsoNap AND C_TANEVID = @tanevId AND TOROLT='F')
  --IF @IdoszakVege IS NULL BEGIN
    --SET @IdoszakVege = (SELECT IIF(GETDATE() > C_UTOLSONAP, C_UTOLSONAP, GETDATE()) FROM T_TANEV WHERE ID = @tanevId)
  --END

  SELECT
     t.TANULOID tanuloid
    ,t.TanuloCsoportId tanulocsoportid
    ,ISNULL(mu.[hianyzasIgazoltTanoraiElmeleti], 0) + ISNULL(mu.[hianyzasIgazoltTanoraiGyakorlati], 0)
      + ISNULL(kp.kesesIgazoltElmeletiOraban,0) + ISNULL(kp.kesesIgazoltGyakorlatiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLTHIANYZAS, 0),0)
      AS Igazolt
    ,ISNULL(mu.[hianyzasIgazolatlanTanoraiElmeleti], 0) + ISNULL(mu.[hianyzasIgazolatlanTanoraiGyakorlati], 0)
      + ISNULL(kp.kesesIgazolatlanElmeletiOraban,0) + ISNULL(kp.kesesIgazolatlanGyakorlatiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLATLANHIANYZAS, 0),0)
      AS Igazolatlan
    ,ISNULL(mu.[hianyzasIgazoltTanoraiElmeleti], 0) + ISNULL(kp.kesesIgazoltElmeletiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLTHIANYZAS, 0),0)
      AS ElmeletIgazolt
    ,ISNULL(mu.[hianyzasIgazolatlanTanoraiElmeleti], 0) + ISNULL(kp.kesesIgazolatlanElmeletiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLATLANHIANYZAS, 0),0)
      AS ElmeletIgazolatlan
    ,ISNULL(mu.[hianyzasIgazoltTanoraiGyakorlati], 0) + ISNULL(kp.kesesIgazoltGyakorlatiOraban,0)
      AS GyakorlatiIgazolt
    ,ISNULL(mu.[hianyzasIgazolatlanTanoraiGyakorlati], 0) + ISNULL(kp.kesesIgazolatlanGyakorlatiOraban,0)
      AS GyakorlatiIgazolatlan
    ,ISNULL(mu.[hianyzasIgazoltTanoraiElmeleti], 0) + ISNULL(kp.kesesIgazoltElmeletiOraban,0)
      + ISNULL(mu.[hianyzasIgazolatlanTanoraiElmeleti], 0) + ISNULL(kp.kesesIgazolatlanElmeletiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLTHIANYZAS, 0),0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLATLANHIANYZAS, 0),0)
      AS ElmeletOsszes
    ,ISNULL(mu.[hianyzasIgazoltTanoraiGyakorlati], 0) + ISNULL(kp.kesesIgazoltGyakorlatiOraban,0)
      + ISNULL(mu.[hianyzasIgazolatlanTanoraiGyakorlati], 0) + ISNULL(kp.kesesIgazolatlanGyakorlatiOraban,0)
      AS GyakorlatOsszes
    ,ISNULL(mu.[hianyzasIgazoltTanoraiElmeleti], 0) + ISNULL(mu.[hianyzasIgazoltTanoraiGyakorlati], 0)
      + ISNULL(kp.kesesIgazoltElmeletiOraban,0) + ISNULL(kp.kesesIgazoltGyakorlatiOraban,0)
      + ISNULL(mu.[hianyzasIgazolatlanTanoraiElmeleti], 0) + ISNULL(mu.[hianyzasIgazolatlanTanoraiGyakorlati], 0)
      + ISNULL(kp.kesesIgazolatlanElmeletiOraban,0) + ISNULL(kp.kesesIgazolatlanGyakorlatiOraban,0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLTHIANYZAS, 0),0)
      + IIF(t.BelepesDatum <= @IdoszakVege , ISNULL(ta.C_HOZOTTIGAZOLATLANHIANYZAS, 0),0)
      AS Osszes
  FROM #Tanulo t
  LEFT JOIN (
        SELECT
           tanuloId
          ,tanulocsoportid
          ,[hianyzasIgazoltTanoraiElmeleti]
          ,[hianyzasIgazoltTanoraiGyakorlati]
          ,[hianyzasIgazolatlanTanoraiElmeleti]
          ,[hianyzasIgazolatlanTanoraiGyakorlati]
        FROM (
            SELECT
            x.tanuloId, x.tanulocsoportid
            ,'Hianyzas' +
                CASE isIgazolt WHEN 'T' THEN 'Igazolt' WHEN 'F' THEN 'Igazolatlan' END +
                CASE isTanorai WHEN 'T' THEN 'Tanorai' WHEN 'F' THEN 'TanoranKivuli' END +
                CASE isGyakorlati WHEN  'T' THEN 'Gyakorlati' WHEN 'F' THEN 'Elmeleti' END
            AS piv
            ,cnt
            FROM (
                SELECT
                    mu.C_ORATANULOIID AS tanuloId
                    ,tanulok.TanuloCsoportId
                    ,mu.C_TIPUS mulasztasTipus
                    ,mu.C_IGAZOLT isIgazolt
                    ,IIF((@isMuveszetOktatasi = 0 AND cs.ID IS NULL), 'T', IIF((@isMuveszetOktatasi = 1 AND (csmuv.ID IS NOT NULL OR tcs.C_OSZTALYCSOPORTID = @osztalyid)),'T','F')) AS isTanorai
                    ,IIF(t.C_GYAKORLATI='T', 'T', 'F') as isGyakorlati
                    ,COUNT(1) AS cnt
                FROM T_TANULOMULASZTAS_OSSZES mu
                    INNER JOIN #Tanulo tanulok ON tanulok.TanuloId = mu.C_ORATANULOIID
                    INNER JOIN T_TANITASIORA_OSSZES tn ON tn.ID = mu.C_TANITASIORAKID
                    INNER JOIN (SELECT ID FROM fnGetDokumentumKapcsolodoOsztalycsoportok(@osztalyID, @tanevId, 0, DEFAULT)) kocs ON kocs.ID = tn.C_OSZTALYCSOPORTID
                    INNER JOIN T_TANTARGY_OSSZES t on t.id=tn.C_TANTARGYID
                    LEFT  JOIN (
                        SELECT cs.ID
                        FROM T_CSOPORT_OSSZES cs
                        INNER JOIN T_CSOPORTTIPUS_OSSZES cst On cst.ID = cs.C_TIPUSA AND cst.C_ALTANEVID = cs.C_ALTANEVID AND cst.C_ISTANORAICELU = 'F'
                        WHERE cs.C_ALTANEVID = @tanevId
                    ) cs ON tn.C_OSZTALYCSOPORTID = cs.ID
                    LEFT  JOIN (
                        SELECT cs.ID
                        FROM T_CSOPORT_OSSZES cs
                        INNER JOIN #SzurtCsoportTipus cst On cst.CsoportTipusId = cs.C_TIPUSA
                        WHERE cs.C_ALTANEVID = @tanevId
                    ) csmuv ON tn.C_OSZTALYCSOPORTID = csmuv.ID
                    INNER JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_OSZTALYCSOPORTID = tn.C_OSZTALYCSOPORTID AND tanulok.TanuloId = tcs.C_TANULOID AND tcs.TOROLT = 'F'
                    INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tn.C_OSZTALYCSOPORTID AND ocs.C_FELADATKATEGORIAID = @kategoriaId AND ocs.Torolt = 'F'
                WHERE tn.C_DATUM BETWEEN @IdoszakKezdete AND @IdoszakVege
                    AND mu.C_TANEVID = @tanevId
                    AND mu.Torolt ='F'
                    AND tn.Torolt ='F'
                    AND mu.C_IGAZOLT IS NOT NULL
                    AND tn.C_TANEVID = @tanevId
                    AND (@iskolaErdekuSzamit = 1 OR (C_IGAZOLASTIPUSA <> 1533 OR C_IGAZOLASTIPUSA IS NULL))
                    AND tcs.C_BELEPESDATUM <= tn.C_DATUM
                    AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= tn.C_DATUM)
                    AND tanulok.BelepesDatum <= tn.C_DATUM
                    AND (tanulok.KilepesDatum IS NULL OR tanulok.KilepesDatum >= tn.C_DATUM)
                    AND mu.C_TIPUS = 1500
                    AND (
                        (@isMuveszetOktatasi = 0)
                        OR
                        (@isMuveszetOktatasi = 1 AND (csmuv.ID IS NOT NULL OR tcs.C_OSZTALYCSOPORTID = @osztalyid))
                    )
                GROUP BY mu.C_ORATANULOIID, tanulok.TanuloCsoportId, mu.C_TIPUS, mu.C_IGAZOLT, IIF((@isMuveszetOktatasi = 0 AND cs.ID IS NULL), 'T', IIF((@isMuveszetOktatasi = 1 AND (csmuv.ID IS NOT NULL OR tcs.C_OSZTALYCSOPORTID = @osztalyid)),'T','F')), t.C_GYAKORLATI
            ) x
        ) p
        PIVOT (
            MAX(cnt)
            FOR piv IN (
                [hianyzasIgazoltTanoraiElmeleti], [hianyzasIgazoltTanoraiGyakorlati],
                [hianyzasIgazolatlanTanoraiElmeleti], [hianyzasIgazolatlanTanoraiGyakorlati]
            )
        ) AS pvt
  ) mu on mu.tanuloId = t.tanuloId and mu.TanuloCsoportId = t.TanuloCsoportId
  LEFT JOIN (
        SELECT
           tanuloId
          ,tanulocsoportid
          ,SUM(kesesIgazolandoTanoraiPluszOra) AS kesesIgazolandoTanoraiPluszOra
          ,SUM(kesesIgazoltTanoraiPluszOra) AS kesesIgazoltTanoraiPluszOra
          ,SUM(kesesIgazolatlanTanoraiPluszOra) AS kesesIgazolatlanTanoraiPluszOra
          ,SUM(kesesIgazoltElmeletiOraban) AS kesesIgazoltElmeletiOraban
          ,SUM(kesesIgazolatlanElmeletiOraban) AS kesesIgazolatlanElmeletiOraban
          ,SUM(kesesIgazoltGyakorlatiOraban) AS kesesIgazoltGyakorlatiOraban
          ,SUM(kesesIgazolatlanGyakorlatiOraban) AS kesesIgazolatlanGyakorlatiOraban
        FROM (
            SELECT
                x.tanuloId
            ,x.tanulocsoportid
            ,'Keses' +
                CASE
                WHEN isIgazolt IS NULL THEN 'Igazolando'
                WHEN isIgazolt = 'T' THEN 'Igazolt'
                WHEN isIgazolt = 'F' THEN 'Igazolatlan'
                END + 'TanoraiPluszOra' AS piv
            ,kesesOraban
            ,kesesIgazoltElmeletiOraban
            ,kesesIgazolatlanElmeletiOraban
            ,kesesIgazoltGyakorlatiOraban
            ,kesesIgazolatlanGyakorlatiOraban
            FROM (
                SELECT
                   xx.tanuloId
                  ,xx.tanulocsoportid
                  ,xx.isIgazolt
                  ,SUM(xx.keses / (CASE WHEN isGyakorlati = 'F' THEN @elmeletiOraPercben ELSE @gyakorlatiOraPercben END)) AS kesesOraban
                  ,SUM(CASE WHEN isGyakorlati = 'F' AND isIgazolt='T' THEN xx.keses / @elmeletiOraPercben ELSE 0 END) AS kesesIgazoltElmeletiOraban
                  ,SUM(CASE WHEN isGyakorlati = 'F' AND isIgazolt='F' THEN xx.keses / @elmeletiOraPercben ELSE 0 END) AS kesesIgazolatlanElmeletiOraban
                  ,SUM(CASE WHEN isGyakorlati = 'T' AND isIgazolt='T' THEN xx.keses / @gyakorlatiOraPercben ELSE 0 END) AS kesesIgazoltGyakorlatiOraban
                  ,SUM(CASE WHEN isGyakorlati = 'T' AND isIgazolt='F' THEN xx.keses / @gyakorlatiOraPercben ELSE 0 END) AS kesesIgazolatlanGyakorlatiOraban
                FROM (
                    SELECT
                        mu.C_ORATANULOIID AS tanuloId
                        ,tanulok.tanulocsoportid
                        ,mu.C_IGAZOLT isIgazolt
                        ,t.C_GYAKORLATI AS isGyakorlati
                        ,SUM(mu.C_KESESPERCBEN) AS keses
                    FROM T_TANULOMULASZTAS_OSSZES mu
                        INNER JOIN #Tanulo tanulok ON tanulok.TanuloId = mu.C_ORATANULOIID
                        INNER JOIN T_TANITASIORA_OSSZES tn ON tn.ID = mu.C_TANITASIORAKID
                        INNER JOIN (SELECT ID FROM fnGetDokumentumKapcsolodoOsztalycsoportok(@osztalyID, @tanevId, 0, DEFAULT)) kocs ON kocs.ID = tn.C_OSZTALYCSOPORTID
                        INNER JOIN T_TANTARGY_OSSZES t ON t.ID = tn.C_TANTARGYID
                        LEFT  JOIN (
                            SELECT cs.ID, cs.C_TIPUSA
                            FROM T_CSOPORT_OSSZES cs
                            INNER JOIN T_CSOPORTTIPUS_OSSZES cst On cst.ID = cs.C_TIPUSA AND cst.C_ALTANEVID = cs.C_ALTANEVID AND cst.C_ISTANORAICELU = 'F'
                        ) cs ON tn.C_OSZTALYCSOPORTID = cs.ID
                        LEFT  JOIN (
                            SELECT cs.ID
                            FROM T_CSOPORT_OSSZES cs
                            INNER JOIN #SzurtCsoportTipus cst On cst.CsoportTipusId = cs.C_TIPUSA
                        ) csmuv ON tn.C_OSZTALYCSOPORTID = csmuv.ID
                        INNER JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_OSZTALYCSOPORTID = tn.C_OSZTALYCSOPORTID and tanulok.TanuloId = tcs.C_TANULOID AND tcs.TOROLT = 'F'
                        INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tn.C_OSZTALYCSOPORTID AND ocs.C_FELADATKATEGORIAID = @kategoriaId AND ocs.Torolt = 'F'
                    WHERE mu.C_TANEVID = @tanevId
                        AND (
                          (@isMuveszetOktatasi = 0 AND (cs.ID IS NULL OR cs.C_TIPUSA IN (SELECT CsoportTipusId FROM #SzurtCsoportTipus)))
                          OR
                          (@isMuveszetOktatasi = 1 AND (csmuv.ID IS NOT NULL OR tcs.C_OSZTALYCSOPORTID = @osztalyid))
                        )
                        AND mu.C_TIPUS = 1499
                        AND mu.TOROLT = 'F'
                        AND tn.Torolt ='F'
                        AND (@iskolaErdekuSzamit = 1 OR (C_IGAZOLASTIPUSA <> 1533 OR C_IGAZOLASTIPUSA IS NULL))
                        AND tcs.C_BELEPESDATUM <= tn.C_DATUM
                        AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM >= tn.C_DATUM)
                        AND tanulok.BelepesDatum <= tn.C_DATUM
                        AND (tanulok.KilepesDatum IS NULL OR tanulok.KilepesDatum >= tn.C_DATUM)
                        AND tn.C_DATUM BETWEEN @IdoszakKezdete AND @IdoszakVege
                    GROUP BY mu.C_ORATANULOIID, tanulok.TanuloCsoportId, mu.C_IGAZOLT, t.C_GYAKORLATI
                ) xx
                GROUP BY tanuloId, TanuloCsoportId, xx.isIgazolt
            ) x
        ) p
        PIVOT (
          MAX(kesesOraban)
          FOR piv IN (
            kesesIgazolandoTanoraiPluszOra, kesesIgazoltTanoraiPluszOra, kesesIgazolatlanTanoraiPluszOra
            )
        ) AS pvt
        GROUP BY tanuloId, TanuloCsoportId
) kp ON t.tanuloId = kp.tanuloId AND kp.TanuloCsoportId = t.TanuloCsoportId
LEFT join T_TANULOTANUGYIADATOK ta on t.TanuloCsoportId = ta.C_TANULOCSOPORTID
END
GO

