﻿-- =============================================
-- Description:	<Órarend import>
-- =============================================
DROP PROCEDURE IF EXISTS [dbo].[uspOrarendImport]
GO

CREATE PROCEDURE [dbo].[uspOrarendImport]
	 @pIntezmenyId					INT
	,@pTanevId						INT
	,@pUserId						INT
	,@pImportJson					NVARCHAR(MAX)
	,@pIsTorles						BIT
	,@pIsModositas					BIT
	,@pIsNapirendImport				BIT
	,@pOrarendiOraLezarasDateTime	DATETIME = NULL

AS
BEGIN

	SET NOCOUNT ON;	

	DECLARE
		 @tableNameList			NVARCHAR(2000)	= 'T_TEREM_OSSZES'
		,@actualJson			NVARCHAR(MAX)	= ''

		,@lastChangedDateTime	DATETIME		= GETDATE()

	--Ha törlés van, akkor a kapcsolódások törlésével kell kezdenünk!
	IF (@pIsTorles = 1)
		BEGIN
			--Órarendi óra kapcsolatainak törlése
			UPDATE 
				TanitasiOra
			SET 
				 TanitasiOra.C_ORARENDIORAID			= NULL
				,TanitasiOra.SERIAL						= TanitasiOra.SERIAL + 1
				,TanitasiOra.LASTCHANGED				= @lastChangedDateTime
				,TanitasiOra.MODIFIER					= @pUserId
			FROM
				T_TANITASIORA_OSSZES TanitasiOra
			WHERE
					TanitasiOra.C_INTEZMENYID			= @pIntezmenyId
				AND	TanitasiOra.C_TANEVID				= @pTanevId
				AND TanitasiOra.TOROLT					= 'F'
				AND EXISTS
					(SELECT TOP 1
						ID
					FROM
						T_ORARENDIORA_OSSZES OrarendiOra 
					WHERE
							OrarendiOra.ID				= TanitasiOra.C_ORARENDIORAID				
						AND OrarendiOra.C_INTEZMENYID	= @pIntezmenyId
						AND	OrarendiOra.C_TANEVID		= @pTanevId
						AND OrarendiOra.TOROLT			= 'F'
						AND OrarendiOra.C_IMPORTALT		= 'T'
						AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
						 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
							
					)

			UPDATE 
				Hazifeladatok
			SET 
				 Hazifeladatok.C_ORARENDIORAID			= NULL
				,Hazifeladatok.SERIAL					= Hazifeladatok.SERIAL + 1
				,Hazifeladatok.LASTCHANGED				= @lastChangedDateTime
				,Hazifeladatok.MODIFIER					= @pUserId
			FROM
				T_HAZIFELADATOK_OSSZES Hazifeladatok
			WHERE
					Hazifeladatok.C_INTEZMENYID			= @pIntezmenyId
				AND	Hazifeladatok.C_TANEVID				= @pTanevId
				AND Hazifeladatok.TOROLT				= 'F'
				AND EXISTS
					(SELECT TOP 1
						ID
					FROM
						T_ORARENDIORA_OSSZES OrarendiOra 
					WHERE
							OrarendiOra.ID				= Hazifeladatok.C_ORARENDIORAID				
						AND OrarendiOra.C_INTEZMENYID	= @pIntezmenyId
						AND	OrarendiOra.C_TANEVID		= @pTanevId
						AND OrarendiOra.TOROLT			= 'F'
						AND OrarendiOra.C_IMPORTALT		= 'T'
						AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
						 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
					)

			UPDATE 
				OrarendiOraTulajdonsag
			SET 
				 OrarendiOraTulajdonsag.C_ORARENDIORAID		= NULL
				,OrarendiOraTulajdonsag.SERIAL				= OrarendiOraTulajdonsag.SERIAL + 1
				,OrarendiOraTulajdonsag.LASTCHANGED			= @lastChangedDateTime
				,OrarendiOraTulajdonsag.MODIFIER			= @pUserId
			FROM 
				T_ORARENDIORATULAJDONSAG OrarendiOraTulajdonsag
			WHERE
					OrarendiOraTulajdonsag.C_INTEZMENYID	= @pIntezmenyId
				AND	OrarendiOraTulajdonsag.C_TANEVID		= @pTanevId
				AND OrarendiOraTulajdonsag.TOROLT			= 'F'
				AND EXISTS
					(SELECT TOP 1
						ID
					FROM
						T_ORARENDIORA_OSSZES OrarendiOra	
					WHERE
							OrarendiOra.ID					= OrarendiOraTulajdonsag.C_ORARENDIORAID				
						AND OrarendiOra.C_INTEZMENYID		= @pIntezmenyId
						AND	OrarendiOra.C_TANEVID			= @pTanevId
						AND OrarendiOra.TOROLT				= 'F'
						AND OrarendiOra.C_IMPORTALT			= 'T'
						AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
						 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
					)
				
			DELETE 
				HelyettesitesiIdoszak
			FROM 
				T_HELYETTESITESIIDOSZAK_OSSZES HelyettesitesiIdoszak
			WHERE
				EXISTS 
					(SELECT TOP 1 
						ID 
					FROM 
						T_ORARENDIORA_OSSZES OrarendiOra 
					WHERE 
							OrarendiOra.ID				= HelyettesitesiIdoszak.C_HELYETTESITETTORARENDID				
						AND OrarendiOra.C_INTEZMENYID	= @pIntezmenyId
						AND	OrarendiOra.C_TANEVID		= @pTanevId
						AND OrarendiOra.TOROLT			= 'F'
						AND OrarendiOra.C_IMPORTALT		= 'T'
						AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
						 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
					)					

			--Órarendi órák törlése
			UPDATE 
				OrarendiOra
			SET 
				 OrarendiOra.TOROLT						= 'T'
				,OrarendiOra.SERIAL						= OrarendiOra.SERIAL + 1
				,OrarendiOra.LASTCHANGED				= @lastChangedDateTime
				,OrarendiOra.MODIFIER					= @pUserId
			FROM 
				T_ORARENDIORA_OSSZES OrarendiOra		
			WHERE
					OrarendiOra.C_INTEZMENYID			= @pIntezmenyId
				AND	OrarendiOra.C_TANEVID				= @pTanevId
				AND OrarendiOra.TOROLT					= 'F'
				AND OrarendiOra.C_IMPORTALT				= 'T'
				AND OrarendiOra.C_ORAERVENYESSEGVEGE	<> OrarendiOra.C_ORAERVENYESSEGKEZDETE
				AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
				 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
		END

	--Ha módosítás van, akkor a már létező órarendi órák módosításával kell kezdenünk!
	IF (@pIsModositas = 1)
		BEGIN
			--Korábbi órarendi órák lezárása
			UPDATE 
				OrarendiOra
			SET 
				 OrarendiOra.C_ORAERVENYESSEGVEGE		= @pOrarendiOraLezarasDateTime
				,OrarendiOra.SERIAL						= OrarendiOra.SERIAL + 1
				,OrarendiOra.LASTCHANGED				= @lastChangedDateTime
				,OrarendiOra.MODIFIER					= @pUserId
			FROM 
				T_ORARENDIORA_OSSZES OrarendiOra		
			WHERE
					OrarendiOra.C_INTEZMENYID			= @pIntezmenyId
				AND	OrarendiOra.C_TANEVID				= @pTanevId
				AND OrarendiOra.TOROLT					= 'F'
				AND (OrarendiOra.C_ORAERVENYESSEGVEGE	IS NULL
				 OR OrarendiOra.C_ORAERVENYESSEGVEGE	> @pOrarendiOraLezarasDateTime)
				AND OrarendiOra.C_ORAERVENYESSEGVEGE	<> OrarendiOra.C_ORAERVENYESSEGKEZDETE
				AND OrarendiOra.C_ORAERVENYESSEGKEZDETE	< @pOrarendiOraLezarasDateTime
				AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
				 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))

			--A korábban felvett, de későbbi időpontra importált órarendi órák törlése
			UPDATE 
				OrarendiOra
			SET 
				 OrarendiOra.TOROLT						= 'T'
				,OrarendiOra.SERIAL						= OrarendiOra.SERIAL + 1
				,OrarendiOra.LASTCHANGED				= @lastChangedDateTime
				,OrarendiOra.MODIFIER					= @pUserId
			FROM 
				T_ORARENDIORA_OSSZES OrarendiOra		
			WHERE
					OrarendiOra.C_INTEZMENYID			= @pIntezmenyId
				AND	OrarendiOra.C_TANEVID				= @pTanevId
				AND OrarendiOra.TOROLT					= 'F'
				AND OrarendiOra.C_IMPORTALT				= 'T'
				AND OrarendiOra.C_ORAERVENYESSEGVEGE	<> OrarendiOra.C_ORAERVENYESSEGKEZDETE
				AND OrarendiOra.C_ORAERVENYESSEGKEZDETE	>= @pOrarendiOraLezarasDateTime
				AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
				 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))
		END

	EXECUTE [dbo].[uspTantargyfelosztasImport] @pIntezmenyId, @pTanevId, @pUserId, @pImportJson, @pIsTorles
	  
	--NOTE: A törlés azért false, mert a T_TEREM_OSSZES view-ból nem törlünk importnál!
	EXECUTE [dbo].[uspDynamicImportJsonSplit] @pIntezmenyId = @pIntezmenyId, @pTanevId = @pTanevId, @pUserId = @pUserId, @pImportJson = @pImportJson, @pIsTorles = 0, @pIsSubTable = 0, @pTableNameList = @tableNameList

	--Órarendi órák beszúrása
	SET @actualJson = ' { "ImportJson":{ "T_ORARENDIORA_OSSZES":' +
		(SELECT
			 OrarendiOra.						ID
			,OrarendiOra.						C_HETIREND
			,OrarendiOra.						C_HETNAPJA
			,OrarendiOra.TantargyId				C_TANTARGYID
			,OrarendiOra.TanarId				C_TANARID
			,OrarendiOra.OsztalyCsoportId 		C_OSZTALYCSOPORTID
			,OrarendiOra.TeremId				C_TEREMID
			,OrarendiOra.FoglalkozasId			C_FOGLALKOZASID
			,OrarendiOra.						C_ORASZAM
			,OrarendiOra.						C_ORAERVENYESSEGKEZDETE
			,OrarendiOra.						C_ORAERVENYESSEGVEGE
			,OrarendiOra.						C_TANORANKIVULIFOGLALKOZAS
			,OrarendiOra.						C_CSENGETESIRENDID
			,OrarendiOra.						C_CSENGETESIRENDORAID
			,OrarendiOra.						C_ORAKEZDETE
			,OrarendiOra.						C_ORAVEGE
			,OrarendiOra.						C_BONTOTT
			,OrarendiOra.						C_ORATULAJDONOSID

			,OrarendiOra.						C_IMPORTALT
			,OrarendiOra.						C_INTEZMENYID
			,OrarendiOra.					 	C_TANEVID
			,OrarendiOra.						TOROLT
			,OrarendiOra.						SERIAL
			,OrarendiOra.						LASTCHANGED
			,OrarendiOra.						CREATED
			,OrarendiOra.						MODIFIER
			,OrarendiOra.						CREATOR
			,OrarendiOra.						ELOZOTANEVIREKORDID
			,OrarendiOra.						NNID
			,OrarendiOra.						Operation
		FROM
			(SELECT   
				 OrarendiOraJsonData.*
				,OsztalyCsoport.ID				OsztalyCsoportId
				,Felhasznalo.ID					TanarId
				,Tantargy.ID					TantargyId
				,Foglalkozas.ID					FoglalkozasId
				,Terem.ID						TeremId			
			FROM OPENJSON(@pImportJson,  N'lax $.ImportJson.T_ORARENDIORA_OSSZES')
				WITH (
					 ID								INT				'$.ID'
					,C_HETIREND						INT				'$.C_HETIREND'
					,C_HETNAPJA						INT				'$.C_HETNAPJA'
					,C_ORASZAM						INT				'$.C_ORASZAM'
					,C_ORAERVENYESSEGKEZDETE		DATETIME		'$.C_ORAERVENYESSEGKEZDETE'
					,C_ORAERVENYESSEGVEGE			DATETIME		'$.C_ORAERVENYESSEGVEGE'
					,C_TANORANKIVULIFOGLALKOZAS		CHAR(1)			'$.C_TANORANKIVULIFOGLALKOZAS'
					,C_CSENGETESIRENDID				INT				'$.C_CSENGETESIRENDID'
					,C_CSENGETESIRENDORAID			INT				'$.C_CSENGETESIRENDORAID'
					,C_ORAKEZDETE					DATETIME		'$.C_ORAKEZDETE'
					,C_ORAVEGE						DATETIME		'$.C_ORAVEGE'
					,C_BONTOTT						CHAR(1)			'$.C_BONTOTT'
					,C_ORATULAJDONOSID				INT				'$.C_ORATULAJDONOSID'

					,C_IMPORTALT					CHAR(1)			'$.C_IMPORTALT'
					,C_INTEZMENYID					INT				'$.C_INTEZMENYID'
					,C_TANEVID						INT				'$.C_TANEVID'
					,TOROLT							CHAR(1)			'$.TOROLT'
					,SERIAL							INT				'$.SERIAL'
					,LASTCHANGED					DATETIME		'$.LASTCHANGED'
					,CREATED						DATETIME		'$.CREATED'
					,MODIFIER						INT				'$.MODIFIER'
					,CREATOR						INT				'$.CREATOR'
					,ELOZOTANEVIREKORDID			INT				'$.ELOZOTANEVIREKORDID'
					,NNID							INT				'$.NNID'
					,Operation						INT				'$.Operation'

					,TantargyNev					NVARCHAR(255)	'$.TantargyNev'
					,OsztalyCsoportNev				NVARCHAR(255)	'$.OsztalyCsoportNev'
					,TanarNev						NVARCHAR(255)	'$.TanarNev'
					,TanarSzuletesiIdo				NVARCHAR(255)	'$.TanarSzuletesiIdo'
					,TeremNev						NVARCHAR(255)	'$.TeremNev'
					,TantargyfelosztasNev			NVARCHAR(255)	'$.TantargyfelosztasNev'
				) OrarendiOraJsonData 
			LEFT JOIN
				T_OSZTALYCSOPORT_OSSZES OsztalyCsoport ON
						--NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
						--		Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
						LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(OsztalyCsoport.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(OrarendiOraJsonData.OsztalyCsoportNev)
					AND OsztalyCsoport.C_INTEZMENYID			= @pIntezmenyId
					AND OsztalyCsoport.C_TANEVID				= @pTanevId
					AND OsztalyCsoport.TOROLT					= 'F'
			LEFT JOIN
				T_TANTARGY_OSSZES Tantargy ON
						--NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
						--		Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
						LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(Tantargy.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(OrarendiOraJsonData.TantargyNev)
					AND Tantargy.C_INTEZMENYID					= @pIntezmenyId
					AND Tantargy.C_TANEVID						= @pTanevId
					AND Tantargy.TOROLT							= 'F'
			LEFT JOIN 
				T_FELHASZNALO_OSSZES Felhasznalo ON
						--NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
						--		Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
						LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(Felhasznalo.C_NYOMTATASINEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(OrarendiOraJsonData.TanarNev)
					AND	(OrarendiOraJsonData.TanarSzuletesiIdo IS NULL 
					 OR Felhasznalo.C_SZULETESIDATUM			= OrarendiOraJsonData.TanarSzuletesiIdo)
					AND Felhasznalo.C_INTEZMENYID				= @pIntezmenyId
					AND Felhasznalo.C_TANEVID					= @pTanevId
					AND Felhasznalo.TOROLT						= 'F'
			INNER JOIN
				T_ALKALMAZOTT_OSSZES Alkalmazott ON				
						Alkalmazott.ID = Felhasznalo.ID
					AND Alkalmazott.C_ALINTEZMENYID				= @pIntezmenyId
					AND	Alkalmazott.C_ALTANEVID					= @pTanevId
					AND Alkalmazott.TOROLT						= 'F'
			LEFT JOIN
				T_FOGLALKOZAS_OSSZES Foglalkozas ON 
						Foglalkozas.C_OSZTALYCSOPORTID			= OsztalyCsoport.ID
					AND	Foglalkozas.C_TANARID					= Felhasznalo.ID
					AND	Foglalkozas.C_TANTARGYID				= Tantargy.ID
					AND Foglalkozas.C_INTEZMENYID				= @pIntezmenyId
					AND Foglalkozas.C_TANEVID					= @pTanevId
					AND Foglalkozas.TOROLT						= 'F'
			LEFT JOIN
				T_TEREM_OSSZES Terem ON
						--NOTE: A leküldött adat már teljesen jól formázott, de a db-ben lehetnek rossz adatok. Az összehasonlításhoz ezt csináljuk:
						--		Kisbetűsítjük -> Lecseréljük a NO BREAK SPACE-eket, SPACE-ekre -> Lecseréljük az összes többszörös szóközt egyre -> Trimmelünk
						LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(Terem.C_NEV),CHAR(160),CHAR(32)),CHAR(32),'(¤¤)'),'¤)(¤',''),'(¤¤)',CHAR(32)))) = LOWER(OrarendiOraJsonData.TeremNev)
					AND Terem.C_INTEZMENYID						= @pIntezmenyId
					AND Terem.C_TANEVID							= @pTanevId
					AND Terem.TOROLT							= 'F'
			) AS OrarendiOra
		FOR JSON PATH,INCLUDE_NULL_VALUES)

	SET @actualJson = @actualJson + ' } }'
	
	--NOTE: A törlés azért false, mert a T_ORARENDIORA_OSSZES view-ból korábban elvégeztük a törlést, mivel egyéb feltélek is kellettek hozzá, ami nem szerepel a uspDynamicImport-ban.
	EXECUTE [dbo].[uspDynamicImport] @pIntezmenyId = @pIntezmenyId, @pTanevId = @pTanevId, @pUserId = @pUserId, @pImportJson = @actualJson, @pIsTorles = 0, @pIsSubTable = 0	     

	--NOTE: Update-elnünk kell a órarendi óráknak a groud id-ját!
	UPDATE 
		OrarendiOra
	SET 
		OrarendiOra.C_ORARENDIORAGROUPID	= ID
	FROM 
		T_ORARENDIORA_OSSZES OrarendiOra		
	WHERE
			OrarendiOra.C_INTEZMENYID		= @pIntezmenyId
		AND OrarendiOra.C_TANEVID			= @pTanevId
		AND OrarendiOra.TOROLT				= 'F'
		AND OrarendiOra.C_IMPORTALT			= 'T'
		AND ((@pIsNapirendImport = 0 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'F')
		 OR  (@pIsNapirendImport = 1 AND OrarendiOra.C_TANORANKIVULIFOGLALKOZAS = 'T'))

END


GO

