Files
Plataforma-de-desarrolladores/Tablero_Tramites_20260919.sql
Jorge Luis caudillo esparza e8160eefba --documentos
2026-09-27 14:44:12 -07:00

309 lines
9.9 KiB
Transact-SQL

/*
Tablero de trámites. Ejecutar en la base configurada para la aplicación
únicamente después de autorizar su instalación.
Crea o actualiza solamente:
dbo.PA_Tra_ReporteTramitesList
dbo.PA_Tra_SolicitudHistorialEstatusList
No cambia tablas, permisos, catálogos ni solicitudes existentes.
Los valores 1 y 2 de @CveAgrupacion son opciones del reporte:
1 = Por trámite; 2 = Por cliente.
No son claves nuevas de un catálogo de la base de datos.
PENDIENTE: bloqueo a nivel Clientes y tabla de cambios con comentarios.
@SoloBloqueados se recibe, pero aún no restringe los resultados.
*/
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ReporteTramitesList
@CveUsuarioEjecuta int,
@CveAgrupacion tinyint = 1,
@CveFraccionamiento int = NULL,
@SoloActivos bit = 1,
@SoloBloqueados bit = 0,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @CveRol int;
DECLARE @TieneAccesoGlobal bit = 0;
-- Misma regla de acceso que PA_Tramites_SolicitudGet/List.
SELECT
@CveRol = U.CveRol,
@TieneAccesoGlobal = CASE WHEN U.CveRol <= 2 THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U
WHERE U.CveUsuario = @CveUsuarioEjecuta
AND U.Activo = 1;
IF @CveRol IS NULL
BEGIN
SET @ErrorMostrar = 'El usuario no existe o está inactivo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveAgrupacion IS NULL OR @CveAgrupacion NOT IN (1, 2)
BEGIN
SET @ErrorMostrar = 'Seleccione una agrupación válida.';
SET @ErrorTipo = 2;
RETURN;
END;
-- Empresa es el rol cliente actual (UserSessionModel.EsDesarrollador).
IF @CveRol = 3
BEGIN
IF @CveAgrupacion <> 1
BEGIN
SET @ErrorMostrar = 'La agrupación seleccionada no está disponible para el usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @SoloBloqueados = 0;
END;
SELECT
F.CveFraccionamiento,
F.Fraccionamiento
INTO #FraccionamientosAutorizados
FROM dbo.Fraccionamientos AS F
WHERE @TieneAccesoGlobal = 1
OR EXISTS
(
SELECT 1
FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta
AND UC.CveCliente = F.CveCliente
AND UC.Activo = 1
);
IF @CveFraccionamiento IS NOT NULL
AND NOT EXISTS
(
SELECT 1
FROM #FraccionamientosAutorizados AS F
WHERE F.CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
S.CveSolicitud,
S.CveTipoTramite,
S.CveFraccionamiento,
S.CveFraccionamientoEtapa,
S.CveCliente,
CASE @CveAgrupacion
WHEN 1 THEN S.CveTipoTramite
WHEN 2 THEN S.CveCliente
END AS CveAgrupacion,
CASE @CveAgrupacion
WHEN 1 THEN TT.TipoTramite
WHEN 2 THEN C.Nombre
END AS Agrupacion,
C.Nombre AS Cliente,
TT.TipoTramite AS Tramite,
F.Fraccionamiento,
CASE
WHEN @TieneAccesoGlobal = 1 OR ES.EsCliente = 1
THEN ES.EstatusSolicitud
ELSE NULL
END AS Estatus,
S.FechaInicio
INTO #SolicitudesTablero
FROM dbo.Tra_Solicitudes AS S
INNER JOIN #FraccionamientosAutorizados AS F ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.Clientes AS C ON C.CveCliente = S.CveCliente
INNER JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_EstatusSolicitud AS ES ON ES.CveEstatusSolicitud = S.CveEstatusSolicitud
WHERE (@CveFraccionamiento IS NULL OR S.CveFraccionamiento = @CveFraccionamiento)
AND (@SoloActivos = 0 OR TT.EsActivo = 1)
AND
(
@TieneAccesoGlobal = 1
OR EXISTS
(
SELECT 1
FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta
AND UC.CveCliente = S.CveCliente
AND UC.Activo = 1
)
)
-- PENDIENTE: agregar el campo de bloqueo en Clientes y su historial.
-- Condición conceptual pendiente (no existe aún el campo):
-- AND (@SoloBloqueados = 0 OR <campo de bloqueo de C> = 1)
;
-- El grid consume este contrato estable sin conocer la agrupación elegida.
SELECT
CAST(NULL AS int) AS CveSolicitud,
CAST(NULL AS int) AS CveTipoTramite,
CAST(NULL AS int) AS CveFraccionamiento,
CAST(NULL AS int) AS CveFraccionamientoEtapa,
CAST(NULL AS int) AS CveCliente,
CveAgrupacion,
Agrupacion,
2 AS Nivel,
CAST(NULL AS varchar(200)) AS Cliente,
CAST(NULL AS varchar(200)) AS Tramite,
CAST(NULL AS varchar(200)) AS Fraccionamiento,
CAST(NULL AS varchar(200)) AS Estatus,
CAST(NULL AS datetime) AS FechaInicio
FROM #SolicitudesTablero
GROUP BY CveAgrupacion, Agrupacion
UNION ALL
SELECT
CveSolicitud,
CveTipoTramite,
CveFraccionamiento,
CveFraccionamientoEtapa,
CveCliente,
CveAgrupacion,
Agrupacion,
1 AS Nivel,
Cliente,
Tramite,
Fraccionamiento,
Estatus,
FechaInicio
FROM #SolicitudesTablero
ORDER BY CveAgrupacion, Nivel DESC, FechaInicio DESC, CveSolicitud DESC;
-- Segundo resultado: combo con el mismo alcance de acceso del tablero.
-- No depende del filtro seleccionado ni del estado activo del tipo.
SELECT CveFraccionamiento, Fraccionamiento
FROM #FraccionamientosAutorizados
ORDER BY Fraccionamiento, CveFraccionamiento;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el tablero de trámites; 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_Tra_ReporteTramitesList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudHistorialEstatusList
@CveSolicitud 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
DECLARE @CveRol int;
DECLARE @TieneAccesoGlobal bit = 0;
SELECT
@CveRol = U.CveRol,
@TieneAccesoGlobal = CASE WHEN U.CveRol <= 2 THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U
WHERE U.CveUsuario = @CveUsuarioEjecuta
AND U.Activo = 1;
IF @CveRol IS NULL
BEGIN
SET @ErrorMostrar = 'El usuario no existe o está inactivo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
WHERE S.CveSolicitud = @CveSolicitud
AND
(
@TieneAccesoGlobal = 1
OR EXISTS
(
SELECT 1
FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta
AND UC.CveCliente = S.CveCliente
AND UC.Activo = 1
)
)
)
BEGIN
SET @ErrorMostrar = 'La solicitud no existe o no está asignada al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
H.CveHistorialEstatusSolicitud,
H.CveSolicitud,
ES.EstatusSolicitud AS Estatus,
H.FechaAlta AS FechaCambio,
H.Comentarios
FROM dbo.Tra_HistorialEstatusSolicitud AS H
INNER JOIN dbo.Tra_EstatusSolicitud AS ES ON ES.CveEstatusSolicitud = H.CveEstatusSolicitud
LEFT JOIN dbo.Tra_EstatusSolicitud AS EA ON EA.CveEstatusSolicitud = H.CveEstatusSolicitudAnterior
WHERE H.CveSolicitud = @CveSolicitud
AND
(
@TieneAccesoGlobal = 1
OR
(
ES.EsCliente = 1
AND (H.CveEstatusSolicitudAnterior IS NULL OR EA.EsCliente = 1)
)
)
ORDER BY H.FechaAlta DESC, H.CveHistorialEstatusSolicitud DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el historial de estatus; 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_Tra_SolicitudHistorialEstatusList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO