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

392 lines
16 KiB
Transact-SQL

/*
Pagos y Convenios: configuración de auditoría y permisos.
NO EJECUTADO. Instalar después de estructura y procedimientos,
en la misma transacción del instalador, sólo con autorización separada.
Requiere la adaptación de servicios y pantallas antes de habilitar el módulo.
Prepara menús y replica sólo el acceso de consulta del módulo de Trámites.
No asigna permisos de operación ni crea productos, cuentas o usuarios.
Conserva claves de Bit_Tablas/Bit_Campos y el historial de acciones.
*/
-- Reasignar los nombres antes de registrar el nuevo significado de Tra_Pagos.
-- Relaciones de visualización sólo si ambos campos ya están registrados.
SET NOCOUNT ON;
IF DB_NAME() <> N'SIG_PlataformaDesarolladores'
THROW 51400, N'La base seleccionada no corresponde a la revisada.', 1;
IF @@TRANCOUNT = 0
OR XACT_STATE() <> 1
THROW 51401, N'Se requiere una transacción activa del instalador.', 1;
IF OBJECT_ID(N'dbo.Tra_TiposTramitePagos', N'U') IS NULL
OR COL_LENGTH(N'dbo.Tra_Pagos', N'ValorConversion') IS NULL
THROW 51402, N'Instale primero la estructura de Pagos y Convenios.', 1;
UPDATE dbo.Bit_Tablas
SET NombreTablaSQL = 'Tra_TiposTramitePagos',
NombreMostrar = 'Plantillas de pagos por trámite',
FechaMod = GETDATE()
WHERE NombreTablaSQL = 'Tra_Pagos'
AND NombreCampoLlaveSQL = 'CveTramitePago';
UPDATE dbo.Bit_Tablas
SET NombreTablaSQL = 'Tra_TiposTramitePagosDetalle',
NombreMostrar = 'Productos de plantilla de pago',
FechaMod = GETDATE()
WHERE NombreTablaSQL = 'Tra_PagosDetalle';
UPDATE dbo.Bit_Tablas
SET NombreTablaSQL = 'Tra_SolicitudesPago',
NombreMostrar = 'Obligaciones de pago',
FechaMod = GETDATE()
WHERE NombreTablaSQL = 'Tra_SolicitudesPagos';
UPDATE dbo.Bit_Tablas
SET NombreTablaSQL = 'Tra_Pagos',
NombreMostrar = 'Abonos recibidos',
FechaMod = GETDATE()
WHERE NombreTablaSQL = 'Vta_Pagos';
DECLARE @Tablas TABLE (
NombreTablaSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS PRIMARY KEY,
NombreMostrar VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
NombreCampoLlaveSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
INSERT INTO @Tablas
VALUES (N'Gral_UnidadesCobro', N'Unidades de cobro', N'CveUnidadCobro'),
(N'Gral_UnidadesCobroValores', N'Histórico de equivalencias', N'CveUnidadCobroValor'),
(N'Tra_TiposSolicitudPago', N'Tipos de obligación', N'CveTipoSolicitudPago'),
(N'Tra_TiposTramitePagos', N'Plantillas de pagos por trámite', N'CveTramitePago'),
(N'Tra_TiposTramitePagosDetalle', N'Productos de plantilla de pago', N'CveTramitePagoDetalle'),
(N'Tra_SolicitudesPago', N'Obligaciones de pago', N'CveSolicitudPago'),
(N'Tra_SolicitudesPagoDetalle', N'Productos de obligación', N'CveSolicitudPagoDetalle'),
(N'Tra_SolicitudesPagoParcialidades', N'Parcialidades de obligación', N'CveSolicitudPagoParcialidad'),
(N'Tra_Pagos', N'Abonos recibidos', N'CvePago'),
(N'Tra_PagosAplicaciones', N'Aplicaciones de abonos', N'CvePagoAplicacion'),
(N'Tra_SolicitudesPagoRequeridoBitacora', N'Cambios de pago requerido', N'CveSolicitudPagoRequeridoBitacora'),
(N'Tra_SolicitudesPagoConvenio', N'Convenios', N'CveSolicitudPago'),
(N'Tra_SolicitudesPagoConvenioOrigen', N'Adeudos de origen de convenio', N'CveConvenioOrigen'),
(N'Tra_SolicitudesPagoConvenioOrigenDetalle', N'Distribución de saldo convenido', N'CveConvenioOrigenDetalle'),
(N'Tra_PagosCfdi', N'Documentos fiscales de abonos', N'CvePagoCfdi'),
(N'Fac_CfdiDocumentos', N'Documentos fiscales', N'CveCfdiDocumento'),
(N'Sis_UsuariosPermisos', N'Permisos particulares de usuario', N'CveUsuarioPermiso');
IF EXISTS (SELECT 1
FROM @Tablas AS T
WHERE OBJECT_ID(N'dbo.' + T.NombreTablaSQL, N'U') IS NULL
OR COL_LENGTH(N'dbo.' + T.NombreTablaSQL, T.NombreCampoLlaveSQL) IS NULL)
THROW 51403, N'Falta una tabla o llave de la configuración de auditoría.', 1;
INSERT INTO dbo.Bit_Tablas (NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo, FechaAlta, FechaMod)
SELECT T.NombreTablaSQL,
T.NombreMostrar,
T.NombreMostrar,
T.NombreCampoLlaveSQL,
1,
GETDATE(),
NULL
FROM @Tablas AS T
WHERE NOT EXISTS (SELECT 1
FROM dbo.Bit_Tablas AS B
WHERE B.NombreTablaSQL = T.NombreTablaSQL);
-- Completar llaves que no estaban configuradas, conservando su CveTabla.
UPDATE B
SET NombreCampoLlaveSQL = T.NombreCampoLlaveSQL,
FechaMod = GETDATE()
FROM dbo.Bit_Tablas AS B
INNER JOIN @Tablas AS T ON T.NombreTablaSQL = B.NombreTablaSQL
WHERE NULLIF(LTRIM(RTRIM(B.NombreCampoLlaveSQL)), '') IS NULL;
DECLARE @Etiquetas TABLE (
NombreCampoSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS PRIMARY KEY,
NombreMostrar VARCHAR (150) COLLATE Modern_Spanish_CS_AS);
INSERT INTO @Etiquetas
VALUES (N'Codigo', N'Código'),
(N'Nombre', N'Nombre'),
(N'EsMoneda', N'Es moneda'),
(N'RequiereConversion', N'Requiere conversión'),
(N'Activo', N'Activo'),
(N'FechaVigencia', N'Fecha de vigencia'),
(N'ValorMXN', N'Equivalencia en MXN'),
(N'Fuente', N'Fuente'),
(N'Importe', N'Importe'),
(N'Descripcion', N'Descripción'),
(N'Cantidad', N'Cantidad'),
(N'PrecioUnitario', N'Precio unitario final'),
(N'EsRequerido', N'Requerido'),
(N'NumeroParcialidad', N'Parcialidad'),
(N'FechaVencimiento', N'Fecha de vencimiento'),
(N'FechaProrroga', N'Prórroga'),
(N'FechaGeneracion', N'Fecha de generación'),
(N'EstadoAdministrativo', N'Estado administrativo'),
(N'FechaPago', N'Fecha de pago'),
(N'Referencia', N'Referencia'),
(N'Observaciones', N'Observaciones'),
(N'ValorConversion', N'Conversión del abono'),
(N'ImporteMXN', N'Importe en MXN'),
(N'ImporteAplicado', N'Importe aplicado'),
(N'ImporteAplicadoMXN', N'Aplicación en MXN'),
(N'ImportePagoConsumido', N'Importe consumido del abono'),
(N'ValorConversionObligacion', N'Conversión de la obligación'),
(N'ValorAnterior', N'Valor anterior'),
(N'ValorNuevo', N'Valor nuevo'),
(N'Observacion', N'Observación'),
(N'ImporteSaldoConvenido', N'Saldo convenido'),
(N'ImporteSaldoOriginal', N'Saldo antes del convenio'),
(N'ImporteTomadoConvenio', N'Saldo trasladado al convenio'),
(N'ImporteVinculadoMXN', N'Importe documentado en MXN'),
(N'ImporteValidado', N'Importe validado'),
(N'UuidExterno', N'UUID externo'),
(N'FechaTimbradoExterno', N'Fecha de timbrado externo'),
(N'OrigenRegistro', N'Origen del documento'),
(N'Permitido', N'Permitido'),
(N'FechaRegistro', N'Fecha de registro'),
(N'FechaAlta', N'Fecha de alta'),
(N'FechaModificacion', N'Fecha de modificación'),
(N'FechaValidacion', N'Fecha de validación'),
(N'EsActivo', N'Activo'),
(N'Autorizado', N'Abono autorizado'),
(N'Notas', N'Notas'),
(N'Orden', N'Orden'),
(N'TipoSolicitudPago', N'Tipo de obligación');
INSERT INTO dbo.Bit_Campos (CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, Activo, FechaAlta, FechaMod, TipoDatoSQL)
SELECT B.CveTabla,
C.name,
COALESCE (E.NombreMostrar, C.name),
CASE WHEN C.name LIKE 'Cve%'
OR C.name LIKE 'Ruta%'
OR C.name LIKE 'Hash%'
OR Y.name IN ('binary', 'varbinary', 'image', 'timestamp') THEN 0 ELSE 1 END,
1,
GETDATE(),
NULL,
Y.name
FROM @Tablas AS T
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = T.NombreTablaSQL
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(N'dbo.' + T.NombreTablaSQL)
INNER JOIN sys.types AS Y ON Y.user_type_id = C.user_type_id
LEFT OUTER JOIN @Etiquetas AS E ON E.NombreCampoSQL = C.name
WHERE NOT EXISTS (SELECT 1
FROM dbo.Bit_Campos AS X
WHERE X.CveTabla = B.CveTabla
AND X.NombreCampoSQL = C.name);
DECLARE @Referencias TABLE (
Columna VARCHAR (128) COLLATE Modern_Spanish_CS_AS,
Tabla VARCHAR (128) COLLATE Modern_Spanish_CS_AS,
CampoMostrar VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
INSERT INTO @Referencias
VALUES ('CveUnidadCobro', 'Gral_UnidadesCobro', 'Nombre'),
('CveTipoSolicitudPago', 'Tra_TiposSolicitudPago', 'TipoSolicitudPago'),
('CveSolicitudPago', 'Tra_SolicitudesPago', 'Descripcion'),
('CveSolicitudPagoOrigen', 'Tra_SolicitudesPago', 'Descripcion'),
('CveSolicitudPagoConvenio', 'Tra_SolicitudesPago', 'Descripcion'),
('CveTramitePago', 'Tra_TiposTramitePagos', 'Nombre'),
('CveCliente', 'Clientes', 'Nombre'),
('CvePS', 'ProductosServicios', 'PS'),
('CveFraccionamiento', 'Fraccionamientos', 'Fraccionamiento'),
('CveFraccionamientoEtapa', 'FraccionamientosEtapas', 'Etapa'),
('CveUsuarioRegistro', 'Sis_Usuarios', 'NombreUsuario'),
('CveUsuarioModificacion', 'Sis_Usuarios', 'NombreUsuario'),
('CveUsuarioValida', 'Sis_Usuarios', 'NombreUsuario'),
('CvePermiso', 'Sis_Permisos', 'NombrePermiso');
UPDATE C
SET CveTablaReferencia = B.CveTabla,
CveCampoMostrarReferencia = M.CveCampo,
MostrarEnBitacora = 1,
FechaMod = GETDATE()
FROM dbo.Bit_Campos AS C
INNER JOIN dbo.Bit_Tablas AS T ON T.CveTabla = C.CveTabla
INNER JOIN @Tablas AS A ON A.NombreTablaSQL = T.NombreTablaSQL
INNER JOIN @Referencias AS R ON R.Columna = C.NombreCampoSQL
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = R.Tabla
INNER JOIN dbo.Bit_Campos AS M ON M.CveTabla = B.CveTabla
AND M.NombreCampoSQL = R.CampoMostrar
WHERE C.CveTablaReferencia IS NULL;
DECLARE @Acciones TABLE (
CodigoAccion VARCHAR (150) COLLATE Modern_Spanish_CI_AS,
NombreAccion VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
NombreTablaSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
INSERT INTO @Acciones
VALUES ('GuardarSolicitudPago', 'Guardar obligación de pago', 'Tra_SolicitudesPago'),
('GenerarSolicitudesPago', 'Generar obligaciones del trámite', 'Tra_SolicitudesPago'),
('CambiarRequeridoSolicitudPago', 'Cambiar pago requerido', 'Tra_SolicitudesPago'),
('CancelarSolicitudPago', 'Cancelar obligación de pago', 'Tra_SolicitudesPago'),
('RegistrarAbono', 'Registrar abono', 'Tra_Pagos'),
('AplicarAbono', 'Aplicar abono a parcialidades', 'Tra_PagosAplicaciones'),
('CancelarAbono', 'Cancelar abono', 'Tra_Pagos'),
('GuardarConvenio', 'Guardar convenio', 'Tra_SolicitudesPagoConvenio'),
('CancelarConvenio', 'Cancelar convenio', 'Tra_SolicitudesPagoConvenio'),
('GuardarUnidadCobro', 'Guardar unidad de cobro', 'Gral_UnidadesCobro'),
('AgregarEquivalenciaUnidadCobro', 'Agregar equivalencia', 'Gral_UnidadesCobroValores'),
('GuardarCfdiExterno', 'Guardar documento fiscal externo', 'Fac_CfdiDocumentos'),
('VincularCfdiAbono', 'Vincular documento fiscal a abono', 'Tra_PagosCfdi'),
('GuardarPermisoUsuario', 'Modificar permiso particular', 'Sis_UsuariosPermisos');
INSERT INTO dbo.Bit_DefinicionesAccion (CveTabla, CveTipoMovimiento, NombreAccion, DescripcionAccion, Activo, Fecha, CodigoAccion)
SELECT T.CveTabla,
NULL,
A.NombreAccion,
A.NombreAccion,
1,
GETDATE(),
A.CodigoAccion
FROM @Acciones AS A
INNER JOIN dbo.Bit_Tablas AS T ON T.NombreTablaSQL = A.NombreTablaSQL
WHERE NOT EXISTS (SELECT 1
FROM dbo.Bit_DefinicionesAccion AS D
WHERE D.CodigoAccion = A.CodigoAccion);
DECLARE @Permisos TABLE (
CodigoPermiso VARCHAR (100) COLLATE Modern_Spanish_CI_AS,
NombrePermiso VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
Descripcion VARCHAR (255) COLLATE Modern_Spanish_CS_AS);
INSERT INTO @Permisos
VALUES (N'Pagos.RegistrarAbono', N'Registrar abonos', N'Registrar y aplicar pagos recibidos.'),
(N'Pagos.CambiarRequerido', N'Cambiar pago requerido', N'Modificar requerido de una obligación con observación.'),
(N'Pagos.AdministrarDocumentosFiscales', N'Administrar documentos fiscales de pagos', N'Cargar y validar XML/PDF y vincularlos a abonos.'),
(N'Convenios.Crear', N'Crear convenios', N'Crear obligaciones de tipo convenio.'),
(N'Convenios.Modificar', N'Modificar convenios', N'Editar convenios sin alterar historia de abonos.'),
(N'Convenios.Cancelar', N'Cancelar convenios', N'Cancelar convenios y liberar su saldo de origen cuando proceda.'),
(N'Convenios.DisminuirImporte', N'Disminuir importe de convenio', N'Permitir un importe de convenio menor al saldo seleccionado.');
INSERT INTO dbo.Sis_Permisos (CodigoPermiso, NombrePermiso, Descripcion, Activo, FechaCreacion)
SELECT P.CodigoPermiso,
P.NombrePermiso,
P.Descripcion,
1,
GETDATE()
FROM @Permisos AS P
WHERE NOT EXISTS (SELECT 1
FROM dbo.Sis_Permisos AS S
WHERE S.CodigoPermiso = P.CodigoPermiso);
SELECT S.CvePermiso,
S.CodigoPermiso,
S.NombrePermiso,
S.Activo
FROM dbo.Sis_Permisos AS S
INNER JOIN @Permisos AS P ON P.CodigoPermiso = S.CodigoPermiso
ORDER BY S.CodigoPermiso;
GO
-- Accesos de consulta. Los permisos de operación siguen siendo específicos.
-- El contenedor y los roles se resuelven desde el módulo real de Trámites.
DECLARE @ModuloTramites INT;
DECLARE @ModuloPadre INT;
DECLARE @Plataforma INT;
IF (SELECT COUNT(*)
FROM dbo.Sis_Modulos
WHERE Url = '~/Pages/Desarrolladores/Tramites.aspx'
AND Activo = 1) <> 1
THROW 51410, N'No se encontró un módulo único y activo de Trámites.', 1;
SELECT @ModuloTramites = CveModulo,
@ModuloPadre = CveModuloPadre,
@Plataforma = CvePlataforma
FROM dbo.Sis_Modulos
WHERE Url = '~/Pages/Desarrolladores/Tramites.aspx'
AND Activo = 1;
DECLARE @PantallasPagos TABLE
(
Nombre VARCHAR(150),
Url VARCHAR(500),
UrlPadre VARCHAR(500),
Visible BIT,
Icono VARCHAR(150),
Posicion INT
);
INSERT INTO @PantallasPagos
(Nombre, Url, UrlPadre, Visible, Icono, Posicion)
VALUES
('Pagos', '~/Pages/Desarrolladores/Pagos.aspx', NULL, 1, 'fa fa-credit-card', 1),
('Detalle de pago', '~/Pages/Desarrolladores/PagoDetalle.aspx',
'~/Pages/Desarrolladores/Pagos.aspx', 0, 'fa fa-credit-card', 2),
('Convenios', '~/Pages/Desarrolladores/Convenios.aspx', NULL, 1, 'fa fa-handshake-o', 3),
('Detalle de convenio', '~/Pages/Desarrolladores/ConvenioDetalle.aspx',
'~/Pages/Desarrolladores/Convenios.aspx', 0, 'fa fa-handshake-o', 4);
IF EXISTS
(
SELECT M.Url
FROM dbo.Sis_Modulos AS M
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
GROUP BY M.Url
HAVING COUNT(*) > 1
)
THROW 51411, N'Existen rutas duplicadas para las pantallas de pagos.', 1;
DECLARE @UltimoOrdenPagos INT =
(
SELECT ISNULL(MAX(OrdenVisualizacion), 0)
FROM dbo.Sis_Modulos
WHERE CveModuloPadre = @ModuloPadre
);
INSERT INTO dbo.Sis_Modulos
(CveModuloPadre, CvePlataforma, NombreModulo, Url, ClaseCssIcono,
OrdenVisualizacion, Visible, Activo, FechaCreacion)
SELECT @ModuloPadre,
@Plataforma,
P.Nombre,
P.Url,
P.Icono,
@UltimoOrdenPagos + P.Posicion,
P.Visible,
1,
GETDATE()
FROM @PantallasPagos AS P
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Sis_Modulos AS M
WHERE M.Url = P.Url
);
UPDATE M
SET CveModuloPadre = Padre.CveModulo
FROM dbo.Sis_Modulos AS M
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
INNER JOIN dbo.Sis_Modulos AS Padre ON Padre.Url = P.UrlPadre
WHERE P.Visible = 0
AND ISNULL(M.CveModuloPadre, 0) <> Padre.CveModulo;
INSERT INTO dbo.Sis_RolesModulos
(CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion)
SELECT R.CveRol,
M.CveModulo,
1,
0,
0,
0,
0,
0,
GETDATE()
FROM dbo.Sis_RolesModulos AS R
INNER JOIN dbo.Sis_Modulos AS M ON M.Activo = 1
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
WHERE R.CveModulo = @ModuloTramites
AND R.PuedeVer = 1
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_RolesModulos AS Existente
WHERE Existente.CveRol = R.CveRol
AND Existente.CveModulo = M.CveModulo
);
GO