Files
Plataforma-de-desarrolladores/Migracion_Bitacora_ConsultaRelaciones_20260722.sql
Jorge Luis caudillo esparza 8f33c860ec Ajustes
2026-08-13 19:46:33 -07:00

377 lines
12 KiB
Transact-SQL

CREATE OR ALTER PROCEDURE dbo.PA_Bit_BitacoraListByRelations
@RelacionesXml xml = NULL,
@RegistrosOmitidos int,
@RegistrosPorPagina int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF @RegistrosOmitidos < 0 OR @RegistrosPorPagina <= 0
BEGIN
SET @ErrorMostrar = 'Los datos de paginación no son válidos.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @EsAdministrador bit = 0;
DECLARE @EsDesarrollador bit = 0;
SELECT
@EsAdministrador = CASE
WHEN R.NombreRol IN ('SuperUsuario', 'Administrador') THEN 1
ELSE 0
END,
@EsDesarrollador = CASE
WHEN R.NombreRol = 'Empresa' THEN 1
ELSE 0
END
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta
AND U.Activo = 1
AND R.Activo = 1;
DECLARE @Filtros TABLE
(
Orden int NOT NULL PRIMARY KEY,
NombreTablaSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreCampoSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
Valor nvarchar(250)
COLLATE Modern_Spanish_CS_AS NOT NULL
);
IF @RelacionesXml IS NOT NULL
BEGIN
INSERT INTO @Filtros
(
Orden,
NombreTablaSQL,
NombreCampoSQL,
Valor
)
SELECT
R.value('@Orden', 'int'),
R.value('@Tabla', 'varchar(128)'),
R.value('@Campo', 'varchar(128)'),
R.value('@Valor', 'nvarchar(250)')
FROM @RelacionesXml.nodes('/Relaciones/Relacion') AS X(R);
END;
DECLARE @FiltrosResueltos TABLE
(
Orden int NOT NULL PRIMARY KEY,
CveTabla int NOT NULL,
CveCampo int NOT NULL,
TipoDatoSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
Valor nvarchar(250)
COLLATE Modern_Spanish_CS_AS NOT NULL,
EsEntero bit NOT NULL
);
INSERT INTO @FiltrosResueltos
(
Orden,
CveTabla,
CveCampo,
TipoDatoSQL,
Valor,
EsEntero
)
SELECT
F.Orden,
T.CveTabla,
C.CveCampo,
C.TipoDatoSQL,
F.Valor,
CASE
WHEN C.TipoDatoSQL IN
(
'tinyint',
'smallint',
'int',
'bigint'
) THEN 1
ELSE 0
END
FROM @Filtros AS F
INNER JOIN dbo.Bit_Tablas AS T
ON T.NombreTablaSQL = F.NombreTablaSQL
AND T.Activo = 1
INNER JOIN dbo.Bit_Campos AS C
ON C.CveTabla = T.CveTabla
AND C.NombreCampoSQL = F.NombreCampoSQL
AND C.Activo = 1
WHERE C.TipoDatoSQL IS NOT NULL;
IF (SELECT COUNT(1) FROM @Filtros) <>
(SELECT COUNT(1) FROM @FiltrosResueltos)
BEGIN
SET @ErrorMostrar = 'Una relación utiliza una tabla o campo que no está configurado en la bitácora.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @FiltrosResueltos
WHERE EsEntero = 1
AND TRY_CONVERT(bigint, Valor) IS NULL
)
BEGIN
SET @ErrorMostrar = 'El valor de una relación numérica no es válido.';
SET @ErrorTipo = 2;
RETURN;
END;
CREATE TABLE #BitacorasCoincidentes
(
CveBitacora bigint NOT NULL PRIMARY KEY,
FechaMovimiento datetime NOT NULL
);
INSERT INTO #BitacorasCoincidentes
(
CveBitacora,
FechaMovimiento
)
SELECT
B.CveBitacora,
B.FechaMovimiento
FROM dbo.Bit_Bitacora AS B
WHERE
(
@EsAdministrador = 1
OR
(
@EsDesarrollador = 1
AND EXISTS
(
SELECT 1
FROM dbo.Bit_BitacoraRelaciones AS BRCliente
INNER JOIN dbo.Bit_Tablas AS TCliente
ON TCliente.CveTabla =
BRCliente.CveTablaRelacionada
INNER JOIN dbo.Bit_Campos AS CCliente
ON CCliente.CveCampo =
BRCliente.CveCampoRelacion
AND CCliente.CveTabla = TCliente.CveTabla
INNER JOIN dbo.Sis_UsuariosClientes AS UC
ON UC.CveCliente =
BRCliente.ValorRelacionNumero
AND UC.CveUsuario = @CveUsuarioEjecuta
AND UC.Activo = 1
WHERE BRCliente.CveBitacora = B.CveBitacora
AND BRCliente.VisibleDesarrollador = 1
AND TCliente.NombreTablaSQL = 'Clientes'
AND CCliente.NombreCampoSQL = 'CveCliente'
)
)
)
AND
(
@EsDesarrollador = 0
OR NOT EXISTS
(
SELECT 1
FROM @FiltrosResueltos AS FCliente
INNER JOIN dbo.Bit_Tablas AS TClienteFiltro
ON TClienteFiltro.CveTabla = FCliente.CveTabla
INNER JOIN dbo.Bit_Campos AS CClienteFiltro
ON CClienteFiltro.CveCampo = FCliente.CveCampo
AND CClienteFiltro.CveTabla =
TClienteFiltro.CveTabla
WHERE TClienteFiltro.NombreTablaSQL = 'Clientes'
AND CClienteFiltro.NombreCampoSQL = 'CveCliente'
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_UsuariosClientes AS UCClienteFiltro
WHERE UCClienteFiltro.CveUsuario =
@CveUsuarioEjecuta
AND UCClienteFiltro.CveCliente =
TRY_CONVERT(bigint, FCliente.Valor)
AND UCClienteFiltro.Activo = 1
)
)
)
AND NOT EXISTS
(
SELECT 1
FROM @FiltrosResueltos AS F
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_BitacoraRelaciones AS BR
WHERE BR.CveBitacora = B.CveBitacora
AND BR.CveTablaRelacionada = F.CveTabla
AND BR.CveCampoRelacion = F.CveCampo
AND
(
@EsAdministrador = 1
OR BR.VisibleDesarrollador = 1
)
AND
(
(
F.EsEntero = 1
AND BR.ValorRelacionNumero =
TRY_CONVERT(bigint, F.Valor)
)
OR
(
F.EsEntero = 0
AND BR.ValorRelacionTexto =
F.Valor COLLATE Modern_Spanish_CS_AS
)
)
)
);
DECLARE @TotalRegistros int;
SELECT @TotalRegistros = COUNT(DISTINCT CveBitacora)
FROM #BitacorasCoincidentes;
CREATE TABLE #BitacorasPagina
(
CveBitacora bigint NOT NULL PRIMARY KEY,
Orden int NOT NULL
);
INSERT INTO #BitacorasPagina
(
CveBitacora,
Orden
)
SELECT
C.CveBitacora,
ROW_NUMBER() OVER
(
ORDER BY
C.FechaMovimiento DESC,
C.CveBitacora DESC
)
FROM #BitacorasCoincidentes AS C
ORDER BY
C.FechaMovimiento DESC,
C.CveBitacora DESC
OFFSET @RegistrosOmitidos ROWS
FETCH NEXT @RegistrosPorPagina ROWS ONLY;
SELECT @TotalRegistros AS TotalRegistros;
SELECT
B.CveBitacora,
B.CveTabla,
T.NombreTablaSQL,
T.NombreMostrar AS NombreTabla,
B.CveTipoMovimiento,
M.Nombre AS TipoMovimiento,
B.CveDefinicionAccion,
A.NombreAccion,
A.DescripcionAccion,
B.CveUsuarioEjecuta,
B.CveUsuarioAutoriza,
B.FechaAutorizacion,
B.LlaveRegistro,
B.DescripcionMovimiento,
B.FechaMovimiento,
B.DireccionIP,
B.NombreEquipo,
B.Modulo
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_Bitacora AS B
ON B.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_Tablas AS T
ON T.CveTabla = B.CveTabla
INNER JOIN dbo.Bit_TiposMovimiento AS M
ON M.CveTipoMovimiento = B.CveTipoMovimiento
LEFT JOIN dbo.Bit_DefinicionesAccion AS A
ON A.CveDefinicionAccion = B.CveDefinicionAccion
ORDER BY P.Orden;
SELECT
BC.CveBitacoraCampo,
BC.CveBitacora,
BC.CveCampo,
C.NombreCampoSQL,
C.NombreMostrar,
BC.ValorAnterior,
BC.ValorNuevo
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_BitacoraCampos AS BC
ON BC.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_Campos AS C
ON C.CveCampo = BC.CveCampo
WHERE @EsAdministrador = 1
OR C.MostrarEnBitacora = 1
ORDER BY
P.Orden,
BC.CveBitacoraCampo;
SELECT
BR.CveBitacoraRelacion,
BR.CveBitacora,
BR.CveTipoRelacion,
TR.Nombre AS TipoRelacion,
BR.CveTablaRelacionada,
T.NombreTablaSQL,
BR.CveCampoRelacion,
C.NombreCampoSQL,
BR.LlaveRegistroRelacionada,
BR.ValorRelacionNumero,
BR.ValorRelacionTexto,
BR.VisibleDesarrollador,
BR.DescripcionRelacion
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_BitacoraRelaciones AS BR
ON BR.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_TiposRelacion AS TR
ON TR.CveTipoRelacion = BR.CveTipoRelacion
INNER JOIN dbo.Bit_Tablas AS T
ON T.CveTabla = BR.CveTablaRelacionada
LEFT JOIN dbo.Bit_Campos AS C
ON C.CveCampo = BR.CveCampoRelacion
AND C.CveTabla = T.CveTabla
WHERE @EsAdministrador = 1
OR BR.VisibleDesarrollador = 1
ORDER BY
P.Orden,
BR.CveBitacoraRelacion;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar la bitácora; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Bit_BitacoraListByRelations'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO