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

775 lines
28 KiB
Transact-SQL

/*
Seguimiento por solicitud y verificación diaria de vigencias.
Preparado desde las tablas y procedimientos consultados el 21/09/2026.
Ejecutar únicamente con autorización de instalación.
Los PA no administran transacciones. Los guardados usan la transacción del servicio.
El paso externo de SQL Server Agent controla su propia transacción.
EstatusProceso: 0 Sin iniciar, 1 En proceso, 2 Revisar errores, 3 Revisar, 4 Autorizado.
La carga inicial conserva 0; se actualiza al guardar acciones.
No se modifican catálogos ni claves, ni se cambian permisos de estatus.
*/
USE [SIG_PlataformaDesarolladores];
GO
IF COL_LENGTH('dbo.Tra_Solicitudes', 'EstatusProceso') IS NULL
BEGIN
ALTER TABLE dbo.Tra_Solicitudes ADD EstatusProceso tinyint NOT NULL
CONSTRAINT DF_Tra_Solicitudes_EstatusProceso DEFAULT (0) WITH VALUES;
END;
GO
-- Compilar la restricción después de que exista la columna.
IF NOT EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID('dbo.Tra_Solicitudes')
AND name = 'CK_Tra_Solicitudes_EstatusProceso'
)
BEGIN
ALTER TABLE dbo.Tra_Solicitudes ADD CONSTRAINT CK_Tra_Solicitudes_EstatusProceso
CHECK (EstatusProceso BETWEEN 0 AND 4);
END;
GO
IF OBJECT_ID('dbo.Tra_SolicitudesAccionesPendientes', 'U') IS NULL
BEGIN
CREATE TABLE dbo.Tra_SolicitudesAccionesPendientes
(
CveSolicitud int NOT NULL,
TipoAccion varchar(30) COLLATE Modern_Spanish_CI_AS NOT NULL,
CveReferencia int NOT NULL,
Descripcion nvarchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
VisibleCliente bit NOT NULL,
Orden int NOT NULL,
CONSTRAINT PK_Tra_SolicitudesAccionesPendientes
PRIMARY KEY (CveSolicitud, TipoAccion, CveReferencia),
CONSTRAINT FK_Tra_SolicitudesAccionesPendientes_Solicitudes
FOREIGN KEY (CveSolicitud) REFERENCES dbo.Tra_Solicitudes (CveSolicitud)
ON DELETE CASCADE
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudProcesoActualizar
@CveSolicitud int = NULL,
@CveFraccionamientoEtapa int = NULL,
@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 @CveSolicitud IS NULL AND @CveFraccionamientoEtapa IS NULL
BEGIN
SET @ErrorMostrar = 'Seleccione una solicitud o etapa para actualizar.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @Hoy date = CONVERT(date, SYSDATETIMEOFFSET() AT TIME ZONE 'US Mountain Standard Time');
SELECT S.CveSolicitud, S.CveTipoTramite, S.CveFraccionamientoEtapa,
ES.Codigo AS CodigoEstatus
INTO #Solicitudes
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_EstatusSolicitud AS ES ON ES.CveEstatusSolicitud = S.CveEstatusSolicitud
WHERE (@CveSolicitud IS NULL OR S.CveSolicitud = @CveSolicitud)
AND (@CveFraccionamientoEtapa IS NULL
OR S.CveFraccionamientoEtapa = @CveFraccionamientoEtapa);
CREATE UNIQUE CLUSTERED INDEX IX_Solicitudes ON #Solicitudes (CveSolicitud);
-- La configuración particular sustituye completamente la general.
SELECT S.CveSolicitud, G.CveTipoDocumento, G.EsRequerido, G.EsCliente,
G.TieneVigencia, G.EsActivo
INTO #Configuracion
FROM #Solicitudes AS S
INNER JOIN dbo.Tra_TiposTramiteDocumento AS G ON G.CveTipoTramite = S.CveTipoTramite
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS P
WHERE P.CveSolicitud = S.CveSolicitud
AND P.CveTipoDocumento = G.CveTipoDocumento
)
UNION ALL
SELECT P.CveSolicitud, P.CveTipoDocumento, P.EsRequerido, P.EsCliente,
P.TieneVigencia, P.EsActivo
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS P
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = P.CveSolicitud;
CREATE TABLE #Acciones
(
CveSolicitud int NOT NULL,
TipoAccion varchar(30) COLLATE Modern_Spanish_CI_AS NOT NULL,
CveReferencia int NOT NULL,
Descripcion nvarchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
VisibleCliente bit NOT NULL,
Orden int NOT NULL,
PRIMARY KEY (CveSolicitud, TipoAccion, CveReferencia)
);
INSERT INTO #Acciones
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT C.CveSolicitud, 'DocumentoFaltante', C.CveTipoDocumento,
CONCAT(N'Cargar documento: ', COALESCE(NULLIF(T.Descripcion, ''), T.TipoDocumento)),
C.EsCliente, 10
FROM #Configuracion AS C
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = C.CveTipoDocumento
WHERE C.EsActivo = 1 AND C.EsRequerido = 1 AND T.EsActivo = 1
AND NOT EXISTS
(
SELECT 1
FROM dbo.Tra_DocumentosSolicitud AS D
WHERE D.CveSolicitud = C.CveSolicitud
AND D.CveTipoDocumento = C.CveTipoDocumento
AND D.EsActivo = 1
AND NULLIF(LTRIM(RTRIM(D.NombreArchivo)), '') IS NOT NULL
AND NULLIF(LTRIM(RTRIM(D.RutaArchivo)), '') IS NOT NULL
);
INSERT INTO #Acciones
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT D.CveSolicitud, 'DocumentoRechazado', D.CveDocumentoSolicitud,
CONCAT(N'Corregir documento no autorizado: ', COALESCE(NULLIF(T.Descripcion, ''), T.TipoDocumento)),
ISNULL(C.EsCliente, 0), 20
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = D.CveTipoDocumento
LEFT JOIN #Configuracion AS C ON C.CveSolicitud = D.CveSolicitud
AND C.CveTipoDocumento = D.CveTipoDocumento
WHERE D.EsActivo = 1 AND D.EsAprobado = 0;
INSERT INTO #Acciones
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT D.CveSolicitud, 'DocumentoVencido', D.CveDocumentoSolicitud,
CONCAT(N'Renovar documento vencido: ', COALESCE(NULLIF(T.Descripcion, ''), T.TipoDocumento),
N' (', CONVERT(char(10), D.FechaVencimiento, 103), N')'),
ISNULL(C.EsCliente, 0), 30
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = D.CveTipoDocumento
LEFT JOIN #Configuracion AS C ON C.CveSolicitud = D.CveSolicitud
AND C.CveTipoDocumento = D.CveTipoDocumento
WHERE D.EsActivo = 1 AND D.FechaVencimiento < @Hoy
AND ISNULL(C.TieneVigencia, 1) = 1;
-- Misma regla de PA_Tra_SolicitudPagoList/ModeloPagoSolicitud:
-- requerido activo sin un pago activo registrado.
INSERT INTO #Acciones
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT S.CveSolicitud, 'PagoPendiente', P.CveTramitePago,
CONCAT(N'Realizar pago: ', P.Nombre), 1, 40
FROM #Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P ON P.CveTipoTramite = S.CveTipoTramite
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
WHERE P.EsActivo = 1 AND P.EsRequerido = 1
AND NOT EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos AS VP
WHERE VP.CveSolicitud = S.CveSolicitud
AND VP.CveTramitePago = P.CveTramitePago
AND VP.CveVenta = SP.CveVenta
AND VP.EsActivo = 1
);
-- Consulta las condiciones al PA existente, sin duplicar sus reglas.
DECLARE @SolicitudCondicion int;
DECLARE @TipoTramite int;
DECLARE @Etapa int;
DECLARE @Condiciones TABLE
(
CveCondicionMostrar int,
CondicionMostrar varchar(100)
);
DECLARE @Correcto bit;
DECLARE @TipoError int;
DECLARE @Mensaje varchar(max);
DECLARE condiciones CURSOR LOCAL FAST_FORWARD FOR
SELECT CveSolicitud, CveTipoTramite, CveFraccionamientoEtapa
FROM #Solicitudes ORDER BY CveSolicitud;
OPEN condiciones;
FETCH NEXT FROM condiciones INTO @SolicitudCondicion, @TipoTramite, @Etapa;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @Condiciones;
INSERT INTO @Condiciones
EXEC dbo.PA_Tra_MostrarCondicionesporTramite
@CveTipoTramite = @TipoTramite,
@CveFraccionamientoEtapa = @Etapa,
@CveUsuarioEjecuta = @CveUsuarioEjecuta,
@ErrorMostrar = @Mensaje OUTPUT,
@ErrorTipo = @TipoError OUTPUT,
@Return = @Correcto OUTPUT;
IF ISNULL(@Correcto, 0) = 0
BEGIN
SET @ErrorMostrar = @Mensaje;
SET @ErrorTipo = ISNULL(NULLIF(@TipoError, 0), 1);
CLOSE condiciones;
DEALLOCATE condiciones;
RETURN;
END;
INSERT INTO #Acciones
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT @SolicitudCondicion, 'CondicionPendiente', C.CveCondicionMostrar,
CONCAT(N'Capturar condición: ', C.CondicionMostrar), 0, 50
FROM @Condiciones AS C
INNER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = @Etapa
WHERE CASE C.CveCondicionMostrar
WHEN 1 THEN E.Aprobado_Prefactibilidad
WHEN 2 THEN E.RequiereObrasExternas
WHEN 3 THEN E.TipoDeObra
WHEN 4 THEN E.LiberacionMacromedidor
WHEN 5 THEN E.Relotificacion
WHEN 6 THEN E.LiberacionDeLotes
WHEN 7 THEN E.LiberacionDePagosDeDerechos
END IS NULL;
FETCH NEXT FROM condiciones INTO @SolicitudCondicion, @TipoTramite, @Etapa;
END;
CLOSE condiciones;
DEALLOCATE condiciones;
-- El estatus Autorizado tiene prioridad; el rechazo precede a faltantes/vencidos.
UPDATE S
SET EstatusProceso = CASE
WHEN B.CodigoEstatus = 'Autorizado' THEN 4
WHEN EXISTS
(SELECT 1 FROM #Acciones AS A WHERE A.CveSolicitud = S.CveSolicitud
AND A.TipoAccion = 'DocumentoRechazado') THEN 2
WHEN EXISTS
(SELECT 1 FROM #Acciones AS A WHERE A.CveSolicitud = S.CveSolicitud
AND A.TipoAccion IN ('DocumentoFaltante', 'DocumentoVencido')) THEN 1
WHEN B.CodigoEstatus = 'Revisando' THEN 3
WHEN B.CodigoEstatus <> 'Sin Procesar'
OR EXISTS
(SELECT 1 FROM dbo.Tra_DocumentosSolicitud AS D
WHERE D.CveSolicitud = S.CveSolicitud AND D.EsActivo = 1)
OR EXISTS
(SELECT 1 FROM dbo.Tra_ComentariosSolicitud AS C
WHERE C.CveSolicitud = S.CveSolicitud) THEN 1
ELSE 0
END
FROM dbo.Tra_Solicitudes AS S
INNER JOIN #Solicitudes AS B ON B.CveSolicitud = S.CveSolicitud;
-- Autorizados/cancelados no presentan tareas por atender en el panel.
DELETE A
FROM #Acciones AS A
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = A.CveSolicitud
WHERE S.CodigoEstatus IN ('Autorizado', 'Cancelado');
DELETE A
FROM dbo.Tra_SolicitudesAccionesPendientes AS A
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = A.CveSolicitud
WHERE NOT EXISTS
(
SELECT 1 FROM #Acciones AS N
WHERE N.CveSolicitud = A.CveSolicitud
AND N.TipoAccion = A.TipoAccion
AND N.CveReferencia = A.CveReferencia
);
UPDATE A
SET Descripcion = N.Descripcion,
VisibleCliente = N.VisibleCliente,
Orden = N.Orden
FROM dbo.Tra_SolicitudesAccionesPendientes AS A
INNER JOIN #Acciones AS N ON N.CveSolicitud = A.CveSolicitud
AND N.TipoAccion = A.TipoAccion AND N.CveReferencia = A.CveReferencia;
INSERT INTO dbo.Tra_SolicitudesAccionesPendientes
(CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
SELECT N.CveSolicitud, N.TipoAccion, N.CveReferencia,
N.Descripcion, N.VisibleCliente, N.Orden
FROM #Acciones AS N
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.Tra_SolicitudesAccionesPendientes AS A
WHERE A.CveSolicitud = N.CveSolicitud
AND A.TipoAccion = N.TipoAccion
AND A.CveReferencia = N.CveReferencia
);
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible actualizar o consultar el seguimiento de solicitudes; contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_SolicitudProcesoActualizar'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudAccionesPendientesList
@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
SELECT TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden
FROM dbo.Tra_SolicitudesAccionesPendientes
WHERE CveSolicitud = @CveSolicitud
ORDER BY Orden, TipoAccion, CveReferencia;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible actualizar o consultar el seguimiento de solicitudes; contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_SolicitudAccionesPendientesList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Job_VerificaVigencias
@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
-- Sólo el programador externo llama este procedimiento.
-- La fecha de vencimiento es inclusiva: vence después de terminar ese día.
DECLARE @Hoy date = CONVERT(date, SYSDATETIMEOFFSET() AT TIME ZONE 'US Mountain Standard Time');
DECLARE @Solicitud int;
DECLARE @Correcto bit;
DECLARE @TipoError int;
DECLARE @Mensaje varchar(max);
DECLARE solicitudes CURSOR LOCAL FAST_FORWARD FOR
SELECT DISTINCT D.CveSolicitud
FROM dbo.Tra_DocumentosSolicitud AS D
WHERE D.EsActivo = 1 AND D.FechaVencimiento < @Hoy
ORDER BY D.CveSolicitud;
OPEN solicitudes;
FETCH NEXT FROM solicitudes INTO @Solicitud;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.PA_Tra_SolicitudProcesoActualizar
@CveSolicitud = @Solicitud,
@CveUsuarioEjecuta = @CveUsuarioEjecuta,
@ErrorMostrar = @Mensaje OUTPUT,
@ErrorTipo = @TipoError OUTPUT,
@Return = @Correcto OUTPUT;
IF ISNULL(@Correcto, 0) = 0
BEGIN
SET @ErrorMostrar = @Mensaje;
SET @ErrorTipo = ISNULL(NULLIF(@TipoError, 0), 1);
CLOSE solicitudes;
DEALLOCATE solicitudes;
RETURN;
END;
FETCH NEXT FROM solicitudes INTO @Solicitud;
END;
CLOSE solicitudes;
DEALLOCATE solicitudes;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible actualizar o consultar el seguimiento de solicitudes; contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Job_VerificaVigencias'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ReporteTramitesList
@CveUsuarioEjecuta int,
@CveAgrupacion tinyint = 1,
@CveFraccionamiento int = NULL,
@SoloActivos bit = 1,
@SoloBloqueados bit = 0,
@EstatusSeleccionados varchar(max) = NULL,
@MostrarAutorizados bit = 0,
@MostrarCancelados 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,
E.Avance,
S.EstatusProceso
INTO #SolicitudesTablero
FROM dbo.Tra_Solicitudes AS S
INNER JOIN #FraccionamientosAutorizados AS F ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
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
(
(NULLIF(@EstatusSeleccionados, '') IS NULL
AND (ES.Codigo <> 'Autorizado' OR @MostrarAutorizados = 1)
AND (ES.Codigo <> 'Cancelado' OR @MostrarCancelados = 1))
OR EXISTS
(
SELECT 1
FROM STRING_SPLIT(@EstatusSeleccionados, ',') AS Seleccion
WHERE TRY_CONVERT(int, Seleccion.value) = S.CveEstatusSolicitud
)
OR (@MostrarAutorizados = 1 AND ES.Codigo = 'Autorizado')
OR (@MostrarCancelados = 1 AND ES.Codigo = 'Cancelado')
)
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,
CAST(NULL AS decimal(18, 2)) AS Avance,
CAST(0 AS tinyint) AS EstatusProceso
FROM #SolicitudesTablero
GROUP BY CveAgrupacion, Agrupacion
UNION ALL
SELECT
CveSolicitud,
CveTipoTramite,
CveFraccionamiento,
CveFraccionamientoEtapa,
CveCliente,
CveAgrupacion,
Agrupacion,
1 AS Nivel,
Cliente,
Tramite,
Fraccionamiento,
Estatus,
FechaInicio,
Avance,
EstatusProceso
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;
-- Opciones del filtro; no altera los permisos para cambiar estatus.
SELECT CveEstatusSolicitud, Codigo, EstatusSolicitud, Orden, EsFinal, EsCliente
FROM dbo.Tra_EstatusSolicitud
WHERE EsActivo = 1
ORDER BY Orden, CveEstatusSolicitud;
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
/*
Instalación de SQL Server Agent. La ejecución de esta sección requiere autorización.
Hora: 03:00 todos los días, Hermosillo (UTC-07:00, sin horario de verano).
SQL Server Agent interpreta la hora del servidor: verificar esa zona antes de activar.
En el servidor inspeccionado: US Mountain Standard Time, UTC-07:00.
Instala deshabilitado; la activación se hace en una operación separada autorizada.
*/
DECLARE @Trabajo uniqueidentifier;
DECLARE @Horario int;
DECLARE @Paso int;
DECLARE @NombreBase sysname = DB_NAME();
DECLARE @Comando nvarchar(max) = N'-- Ejecutor externo: sin usuario autenticado, no inventar una clave de usuario.
DECLARE @ErrorMostrar varchar(max), @ErrorTipo int, @Correcto bit;
BEGIN TRY
BEGIN TRANSACTION;
EXEC dbo.PA_Job_VerificaVigencias
@CveUsuarioEjecuta = NULL,
@ErrorMostrar = @ErrorMostrar OUTPUT,
@ErrorTipo = @ErrorTipo OUTPUT,
@Return = @Correcto OUTPUT;
IF ISNULL(@Correcto, 0) = 0 OR ISNULL(@ErrorTipo, 1) <> 0
BEGIN
DECLARE @Mensaje nvarchar(2048) = COALESCE(@ErrorMostrar, ''Falló la verificación de vigencias.'');
THROW 51000, @Mensaje, 1;
END;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;';
SELECT @Trabajo = job_id
FROM msdb.dbo.sysjobs
WHERE name = N'Job_VerificaVigencias';
IF @Trabajo IS NULL
BEGIN
EXEC msdb.dbo.sp_add_job
@job_name = N'Job_VerificaVigencias',
@enabled = 0,
@description = N'Verifica documentos vencidos diariamente a las 03:00 de Hermosillo.',
@job_id = @Trabajo OUTPUT;
EXEC msdb.dbo.sp_add_jobserver @job_id = @Trabajo;
END;
SELECT @Paso = step_id
FROM msdb.dbo.sysjobsteps
WHERE job_id = @Trabajo AND step_name = N'Verificar vigencias';
IF @Paso IS NULL
BEGIN
EXEC msdb.dbo.sp_add_jobstep
@job_id = @Trabajo,
@step_name = N'Verificar vigencias',
@subsystem = N'TSQL',
@database_name = @NombreBase,
@command = @Comando,
@retry_attempts = 2,
@retry_interval = 5,
@on_success_action = 1,
@on_fail_action = 2;
END
ELSE
BEGIN
EXEC msdb.dbo.sp_update_jobstep
@job_id = @Trabajo,
@step_id = @Paso,
@database_name = @NombreBase,
@command = @Comando,
@retry_attempts = 2,
@retry_interval = 5;
END;
SELECT @Horario = schedule_id
FROM msdb.dbo.sysschedules
WHERE name = N'Horario_VerificaVigencias_0300';
IF @Horario IS NULL
BEGIN
EXEC msdb.dbo.sp_add_schedule
@schedule_name = N'Horario_VerificaVigencias_0300',
@enabled = 1,
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 30000,
@schedule_id = @Horario OUTPUT;
END
ELSE
BEGIN
EXEC msdb.dbo.sp_update_schedule
@schedule_id = @Horario,
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 30000;
END;
IF NOT EXISTS
(
SELECT 1
FROM msdb.dbo.sysjobschedules
WHERE job_id = @Trabajo AND schedule_id = @Horario
)
BEGIN
EXEC msdb.dbo.sp_attach_schedule
@job_id = @Trabajo,
@schedule_id = @Horario;
END;
GO
-- Activación únicamente después de autorización explícita y verificación de zona horaria:
-- EXEC msdb.dbo.sp_update_job @job_name = N'Job_VerificaVigencias', @enabled = 1;