775 lines
28 KiB
Transact-SQL
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;
|