DROP PROCEDURE IF EXISTS uspGetSzakkepzesiJuttatasokTanulok
GO

CREATE PROCEDURE [dbo].[uspGetSzakkepzesiJuttatasokTanulok]
   @pTanevId int
  ,@pIntezmenyId int
  ,@pDatum datetime
  ,@pTanuloNeve nvarchar(510) = NULL
  ,@pOktatasiAzonosito nvarchar(40) = NULL
  ,@pEvfolyamTipusaId int = NULL
  ,@pFeladatKategoria int = NULL
  ,@pJogosultsag char(1) = NULL
  ,@pJuttatasOsszege int = NULL
  ,@pOsztalyId int = NULL
  ,@pJuttatasTipus int
  ,@pOsszevonas nvarchar(100) = NULL
  ,@pTanuloTipus int = NULL
  ,@pApaczaiJogosultEvfolyamIdList NVARCHAR(MAX) = NULL

AS BEGIN
  SET NOCOUNT ON

  DECLARE @sql nvarchar(MAX)

  IF @pJuttatasTipus = 8618
  BEGIN
    CREATE TABLE #apaczaiJogosultEvfolyamok (ID int)
    INSERT INTO #apaczaiJogosultEvfolyamok
    SELECT value FROM string_split(@pApaczaiJogosultEvfolyamIdList, ',')
  END


  SET @sql = N'
    SET @pDatum = DATEADD(month, -1, @pDatum)

    DECLARE @defaultJuttatasHatarnap int = 15
    DECLARE @tanevUtlsoNapja DATE = (SELECT C_UTOLSONAP FROM T_TANEV_OSSZES WHERE ID=@pTanevId AND TOROLT = ''F'')
    DECLARE @utolsoNapTanevRendje DATE = (SELECT TOP 1 C_DATUM FROM T_TANEVRENDJE_OSSZES WHERE C_NAPTIPUSA = 1395 AND C_TANEVID = @pTanevId AND TOROLT = ''F'')
    DECLARE @utolsoNapTanev DATE = (SELECT TOP 1 C_UTOLSOTANITASINAP FROM T_TANEV_OSSZES WHERE ID = @pTanevId AND TOROLT = ''F'')

    DECLARE @isVegzos CHAR(1) = IIF(@pOsztalyId IS NOT NULL ,(SELECT TOP 1  C_VEGZOSEVFOLYAM FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @pOsztalyId), ''F'')
    DECLARE @vegzosUtolsoNap DATE = (SELECT dbo.fnGetOsztalyVegzosTanitasiNap(@pOsztalyId, @pIntezmenyId, @pTanevId))

    DECLARE @elsoNap DATE = (SELECT TOP 1 C_KEZDONAP FROM T_TANEV_OSSZES WHERE ID = @pTanevId AND TOROLT = ''F'')
    DECLARE @utolsoNap DATE = IIF(@isVegzos = ''T'', COALESCE(@vegzosUtolsoNap, @utolsoNapTanevRendje, @utolsoNapTanev), ISNULL(@utolsoNapTanevRendje, @utolsoNapTanev))

    IF @pDatum < @elsoNap BEGIN
      SET @pDatum = @elsoNap
    END
    IF @pDatum > @utolsoNap BEGIN
      SET @pDatum = @utolsoNap
    END

    DECLARE @elseje datetime = DATETIMEFROMPARTS(DATEPART(year, @pDatum), DATEPART(month, @pDatum), 1, 0, 0, 0, 0)
    DECLARE @juttatasHatarnap int = (SELECT ISNULL(DATEPART(day, C_JUTTATASHATARNAP), @defaultJuttatasHatarnap) FROM T_INTEZMENYADATOK_OSSZES WHERE C_TANEVID = @pTanevId AND TOROLT = ''F'') + 1

    CREATE TABLE #tanulok (
       TanuloId int
      ,TanuloNeve nvarchar(510)
      ,OktatasiAzonosito nvarchar(40)
      ,AnyjaNeve nvarchar(128)
      ,SzuletesiHelye nvarchar(100)
      ,SzuletesiIdeje datetime
      ,Evfolyam int
      ,Osztaly nvarchar(510)
      ,OsztalyId int
      ,BelepesDatum datetime
      ,KilepesDatum datetime
      ,TanuloCsoportId int
      ,Beszamitasos char(1)'
  IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      ,SzakmaiVizsgaEredmenye float
      ,SzakmaiVizsgaSzakkepesitesMegnevezese nvarchar(200)
      ,IsJavitoVizsga char(1)
      ,IsPotloVizsga char(1)
      ,SzakmaiVizsgaSzakkepesitesAzonosito nvarchar(30)
      ,VizsgaDatum datetime
      ,BizonyitvanySzama varchar(100)'
  END
  ELSE IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
      ,KeziAtlag float
      ,SzamitottAtlag float
      ,Szazalek int
      ,Bankszamlaszam nvarchar(48)
      ,IdpEgyediAzonosito uniqueidentifier'
  END
  SET @sql += N')
      '
  IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
    CREATE TABLE #osszevonasok (generalthonap int)

    INSERT INTO #osszevonasok
    SELECT value FROM string_split(@pOsszevonas, '','')
    '
  END

  IF @pTanuloTipus = 1
  BEGIN
    SET @sql += N'
    CREATE TABLE #odDiakok (tanuloId int)
    INSERT INTO #odDiakok
    SELECT t.ID FROM T_TANULO_OSSZES t
      INNER JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_TANULOID = t.ID 
        AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM > GETDATE())
        AND tcs.TOROLT = ''F''
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID 
        AND ocs.C_EVFOLYAMTIPUSA in (7904, 7889, 7868)
        AND ocs.C_FELADATKATEGORIAID = @pFeladatKategoria
        AND ocs.TOROLT = ''F''
      INNER JOIN T_OSZTALY_OSSZES o ON o.ID = ocs.ID
        AND o.TOROLT = ''F''
      INNER JOIN T_INTEZMENYADATOK ia ON ia.C_TANEVID = t.C_ALTANEVID
        AND ia.C_ISSZAKKEPZOJUTTATAS = ''T''
        AND ia.TOROLT = ''F''
    WHERE t.C_ALTANEVID = @pTanevId 
      AND t.TOROLT = ''F''
    UNION
    SELECT t.ID FROM T_TANULO_OSSZES t
      INNER JOIN T_INTEZMENYADATOK ia ON ia.C_TANEVID = t.C_ALTANEVID
        AND ia.C_ISSZAKKEPZOJUTTATAS = ''T''
        AND ia.TOROLT = ''F''
    WHERE t.C_ISBESZAMITASOS = ''T'' 
      AND t.C_ALTANEVID = @pTanevId 
      AND t.TOROLT = ''F''
    UNION
    SELECT t.ID FROM T_TANULO_OSSZES t
      INNER JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_TANULOID = t.ID 
        AND (tcs.C_KILEPESDATUM IS NULL OR tcs.C_KILEPESDATUM > GETDATE())
        AND tcs.TOROLT = ''F''
      INNER JOIN T_TANULOTANUGYIADATOK_OSSZES tta ON tta.C_TANULOCSOPORTID = tcs.ID
        AND (tta.C_AGAZATUJSZKTTIPUSID <> 7920 OR tta.C_SZAKMATIPUSID <> 7946) -- AgazatUjSzktTipus.Na, SzakmaTipus.Na
        AND tta.TOROLT = ''F''
      INNER JOIN T_INTEZMENYADATOK ia ON ia.C_TANEVID = t.C_ALTANEVID
        AND ia.C_ISSZAKKEPZOJUTTATAS = ''T''
        AND ia.TOROLT = ''F''
    WHERE t.C_ALTANEVID = @pTanevId 
      AND t.TOROLT = ''F''
    '
  END
  
  SET @sql += N'
    INSERT INTO #tanulok
    SELECT
       f.ID AS TanuloId
      ,f.C_NYOMTATASINEV AS TanuloNeve
      ,f.C_OKTATASIAZONOSITO as OktatasiAzonosito
      ,f.C_ANYJANEVE AS AnyjaNeve
      ,f.C_SZULETESIHELY AS SzuletesiHelye
      ,f.C_SZULETESIDATUM AS SzuletesiIdeje
      ,IIF(evtip.C_ISOSSZEVONT = ''T'', tta.C_TANULOEVFOLYAMTIPUSID, evtip.ID) AS Evfolyam
      ,ocs.C_NEV AS Osztaly
      ,ocs.ID AS OsztalyId
      ,tcs.C_BELEPESDATUM AS BelepesDatum
      ,tcs.C_KILEPESDATUM AS KilepesDatum
      ,tcs.ID AS TanuloCsoportId
      ,ISNULL(tta.C_ISBESZAMITASOS, t.C_ISBESZAMITASOS) Beszamitasos'
  IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      ,epj.C_ERDEMJEGY AS SzakmaiVizsgaEredmenye
      ,epj.C_SZAKKEPESITESMEGNEVEZES AS SzakmaiVizsgaSzakkepesitesMegnevezese
      ,epj.C_ISJAVITOVIZSGA AS IsJavitoVizsga
      ,epj.C_ISPOTVIZSGA AS IsPotloVizsga
      ,epj.C_SZAKKEPESITESAZONOSITO AS SzakmaiVizsgaSzakkepesitesAzonosito
      ,epj.C_VIZSGADATUM AS VizsgaDatum
      ,epj.C_BIZONYITVANYSZAMA AS BizonyitvanySzama'
  END
  ELSE IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
      ,t.C_KEZIATLAG AS KeziAtlag
      ,t.C_SZAMITOTTATLAG AS SzamitottAtlag
      ,dbo.fnGetOsztondijSzazalek(ISNULL(tta.C_ISBESZAMITASOS, t.C_ISBESZAMITASOS)
        ,ISNULL(tta.C_ISBESZAMITASOSFIXSZAZALEK,t.C_ISBESZAMITASOSFIXSZAZALEK)
        ,ISNULL(t.C_KEZIATLAG, t.C_SZAMITOTTATLAG)
        ,CASE WHEN evtip.C_ISOSSZEVONT = ''T''
          THEN dibCodetta.C_CODE
          ELSE dibCodeocs.C_CODE
          END
        ,IIF(ocs.C_EVFOLYAMTIPUSA IN  (7866,7883),''T'',''F'')
        ,t.C_ISSIKERESAGAZATIVIZSGA
        ,t.C_ISATLAGSZAKKEPZESI
        ) AS Szazalek
      ,t.C_BANKSZAMLASZAM AS Bankszamlaszam
      ,f.C_IDPEGYEDIAZONOSITO AS IdpEgyediAzonosito'
  END
  SET @sql += N'
    FROM T_FELHASZNALO_OSSZES f
      INNER JOIN T_TANULO_OSSZES t ON t.ID = f.ID AND t.TOROLT = ''F''
      INNER JOIN T_TANULOCSOPORT_OSSZES tcs ON tcs.C_TANULOID = t.ID 
        AND tcs.TOROLT = ''F''
      LEFT JOIN T_TANULOCSOPORT_OSSZES tcs2 on tcs2.C_TANULOID = t.ID
        AND (tcs.C_KILEPESDATUM < tcs2.C_KILEPESDATUM OR (tcs.C_KILEPESDATUM IS NOT NULL AND tcs2.C_KILEPESDATUM IS NULL))
        AND tcs2.TOROLT = ''F''
      INNER JOIN T_OSZTALY_OSSZES o ON o.ID = tcs.C_OSZTALYCSOPORTID AND o.TOROLT = ''F''
      INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = o.ID AND ocs.TOROLT = ''F''
      INNER JOIN T_DICTIONARYITEMBASE_OSSZES dibCodeocs ON dibCodeocs.ID = ocs.C_EVFOLYAMTIPUSA AND dibCodeocs.C_TANEVID = ocs.C_TANEVID AND dibCodeocs.TOROLT = ''F''
      INNER JOIN T_EVFOLYAMTIPUS_OSSZES evtip ON evtip.ID = ocs.C_EVFOLYAMTIPUSA AND evtip.TOROLT = ''F'' AND evtip.C_ALTANEVID = ocs.C_TANEVID
    '
  SET @sql += IIF(@pFeladatKategoria IS NOT NULL, N'
        AND ocs.C_FELADATKATEGORIAID = @pFeladatKategoria', '')
  
  IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      AND ocs.C_VEGZOSEVFOLYAM = ''T''
    '
  END
  
  SET @sql += N'
      LEFT JOIN T_TANULOTANUGYIADATOK_OSSZES tta ON tta.C_TANULOCSOPORTID = tcs.ID AND tta.TOROLT = ''F''
      LEFT JOIN T_DICTIONARYITEMBASE_OSSZES dibCodetta ON dibCodetta.ID = tta.C_TANULOEVFOLYAMTIPUSID AND dibCodetta.C_TANEVID = tta.C_TANEVID AND dibCodetta.TOROLT = ''F'''
  IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      LEFT JOIN T_EPJTANULOIADAT_OSSZES epj ON epj.C_TANULOID = t.ID AND epj.TOROLT = ''F'' AND epj.C_ISAKTIV = ''T''
    '
  END

  IF @pTanuloTipus = 1
  BEGIN
    SET @sql += N'
      INNER JOIN #odDiakok odDiakok ON odDiakok.tanuloId = f.ID
    '
  END

  SET @sql += N'
    WHERE f.C_TANEVID = @pTanevId
      AND f.TOROLT = ''F''
      AND tcs2.ID IS NULL

    SELECT 
       tanulok.TanuloId
      ,tanulok.TanuloNeve
      ,tanulok.OktatasiAzonosito
      ,tanulok.AnyjaNeve
      ,tanulok.SzuletesiHelye
      ,tanulok.SzuletesiIdeje
      ,tanulok.Evfolyam 
      ,tanulok.Osztaly
      ,tanulok.OsztalyId
      '
  IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
      ,CASE
        -- van összevonás, de csak aktuális értéket kapok
        WHEN @pOsszevonas IS NOT NULL AND COUNT(j.C_ISJOGOSULT) = 1 THEN MAX(j.C_ISJOGOSULT)  
        -- van összevonás, és két értéket kapok, akkor csak akkor nem jogosult, ha mindkettő nem jogosult
        WHEN @pOsszevonas IS NOT NULL AND COUNT(j.C_ISJOGOSULT) > 1 THEN IIF(AVG(IIF(j.C_ISJOGOSULT = ''T'', 1.0, 0.0)) = 0, ''F'', ''T'') 
        -- nincs összevonás, csak aktuális értéket kapok
        ELSE MAX(j.C_ISJOGOSULT)
      END AS Jogosultsag
      ,CASE
        -- van összevonás, de csak aktuális értéket kapok
        WHEN @pOsszevonas IS NOT NULL AND COUNT(j.C_ELUTASITASOKA) = 1 THEN MAX(j.C_ELUTASITASOKA)
        -- van összevonás, és több értéket kapok, akkor az elutasítás oka csak akkor 0-tól különböző, ha a hozzá tartozó jogoslutság minden esetben F
        -- ilyenkor az elutasítás okokat bit szerint összesítjük, és megjelenítjük az összes okot, ami szerepelt az értékekben
        WHEN @pOsszevonas IS NOT NULL AND COUNT(j.C_ELUTASITASOKA) > 1 THEN IIF(AVG(IIF(j.C_ISJOGOSULT = ''T'', 1.0, 0.0)) = 0, 
          MAX(j.C_ELUTASITASOKA & 0x01)
          + MAX(j.C_ELUTASITASOKA & 0x02)
          + MAX(j.C_ELUTASITASOKA & 0x04)
          + MAX(j.C_ELUTASITASOKA & 0x08)
          + MAX(j.C_ELUTASITASOKA & 0x10)
          + MAX(j.C_ELUTASITASOKA & 0x20)
          + MAX(j.C_ELUTASITASOKA & 0x40)
          + MAX(j.C_ELUTASITASOKA & 0x80)
          + MAX(j.C_ELUTASITASOKA & 0x100)
          + MAX(j.C_ELUTASITASOKA & 0x200)
          + MAX(j.C_ELUTASITASOKA & 0x400)
          + MAX(j.C_ELUTASITASOKA & 0x800)
          + MAX(j.C_ELUTASITASOKA & 0x1000)
          + MAX(j.C_ELUTASITASOKA & 0x2000)
          + MAX(j.C_ELUTASITASOKA & 0x4000)
          + MAX(j.C_ELUTASITASOKA & 0x8000), 0)
        -- nincs összevonás, csak aktuális értéket kapok
        ELSE MAX(j.C_ELUTASITASOKA)
      END AS NemJogosultsagOka
      ,CASE
        WHEN @pOsszevonas IS NOT NULL AND COUNT(j.ID) = 1 THEN SUM(2*j.C_OSSZEG)
        ELSE IIF(SUM(IIF(j.C_ISJOGOSULT = ''T'', j.C_OSSZEG, 0)) = 0, NULL, SUM(IIF(j.C_ISJOGOSULT = ''T'', j.C_OSSZEG, 0)))
      END AS OsztondijOsszege
      '
  END
  ELSE IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      ,j.C_ISJOGOSULT AS Jogosultsag
      ,j.C_ELUTASITASOKA AS NemJogosultsagOka
      ,j.C_OSSZEG AS OsztondijOsszege
    '
  END
  SET @sql += N'
      ,tanulok.Beszamitasos AS Beszamitasos
  '
  IF @pJuttatasTipus = 8617
  BEGIN
    SET @sql += N'
      ,tanulok.SzakmaiVizsgaEredmenye AS SzakmaiVizsgaEredmenye
      ,tanulok.SzakmaiVizsgaSzakkepesitesMegnevezese AS SzakmaiVizsgaSzakkepesitesMegnevezese
      ,tanulok.IsJavitoVizsga AS IsJavitoVizsga
      ,tanulok.IsPotloVizsga AS IsPotloVizsga
      ,tanulok.SzakmaiVizsgaSzakkepesitesAzonosito AS SzakmaiVizsgaSzakkepesitesAzonosito
      ,tanulok.VizsgaDatum AS VizsgaDatum
      ,tanulok.BizonyitvanySzama AS BizonyitvanySzama
    '
  END
  ELSE IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
      ,tanulok.KeziAtlag
      ,tanulok.SzamitottAtlag
      ,tanulok.Szazalek
      ,tanulok.Bankszamlaszam
      ,tanulok.IdpEgyediAzonosito
    '
  END
  SET @sql += N'
    FROM #tanulok tanulok
      LEFT JOIN T_JUTTATAS_OSSZES j ON j.C_TANULOID = tanulok.TanuloId 
        AND (j.C_ISAKTIV = ''T'' 
        '
  IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
          OR (@pOsszevonas IS NOT NULL AND j.C_GENERALTHONAP in (SELECT generalthonap from #osszevonasok))
        '
  END
  SET @sql += N'
        )
        AND j.C_JUTTATASTIPUSID = @pJuttatasTipus AND j.TOROLT = ''F''
  '
  IF @pJuttatasTipus = 8618
  BEGIN
    SET @sql += N'INNER JOIN #apaczaiJogosultEvfolyamok apaczaiJogosultEvfolyamok ON apaczaiJogosultEvfolyamok.ID = tanulok.Evfolyam
    '
  END

  SET @sql += N'WHERE 1 = 1
  '

  SET @sql += IIF(@pTanuloNeve IS NOT NULL AND @pTanuloNeve <> '', ' AND tanulok.TanuloNeve LIKE ''%'' + @pTanuloNeve + ''%'' ', '')
  SET @sql += IIF(@pOktatasiAzonosito IS NOT NULL, ' AND tanulok.OktatasiAzonosito LIKE ''%'' + @pOktatasiAzonosito + ''%'' ', '')
  SET @sql += IIF(@pEvfolyamTipusaId IS NOT NULL, ' AND tanulok.Evfolyam = @pEvfolyamTipusaId', '')
  SET @sql += IIF(@pOsztalyId IS NOT NULL, ' AND tanulok.OsztalyId = @pOsztalyId', '')
  SET @sql += IIF(@pJogosultsag IS NOT NULL, ' AND j.C_ISJOGOSULT = @pJogosultsag','')
  SET @sql += IIF(@pJuttatasOsszege IS NOT NULL, IIF(@pJuttatasOsszege = 0, ' AND (j.C_OSSZEG = 0 OR j.C_OSSZEG IS NULL)', ' AND j.C_OSSZEG = @pJuttatasOsszege'), '')

  IF @pJuttatasTipus IN (7888, 8618)
  BEGIN
    SET @sql += N'
      GROUP BY tanulok.TanuloId
        ,tanulok.TanuloNeve
        ,tanulok.OktatasiAzonosito
        ,tanulok.AnyjaNeve
        ,tanulok.SzuletesiHelye
        ,tanulok.SzuletesiIdeje
        ,tanulok.Evfolyam 
        ,tanulok.Osztaly
        ,tanulok.OsztalyId
        ,tanulok.Beszamitasos
        ,tanulok.KeziAtlag
        ,tanulok.SzamitottAtlag
        ,tanulok.Szazalek
        ,tanulok.Bankszamlaszam
        ,tanulok.IdpEgyediAzonosito
    '
  END

  EXEC sp_executesql @sql
    ,N'@pTanevId int
    ,@pIntezmenyId int
    ,@pDatum datetime
    ,@pTanuloNeve nvarchar(510)
    ,@pOktatasiAzonosito nvarchar(40)
    ,@pEvfolyamTipusaId int
    ,@pOsztalyId int
    ,@pFeladatKategoria int
    ,@pJogosultsag char(1)
    ,@pJuttatasOsszege int
    ,@pJuttatasTipus int
    ,@pOsszevonas nvarchar(100)'
    ,@pTanevId = @pTanevId
    ,@pIntezmenyId = @pIntezmenyId
    ,@pDatum = @pDatum
    ,@pTanuloNeve = @pTanuloNeve
    ,@pOktatasiAzonosito = @pOktatasiAzonosito
    ,@pEvfolyamTipusaId = @pEvfolyamTipusaId
    ,@pOsztalyId = @pOsztalyId
    ,@pFeladatKategoria = @pFeladatKategoria
    ,@pJogosultsag = @pJogosultsag
    ,@pJuttatasOsszege = @pJuttatasOsszege
    ,@pJuttatasTipus = @pJuttatasTipus
    ,@pOsszevonas = @pOsszevonas
END