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

320 lines
11 KiB
Transact-SQL

-- Preparar únicamente. Instalar requiere autorización separada.
-- Requiere los scripts Pagos_Convenios_*_20260922.sql y la bitácora de eventos.
-- No concede Pagos.AprobarPagos automáticamente: asignarlo desde permisos de usuario.
IF OBJECT_ID(N'dbo.Tra_ComprobantesPago', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Tra_ComprobantesPago
(
CveComprobantePago int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CveSolicitudPago int NOT NULL REFERENCES dbo.Tra_SolicitudesPago(CveSolicitudPago),
CveCliente int NOT NULL REFERENCES dbo.Clientes(CveCliente),
CveUnidadCobro int NOT NULL REFERENCES dbo.Gral_UnidadesCobro(CveUnidadCobro),
CveFormaPago tinyint NOT NULL,
FechaPago datetime NOT NULL,
Importe decimal(19, 6) NOT NULL CHECK (Importe > 0),
Referencia varchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreArchivo nvarchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreFisico varchar(50) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoContenido varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
TamanoBytes bigint NOT NULL CHECK (TamanoBytes > 0 AND TamanoBytes <= 5242880),
CveUsuarioEnvia int NOT NULL REFERENCES dbo.Sis_Usuarios(CveUsuario),
FechaEnvio datetime NOT NULL,
CveUsuarioAprueba int NULL REFERENCES dbo.Sis_Usuarios(CveUsuario),
FechaAprobacion datetime NULL,
CvePago int NULL REFERENCES dbo.Tra_Pagos(CvePago),
CONSTRAINT CK_Tra_ComprobantesPago_Aprobacion CHECK
(
(CvePago IS NULL AND CveUsuarioAprueba IS NULL AND FechaAprobacion IS NULL)
OR (CvePago IS NOT NULL AND CveUsuarioAprueba IS NOT NULL AND FechaAprobacion IS NOT NULL)
)
);
CREATE INDEX IX_Tra_ComprobantesPago_Solicitud ON dbo.Tra_ComprobantesPago(CveSolicitudPago, CveComprobantePago);
CREATE UNIQUE INDEX UX_Tra_ComprobantesPago_Abono ON dbo.Tra_ComprobantesPago(CvePago) WHERE CvePago IS NOT NULL;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoListar
@CveSolicitudPago 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.*
FROM dbo.Tra_ComprobantesPago AS C
WHERE C.CveSolicitudPago = @CveSolicitudPago
ORDER BY C.FechaEnvio DESC, C.CveComprobantePago DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoObtener
@CveComprobantePago 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
-- Dentro de la transacción de aprobación, evita aprobar dos veces el mismo comprobante.
SELECT C.*
FROM dbo.Tra_ComprobantesPago AS C WITH (UPDLOCK, HOLDLOCK)
WHERE C.CveComprobantePago = @CveComprobantePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoFormasListar
@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
CveFormaPago,
FormaPago
FROM dbo.Vta_FormaPago
WHERE ClaveFormaPagoSAT IN ('01', '02', '03', '04', '28')
ORDER BY FormaPago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoRegistrar
@CveSolicitudPago int,
@CveFormaPago tinyint,
@FechaPago datetime,
@Importe decimal(19, 6),
@Referencia varchar(200),
@NombreArchivo nvarchar(255),
@NombreFisico varchar(50),
@TipoContenido varchar(100),
@TamanoBytes bigint,
@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 @@TRANCOUNT = 0 OR XACT_STATE() <> 1
THROW 51500, 'La operación requiere la transacción del servicio.', 1;
INSERT INTO dbo.Tra_ComprobantesPago
(
CveSolicitudPago,
CveCliente, CveUnidadCobro, CveFormaPago, FechaPago, Importe,
Referencia, NombreArchivo, NombreFisico, TipoContenido, TamanoBytes,
CveUsuarioEnvia, FechaEnvio
)
SELECT
S.CveSolicitudPago,
S.CveCliente, S.CveUnidadCobro, @CveFormaPago, @FechaPago, @Importe,
@Referencia, @NombreArchivo, @NombreFisico, @TipoContenido, @TamanoBytes,
@CveUsuarioEjecuta, GETDATE()
FROM dbo.Tra_SolicitudesPago AS S
WHERE S.CveSolicitudPago = @CveSolicitudPago;
IF @@ROWCOUNT = 0
BEGIN
SELECT @ErrorMostrar = 'La obligación ya no existe.', @ErrorTipo = 2;
RETURN;
END;
SELECT CONVERT(int, SCOPE_IDENTITY()) AS CveComprobantePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoAprobar
@CveComprobantePago int,
@CvePago 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
IF @@TRANCOUNT = 0 OR XACT_STATE() <> 1
THROW 51500, 'La operación requiere la transacción del servicio.', 1;
UPDATE dbo.Tra_ComprobantesPago
SET
CvePago = @CvePago,
CveUsuarioAprueba = @CveUsuarioEjecuta,
FechaAprobacion = GETDATE()
WHERE CveComprobantePago = @CveComprobantePago
AND CvePago IS NULL;
IF @@ROWCOUNT = 0
BEGIN
SELECT @ErrorMostrar = 'El comprobante ya fue aprobado o no está disponible.', @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
IF NOT EXISTS (SELECT 1 FROM dbo.Sis_Permisos WHERE CodigoPermiso = 'Pagos.AprobarPagos')
BEGIN
INSERT INTO dbo.Sis_Permisos
(CodigoPermiso, NombrePermiso, Descripcion, Activo, FechaCreacion)
VALUES
('Pagos.AprobarPagos', 'Aprobar pagos', 'Aprobar comprobantes y aplicar sus abonos al saldo.', 1, GETDATE());
END;
IF NOT EXISTS (SELECT 1 FROM dbo.Bit_Tablas WHERE NombreTablaSQL = 'Tra_ComprobantesPago')
BEGIN
INSERT INTO dbo.Bit_Tablas
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo, FechaAlta, FechaMod)
VALUES
('Tra_ComprobantesPago', 'Comprobantes de pago', 'Envío y aprobación de comprobantes',
'CveComprobantePago', 1, GETDATE(), NULL);
END;
INSERT INTO dbo.Bit_Campos
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, Activo, FechaAlta, FechaMod, TipoDatoSQL)
SELECT
B.CveTabla,
C.name,
C.name,
CASE WHEN C.name LIKE 'Cve%' OR C.name = 'NombreFisico' THEN 0 ELSE 1 END,
1,
GETDATE(),
NULL,
T.name
FROM dbo.Bit_Tablas AS B
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(N'dbo.Tra_ComprobantesPago')
INNER JOIN sys.types AS T ON T.user_type_id = C.user_type_id
WHERE B.NombreTablaSQL = 'Tra_ComprobantesPago'
AND NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS X
WHERE X.CveTabla = B.CveTabla AND X.NombreCampoSQL = C.name
);
INSERT INTO dbo.Bit_DefinicionesAccion
(CveTabla, CveTipoMovimiento, NombreAccion, DescripcionAccion, Activo, Fecha, CodigoAccion)
SELECT
B.CveTabla,
NULL,
A.Nombre,
A.Nombre,
1,
GETDATE(),
A.Codigo
FROM dbo.Bit_Tablas AS B
CROSS JOIN
(
VALUES
('EnviarComprobantePago', 'Enviar comprobante de pago'),
('AprobarComprobantePago', 'Aprobar comprobante de pago')
) AS A(Codigo, Nombre)
WHERE B.NombreTablaSQL = 'Tra_ComprobantesPago'
AND NOT EXISTS
(
SELECT 1
FROM dbo.Bit_DefinicionesAccion AS D
WHERE D.CodigoAccion = A.Codigo
);
GO