320 lines
11 KiB
Transact-SQL
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
|