﻿SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF OBJECT_ID('dbo.sp_KIRImportTanulok') IS NOT NULL 
BEGIN
  DROP PROCEDURE [dbo].[sp_KIRImportTanulok]
END  
GO

CREATE PROCEDURE [dbo].[sp_KIRImportTanulok]
	-- Add the parameters for the stored procedure here
	@TanulokXML as XML,
	@intezmenyID int,
	@tanevID int,
	@userId int
AS
BEGIN
	SET NOCOUNT ON;
  DECLARE 
    @TantervID int,
    @userNameGenerateMode int
    
  DECLARE @linkTable TABLE (
    tempId int,
    insertedId int,
    act varchar(10)
  )
  
	-- XML paraméter értelmezése
  SELECT  ID = Tanulo.value('(ID)[1]', 'int'),
		OktatasiAzonosito = Tanulo.value('(OktatasiAzonosito)[1]', 'varchar(15)'),
		KretaKod = Tanulo.value('(KretaKod)[1]', 'varchar(6)'),
		VezetekNev =  Tanulo.value('(ViseltNevVezetekNev)[1]', 'nvarchar(50)'),	UtoNev =  Tanulo.value('(ViseltNevKeresztNev)[1]', 'nvarchar(50)'),
		Elotag =  Tanulo.value('(ViseltNevElotag)[1]', 'nvarchar(10)'),	NevSorrend =  Tanulo.value('(ViseltNevNevSorrend)[1]', 'char(1)'),
		AnyjaNeveElotag =  Tanulo.value('(AnyjaNeveElotag)[1]', 'nvarchar(10)'), AnyjaNeveVezetekNev =  Tanulo.value('(AnyjaNeveVezetekNev)[1]', 'nvarchar(50)'),
		AnyjaNeveKeresztNev =  Tanulo.value('(AnyjaNeveKeresztNev)[1]', 'nvarchar(50)'),	AnyjaNeveNevSorrend =  Tanulo.value('(AnyjaNeveNevSorrend)[1]', 'nvarchar(50)'),
		SzuletesiDatum =  Tanulo.value('(SzuletesiDatum)[1]', 'date'),	SzuletesiHely =  Tanulo.value('(SzuletesiHely)[1]', 'nvarchar(255)'),
		SzuletesiOrszag =  Tanulo.value('(SzuletesiOrszag)[1]', 'int'),	Allampolgarsag =  Tanulo.value('(Allampolgarsag)[1]', 'int'),
		Nem =  Tanulo.value('(Nem)[1]', 'int'),	TAJSzam =  Tanulo.value('(TAJSzam)[1]', 'nvarchar(15)'),
		AllandoLakcimIranyitoSzam =  Tanulo.value('(AllandoLakcimIranyitoSzam)[1]', 'nvarchar(10)'),	AllandoLakcimTelepules =  Tanulo.value('(AllandoLakcimTelepules)[1]', 'nvarchar(255)'),
		AllandoLakcimKozteruletNev =  Tanulo.value('(AllandoLakcimKozteruletNev)[1]', 'nvarchar(255)'),	AllandoLakcimKozteruletJelleg =  Tanulo.value('number((AllandoLakcimKozteruletJelleg)[1])', 'int'),
		AllandoLakcimHazszam =  Tanulo.value('(AllandoLakcimHazszam)[1]', 'nvarchar(20)'),	TartozkodasiCimTelepules =  Tanulo.value('(TartozkodasiCimTelepules)[1]', 'nvarchar(255)'),
		TartozkodasiCimKozteruletNev =  Tanulo.value('(TartozkodasiCimKozteruletNev)[1]', 'nvarchar(255)'),	TartozkodasiCimKozteruletJelleg =  Tanulo.value('number((TartozkodasiCimKozteruletJelleg)[1])', 'int'),
		TartozkodasiCimHazszam =  Tanulo.value('(TartozkodasiCimHazszam)[1]', 'nvarchar(20)'),	TartozkodasiCimIranyitoszam =  Tanulo.value('(TartozkodasiCimIranyitoSzam)[1]', 'nvarchar(20)'),
		TankotelezettsegVege =  Tanulo.value('(TankotelezettsegVege)[1]', 'date'),
		TankotelezettsegetTeljesito =  Tanulo.value('(TankotelezettsegetTeljesito)[1]', 'char'),	SajatosNevelesIgenyu =  Tanulo.value('(SajatosNevelesIgenyu)[1]', 'char'),
		BeilleszkedesselKuzd =  Tanulo.value('(BeilleszkedesselKuzd)[1]', 'char'),	OMAzonosito =  Tanulo.value('(OMAzonosito)[1]', 'nvarchar(20)'),
		JogviszonyStatusza =  Tanulo.value('(JogviszonyStatusza)[1]', 'nvarchar(50)'),	JogviszonyKezdete =  Tanulo.value('(JogviszonyKezdete)[1]', 'date'),
		JogviszonyVarBefejezese =  Tanulo.value('(JogviszonyVarBefejezese)[1]', 'date'),	JogviszonyJellege =  Tanulo.value('(JogviszonyJellege)[1]', 'nvarchar(50)'),
		Vendegtanulo =  Tanulo.value('(Vendegtanulo)[1]', 'char'),	Magantanulo =  Tanulo.value('(Magantanulo)[1]', 'char'),
		Osztaly =  Tanulo.value('(Osztaly)[1]', 'nvarchar(255)'),
		KeresesiNev =  Tanulo.value('(KeresesiNev)[1]', 'nvarchar(255)'), NyomtatasiNev =  ltrim(Tanulo.value('(NyomtatasiNev)[1]', 'nvarchar(255)')),
		Telefonszam = Tanulo.value('(Telefonszam)[1]', 'nvarchar(45)'),
		AnyjaNeve =  Tanulo.value('(AnyjaNeve)[1]', 'nvarchar(255)'),
		EmailCim = Tanulo.value('(Email)[1]', 'nvarchar(200)'),
    0 AS isTanulo,
    0 TanuloID
	INTO #tempTanulok
	FROM @TanulokXML.nodes('/KIRTanulok/ImportaltTanulok/Tanulo') as Tanulok(Tanulo)
  
  -- A létező felhasználók ID-ját kitöltjük, és az isTanulot is update-eljük
  UPDATE t
  SET t.TanuloID = fh.ID,
      t.isTanulo = IIF(tn.ID IS NULL, 0, 1)
  FROM #tempTanulok t
    INNER JOIN T_FELHASZNALO_OSSZES fh ON
	t.NyomtatasiNev = fh.C_NYOMTATASINEV AND
	t.SzuletesiDatum = fh.C_SZULETESIDATUM AND
	t.SzuletesiHely = fh.C_SZULETESIHELY AND
	t.AnyjaNeve = fh.C_ANYJANEVE
	LEFT JOIN T_TANULO_OSSZES tn ON tn.ID = fh.ID
	WHERE fh.TOROLT = 'F' AND fh.C_TANEVID = @tanevID AND fh.C_INTEZMENYID = @intezmenyID
  
  BEGIN TRY
  BEGIN TRANSACTION
  
    -- FELHASZNÁLÓK INSERTJE VAGY UPDATE-JE AKA MERGE
    MERGE T_FELHASZNALO_OSSZES trg
    USING #tempTanulok src ON src.TanuloID = trg.ID AND trg.C_TANEVID = @tanevID
    WHEN MATCHED AND src.isTanulo = 1 THEN
      UPDATE SET
        trg.C_NEME = src.Nem,
        trg.C_SZULETESIDATUM = src.SzuletesiDatum,
        trg.C_SZULETESINEV = src.VezetekNev + ' ' + src.UtoNev,
        trg.C_ANYJANEVE = src.AnyjaNeve,
        trg.C_SZULETESIHELY = src.SzuletesiHely,
        trg.C_ALLAMPOLGARSAGA = src.Allampolgarsag,
        trg.C_KERESESINEV = src.KeresesiNev,
        trg.C_SZULETESIORSZAG = src.SzuletesiOrszag,
        trg.C_SZULETESINEVSORREND = src.NevSorrend,
        trg.C_ANYJANEVESORREND = src.AnyjaNeveNevSorrend,
        trg.C_ALAPERTELMEZETTLCID = 1038,
        trg.C_SZULETESINEVELVALASZTO = LEN(src.VezetekNev),
        trg.C_ANYJANEVEELVALASZTO = (LEN(src.AnyjaNeveVezetekNev) + IIF(src.AnyjaNeveElotag IS NULL OR LEN(src.AnyjaNeveElotag) = 0, 0, LEN(src.AnyjaNeveElotag) + 1)),
        trg.C_NYOMTATASINEV = src.NyomtatasiNev,
        trg.C_UTONEV = src.UtoNev,
        trg.C_VEZETEKNEV = src.VezetekNev,
        trg.C_ELOTAG = src.Elotag,
        trg.C_NEVSORREND = src.NevSorrend,
        trg.C_NYILVANTARTASKEZDETE = getdate(),
        trg.C_OMKOD = src.OMAzonosito,
        trg.C_KRETAKOD = src.KretaKod,
        trg.TOROLT = 'F',
  		  trg.SERIAL = trg.SERIAL + 1,
  		  trg.LASTCHANGED = GETDATE(),
  		  trg.MODIFIER = @userId,
		  trg.C_OKTATASIAZONOSITO = src.OktatasiAzonosito
    WHEN NOT MATCHED THEN
  		INSERT (
  			 C_NEME
  			,C_SZULETESIDATUM
  			,C_SZULETESINEV
  			,C_ANYJANEVE
  			,C_SZULETESIHELY
  			,C_TAJSZAM
  			,C_ALLAMPOLGARSAGA
  			,C_LEIRAS
  			,C_KERESESINEV
  			,C_SZULETESIORSZAG
  			,C_SZULETESINEVSORREND
  			,C_ANYJANEVESORREND
  			,C_ALAPERTELMEZETTLCID
  			,C_SZULETESINEVELVALASZTO
  			,C_ANYJANEVEELVALASZTO
  			,C_NYOMTATASINEV
  			,C_UTONEV
  			,C_VEZETEKNEV
  			,C_ELOTAG
  			,C_NEVSORREND
  			,C_NYILVANTARTASKEZDETE
  			,C_OKTATASIAZONOSITO
  			,C_OMKOD
  			,C_KRETAKOD
  			,C_INTEZMENYID
  			,C_TANEVID
  			,MODIFIER
  			,CREATOR)
  		VALUES (
  			 src.Nem
  			,src.SzuletesiDatum
  			,src.VezetekNev + ' ' + src.UtoNev
  			,src.AnyjaNeve
  			,src.SzuletesiHely
  			,src.TAJSzam
  			,src.Allampolgarsag
  			,src.JogviszonyJellege
  			,src.KeresesiNev
  			,src.SzuletesiOrszag
  			,src.NevSorrend
  			,src.AnyjaNeveNevSorrend
  			,1038
  			,LEN(src.VezetekNev)
  			,(LEN(src.AnyjaNeveVezetekNev) + IIF(src.AnyjaNeveElotag IS NULL OR LEN(src.AnyjaNeveElotag) = 0, 0, LEN(src.AnyjaNeveElotag) + 1))
  			,src.NyomtatasiNev
  			,src.UtoNev
  			,src.VezetekNev
  			,src.Elotag
  			,src.NevSorrend
  			,src.JogviszonyKezdete
  			,src.OktatasiAzonosito
  			,src.OMAzonosito
  			,src.KretaKod
  			,@intezmenyID
  			,@tanevID
  			,NULL
  			,@userId
      )
      OUTPUT INSERTED.ID, src.ID, $action
      INTO @linkTable(insertedID, tempId, act);
      
	  SET @TantervID = (SELECT MAX(ID) FROM T_TANTERV_OSSZES WHERE C_TANEVID = @tanevID AND TOROLT = 'F')  
    MERGE T_TANULO_OSSZES trg
    USING (
      SELECT t.*, l.insertedId AS insertedID 
      FROM #tempTanulok t
        INNER JOIN @linkTable l ON t.ID = l.tempID
    ) src ON src.TanuloID = trg.ID AND trg.C_ALTANEVID = @tanevID AND src.isTanulo = 1 
    WHEN MATCHED THEN
      UPDATE SET
			  trg.C_TANKOTELEZETTSEGVEGE = src.TankotelezettsegVege,
    		trg.C_TANKOTELEZETT = src.TankotelezettsegetTeljesito,
    		trg.C_SAJATOSNEVELESU = src.SajatosNevelesIgenyu,
    		trg.C_BTMPROBLEMAS = src.BeilleszkedesselKuzd,
    		trg.C_JOGVISZONYVARHATOBEFEJEZESE = src.JogviszonyVarBefejezese,
    		trg.C_VENDEG = src.Vendegtanulo,
    		trg.C_MAGANTANULO = src.Magantanulo,
    		trg.C_JOGVISZONYATSZUNETELTETO = src.JogviszonyStatusza,
    		trg.C_FELVETELTANEVEID = @tanevID,
    		trg.C_TANTERVID = @TantervId,
    		trg.TOROLT = 'F',
  			trg.SERIAL = trg.SERIAL + 1,
  			trg.LASTCHANGED = GETDATE(),
  			trg.MODIFIER = @userId
    WHEN NOT MATCHED THEN
  		INSERT (
  			 ID
  			,C_TANKOTELEZETTSEGVEGE
  			,C_TANKOTELEZETT
  			,C_SAJATOSNEVELESU
  			,C_BTMPROBLEMAS
  			,C_JOGVISZONYVARHATOBEFEJEZESE
  			,C_VENDEG
  			,C_MAGANTANULO
  			,C_JOGVISZONYATSZUNETELTETO
  			,C_FELVETELTANEVEID
  			,C_TANTERVID
  			,C_ALINTEZMENYID
  			,C_ALTANEVID
  			,MODIFIER
  			,CREATOR
      ) VALUES (
         src.insertedID
        ,src.TankotelezettsegVege
        ,src.TankotelezettsegetTeljesito
        ,src.SajatosNevelesIgenyu
        ,src.BeilleszkedesselKuzd
        ,src.JogviszonyVarBefejezese
        ,src.Vendegtanulo
        ,src.Magantanulo
        ,src.JogviszonyStatusza
        ,@tanevID
        ,@TantervId
        ,@intezmenyID
        ,@tanevID
  		  ,NULL
  		  ,@userId      
      );
    
	  --------FELHASZNALO SZEREPKÖR-----------
		DELETE FROM T_FELHASZNALO_SZEREPKOR
    WHERE T_FELHASZNALO_SZEREPKOR.[C_FELHASZNALOID] IN (SELECT TanuloID FROM #tempTanulok WHERE TanuloID > 0) 
		
		INSERT INTO T_FELHASZNALO_SZEREPKOR (C_FELHASZNALOID, C_SZEREPKORID)
		SELECT l.insertedId, (SELECT ID FROM T_SZEREPKOR_OSSZES WHERE C_SZEREPKORTIPUS = '1761' AND C_TANEVID = @tanevID)
		FROM #tempTanulok t
      INNER JOIN @linkTable l ON t.ID = l.tempID
	    INNER JOIN T_FELHASZNALO_OSSZES fh ON fh.ID = l.insertedId
		WHERE C_TANEVID = @tanevID
		
    
    ----- Telefonszám ----- 
    MERGE T_TELEFON_OSSZES trg
    USING (
      SELECT t.*, l.insertedId AS insertedID 
      FROM #tempTanulok t
        INNER JOIN @linkTable l ON t.ID = l.tempID --AND C_ALAPERTELMEZETT = 'T'
        WHERE t.Telefonszam IS NOT NULL AND t.Telefonszam <> ''
    ) src ON src.TanuloID = trg.C_FELHASZNALOID AND trg.C_TANEVID = @tanevID AND src.isTanulo = 1 AND trg.C_ALAPERTELMEZETT = 'T'
    WHEN MATCHED THEN
      UPDATE SET
        trg.C_TELEFONSZAM = src.Telefonszam,
        trg.TOROLT = 'F',
    		trg.SERIAL = trg.SERIAL + 1,
    		trg.LASTCHANGED = GETDATE(),
    		trg.MODIFIER = @userId
    WHEN NOT MATCHED THEN
      INSERT (
         C_TELEFONTIPUSA
        ,C_TELEFONSZAM
        ,C_LEIRAS
        ,C_ALAPERTELMEZETT
        ,C_GONDVISELOID
        ,C_FELHASZNALOID
        ,C_INTEZMENYID
        ,C_TANEVID
        ,MODIFIER
        ,CREATOR          
      ) VALUES (
         1019 -- C_TELEFONTIPUSA - int
        ,src.Telefonszam -- C_TELEFONSZAM - nvarchar(100)
        ,N'' -- C_LEIRAS - nvarchar(50)
        ,'T' -- C_ALAPERTELMEZETT - char(1)
        ,NULL   -- C_GONDVISELOID - int
        ,src.insertedID   -- C_FELHASZNALOID - int
        ,@intezmenyID -- C_INTEZMENYID - int
        ,@tanevID -- C_TANEVID - int
        ,NULL   -- MODIFIER - int
        ,@userId   -- CREATOR - int      
      );
          
    ----- TARTÓZKODÁSI HELY -----
    MERGE T_CIM_OSSZES trg
      USING (
        SELECT t.*, l.insertedId AS insertedID 
        FROM #tempTanulok t
          INNER JOIN @linkTable l ON t.ID = l.tempID
          WHERE t.TartozkodasiCimIranyitoszam IS NOT NULL AND t.TartozkodasiCimIranyitoszam <> ''
        ) src ON src.TanuloID = trg.C_FELHASZNALOID AND trg.C_TANEVID = @tanevID AND src.isTanulo = 1 AND trg.C_CIMTIPUSA = 908
      WHEN MATCHED THEN
        UPDATE SET
					trg.C_CIMTIPUSA = 908,
					trg.C_ORSZAG = 765,
					trg.C_IRANYITOSZAM = src.TartozkodasiCimIranyitoszam,
					trg.C_VAROS = src.TartozkodasiCimTelepules,
					trg.C_KOZTERULET = src.TartozkodasiCimKozteruletNev,
					trg.C_KOZTERULETJELLEGE = src.TartozkodasiCimKozteruletJelleg,
					trg.C_HAZSZAM = src.TartozkodasiCimHazszam,
					trg.C_FELHASZNALOID = src.insertedId,
					trg.TOROLT = 'F',
					trg.SERIAL = trg.SERIAL + 1,
					trg.LASTCHANGED = GETDATE(),
					trg.MODIFIER = @userId
      WHEN NOT MATCHED THEN
	      INSERT (
           C_CIMTIPUSA
          ,C_ORSZAG
          ,C_IRANYITOSZAM
          ,C_VAROS
          ,C_KOZTERULET
          ,C_KOZTERULETJELLEGE
          ,C_HAZSZAM
          ,C_FELHASZNALOID
          ,C_INTEZMENYID
          ,C_TANEVID
          ,MODIFIER
          ,CREATOR
        ) VALUES (
           908
          ,765
          ,src.TartozkodasiCimIranyitoszam
          ,src.TartozkodasiCimTelepules
          ,src.TartozkodasiCimKozteruletNev
          ,src.TartozkodasiCimKozteruletJelleg
          ,src.TartozkodasiCimHazszam
          ,src.insertedID
          ,@intezmenyID
          ,@tanevID
          ,NULL
          ,@userId    
        );        
        
    ----- TARTÓZKODÁSI HELY -----
    MERGE T_CIM_OSSZES trg
      USING (
        SELECT t.*, l.insertedId AS insertedID 
        FROM #tempTanulok t
          INNER JOIN @linkTable l ON t.ID = l.tempID
        ) src ON src.TanuloID = trg.C_FELHASZNALOID AND trg.C_TANEVID = @tanevID AND src.isTanulo = 1 AND trg.C_CIMTIPUSA = 907
      WHEN MATCHED THEN
        UPDATE SET
					trg.C_CIMTIPUSA = 907, 
					trg.C_ORSZAG = 765,
					trg.C_IRANYITOSZAM = src.AllandoLakcimIranyitoSzam,
					trg.C_VAROS = src.AllandoLakcimTelepules,
					trg.C_KOZTERULET = src.AllandoLakcimKozteruletNev,
					trg.C_KOZTERULETJELLEGE = src.AllandoLakcimKozteruletJelleg,
					trg.C_HAZSZAM = src.AllandoLakcimHazszam,
					trg.C_FELHASZNALOID = src.insertedId,
					trg.TOROLT = 'F',
					trg.SERIAL = trg.SERIAL + 1,
					trg.LASTCHANGED = GETDATE(),
					trg.MODIFIER = @userId
      WHEN NOT MATCHED THEN
	      INSERT (
           C_CIMTIPUSA
          ,C_ORSZAG
          ,C_IRANYITOSZAM
          ,C_VAROS
          ,C_KOZTERULET
          ,C_KOZTERULETJELLEGE
          ,C_HAZSZAM
          ,C_FELHASZNALOID
          ,C_INTEZMENYID
          ,C_TANEVID
          ,MODIFIER
          ,CREATOR
        ) VALUES (
           907
          ,765
          ,src.AllandoLakcimIranyitoSzam
          ,src.AllandoLakcimTelepules
          ,src.AllandoLakcimKozteruletNev
          ,src.AllandoLakcimKozteruletJelleg
          ,src.AllandoLakcimHazszam
          ,src.insertedID
          ,@intezmenyID
          ,@tanevID
          ,NULL
          ,@userId
        );   
	
	----- E-mail cím ----- 
    MERGE T_EMAIL_OSSZES
		USING (
			SELECT #tempTanulok.*, linkTable.insertedId AS insertedID 
			FROM #tempTanulok
				INNER JOIN 
					@linkTable linkTable ON #tempTanulok.ID = linkTable.tempID --AND C_ALAPERTELMEZETT = 'T'
				WHERE #tempTanulok.EmailCim IS NOT NULL AND #tempTanulok.EmailCim <> ''
				)
				src ON 
				T_EMAIL_OSSZES.C_FELHASZNALOID		= src.TanuloID AND
				T_EMAIL_OSSZES.C_TANEVID			= @tanevID AND 
				src.isTanulo						= 1 AND
				T_EMAIL_OSSZES.C_ALAPERTELMEZETT	= 'T'
		WHEN 
			MATCHED THEN
					  UPDATE SET
						T_EMAIL_OSSZES.C_EMAILCIM	= src.EmailCim,
						T_EMAIL_OSSZES.TOROLT		= 'F',
    					T_EMAIL_OSSZES.SERIAL		= T_EMAIL_OSSZES.SERIAL + 1,
    					T_EMAIL_OSSZES.LASTCHANGED	= GETDATE(),
    					T_EMAIL_OSSZES.MODIFIER		= @userId
		WHEN 
			NOT MATCHED THEN
					  INSERT (
						 C_EMAILTIPUSA
						,C_EMAILCIM
						,C_ALAPERTELMEZETT
						,C_GONDVISELOID
						,C_FELHASZNALOID
						,C_INTEZMENYID
						,C_TANEVID
						,MODIFIER
						,CREATOR          
					  ) VALUES (
						 1024 -- C_EMAILTIPUSA - int   NA
						,src.EmailCim -- C_EMAILCIM - nvarchar(100)
						,'T' -- C_ALAPERTELMEZETT - char(1)
						,NULL   -- C_GONDVISELOID - int
						,src.insertedID   -- C_FELHASZNALOID - int
						,@intezmenyID -- C_INTEZMENYID - int
						,@tanevID -- C_TANEVID - int
						,NULL   -- MODIFIER - int
						,@userId   -- CREATOR - int      
		  );
				     
    COMMIT TRANSACTION
  END TRY
  BEGIN CATCH
    IF @@TRANCOUNT > 0 AND XACT_STATE() <> 0 
      ROLLBACK TRANSACTION;
    THROW
  END CATCH
END
