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

261 lines
7.6 KiB
Transact-SQL

/*
Seguimiento de solicitudes: comentarios y respuestas.
Preparado para SIG_PlataformaDesarolladores.
Pendiente de ejecución: requiere autorización separada.
Las escrituras y su bitácora comparten la transacción del servicio.
*/
SET NOCOUNT ON;
IF OBJECT_ID('dbo.Tra_Solicitudes', 'U') IS NULL
THROW 51000, 'No existe la tabla de solicitudes esperada.', 1;
IF OBJECT_ID('dbo.Sis_Usuarios', 'U') IS NULL
THROW 51000, 'No existe el catálogo de usuarios esperado.', 1;
IF OBJECT_ID('dbo.Tra_ComentariosSolicitud', 'U') IS NULL
BEGIN
CREATE TABLE dbo.Tra_ComentariosSolicitud
(
CveComentarioSolicitud int IDENTITY(1, 1) NOT NULL,
CveSolicitud int NOT NULL,
CveComentarioPadre int NULL,
Comentario nvarchar(4000) COLLATE Modern_Spanish_CS_AS NOT NULL,
CveUsuario int NOT NULL,
FechaAlta datetime NOT NULL
CONSTRAINT DF_Tra_ComentariosSolicitud_FechaAlta DEFAULT (GETDATE()),
CONSTRAINT PK_Tra_ComentariosSolicitud PRIMARY KEY (CveComentarioSolicitud),
CONSTRAINT UQ_Tra_ComentariosSolicitud_Solicitud
UNIQUE (CveComentarioSolicitud, CveSolicitud),
CONSTRAINT FK_Tra_ComentariosSolicitud_Solicitud
FOREIGN KEY (CveSolicitud) REFERENCES dbo.Tra_Solicitudes(CveSolicitud),
CONSTRAINT FK_Tra_ComentariosSolicitud_Usuario
FOREIGN KEY (CveUsuario) REFERENCES dbo.Sis_Usuarios(CveUsuario),
CONSTRAINT FK_Tra_ComentariosSolicitud_Padre
FOREIGN KEY (CveComentarioPadre, CveSolicitud)
REFERENCES dbo.Tra_ComentariosSolicitud(CveComentarioSolicitud, CveSolicitud)
);
END;
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_ComentariosSolicitud')
AND name = 'IX_Tra_ComentariosSolicitud_SolicitudFecha'
)
BEGIN
CREATE INDEX IX_Tra_ComentariosSolicitud_SolicitudFecha
ON dbo.Tra_ComentariosSolicitud(CveSolicitud, FechaAlta, CveComentarioSolicitud);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudComentarioList
@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
C.CveComentarioSolicitud,
C.CveSolicitud,
C.CveComentarioPadre,
C.Comentario,
P.Comentario AS ComentarioPadre,
C.CveUsuario,
U.NombreUsuario AS Usuario,
C.FechaAlta
FROM dbo.Tra_ComentariosSolicitud AS C
INNER JOIN dbo.Sis_Usuarios AS U ON U.CveUsuario = C.CveUsuario
LEFT JOIN dbo.Tra_ComentariosSolicitud AS P ON P.CveComentarioSolicitud = C.CveComentarioPadre
WHERE C.CveSolicitud = @CveSolicitud
ORDER BY C.FechaAlta, C.CveComentarioSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible consultar los comentarios; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_SolicitudComentarioList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudComentarioAdd
@CveSolicitud int,
@CveComentarioPadre int = NULL,
@Comentario nvarchar(max),
@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
SET @Comentario = LTRIM(RTRIM(@Comentario));
IF @Comentario IS NULL OR LEN(@Comentario) = 0 OR DATALENGTH(@Comentario) > 8000
BEGIN
SELECT
@ErrorMostrar = 'Capture un comentario de 1 a 4000 caracteres.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes
WHERE CveSolicitud = @CveSolicitud
)
BEGIN
SELECT @ErrorMostrar = 'La solicitud no está disponible.', @ErrorTipo = 2;
RETURN;
END;
IF @CveComentarioPadre IS NOT NULL AND NOT EXISTS
(
SELECT 1
FROM dbo.Tra_ComentariosSolicitud
WHERE CveComentarioSolicitud = @CveComentarioPadre
AND CveSolicitud = @CveSolicitud
)
BEGIN
SELECT
@ErrorMostrar = 'El comentario al que desea responder no pertenece a la solicitud.',
@ErrorTipo = 2;
RETURN;
END;
INSERT INTO dbo.Tra_ComentariosSolicitud
(
CveSolicitud,
CveComentarioPadre,
Comentario,
CveUsuario
)
VALUES
(
@CveSolicitud,
@CveComentarioPadre,
@Comentario,
@CveUsuarioEjecuta
);
DECLARE @CveComentarioSolicitud int = CONVERT(int, SCOPE_IDENTITY());
SELECT
C.CveComentarioSolicitud,
C.CveSolicitud,
C.CveComentarioPadre,
C.Comentario,
P.Comentario AS ComentarioPadre,
C.CveUsuario,
U.NombreUsuario AS Usuario,
C.FechaAlta
FROM dbo.Tra_ComentariosSolicitud AS C
INNER JOIN dbo.Sis_Usuarios AS U ON U.CveUsuario = C.CveUsuario
LEFT JOIN dbo.Tra_ComentariosSolicitud AS P ON P.CveComentarioSolicitud = C.CveComentarioPadre
WHERE C.CveComentarioSolicitud = @CveComentarioSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible guardar el comentario; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_SolicitudComentarioAdd'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Tablas
WHERE NombreTablaSQL = 'Tra_ComentariosSolicitud'
)
BEGIN
INSERT INTO dbo.Bit_Tablas
(
NombreTablaSQL,
NombreMostrar,
Descripcion,
NombreCampoLlaveSQL,
Activo,
FechaAlta
)
VALUES
(
'Tra_ComentariosSolicitud',
'Comentarios de solicitudes',
'Conversación de una solicitud y respuestas a comentarios anteriores.',
'CveComentarioSolicitud',
1,
GETDATE()
);
END;
DECLARE @CveTablaComentarios int;
SELECT @CveTablaComentarios = CveTabla
FROM dbo.Bit_Tablas
WHERE NombreTablaSQL = 'Tra_ComentariosSolicitud';
INSERT INTO dbo.Bit_Campos
(
CveTabla,
NombreCampoSQL,
NombreMostrar,
TipoDatoSQL,
MostrarEnBitacora,
Activo,
FechaAlta
)
SELECT
@CveTablaComentarios,
C.NombreCampoSQL,
C.NombreMostrar,
C.TipoDatoSQL,
1,
1,
GETDATE()
FROM
(
VALUES
('CveSolicitud', 'Solicitud', 'int'),
('CveComentarioPadre', 'En respuesta a', 'int'),
('Comentario', 'Comentario', 'nvarchar')
) AS C(NombreCampoSQL, NombreMostrar, TipoDatoSQL)
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS B
WHERE B.CveTabla = @CveTablaComentarios
AND B.NombreCampoSQL = C.NombreCampoSQL
);
GO