﻿IF OBJECT_ID('dbo.uspGetOsztalycsoportTantargyiMulasztasai') IS NOT NULL BEGIN
  DROP PROCEDURE dbo.uspGetOsztalycsoportTantargyiMulasztasai
END
GO

CREATE PROCEDURE dbo.uspGetOsztalycsoportTantargyiMulasztasai 
   @pOsztalyId int
  ,@pTantargyId int
  ,@pTanevid int
  ,@pIntezmenyId int
  ,@pCsakMegtartott bit /*0 - nem, 1 - igen */
AS
BEGIN
  SET NOCOUNT ON;
  
  DECLARE 
     @isResultTableDeclered bit = 0
    ,@oraPerc int
    ,@isIskolaiErdekuSzamit bit
    ,@sql nvarchar(max)
	
  SET @isIskolaiErdekuSzamit = dbo.fnGetRendszerbeallitasEnumBool(1683, @pIntezmenyId, @pTanevid)
  
  SET	@oraPerc = (
    SELECT ISNULL(csp.C_ORAPERC, 45) 
    FROM T_OSZTALYCSOPORT ocs
		  LEFT JOIN T_CSOPORT cs on cs.ID = ocs.ID AND cs.TOROLT = 'F'
			LEFT JOIN T_CSOPORTTIPUS csp ON csp.ID = cs.C_TIPUSA AND cs.TOROLT = 'F'
		WHERE ocs.ID = @pOsztalyId AND ocs.TOROLT = 'F')

  IF OBJECT_ID('tempdb..#OsztalyTanuloi') IS NOT NULL BEGIN
    DROP TABLE #OsztalyTanuloi
  END 
  CREATE TABLE #OsztalyTanuloi (
     TanuloId int 
    ,Belepes datetime
    ,Kilepes datetime
    ,PRIMARY KEY CLUSTERED (TanuloId)
  )

  INSERT INTO #OsztalyTanuloi (TanuloId)
  SELECT DISTINCT C_TANULOID 
  FROM T_TANULOCSOPORT_OSSZES 
  WHERE C_OSZTALYCSOPORTID = @pOsztalyId
    AND C_TANEVID = @pTanevId
    AND TOROLT = 'F'

  IF OBJECT_ID('tempdb..#Result') IS NULL BEGIN
    SET @isResultTableDeclered = 1;
    
    CREATE TABLE #Result (
       TanuloId int 
      ,TantargyId int
      ,Mulasztas int
      ,MegtartottOra int
      ,HatralevoOra int
      ,PRIMARY KEY CLUSTERED (TanuloId, TantargyId)
    )
  END 

  SET @sql = N' 
  INSERT INTO #Result (     
     TanuloId
    ,TantargyId
    ,Mulasztas
    ,MegtartottOra
    ,HatralevoOra
  ) SELECT 
     ot.TanuloId
    ,tn.C_TANTARGYID AS TantargyId
    ,SUM(IIF(C_TIPUS = 1500, 1, 0)) + (SUM(IIF(C_TIPUS = 1499, C_KESESPERCBEN, 0)) / @pOraPerc) AS Mulasztas
    ,COUNT(DISTINCT tn.ID) AS MegtartottOra
    ,IIF(@pCsakMegtartott = 1, NULL, 0) AS HatralevoOra
  FROM T_TANULOCSOPORT_OSSZES tcs
    INNER JOIN #OsztalyTanuloi ot ON tcs.C_TANULOID = ot.TanuloId
    INNER JOIN T_TANITASIORA_OSSZES tn 
       ON tn.C_OSZTALYCSOPORTID = tcs.C_OSZTALYCSOPORTID 
      AND tn.C_BEJEGYZESIDEJE >= tcs.C_BELEPESDATUM 
      AND tn.C_BEJEGYZESIDEJE < ISNULL(tcs.C_KILEPESDATUM, ''21000101'')
      AND tn.C_MEGTARTOTT = ''T'' AND tn.TOROLT = ''F'' 
    LEFT JOIN T_TANULOMULASZTAS_OSSZES tm 
       ON tm.C_TANITASIORAKID = tn.ID 
      AND tm.C_ORATANULOIID = ot.TanuloId 
      AND tm.C_TIPUS BETWEEN 1499 AND 1500
      AND tm.TOROLT = ''F''
      ' + IIF(@isIskolaiErdekuSzamit = 0, 'AND ISNULL(tm.C_IGAZOLASTIPUSA,-1) <> 1533', '') + '
  WHERE tcs.TOROLT = ''F''
    ' + IIF(@pTantargyId IS NULL, '', 'AND tn.C_TANTARGYID = @pTantargyId') + '
  GROUP BY ot.TanuloId, tn.C_TANTARGYID
  '
  
  EXEC sys.sp_executesql @sql, N'
     @pTantargyId int
    ,@pOraPerc int
    ,@pCsakMegtartott bit'
    ,@pTantargyId = @pTantargyId
    ,@pOraPerc = @oraPerc
    ,@pCsakMegtartott = @pCsakMegtartott
  
  IF @pCsakMegtartott = 0 BEGIN
    CREATE TABLE #OrarendTable (
       Id int
      ,ORARENDIID INT
      ,Datum datetime
      ,Bontott char(1)
      ,Hetirend int
      ,HetNapja int
      ,HetSorszam int
      ,ErvenyessegKezdete datetime
      ,ErvenyessegVege datetime
      ,OraKezdete datetime
      ,OraVege datetime
      ,Oraszam int
      ,TargyNev nvarchar(300)
      ,TargyNevForMobile nvarchar(300)
      ,TargykategoriaID int
      ,Megtartott char(1)
      ,CsengetesiRendOraID int
      ,CsengetesiRendID int
      ,MaxNapiOraszam int
      ,OsztalyNev nvarchar(255)
      ,TanevRendOsztalyCsoportId int
      ,MegjelenesOka nvarchar(300)
      ,TanarNev nvarchar(255)
      ,TeremNev nvarchar(255)
      ,OraTipus nvarchar(200)
      ,Hianyzas char(1)
      ,Keses char(1)
      ,Ures char(1)
      ,HelyettesitoTanarID int
      ,HelyettesitoTanarNev nvarchar(255)
	  ,HelyettesitesId int
      ,TanarID int
      ,AdminAltalKiirt  char(1)
      ,GroupId int
      ,Tema nvarchar(max)
      ,TantargyId int
      ,OsztCsopId int
      ,INDEX IX_TanevRendOsztalyCsoportId CLUSTERED (TanevRendOsztalyCsoportId)
    )
    
    DECLARE @idoszakKezdete datetime = GETDATE()
    DECLARE @idoszakVege datetime
    
    SELECT @idoszakVege = C_NAPDATUMA 
    FROM T_NAPTARINAP
    WHERE C_NAPTIPUSA = 1395 
      AND C_TANEVID = @pTanevId

	IF @idoszakVege IS NULL SET @idoszakVege = (
		SELECT C_UTOLSOTANITASINAP 
		FROM T_TANEV
		WHERE ID = @pTanevid
		AND TOROLT = 'F')
    
    INSERT INTO #OrarendTable (
      Id,ORARENDIID,Datum,Bontott,Hetirend,HetNapja,HetSorszam,ErvenyessegKezdete,ErvenyessegVege,OraKezdete,OraVege,Oraszam,
      TargyNev,TargyNevForMobile,TargykategoriaID,Megtartott,CsengetesiRendOraID,CsengetesiRendID,MaxNapiOraszam,OsztalyNev,TanevRendOsztalyCsoportId,
      MegjelenesOka,TanarNev,TeremNev,OraTipus,Hianyzas,Keses,Ures,HelyettesitoTanarID,HelyettesitoTanarNev,HelyettesitesId,TanarID,AdminAltalKiirt,GroupId,Tema,TantargyId,OsztCsopId)
    EXEC sp_GetOrarend 
       @pIntezmenyId = @pIntezmenyId
      ,@pTanevId = @pTanevId
      ,@pIdoszakKezdete = @idoszakKezdete
      ,@pIdoszakVege = @idoszakVege
      ,@pTanarId = NULL
      ,@pIsHelyettesitesNelkul  = 0
      ,@pOsztalyCsoportId  =  @pOsztalyId
      ,@pTanuloId = NULL
      ,@pTantargyId  = @pTantargyId
      ,@pTeremId = NULL
      ,@pCsakOrarendiOrak  = 0
      ,@pIsNapirend = 0      
  
    UPDATE r
    SET
      r.HatralevoOra = ISNULL(o.HatralevoOra, 0)
    FROM #Result r
    LEFT JOIN (
      SELECT
        ot.TanuloId, COUNT(1) AS HatralevoOra
      FROM T_TANULOCSOPORT tcs 
        INNER JOIN #OrarendTable oo ON tcs.C_OSZTALYCSOPORTID = oo.TanevRendOsztalyCsoportId
        INNER JOIN #OsztalyTanuloi ot ON tcs.C_TANULOID = ot.TanuloId AND oo.Datum >= tcs.C_BELEPESDATUM AND oo.Datum < ISNULL(tcs.C_KILEPESDATUM, '21000101') 
      GROUP BY ot.TanuloId
    ) o ON o.TanuloId = r.TanuloId
  END 

  IF @isResultTableDeclered = 1 BEGIN
    SELECT
       TanuloId
      ,TantargyId
      ,Mulasztas
      ,MegtartottOra
      ,HatralevoOra
    FROM #Result
  END
END
GO