﻿DROP PROCEDURE IF EXISTS [dbo].[uspGetTanulokMulasztasaiKesesei]
GO

-- ==========================================================================================
-- Description:  <Az osztoly/csoport tanulóinak vagy egy adott tanulónak a mulasztásai>
-- ==========================================================================================
CREATE PROCEDURE [dbo].[uspGetTanulokMulasztasaiKesesei]
   @pIntezmenyId INT
  ,@pTanevId INT
  ,@pOsztalyCsoportId INT = NULL
  ,@pTanuloId INT = NULL
  ,@pIsCsoportVez INT = 0
  ,@pSzervezetTipusId INT = NULL
AS 
BEGIN

SET NOCOUNT ON;

DECLARE 
     @maxdate DATETIME = CONVERT(DATETIME, '2999-12-31', 120)
    ,@osztalyCsoportNev NVARCHAR(200)
    --,@elmeletiOraPercben INT = 45 -- ha kiderül, hogy valóban szükség van ezekre, akkor majd implementálni kell
    --,@gyakorlatiOraPercben INT = 45 -- de egyelőre be van égetve a lekérdezésbe
  
SELECT @osztalyCsoportNev = C_NEV FROM T_OSZTALYCSOPORT WHERE ID = @pOsztalyCsoportId AND TOROLT = 'F'

CREATE TABLE #TanuloCsoportok(
    TanuloId INT,
    OsztalyCsoportId INT,
    Belepes DATETIME,
    Kilepes DATETIME,
    IsTanoraiCelu BIT,
    IsOsztaly BIT,
    PRIMARY KEY CLUSTERED (TanuloId, OsztalyCsoportId, Belepes, Kilepes)
);

INSERT INTO #TanuloCsoportok(TanuloId, OsztalyCsoportId, Belepes, Kilepes, IsTanoraiCelu, IsOsztaly)
SELECT
    tcs.C_TANULOID AS TanuloId, 
    tcs.C_OSZTALYCSOPORTID AS OsztalyCsoportId,
    tcs.C_BELEPESDATUM AS Belepes,
    ISNULL(tcs.C_KILEPESDATUM, @maxdate) AS Kilepes,
    CASE WHEN cst.C_ISTANORAICELU = 'T' THEN 1 
         WHEN cst.C_ISTANORAICELU IS NULL AND ocs.C_FELADATKATEGORIAID = 7553 THEN 1
         ELSE 0 
    END AS IsTanoraiCelu,
    CASE WHEN cs.ID IS NULL THEN 1 ELSE 0 END AS IsOsztaly
FROM (

    SELECT DISTINCT
            tcs2.C_TANULOID, 
            tcs2.C_OSZTALYCSOPORTID,
            tcs2.C_BELEPESDATUM,
            tcs2.C_KILEPESDATUM
    FROM T_TANULOCSOPORT_OSSZES tcs1
    INNER JOIN T_TANULOCSOPORT_OSSZES tcs2 ON  tcs2.C_INTEZMENYID = tcs1.C_INTEZMENYID 
                                           AND tcs2.C_TANEVID = tcs1.C_TANEVID 
                                           AND tcs2.C_TANULOID = tcs1.C_TANULOID 
                                           AND tcs2.TOROLT = 'F'
    WHERE tcs1.TOROLT = 'F' 
    AND tcs1.C_INTEZMENYID = @pIntezmenyId
    AND tcs1.C_TANEVID = @pTanevId
    AND tcs1.C_OSZTALYCSOPORTID = CASE WHEN @pOsztalyCsoportId IS NOT NULL AND @pTanuloId IS NULL THEN @pOsztalyCsoportId ELSE tcs1.C_OSZTALYCSOPORTID END
    AND tcs2.C_TANULOID = CASE WHEN @pTanuloId IS NOT NULL THEN @pTanuloId ELSE tcs2.C_TANULOID END
    AND (
        (@pTanuloId IS NOT NULL OR tcs1.C_BELEPESDATUM <= GETDATE()) 
        AND 
        (@pTanuloId IS NOT NULL OR (tcs1.C_KILEPESDATUM > GETDATE() OR tcs1.C_KILEPESDATUM IS NULL))
    )

) tcs
LEFT JOIN T_CSOPORT_OSSZES cs       ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.TOROLT = 'F'
LEFT JOIN T_CSOPORTTIPUS_OSSZES cst ON  cst.ID = cs.C_TIPUSA 
                                    AND cst.C_ALINTEZMENYID = cs.C_ALINTEZMENYID 
                                    AND cst.C_ALTANEVID = cs.C_ALTANEVID 
                                    AND cst.TOROLT = 'F'
LEFT JOIN T_OSZTALYCSOPORT ocs      ON ocs.ID = tcs.C_OSZTALYCSOPORTID AND ocs.TOROLT = 'F'
WHERE @pSzervezetTipusId IS NULL OR tcs.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
    
SELECT
     fh.ID AS TanuloId
    ,fh.C_NYOMTATASINEV AS TanuloNev
    ,fh.C_SZULETESIDATUM AS SzuletesiIdo
    ,fh.C_ANYJANEVE AS AnyjaNeve
    ,@osztalyCsoportNev AS OsztCsopNev
    ,@pOsztalyCsoportId AS OsztalyCsoportId
    ,ISNULL(x.[Potlas], 0) AS Potlas
    ,ISNULL(x.[Szabadsag], 0) AS Szabadsag
    ,ISNULL(x.[Tappenz], 0) AS Tappenz
    ,ISNULL(x.[BetegSzabadsag], 0) AS BetegSzabadsag
    ,ISNULL(x.[hianyzasIgazolandoTanorai], 0) AS TanoraiHianyzasIgazolando
    ,ISNULL(x.[hianyzasIgazolandoTanoranKivuli], 0) AS TanoranKivuliHianyzasIgazolando
    ,ISNULL(x.[hianyzasIgazoltTanorai], 0) AS TanoraiHianyzasIgazolt
    ,ISNULL(x.[hianyzasIgazoltTanoranKivuli], 0) AS TanoranKivuliHianyzasIgazolt
    ,ISNULL(x.[hianyzasIgazolatlanTanorai], 0) AS TanoraiHianyzasIgazolatlan
    ,ISNULL(x.[hianyzasIgazolatlanTanoranKivuli], 0) AS TanoranKivuliHianyzasIgazolatlan
    ,ISNULL(x.[kesesIgazolandoTanorai], 0) AS TanoraiKesesDarabszamIgazolando
    ,ISNULL(x.[kesesIgazoltTanorai], 0) AS TanoraiKesesDarabszamIgazolt
    ,ISNULL(x.[kesesIgazolatlanTanorai], 0) AS TanoraiKesesDarabszamIgazolatlan
    ,ISNULL(x.[kesesIgazolandoTanoraiPerc], 0) AS TanoraiKesesIgazolandoPerc
    ,ISNULL(x.[kesesIgazoltTanoraiPerc], 0) AS TanoraiKesesIgazoltPerc
    ,ISNULL(x.[kesesIgazolatlanTanoraiPerc], 0) AS TanoraiKesesIgazolatlanPerc
    ,ISNULL(x.[kesesIgazolandoTanoraiPluszOra], 0) AS SzamitottKesesIgazolando
    ,ISNULL(x.[kesesIgazoltTanoraiPluszOra], 0) AS SzamitottKesesIgazolt
    ,ISNULL(x.[kesesIgazolatlanTanoraiPluszOra], 0) AS SzamitottKesesIgazolatlan
FROM T_FELHASZNALO_OSSZES fh
LEFT JOIN (
      
    SELECT 
        m.C_ORATANULOIID as TanuloId,
        -- Mulasztások
        SUM(CASE WHEN m.C_TIPUS = 9114 THEN 1 ELSE 0 END) as [Potlas],
        SUM(CASE WHEN m.C_TIPUS = 9084 THEN 1 ELSE 0 END) as [Szabadsag],
        SUM(CASE WHEN m.C_TIPUS = 9112 THEN 1 ELSE 0 END) as [Tappenz],
        SUM(CASE WHEN m.C_TIPUS = 9113 THEN 1 ELSE 0 END) as [BetegSzabadsag],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [hianyzasIgazolandoTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 0  THEN 1 ELSE 0 END) as [hianyzasIgazolandoTanoranKivuli],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [hianyzasIgazoltTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 0 THEN 1 ELSE 0 END) as [hianyzasIgazoltTanoranKivuli],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [hianyzasIgazolatlanTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1500 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 0 THEN 1 ELSE 0 END) as [hianyzasIgazolatlanTanoranKivuli],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [kesesIgazolandoTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [kesesIgazoltTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 1 THEN 1 ELSE 0 END) as [kesesIgazolatlanTanorai],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 0 THEN 1 ELSE 0 END) as [kesesIgazolandoTanoranKivuli],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 0 THEN 1 ELSE 0 END) as [kesesIgazoltTanoranKivuli],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 0 THEN 1 ELSE 0 END) as [kesesIgazolatlanTanoranKivuli],
        -- Késések percekben
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) as [kesesIgazolandoTanoraiPerc],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) as [kesesIgazoltTanoraiPerc],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) as [kesesIgazolatlanTanoraiPerc],
        -- Késések órákban
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT IS NULL and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) / 45 as [kesesIgazolandoTanoraiPluszOra],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'T' and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) / 45 as [kesesIgazoltTanoraiPluszOra],
        SUM(CASE WHEN m.C_TIPUS = 1499 and m.C_IGAZOLT = 'F' and cs.IsTanoraiCelu = 1 THEN m.C_KESESPERCBEN ELSE 0 END) / 45 as [kesesIgazolatlanTanoraiPluszOra]
    FROM T_TANULOMULASZTAS_OSSZES m  
    INNER JOIN T_TANITASIORA_OSSZES tn ON tn.ID = m.C_TANITASIORAKID
    INNER JOIN #TanuloCsoportok cs ON  cs.OsztalyCsoportId = tn.C_OSZTALYCSOPORTID 
                                   AND cs.TanuloId = m.C_ORATANULOIID
                                   AND cs.Belepes <= tn.C_DATUM
                                   AND cs.Kilepes > tn.C_DATUM
    --LEFT JOIN T_TANTARGY t ON t.ID = tn.C_TANTARGYID -- amíg az órák hossza konstans 45 perc, addig erre nincs szükség
    WHERE m.C_INTEZMENYID = @pIntezmenyId 
    AND m.C_TANEVID = @pTanevId 
    AND m.TOROLT = 'F'
    AND m.C_TIPUS <> 1817
    AND tn.C_OSZTALYCSOPORTID = CASE WHEN @pIsCsoportVez = 1 THEN @pOsztalyCsoportId ELSE tn.C_OSZTALYCSOPORTID END
    AND EXISTS(SELECT * FROM #TanuloCsoportok tcs1 WHERE tcs1.TanuloId = m.C_ORATANULOIID AND tcs1.OsztalyCsoportId = @pOsztalyCsoportId AND tn.C_DATUM >= tcs1.Belepes AND tn.C_DATUM < tcs1.Kilepes)
    GROUP BY m.C_ORATANULOIID
      
) x ON x.TanuloId = fh.ID
WHERE EXISTS(SELECT * FROM #TanuloCsoportok tcs2 where tcs2.TanuloId = fh.ID)

END
GO