/* 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