392 lines
16 KiB
Transact-SQL
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
|
|
|
|
|