-- Acciones PNet Automotriz -- 

/****** pNetAcciones ******/

CREATE TABLE pNetAcciones (
    IDAcciones INT IDENTITY(1,1) NOT NULL, 
    Descripcion NVARCHAR(100) NULL,       
    IDUsuarioTipo INT NULL,               
    Ruta NVARCHAR(50) NULL,               
    CONSTRAINT PK_pNetAcciones PRIMARY KEY (IDAcciones) 
);



/****** pNetAcciones ******/
CREATE TABLE pNetRoleAcciones (
    IDRoleAcciones INT IDENTITY(1,1) NOT NULL, 
    IDRole INT NULL,
    IDAcciones INT NULL,
    CONSTRAINT PK_pNetRoleAcciones PRIMARY KEY (IDRoleAcciones)
);

/****** spPNet_AccionesInsert ******/
IF EXISTS (SELECT * 
           FROM sysobjects 
           WHERE id = OBJECT_ID('dbo.spPNet_AccionesInsert') 
             AND type = 'P')
BEGIN
    DROP PROCEDURE dbo.spPNet_AccionesInsert
END
GO

CREATE PROCEDURE [dbo].[spPNet_AccionesInsert] 
    @IDAcciones       INT, 
    @Descripcion      NVARCHAR(100),
    @IDUsuarioTipo    INT,
    @Ruta             NVARCHAR(50)
AS
BEGIN

    IF NOT EXISTS (SELECT IDAcciones FROM dbo.pNetAcciones WHERE IDAcciones = @IDAcciones)
    BEGIN
       
        INSERT INTO dbo.pNetAcciones (Descripcion, IDUsuarioTipo, Ruta)
        SELECT @Descripcion, @IDUsuarioTipo, @Ruta
    END
    ELSE
    BEGIN

        UPDATE dbo.pNetAcciones
        SET Descripcion = @Descripcion, 
            IDUsuarioTipo = @IDUsuarioTipo, 
            Ruta = @Ruta    
        WHERE IDAcciones = @IDAcciones
    END

    RETURN
END
GO

/************************************************* Acciones Automotriz ***********************************************/
DECLARE @SET_IDUsuarioTipo INT
SELECT	@SET_IDUsuarioTipo = IDUsuarioTipo 
  FROM	pNetUsuarioTipo WHERE Descripcion = 'Automotriz'
  -- Insertar acción "Crear"
EXEC spPNet_AccionesInsert 
    @IDAcciones = 1, 
    @Descripcion = 'Crear', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/crear';


EXEC spPNet_AccionesInsert 
    @IDAcciones = 2, 
    @Descripcion = 'Eliminar', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/eliminar';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 3, 
    @Descripcion = 'Actualizar', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/actualizar';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 4, 
    @Descripcion = 'Envio Fotos', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/envio/fotos';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 5, 
    @Descripcion = 'Envio Correo', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/envio/correro';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 6, 
    @Descripcion = 'Envio de video', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/envio/video';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 7, 
    @Descripcion = 'Agregar Firma', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/firma';

EXEC spPNet_AccionesInsert 
    @IDAcciones = 8, 
    @Descripcion = 'Envio de Whatsapp', 
    @IDUsuarioTipo = @SET_IDUsuarioTipo, 
    @Ruta = 'acciones/whatsapp';


 /****** spNetAdminAcciones_Lista ******/
IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'spNetAdminAcciones_Lista' AND TYPE = 'P') DROP PROCEDURE dbo.spNetAdminAcciones_Lista
GO  
CREATE PROCEDURE dbo.spNetAdminAcciones_Lista
-- WITH ENCRYPTION  
AS
BEGIN 
SET NOCOUNT ON
	DECLARE @IDUsuarioTipo int
	SELECT @IDUsuarioTipo = IDUsuarioTipo FROM pNetUsuarioTipo WHERE Descripcion = 'Automotriz'

	SELECT R.IDRole, R.Descripcion, COUNT(P.IDAcciones) Acciones
	  FROM pNetRole R 
	  LEFT JOIN pNetRoleAcciones P ON R.IDRole = P.IDRole
	 WHERE R.IDUsuarioTipo = @IDUsuarioTipo
	 GROUP BY R.IDRole, R.Descripcion
	 ORDER BY R.Descripcion

RETURN
SET NOCOUNT OFF
END
GO

/****** spNetAdminRoles_Acciones ******/
IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'spNetAdminRoles_Acciones' AND TYPE = 'P') DROP PROCEDURE dbo.spNetAdminRoles_Acciones
GO  
CREATE PROCEDURE dbo.spNetAdminRoles_Acciones
	@IDRole int = NULL
-- WITH ENCRYPTION  
AS
BEGIN
SET NOCOUNT ON
	DECLARE @IDUsuarioTipo int
	SELECT @IDUsuarioTipo = IDUsuarioTipo FROM pNetUsuarioTipo WHERE Descripcion = 'Automotriz'

	SELECT DISTINCT A.IDAcciones, A.Descripcion, A.Ruta,
		   CASE WHEN RA.IDRole IS NULL THEN 0 WHEN @IDRole IS NULL THEN 0 ELSE 1 END Seleccionado
	  FROM pNetAcciones A
	  LEFT JOIN pNetRoleAcciones RA ON A.IDAcciones = RA.IDAcciones AND RA.IDRole = isnull(@IDRole, RA.IDRole)
	 WHERE A.IDUsuarioTipo = @IDUsuarioTipo
	 ORDER BY A.IDAcciones
RETURN
SET NOCOUNT OFF
END
GO

/****** spNetRoles_Accciones ******/
IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'spNetRoles_Acciones' AND TYPE = 'P') DROP PROCEDURE dbo.spNetRoles_Acciones
GO  
CREATE PROCEDURE dbo.spNetRoles_Acciones
	@IDRole int = NULL
-- WITH ENCRYPTION  
AS
BEGIN
SET NOCOUNT ON
	DECLARE @IDUsuarioTipo int
	SELECT @IDUsuarioTipo = IDUsuarioTipo FROM pNetUsuarioTipo WHERE Descripcion = 'Automotriz'

	SELECT DISTINCT A.IDAcciones, A.Descripcion, A.Ruta,
		   CASE WHEN RA.IDRole IS NULL THEN 0 WHEN @IDRole IS NULL THEN 0 ELSE 1 END Seleccionado
	  FROM pNetAcciones A
	  JOIN pNetRoleAcciones RA ON A.IDAcciones = RA.IDAcciones AND RA.IDRole = isnull(@IDRole, RA.IDRole)
	 WHERE A.IDUsuarioTipo = @IDUsuarioTipo 
	 ORDER BY A.IDAcciones
RETURN
SET NOCOUNT OFF
END
GO


/****** spNetAdminRolesAcciones_Actualizar ******/
IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'spNetAdminRolesAcciones_Actualizar' AND TYPE = 'P') 
    DROP PROCEDURE dbo.spNetAdminRolesAcciones_Actualizar;
GO  

CREATE PROCEDURE dbo.spNetAdminRolesAcciones_Actualizar
    @IDRole        INT,
    @Descripcion   VARCHAR(100),
    @Acciones      VARCHAR(MAX) = '' -- Lista de IDs de acciones separadas por comas
AS
BEGIN
    SET NOCOUNT ON;

    -- Obtener el IDUsuarioTipo para 'Automotriz'
    DECLARE @IDUsuarioTipo INT;
    SELECT @IDUsuarioTipo = IDUsuarioTipo 
    FROM pNetUsuarioTipo 
    WHERE Descripcion = 'Automotriz';

    -- Actualizar la descripción del rol
    UPDATE pNetRole
    SET Descripcion = @Descripcion
    WHERE IDUsuarioTipo = @IDUsuarioTipo AND IDRole = @IDRole;

    -- Manejar las acciones asociadas al rol
    IF EXISTS(SELECT 1 FROM pNetRole WHERE IDRole = @IDRole)
    BEGIN
        -- Si @Acciones está vacío, eliminar todas las acciones asociadas al rol
        IF (@Acciones = '')
        BEGIN
            DELETE FROM pNetRoleAcciones 
            WHERE IDRole = @IDRole;
        END
        ELSE
        BEGIN
            -- Eliminar las acciones actuales asociadas al rol
            DELETE FROM pNetRoleAcciones 
            WHERE IDRole = @IDRole;

            -- Insertar las nuevas acciones
            INSERT INTO pNetRoleAcciones (IDRole, IDAcciones)
            SELECT DISTINCT @IDRole AS IDRole, CAST(S.Valor AS INT) AS IDAcciones
            FROM dbo.fnSplitTable(@Acciones, ',') S
            INNER JOIN pNetAcciones A ON CAST(S.Valor AS INT) = A.IDAcciones
            WHERE A.IDUsuarioTipo = @IDUsuarioTipo;
        END
    END;

    RETURN; 
END;
GO

/****** spNetAdminAciones_Validar ******/
IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'spNetAdminAciones_Validar' AND TYPE = 'P') DROP PROCEDURE dbo.spNetAdminAciones_Validar
GO  
CREATE PROCEDURE dbo.spNetAdminAciones_Validar
	@Usuario	varchar(10),
	@RouteLink	varchar(MAX)
-- WITH ENCRYPTION  
AS
BEGIN
SET NOCOUNT ON
 	DECLARE @IDUsuarioTipo INT;
	SELECT @IDUsuarioTipo = IDUsuarioTipo 
	FROM pNetRole 
	WHERE Descripcion = 'Root';
	IF EXISTS(
		SELECT A.IDAcciones
		FROM Usuario U
		JOIN pNetRoleUsuario RU ON U.Usuario = RU.Usuario
        JOIN pNetRole R ON RU.IDRole = R.IDRole AND R.IDUsuarioTipo = @IDUsuarioTipo
        JOIN pNetRoleAcciones AP ON R.IDRole = AP.IDRole
        JOIN pNetAcciones A ON AP.IDAcciones = A.IDAcciones
      	WHERE	U.Usuario = @Usuario  AND A.Ruta = @RouteLink
	)
	BEGIN
		SELECT 1 Acceso
	END
	ELSE
	BEGIN
		SELECT 0 Acceso
	END
RETURN
SET NOCOUNT OFF
END
GO

