IF OBJECT_ID(N'fnGetTanuloTantargyMulasztasOsszesOra') IS NOT NULL BEGIN
  DROP FUNCTION fnGetTanuloTantargyMulasztasOsszesOra
END
GO

CREATE FUNCTION fnGetTanuloTantargyMulasztasOsszesOra (
  @magantanulo int, /*1 - Nem kell megjelennie, 2 - Csak gyakorlaton, 3 - Minden órán*/
  @iskolaErdekuTavolletSzamit bit, 
  @parhuzamosOraSzamit bit,
  @intezmenyId int,
  @tanevId int  
)
RETURNS TABLE
AS
RETURN (
  SELECT xx.*, s.MEGTARTOTT + j.JOVOBELI AS OSSZESORA FROM (
    SELECT x.C_TANTARGYID, x.C_OSZTALYCSOPORTID, x.C_ORATANULOIID, x.HIANYZAS, x.KESES,
      CASE 
        WHEN TANORANKIVULIFOGLALKOZAS = 'T' THEN 100 
        WHEN t.C_GYAKORLATI = 'F' THEN 45 
        ELSE 60 
      END AS OSZTANI
    FROM (   
      SELECT o.C_TANTARGYID, o.C_OSZTALYCSOPORTID, m.C_ORATANULOIID,
        SUM(
          CASE 
            WHEN m.C_TIPUS = 1500 AND tm.ID IS NOT NULL AND o.C_ORAKEZDETE BETWEEN tm.C_KEZDETE AND DATEADD(d, 1, tm.C_VEGE) AND tm.C_ORAMENTESITES = 'T' THEN 0
            WHEN m.C_TIPUS = 1500 AND m.C_IGAZOLASTIPUSA = 1533 AND @iskolaErdekuTavolletSzamit = 0 THEN 0
            WHEN m.C_TIPUS = 1500 AND @parhuzamosOraSzamit = 1 THEN IIF(y.RN = 1, 1, 0)          
            WHEN m.C_TIPUS = 1500 THEN 1
            ELSE 0
          END
        ) AS HIANYZAS,
        SUM(
          IIF(o.C_TANORANKIVULIFOGLALKOZAS = 'T', 
            CAST((ISNULL(m.C_KESESPERCBEN, 0) / CAST(DATEDIFF(mi, o.C_ORAKEZDETE, o.C_ORAVEGE) AS float) * 100) AS int), 
            ISNULL(m.C_KESESPERCBEN, 0))
        ) AS KESES,
        MIN(o.C_TANORANKIVULIFOGLALKOZAS) TANORANKIVULIFOGLALKOZAS 
      FROM T_TANULOMULASZTAS_OSSZES m
      INNER JOIN T_TANITASIORA_OSSZES o ON m.C_TANITASIORAKID = o.ID
      LEFT  JOIN T_TANULOMENTESSEG_OSSZES tm ON tm.C_TANTARGYID = o.C_TANTARGYID AND tm.C_TANULOID = m.C_ORATANULOIID AND tm.C_TANEVID = 15 /*majd tanév is ide*/
      LEFT JOIN  T_FOGLALKOZAS_OSSZES f ON f.id = o.C_FOGLALKOZASID
      LEFT JOIN (
        SELECT sm.ID, ROW_NUMBER() OVER(PARTITION BY sm.C_ORATANULOIID, so.C_DATUM, so.C_ORASZAM ORDER BY so.C_TANORANKIVULIFOGLALKOZAS, so.C_TANTARGYID) RN
        FROM T_TANULOMULASZTAS_OSSZES sm
          INNER JOIN T_TANITASIORA_OSSZES so ON so.ID = sm.C_TANITASIORAKID
        WHERE sm.TOROLT = 'F' AND sm.C_TIPUS = 1500
      ) y ON y.ID = m.ID
      INNER JOIN T_TANULO_OSSZES tn ON tn.ID = m.C_ORATANULOIID
      WHERE (f.C_MULASZTASKELL = 'T' OR f.C_MULASZTASKELL IS NULL) 
        AND tn.C_MAGANTANULO = 'F'
        AND m.C_INTEZMENYID = @intezmenyId 
        AND m.C_TANEVID = @tanevId 
      GROUP BY o.C_OSZTALYCSOPORTID, o.C_TANTARGYID, m.C_ORATANULOIID
    ) x
    INNER JOIN T_TANTARGY_OSSZES t ON x.C_TANTARGYID = t.ID
    
    UNION ALL
    
    SELECT x.C_TANTARGYID, x.C_OSZTALYCSOPORTID, x.C_ORATANULOIID, x.HIANYZAS, x.KESES,
      CASE 
        WHEN TANORANKIVULIFOGLALKOZAS = 'T' THEN 100 
        WHEN x.C_GYAKORLATI = 'F' THEN 45 
        ELSE 60 
      END AS OSZTANI
    FROM (   
      SELECT o.C_TANTARGYID, o.C_OSZTALYCSOPORTID, m.C_ORATANULOIID, MIN(t.C_GYAKORLATI) C_GYAKORLATI,
        SUM(
          CASE 
            WHEN m.C_TIPUS = 1500 THEN
              CASE
                WHEN tm.ID IS NOT NULL AND o.C_ORAKEZDETE BETWEEN tm.C_KEZDETE AND DATEADD(d, 1, tm.C_VEGE) AND tm.C_ORAMENTESITES = 'T' THEN 0
                WHEN m.C_IGAZOLASTIPUSA = 1533 AND @iskolaErdekuTavolletSzamit = 0 THEN 0
                WHEN @magantanulo = 1 THEN 0
                WHEN @magantanulo = 2 AND t.C_GYAKORLATI = 'F' THEN 0
                WHEN @parhuzamosOraSzamit = 1 THEN IIF(y.RN = 1, 1, 0)          
                ELSE 1
              END
            ELSE 0
          END
        ) AS HIANYZAS,
        SUM(
          IIF(o.C_TANORANKIVULIFOGLALKOZAS = 'T', 
            CAST((ISNULL(m.C_KESESPERCBEN, 0) / CAST(DATEDIFF(mi, o.C_ORAKEZDETE, o.C_ORAVEGE) AS float) * 100) AS int), 
            ISNULL(m.C_KESESPERCBEN, 0))
        ) AS KESES,
        MIN(o.C_TANORANKIVULIFOGLALKOZAS) TANORANKIVULIFOGLALKOZAS 
      FROM T_TANULOMULASZTAS_OSSZES m
      INNER JOIN T_TANITASIORA_OSSZES o ON m.C_TANITASIORAKID = o.ID
      LEFT  JOIN T_TANULOMENTESSEG_OSSZES tm ON tm.C_TANTARGYID = o.C_TANTARGYID AND tm.C_TANULOID = m.C_ORATANULOIID AND tm.C_TANEVID = 15 /*majd tanév is ide*/
      LEFT JOIN  T_FOGLALKOZAS_OSSZES f ON f.id = o.C_FOGLALKOZASID
      LEFT JOIN (
        SELECT M.ID, ROW_NUMBER() OVER(PARTITION BY m.C_ORATANULOIID, o.C_DATUM, o.C_ORASZAM ORDER BY o.C_TANORANKIVULIFOGLALKOZAS, o.C_TANTARGYID) RN
        FROM T_TANULOMULASZTAS_OSSZES m
          INNER JOIN T_TANITASIORA_OSSZES o ON o.ID = m.C_TANITASIORAKID
        WHERE m.TOROLT = 'F' AND m.C_TIPUS = 1500
      ) y ON y.ID = m.ID
      INNER JOIN T_TANULO_OSSZES tn ON tn.ID = m.C_ORATANULOIID
      INNER JOIN T_TANTARGY_OSSZES t ON o.C_TANTARGYID = t.ID
      WHERE (f.C_MULASZTASKELL = 'T' OR f.C_MULASZTASKELL IS NULL) 
        AND tn.C_MAGANTANULO = 'T'
        AND m.C_INTEZMENYID = @intezmenyId 
        AND m.C_TANEVID = @tanevId 
      GROUP BY o.C_OSZTALYCSOPORTID, o.C_TANTARGYID, m.C_ORATANULOIID
    ) x
  ) xx
  LEFT JOIN (
    SELECT C_TANTARGYID, C_OSZTALYCSOPORTID, COUNT(1) AS MEGTARTOTT 
    FROM T_TANITASIORA_OSSZES 
    WHERE C_SORSZAMOZANDO = 'T'
    GROUP BY C_TANTARGYID, C_OSZTALYCSOPORTID 
  ) s ON s.C_TANTARGYID = xx.C_TANTARGYID AND s.C_OSZTALYCSOPORTID = xx.C_OSZTALYCSOPORTID
  LEFT JOIN (
    SELECT f.C_TANTARGYID, f.C_OSZTALYCSOPORTID, COUNT(1) AS JOVOBELI
    FROM T_NAPTARINAP_OSSZES n
      INNER JOIN T_ORARENDIORA_OSSZES r ON n.C_HETIREND = r.C_HETIREND AND n.C_HETNAPJA = r.C_HETNAPJA 
      INNER JOIN T_FOGLALKOZAS_OSSZES f ON f.ID = r.C_FOGLALKOZASID
    WHERE n.C_TANEVID = 13
      AND n.C_NAPDATUMA > (SELECT MAX(tora.C_DATUM) FROM T_TANITASIORA_OSSZES tora WHERE r.C_FOGLALKOZASID = tora.C_FOGLALKOZASID)
    GROUP BY f.C_TANTARGYID, f.C_OSZTALYCSOPORTID
  ) j ON j.C_TANTARGYID = xx.C_TANTARGYID AND j.C_OSZTALYCSOPORTID = xx.C_OSZTALYCSOPORTID
);
GO
