SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'WMAN_PermisosOpcionesPlanilla_GetInfo') )
DROP PROCEDURE WMAN_PermisosOpcionesPlanilla_GetInfo
GO

CREATE PROCEDURE WMAN_PermisosOpcionesPlanilla_GetInfo
	@id  INT,
	@opcion INT,
	@id_oper  INT
AS
BEGIN

	DECLARE @Contador INT           -- Variable contador
	DECLARE @CantDH INT           -- Variable Opciones que deben de haber
	DECLARE @CantH INT           -- Variable Opciones que hay
	SET @Contador = 1   
	DECLARE @Regs INT               -- Variable para el Numero de Registros a procesar
	SET @Regs = (SELECT COUNT(*) FROM Modulo)
	DECLARE @campo INT				--id_modulo

IF(@opcion = 0)
BEGIN
	
	create table #TEMPPERMISOMODULO
	(
		id_modulo INT,
		chactivo INT not null default(0),
		negri INT not null default(0),
		desc_modulo NVARCHAR(100),
		activo INT
	)
	
	INSERT INTO #TEMPPERMISOMODULO(id_modulo, desc_modulo, activo)
	SELECT id_modulo,LTRIM(RTRIM(desc_modulo))desc_modulo, activo FROM Modulo
	order by id_modulo
	
	-- Declaramos una tabla temporal para recorrido
	CREATE TABLE #TempM (
	ID INT Identity(1,1),
	id_modulo INT
	)
	
-- Pasamos datos a la tabla temporal
	INSERT INTO #TempM(id_modulo)
	SELECT id_modulo FROM Modulo
	
	WHILE @Contador <= @Regs
	BEGIN
	
	SELECT @campo = t.id_modulo FROM #TempM t WHERE t.ID = @Contador
	
	SET @CantDH =(select COUNT(*) from Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app INNER JOIN Modulo M ON M.id_modulo = A.id_modulo WHERE M.id_modulo = @campo)
	SET @CantH =(select COUNT(*) from Acceso_Opc_Tipo AO INNER JOIN Opciones O ON O.id_opc= AO.id_opc INNER JOIN Aplicaciones A ON A.id_app = O.id_app INNER JOIN Modulo M ON M.id_modulo = A.id_modulo WHERE AO.id_tip_oper = @id_oper AND M.id_modulo = @campo)
	
		IF(@CantDH = @CantH)
		BEGIN
			UPDATE #TEMPPERMISOMODULO
			SET chactivo = 1,
				negri = 1
			Where id_modulo = @campo
		END
		ELSE IF(@CantDH > @CantH AND @CantH != 0)
		BEGIN
			UPDATE #TEMPPERMISOMODULO
			SET negri = 1
			,chactivo = 1 -- Cambio para tener check activado cuando tenga almenos 1 permiso
			Where id_modulo = @campo
		END
	
	SET @Contador = @Contador + 1
	END
	
	SELECT * FROM  #TEMPPERMISOMODULO
END

IF(@opcion = 1)
BEGIN

	create table #TEMPPERMISOAPLI
	(
		id_app INT,
		id_modulo INT,
		activo INT not null default(0),
		negri INT not null default(0),
		desc_opc NVARCHAR(100),
	)
	
	INSERT INTO #TEMPPERMISOAPLI(id_app, id_modulo, desc_opc)
	SELECT id_app, id_modulo, LTRIM(RTRIM(desc_app))desc_app FROM Aplicaciones
	WHERE id_modulo = @id
	ORDER BY id_modulo
	
	-- Declaramos una tabla temporal para recorrido  SELECT * FROM APLICACIONES
	CREATE TABLE #TempOP (
	ID INT Identity(1,1),
	id_app INT
	)
	
-- Pasamos datos a la tabla temporal
	INSERT INTO #TempOP(id_app)
	SELECT id_app FROM Aplicaciones

	SET @Contador = 1   
	SET @Regs = (SELECT COUNT(*) FROM Aplicaciones)
	
	WHILE @Contador <= @Regs
	BEGIN
	
	SELECT @campo = t.id_app FROM #TempOP t WHERE t.ID = @Contador
	
	SET @CantDH =(select COUNT(*) from Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app WHERE A.id_app = @campo)
	SET @CantH =(select COUNT(*) from Acceso_Opc_Tipo AO INNER JOIN Opciones O ON O.id_opc= AO.id_opc INNER JOIN Aplicaciones A ON A.id_app = O.id_apP WHERE AO.id_tip_oper = @id_oper AND A.id_app = @campo)
	
		IF(@CantDH = @CantH)
		BEGIN
			UPDATE #TEMPPERMISOAPLI
			SET activo = 1,
				negri = 1
			Where id_app = @campo
		END
		ELSE IF(@CantDH >= @CantH AND @CantH != 0)
		BEGIN
			UPDATE #TEMPPERMISOAPLI
			SET negri = 1
			,activo = 1 -- Cambio para tener check activado cuando tenga almenos 1 permiso
			Where id_app = @campo
		END
	
	SET @Contador = @Contador + 1
	END
	
	SELECT * FROM  #TEMPPERMISOAPLI
END

IF(@opcion = 2)
BEGIN
	create table #TEMPPERMISOOPCION
	(
		id_opc INT,
		activo INT not null default(0),
		id_app INT,
		desc_opc VARCHAR(100),
		va_log_sheet BIT,
		id_parent INT,
		historico BIT
	)
	
	INSERT INTO #TEMPPERMISOOPCION(id_opc, id_app, desc_opc, va_log_sheet, id_parent, historico) exec WMAN_OrdenarOpcionesArbol @id
	
	UPDATE #TEMPPERMISOOPCION
	SET activo = 1
	Where  id_opc IN (select A.id_opc from Acceso_Opc_Tipo A INNER JOIN Opciones D ON D.id_opc= A.id_opc WHERE A.id_tip_oper = @id_oper)
	
	SELECT * FROM  #TEMPPERMISOOPCION
END

END
GO

---------------------------------------------------------------------------------
---------------------------------------------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'WMAN_PermisosOpcionesPlanilla_RepInfo') )
DROP PROCEDURE WMAN_PermisosOpcionesPlanilla_RepInfo
GO

CREATE PROCEDURE WMAN_PermisosOpcionesPlanilla_RepInfo
	@id INT
AS
BEGIN

	SELECT AC.id_opc, OP.desc_opc, AP.id_app, AP.desc_app, MO.id_modulo, MO.desc_modulo FROM Acceso_Opc_Tipo AC
	INNER JOIN Opciones OP ON OP.id_opc = AC.id_opc
	INNER JOIN Aplicaciones AP ON AP.id_app = OP.id_app
	INNER JOIN Modulo MO ON MO.id_modulo = AP.id_modulo
	WHERE AC.id_tip_oper = @id
	ORDER BY MO.id_modulo, AP.id_app, OP.id_opc

END
GO

---------------------------------------------------------------------------------
---------------------------------------------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'WMAN_PermisosOpcionesPlanilla_PutInfo') )
DROP PROCEDURE WMAN_PermisosOpcionesPlanilla_PutInfo
GO

CREATE PROCEDURE WMAN_PermisosOpcionesPlanilla_PutInfo
	@id  INT,
	@opcion INT,
	@id_oper  INT,
	@eliminado INT
	

AS

	DECLARE @Contador INT           -- Variable contador
	SET @Contador = 1   
	DECLARE @Regs INT               -- Variable para el Numero de Registros a procesar
	DECLARE @campo INT				--id_modulo

BEGIN
	DECLARE @MensajeError VARCHAR(255) = ''

	IF @eliminado = 0
	BEGIN
		
		declare @valor_llave INT
	
		IF(@opcion = 0)
		BEGIN
		
			CREATE TABLE #TempMOD (
			ID INT Identity(1,1),
			id_opc INT
			)
			
		-- Pasamos datos a la tabla temporal
			INSERT INTO #TempMOD(id_opc)
			(select id_opc from Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app 
				INNER JOIN Modulo M ON M.id_modulo = A.id_modulo WHERE M.id_modulo = @id)

			SET @Regs = (SELECT COUNT(*) FROM Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app 
				INNER JOIN Modulo M ON M.id_modulo = A.id_modulo WHERE M.id_modulo = @id)
			
			WHILE @Contador <= @Regs
			BEGIN
			
			SELECT @campo = t.id_opc FROM #TempMOD t WHERE t.ID = @Contador
			
				IF NOT EXISTS(select id_opc from Acceso_Opc_Tipo WHERE id_opc = @campo and id_tip_oper = @id_oper)
				BEGIN
					SET IDENTITY_INSERT Acceso_Opc_Tipo ON
					
						SET @valor_llave= IDENT_CURRENT ('Acceso_Opc_Tipo');
						--select @valor_llave
						SET @valor_llave = @valor_llave+1
						
						UPDATE syswinFOR
						SET valor_llave = @valor_llave
						WHERE desc_tabla = 'Acceso_Opc_Tipo'
					
						INSERT INTO Acceso_Opc_Tipo(id_acceso_opc,id_opc, id_tip_oper)
						VALUES(@valor_llave,@campo,@id_oper)
						
					SET IDENTITY_INSERT Acceso_Opc_Tipo OFF

						SET @eliminado = @valor_llave
				END
				SET @Contador = @Contador + 1
			END

		END
		
		IF(@opcion = 1)
		BEGIN
		
			CREATE TABLE #TempAPLI (
			ID INT Identity(1,1),
			id_opc INT
			)
			
		-- Pasamos datos a la tabla temporal
			INSERT INTO #TempAPLI(id_opc)
			(select id_opc from Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app 
				WHERE A.id_app = @id)

			SET @Regs = (SELECT COUNT(*) FROM Opciones O INNER JOIN Aplicaciones A ON A.id_app = O.id_app 
				WHERE A.id_app = @id)
			
			WHILE @Contador <= @Regs
			BEGIN
			
			SELECT @campo = t.id_opc FROM #TempAPLI t WHERE t.ID = @Contador
			
				IF NOT EXISTS(select id_opc from Acceso_Opc_Tipo WHERE id_opc = @campo and id_tip_oper = @id_oper)
				BEGIN
					SET IDENTITY_INSERT Acceso_Opc_Tipo ON
					
						SET @valor_llave= IDENT_CURRENT ('Acceso_Opc_Tipo');
						--select @valor_llave
						SET @valor_llave = @valor_llave+1
						
						--select * from syswinFOR
						UPDATE syswinFOR
						SET valor_llave = @valor_llave
						WHERE desc_tabla = 'Acceso_Opc_Tipo'
					
						INSERT INTO Acceso_Opc_Tipo(id_acceso_opc,id_opc, id_tip_oper)
						VALUES(@valor_llave,@campo,@id_oper)
						
					SET IDENTITY_INSERT Acceso_Opc_Tipo OFF

						SET @eliminado = @valor_llave
				END
				SET @Contador = @Contador + 1
			END
			
		END
	
		IF(@opcion = 2)
		BEGIN
			-- Crear select * from Acceso_Opc   SELECT * FROM syswinFOR
			
			SET IDENTITY_INSERT Acceso_Opc_Tipo ON
			
				SET @valor_llave= IDENT_CURRENT ('Acceso_Opc_Tipo');
				--select @valor_llave
				SET @valor_llave = @valor_llave+1
				
				UPDATE syswinFOR
				SET valor_llave = @valor_llave
				WHERE desc_tabla = 'Acceso_Opc_Tipo'
			
				INSERT INTO Acceso_Opc_Tipo(id_acceso_opc,id_opc, id_tip_oper)
				VALUES(@valor_llave,@id,@id_oper)
				
			SET IDENTITY_INSERT Acceso_Opc_Tipo OFF

				SET @eliminado = @valor_llave
		END
	END
	ELSE
		BEGIN
			IF(@opcion = 0)
			BEGIN
				DELETE FROM Acceso_Opc_Tipo WHERE id_tip_oper = @id_oper   and id_opc  IN
				(SELECT AO.id_opc  from Acceso_Opc_Tipo AO INNER JOIN Opciones O ON O.id_opc= AO.id_opc 
				INNER JOIN Aplicaciones A ON A.id_app = O.id_app INNER JOIN Modulo M ON M.id_modulo = A.id_modulo 
				WHERE AO.id_tip_oper = @id_oper AND M.id_modulo = @id)
			END
			IF(@opcion = 1)
			BEGIN
				DELETE FROM Acceso_Opc_Tipo WHERE id_tip_oper = @id_oper and id_opc  IN
				(SELECT AO.id_opc from Acceso_Opc_Tipo AO INNER JOIN Opciones O ON O.id_opc= AO.id_opc 
				INNER JOIN Aplicaciones A ON A.id_app = O.id_app 
				WHERE AO.id_tip_oper = @id_oper AND A.id_app = @id)
			END
			IF(@opcion = 2)
			BEGIN
				DELETE FROM Acceso_Opc_Tipo WHERE id_opc = @id and id_tip_oper = @id_oper
			END
		END
	
	SELECT @id AS Id
	
	RETURN

	ERROR:
		RAISERROR (@MensajeError, 16, 1)

END
GO