-- Seleccionar base de datos
USE seg_nexapps;
GO

-- DROP PROCEDURE IF EXISTS dbo.insert_update_sistemas;
-- GO
-- CREATE PROCEDURE dbo.insert_update_sistemas
--     @varPkSistema INT OUTPUT,
--     @varNombre VARCHAR(100),
--     @varDescripcion VARCHAR(255),
--     @varUrlAcceso VARCHAR(255),
--     @varUsuario VARCHAR(100),
--     @varOpc INT
-- AS
-- BEGIN
--     SET NOCOUNT ON;
--     DECLARE @result NVARCHAR(200), @save INT = 0;
--     DECLARE @existe INT;

--     -- MAYÚSCULAS
--     SET @varNombre = UPPER(@varNombre);
--     SET @varDescripcion = UPPER(@varDescripcion);
--     SET @varUrlAcceso = UPPER(@varUrlAcceso);

--     -- VALIDAR SI YA EXISTE
--     SELECT @existe = COUNT(*)
--     FROM dbo.sistemas
--     WHERE nombre = @varNombre
--       AND estado <> 3
--       AND (@varOpc = 1 OR id_sistema <> @varPkSistema);

--     IF @existe > 0
--     BEGIN
--         SET @result = 'Ya existe un sistema con este nombre.';
--         SELECT @save AS 'save', @result AS result;
--         RETURN;
--     END;

--     IF @varOpc = 1 -- INSERTAR
--     BEGIN
--         INSERT INTO dbo.sistemas (
--             nombre, descripcion, url_acceso, creado_por
--         )
--         VALUES (
--             @varNombre, @varDescripcion, @varUrlAcceso, @varUsuario
--         );

--         SET @varPkSistema = SCOPE_IDENTITY();
--         SET @save = 1;
--         SET @result = 'Sistema insertado correctamente';
--     END;
--     ELSE IF @varOpc = 2 -- ACTUALIZAR
--     BEGIN
--         UPDATE dbo.sistemas
--         SET nombre = @varNombre,
--             descripcion = @varDescripcion,
--             url_acceso = @varUrlAcceso,
--             modificado_por = @varUsuario
--         WHERE id_sistema = @varPkSistema;

--         SET @save = 1;
--         SET @result = 'Sistema actualizado correctamente';
--     END;
--     ELSE
--     BEGIN
--         SET @result = 'Opción no válida';
--     END;

--     SELECT @save AS 'save', @result AS result, @varPkSistema AS pk;
-- END;
-- GO





-- DROP PROCEDURE IF EXISTS dbo.insert_update_sistemas_permisos;
-- GO
-- CREATE PROCEDURE dbo.insert_update_sistemas_permisos
--     @varPkPermiso INT OUTPUT,
--     @varCodigo VARCHAR(50),
--     @varNombre VARCHAR(100),
--     @varDescripcion VARCHAR(255),
--     @varIdSistema INT,
--     @varUsuario VARCHAR(100),
--     @varOpc INT
-- AS
-- BEGIN
--     SET NOCOUNT ON;
--     DECLARE @result NVARCHAR(200), @save INT = 0;
--     DECLARE @existe INT;

--     -- MAYÚSCULAS
--     SET @varCodigo = UPPER(@varCodigo);
--     SET @varNombre = UPPER(@varNombre);
--     SET @varDescripcion = UPPER(@varDescripcion);

--     -- VALIDAR SI YA EXISTE
--     SELECT @existe = COUNT(*)
--     FROM dbo.sistemas_permisos
--     WHERE codigo = @varCodigo
--         AND estado <> 3
--         AND (@varOpc = 1 OR id_permiso <> @varPkPermiso);

--     IF @existe > 0
--     BEGIN
--         SET @result = 'El permiso con este código ya existe.';
--         SELECT @save AS 'save', @result AS result;
--         RETURN;
--     END;

--     IF @varOpc = 1 -- INSERTAR
--     BEGIN
--         INSERT INTO dbo.sistemas_permisos (codigo, nombre, descripcion, id_sistema, creado_por)
--         VALUES (@varCodigo, @varNombre, @varDescripcion, @varIdSistema, @varUsuario);

--         SET @varPkPermiso = SCOPE_IDENTITY();
--         SET @save = 1;
--         SET @result = 'Registro insertado correctamente';
--     END;
--     ELSE IF @varOpc = 2 -- ACTUALIZAR
--     BEGIN
--         UPDATE dbo.sistemas_permisos
--         SET codigo = @varCodigo,
--             nombre = @varNombre,
--             descripcion = @varDescripcion,
--             id_sistema = @varIdSistema,
--             modificado_por = @varUsuario
--         WHERE id_permiso = @varPkPermiso;

--         SET @save = 1;
--         SET @result = 'Registro actualizado correctamente';
--     END;
--     ELSE
--     BEGIN
--         SET @result = 'Opción no válida';
--     END;

--     SELECT @save AS 'save', @result AS result, @varPkPermiso AS pk;
-- END;
-- GO





DROP PROCEDURE IF EXISTS dbo.insert_update_modulos;
GO
CREATE PROCEDURE dbo.insert_update_modulos
    @varPkModulo INT OUTPUT,
    @varModulo VARCHAR(MAX),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @result NVARCHAR(200), @save INT = 0;
    -- DECLARE @existe INT;
    DECLARE @id_existe INT;

    -- VALIDACIONES
    SET @varModulo = UPPER(@varModulo);

    -- Verificar si ya existe un registro con el mismo nombre
    -- SELECT @existe = COUNT(*)
    SELECT @id_existe = id_modulo
    FROM dbo.modulos
    WHERE modulo = @varModulo
      AND estado <> 3
      AND (@varOpc = 1 OR id_modulo <> @varPkModulo);

    -- IF @existe > 0
    IF @id_existe IS NOT NULL
    BEGIN
        SET @result = 'El módulo con este nombre ya existe.';
        SET @varPkModulo = @id_existe;
        SELECT @save AS 'save', @result AS result, @varPkModulo as pk;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERT
    BEGIN
        INSERT INTO dbo.modulos (modulo)
        VALUES (@varModulo);

        SET @varPkModulo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Módulo insertado correctamente.';
    END;
    ELSE IF @varOpc = 2 -- UPDATE
    BEGIN
        UPDATE dbo.modulos
        SET modulo = @varModulo
        WHERE id_modulo = @varPkModulo;

        SET @save = 1;
        SET @result = 'Módulo actualizado correctamente.';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción inválida.';
    END;

    SELECT @save AS 'save', @result AS result, @varPkModulo AS pk;
END;
GO





DROP PROCEDURE IF EXISTS dbo.insert_update_modulos_permisos;
GO
CREATE PROCEDURE dbo.insert_update_modulos_permisos
    @varPkPermiso INT OUTPUT,
    @varCodigo VARCHAR(50),
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varIdModulo INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varCodigo = UPPER(@varCodigo);
    SET @varNombre = UPPER(@varNombre);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM dbo.modulos_permisos
    WHERE codigo = @varCodigo
        AND estado <> 3
        AND (@varOpc = 1 OR id_permiso <> @varPkPermiso);

    IF @existe > 0
    BEGIN
        SET @result = 'El permiso con este código ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO dbo.modulos_permisos (
            codigo, nombre, descripcion, id_modulo, creado_por
        )
        VALUES (
            @varCodigo, @varNombre, @varDescripcion, @varIdModulo, @varUsuario
        );

        SET @varPkPermiso = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE dbo.modulos_permisos
        SET codigo = @varCodigo,
            nombre = @varNombre,
            descripcion = @varDescripcion,
            id_modulo = @varIdModulo,
            modificado_por = @varUsuario
        WHERE id_permiso = @varPkPermiso;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkPermiso AS pk;
END;
GO





DROP PROCEDURE IF EXISTS dbo.insert_update_usuarios_permisos_asignaciones;
GO
CREATE PROCEDURE dbo.insert_update_usuarios_permisos_asignaciones
    @varPkAsignacion INT OUTPUT,
    @varIdUsuario INT,
    @varIdPermiso INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO dbo.usuarios_permisos_asignaciones (id_usuario, id_permiso, creado_por)
        VALUES (@varIdUsuario, @varIdPermiso, @varUsuario);

        SET @varPkAsignacion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE dbo.usuarios_permisos_asignaciones
        SET id_usuario = @varIdUsuario,
            id_permiso = @varIdPermiso,
            modificado_por = @varUsuario
        WHERE id_asignacion = @varPkAsignacion;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
END;
GO





DROP PROCEDURE IF EXISTS dbo.insert_update_roles_permisos_asignaciones;
GO
CREATE PROCEDURE dbo.insert_update_roles_permisos_asignaciones
    @varPkAsignacion INT OUTPUT,
    @varIdRol INT,
    @varIdPermiso INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM dbo.roles_permisos_asignaciones
    WHERE id_rol = @varIdRol
      AND id_permiso = @varIdPermiso
      AND estado <> 3
      AND (@varOpc = 1 OR id_asignacion <> @varPkAsignacion);

    IF @existe > 0
    BEGIN
        SET @result = 'Esta asignación de permiso ya existe para este rol.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO dbo.roles_permisos_asignaciones (
            id_rol, id_permiso, creado_por
        )
        VALUES (
            @varIdRol, @varIdPermiso, @varUsuario
        );

        SET @varPkAsignacion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Asignación insertada correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE dbo.roles_permisos_asignaciones
        SET id_rol = @varIdRol,
            id_permiso = @varIdPermiso,
            modificado_por = @varUsuario
        WHERE id_asignacion = @varPkAsignacion;

        SET @save = 1;
        SET @result = 'Asignación actualizada correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
END;
GO





-- el sp es para la tabla que yo no cree llamada 'usuarios_roles_tipos' de seg_nexapps:
DROP PROCEDURE IF EXISTS dbo.insert_update_usuarios_roles;
GO

CREATE PROCEDURE dbo.insert_update_usuarios_roles
    @varPkRol INT OUTPUT,
    @varRol VARCHAR(MAX),
    @varIdModulo INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @id_existe INT;

    -- VALIDACIONES
    SET @varRol = UPPER(@varRol);

    -- Verificar si ya existe un rol con el mismo nombre
    SELECT @id_existe = id_rol
    FROM dbo.usuarios_roles_tipos
    WHERE rol = @varRol
      AND id_modulo = @varIdModulo
      AND estado <> 3
      AND (@varOpc = 1 OR id_rol <> @varPkRol);

    IF @id_existe IS NOT NULL
    BEGIN
        SET @result = 'El rol con este nombre ya existe.';
        SET @varPkRol = @id_existe;
        SELECT @save AS 'save', @result AS result, @varPkRol AS pk;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERT
    BEGIN
        INSERT INTO dbo.usuarios_roles_tipos (rol, id_modulo, creado_por)
        VALUES (@varRol, @varIdModulo, @varUsuario);

        SET @varPkRol = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Rol insertado correctamente.';
    END;
    ELSE IF @varOpc = 2 -- UPDATE
    BEGIN
        UPDATE dbo.usuarios_roles_tipos
        SET rol = @varRol,
            id_modulo = @varIdModulo,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE id_rol = @varPkRol;

        SET @save = 1;
        SET @result = 'Rol actualizado correctamente.';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción inválida.';
    END;

    SELECT @save AS 'save', @result AS result, @varPkRol AS pk;
END;
GO





-- el sp es para la tabla que yo no cree llamada 'menus' de seg_nexapps:
DROP PROCEDURE IF EXISTS dbo.insert_update_menus;
GO
CREATE PROCEDURE dbo.insert_update_menus
    @varPkMenu INT OUTPUT,
    @varCodigoMenu VARCHAR(50),
    @varMenu VARCHAR(50),
    @varDescripcion VARCHAR(MAX),
    @varIdModulo INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @id_existe INT;

    -- MAYÚSCULAS
    SET @varCodigoMenu = UPPER(@varCodigoMenu);
    SET @varMenu = UPPER(@varMenu);

    -- VALIDAR SI YA EXISTE
    SELECT @id_existe = id_menu
    FROM seg_nexapps.dbo.menus
    WHERE codigo_menu = @varCodigoMenu
        AND (@varOpc = 1 OR id_menu <> @varPkMenu);

    IF @id_existe IS NOT NULL
    BEGIN
        SET @result = 'El menú con este código ya existe.';
        SET @varPkMenu = @id_existe;
        SELECT @save AS 'save', @result AS result, @varPkMenu AS pk;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO seg_nexapps.dbo.menus (
            codigo_menu, menu, descripcion, id_modulo
        )
        VALUES (
            @varCodigoMenu, @varMenu, @varDescripcion, @varIdModulo
        );

        SET @varPkMenu = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE seg_nexapps.dbo.menus
        SET codigo_menu = @varCodigoMenu,
            menu = @varMenu,
            descripcion = @varDescripcion,
            id_modulo = @varIdModulo
        WHERE id_menu = @varPkMenu;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkMenu AS pk;
END;
GO





-- el sp es para la tabla que yo no cree llamada 'menus' de seg_nexapps:
DROP PROCEDURE IF EXISTS dbo.insert_update_menus_roles;
GO
CREATE PROCEDURE dbo.insert_update_menus_roles
    @varPkSecuencia INT OUTPUT,
    @varIdRol INT,
    @varIdMenu INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @id_existe INT;

    -- VALIDAR SI YA EXISTE
    SELECT @id_existe = id_secuencia
    FROM seg_nexapps.dbo.menus_roles
    WHERE id_rol = @varIdRol AND id_menu = @varIdMenu
        AND (@varOpc = 1 OR id_secuencia <> @varPkSecuencia);

    IF @id_existe IS NOT NULL
    BEGIN
        SET @result = 'El rol ya tiene asignado este menú.';
        SET @varPkSecuencia = @id_existe;
        SELECT @save AS 'save', @result AS result, @varPkSecuencia AS pk;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO seg_nexapps.dbo.menus_roles (
            id_rol, id_menu
        )
        VALUES (
            @varIdRol, @varIdMenu
        );

        SET @varPkSecuencia = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE seg_nexapps.dbo.menus_roles
        SET id_rol = @varIdRol,
            id_menu = @varIdMenu
        WHERE id_secuencia = @varPkSecuencia;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkSecuencia AS pk;
END;
GO





DROP PROCEDURE IF EXISTS dbo.insert_update_usuarios_menus_asignaciones;
GO
CREATE PROCEDURE dbo.insert_update_usuarios_menus_asignaciones
    @varPkAsignacion INT OUTPUT,
    @varIdUsuario INT,
    @varIdMenu INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO dbo.usuarios_menus_asignaciones (id_usuario, id_menu, creado_por)
        VALUES (@varIdUsuario, @varIdMenu, @varUsuario);

        SET @varPkAsignacion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE dbo.usuarios_menus_asignaciones
        SET id_usuario = @varIdUsuario,
            id_menu = @varIdMenu,
            modificado_por = @varUsuario
        WHERE id_asignacion = @varPkAsignacion;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
END;
GO



-- para tabla que yo no cree, seg_nexapps.empresas
DROP PROCEDURE IF EXISTS dbo.insert_update_empresas;
GO

CREATE PROCEDURE dbo.insert_update_empresas
    @varPkEmpresa INT OUTPUT,
    @varNombreEmpresa VARCHAR(50),
    @varDireccionEmpresa VARCHAR(MAX),
    @varTelefono VARCHAR(50),
    @varLimiteUsuarios INT,
    @varUsuario VARCHAR(50),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @id_existe INT;

    -- VALIDACIONES
    SET @varNombreEmpresa = UPPER(@varNombreEmpresa);

    -- Verificar si ya existe una empresa con el mismo nombre
    SELECT @id_existe = id_empresa
    FROM dbo.empresas
    WHERE nombre_empresa = @varNombreEmpresa
      AND estado <> 3
      AND (@varOpc = 1 OR id_empresa <> @varPkEmpresa);

    IF @id_existe IS NOT NULL
    BEGIN
        SET @result = 'Ya existe una empresa con este nombre.';
        SET @varPkEmpresa = @id_existe;
        SELECT @save AS 'save', @result AS result, @varPkEmpresa AS pk;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERT
    BEGIN
        INSERT INTO dbo.empresas (
            nombre_empresa, direccion_empresa, telefono, limite_usuarios, creado_por
        )
        VALUES (
            @varNombreEmpresa, @varDireccionEmpresa, @varTelefono, @varLimiteUsuarios, @varUsuario
        );

        SET @varPkEmpresa = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Empresa insertada correctamente.';
    END;
    ELSE IF @varOpc = 2 -- UPDATE
    BEGIN
        UPDATE dbo.empresas
        SET nombre_empresa = @varNombreEmpresa,
            direccion_empresa = @varDireccionEmpresa,
            telefono = @varTelefono,
            limite_usuarios = @varLimiteUsuarios,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE id_empresa = @varPkEmpresa;

        SET @save = 1;
        SET @result = 'Empresa actualizada correctamente.';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción inválida.';
    END;

    SELECT @save AS 'save', @result AS result, @varPkEmpresa AS pk;
END;
GO
