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

365 lines
12 KiB
Transact-SQL

/*
Nombres para el enlace Fraccionamiento · Etapa.
Preparado desde las definiciones instaladas consultadas el 21/09/2026.
Requiere autorización separada antes de ejecutarse.
Sólo modifica las consultas:
dbo.PA_Tra_ReporteTramitesList: agrega Etapa al resultado de filas.
dbo.PA_Tramites_SolicitudGet: agrega Fraccionamiento.
Conserva filtros, permisos, agrupaciones y parámetros existentes.
No modifica tablas, datos, estatus ni la programación de vigencias.
*/
USE [SIG_PlataformaDesarolladores];
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,
E.Etapa,
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 Etapa,
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,
Etapa,
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
CREATE OR ALTER PROCEDURE dbo.PA_Tramites_SolicitudGet
@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 @EsSuperUsuario bit = 0;
SELECT
@CveRol = U.CveRol,
@EsSuperUsuario =
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
(
@EsSuperUsuario = 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
S.CveSolicitud,
S.Folio,
S.CveCliente,
S.CveFraccionamiento,
F.Fraccionamiento,
S.CveFraccionamientoEtapa,
ET.Etapa,
S.CveTipoTramite,
TT.TipoTramite,
S.CveEstatusSolicitud,
CASE
WHEN @EsSuperUsuario = 1 OR ES.EsCliente = 1
THEN ES.EstatusSolicitud
ELSE NULL
END AS EstatusSolicitud,
ES.EsCliente AS EsEstatusCliente,
S.FechaInicio,
S.FechaAutorizacion,
CONVERT(bit,
CASE
WHEN @EsSuperUsuario = 1
AND S.FechaAutorizacion IS NULL
AND UPPER(LTRIM(RTRIM(ISNULL(ES.Codigo, '')))) <> 'AUTORIZADO'
AND UPPER(LTRIM(RTRIM(ISNULL(ES.EstatusSolicitud, '')))) <> 'AUTORIZADO'
THEN 1
ELSE 0
END) AS PuedeCambiarEstatus,
CONVERT(bit,
CASE
WHEN S.FechaAutorizacion IS NOT NULL
OR UPPER(LTRIM(RTRIM(ISNULL(ES.Codigo, '')))) = 'AUTORIZADO'
OR UPPER(LTRIM(RTRIM(ISNULL(ES.EstatusSolicitud, '')))) = 'AUTORIZADO'
THEN 1
ELSE 0
END) AS EsAutorizada
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.FraccionamientosEtapas AS ET
ON ET.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
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 S.CveSolicitud = @CveSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar la solicitud; 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_Tramites_SolicitudGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO