-- Catálogo y detalle de desarrolladores. -- Preparar este archivo no autoriza su ejecución. Requiere instalación explícita. -- Reutiliza Clientes, Sis_Usuarios, Sis_UsuariosClientes y la bitácora vigente. -- La transacción de altas y cambios pertenece a ServicioDesarrolladores. SET NOCOUNT ON; GO IF COL_LENGTH('dbo.Clientes', 'Duplicador') IS NULL BEGIN ALTER TABLE dbo.Clientes ADD Duplicador varchar(50) COLLATE Modern_Spanish_CS_AS NULL; END; GO IF COL_LENGTH('dbo.Clientes', 'Referencia') IS NULL BEGIN ALTER TABLE dbo.Clientes ADD Referencia varchar(200) COLLATE Modern_Spanish_CS_AS NULL; END; GO IF COL_LENGTH('dbo.Clientes', 'AsociadoCanadevi') IS NULL BEGIN ALTER TABLE dbo.Clientes ADD AsociadoCanadevi bit NOT NULL CONSTRAINT DF_Clientes_AsociadoCanadevi DEFAULT (0); END; GO IF COL_LENGTH('dbo.Clientes', 'Adherente') IS NULL BEGIN ALTER TABLE dbo.Clientes ADD Adherente varchar(200) COLLATE Modern_Spanish_CS_AS NULL; END; GO CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorList @Texto varchar(200) = NULL, @IncluirInactivos bit = 0, @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.CveCliente, C.RFC, C.Nombre, C.Direccion, C.NoExt, C.Duplicador, C.Referencia, C.Telefono, C.Mail, C.Adherente, C.Colonia, C.CP, C.Ciudad, C.Estado, C.Pais, C.CvePais, C.CveSATEstado, C.CveMunicipio, C.CveLocalidad, C.CveColonia, C.AsociadoCanadevi, C.Estatus FROM dbo.Clientes AS C WHERE (@IncluirInactivos = 1 OR C.Estatus = 1) AND ( NULLIF(@Texto, '') IS NULL OR C.Nombre LIKE '%' + @Texto + '%' OR C.RFC LIKE '%' + @Texto + '%' OR C.Mail LIKE '%' + @Texto + '%' ) ORDER BY C.Nombre, C.CveCliente; SET @Return = 1; END TRY BEGIN CATCH SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; favor de contactar a Sistemas.'; SET @ErrorTipo = 1; SET @Return = 0; DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( 'Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Clientes_DesarrolladorList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE() ); RAISERROR(N'%s', 10, 1, @ErrorTecnico); END CATCH; END; GO CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorGet @CveCliente 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.CveCliente, C.RFC, C.Nombre, C.Direccion, C.NoExt, C.Duplicador, C.Referencia, C.Telefono, C.Mail, C.Adherente, C.Colonia, C.CP, C.Ciudad, C.Estado, C.Pais, C.CvePais, C.CveSATEstado, C.CveMunicipio, C.CveLocalidad, C.CveColonia, C.AsociadoCanadevi, C.Estatus FROM dbo.Clientes AS C WHERE C.CveCliente = @CveCliente; SET @Return = 1; END TRY BEGIN CATCH SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; favor de contactar a Sistemas.'; SET @ErrorTipo = 1; SET @Return = 0; DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( 'Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Clientes_DesarrolladorGet'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE() ); RAISERROR(N'%s', 10, 1, @ErrorTecnico); END CATCH; END; GO CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorAdd @RFC varchar(15), @Nombre varchar(200), @Direccion varchar(90), @NoExt varchar(20), @Duplicador varchar(50), @Referencia varchar(200), @Telefono varchar(25), @Mail varchar(255), @Adherente varchar(200), @Colonia varchar(50), @CP varchar(10), @Ciudad varchar(50), @Estado varchar(35), @Pais varchar(50), @CvePais int, @CveSATEstado int, @CveMunicipio int, @CveLocalidad int, @CveColonia int, @AsociadoCanadevi bit, @GenerarUsuario bit = 0, @NombreUsuario varchar(100) = NULL, @CorreoUsuario varchar(255) = NULL, @HashContrasena varchar(500) = NULL, @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 NULLIF(LTRIM(RTRIM(@Nombre)), '') IS NULL OR NULLIF(LTRIM(RTRIM(@RFC)), '') IS NULL OR NULLIF(LTRIM(RTRIM(@Direccion)), '') IS NULL BEGIN SET @ErrorMostrar = 'Capture RFC, nombre y calle.'; SET @ErrorTipo = 2; RETURN; END; DECLARE @AsociadoAnterior bit = 0; -- Regla solicitada: únicamente los usuarios no clientes pueden cambiar CANADEVI. IF @AsociadoCanadevi <> ISNULL(@AsociadoAnterior, 0) AND NOT EXISTS ( SELECT 1 FROM dbo.Sis_Usuarios WHERE CveUsuario = @CveUsuarioEjecuta AND CveRol <> 3 AND Activo = 1 ) BEGIN SET @ErrorMostrar = 'Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.'; SET @ErrorTipo = 2; RETURN; END; IF EXISTS (SELECT 1 FROM dbo.Clientes WHERE RFC = @RFC) BEGIN SET @ErrorMostrar = 'Ya existe un desarrollador con ese RFC.'; SET @ErrorTipo = 2; RETURN; END; DECLARE @CveUsuarioNuevo int = 0; DECLARE @CveCliente int; IF @GenerarUsuario = 1 BEGIN IF NULLIF(LTRIM(RTRIM(@NombreUsuario)), '') IS NULL OR NULLIF(LTRIM(RTRIM(@CorreoUsuario)), '') IS NULL OR NULLIF(@HashContrasena, '') IS NULL BEGIN SET @ErrorMostrar = 'Capture usuario y correo para generar el acceso.'; SET @ErrorTipo = 2; RETURN; END; IF EXISTS ( SELECT 1 FROM dbo.Sis_Usuarios WHERE NombreUsuario = @NombreUsuario OR CorreoElectronico = @CorreoUsuario ) BEGIN SET @ErrorMostrar = 'El usuario o correo de acceso ya está registrado.'; SET @ErrorTipo = 2; RETURN; END; INSERT INTO dbo.Sis_Usuarios ( NombreUsuario, CorreoElectronico, HashContrasena, CveRol, Activo, DebeCambiarContrasena, CorreoVerificado, FechaCreacion ) VALUES ( @NombreUsuario, @CorreoUsuario, @HashContrasena, 3, 1, 1, 1, SYSDATETIME() ); SET @CveUsuarioNuevo = CONVERT(int, SCOPE_IDENTITY()); END; INSERT INTO dbo.Clientes ( RFC, Nombre, Direccion, NoExt, Duplicador, Referencia, Telefono, Mail, Adherente, Colonia, CP, Ciudad, Estado, Pais, CvePais, CveSATEstado, CveMunicipio, CveLocalidad, CveColonia, AsociadoCanadevi, CveEstado, Estatus, Fecha, CveUsuario, FechaIng ) VALUES ( @RFC, @Nombre, @Direccion, @NoExt, @Duplicador, @Referencia, @Telefono, @Mail, @Adherente, @Colonia, @CP, @Ciudad, @Estado, @Pais, @CvePais, @CveSATEstado, @CveMunicipio, @CveLocalidad, @CveColonia, @AsociadoCanadevi, @CveSATEstado, 1, CONVERT(date, GETDATE()), @CveUsuarioEjecuta, GETDATE() ); SET @CveCliente = CONVERT(int, SCOPE_IDENTITY()); IF @GenerarUsuario = 1 BEGIN INSERT INTO dbo.Sis_UsuariosClientes ( CveUsuario, CveCliente, Orden, EsPrincipal, Activo, CveUsuarioRegistro ) VALUES ( @CveUsuarioNuevo, @CveCliente, 1, 1, 1, @CveUsuarioEjecuta ); END; SELECT @CveCliente AS CveCliente, @CveUsuarioNuevo AS CveUsuario; SET @Return = 1; END TRY BEGIN CATCH SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; favor de contactar a Sistemas.'; SET @ErrorTipo = 1; SET @Return = 0; DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( 'Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Clientes_DesarrolladorAdd'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE() ); RAISERROR(N'%s', 10, 1, @ErrorTecnico); END CATCH; END; GO CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorUpdate @CveCliente int, @RFC varchar(15), @Nombre varchar(200), @Direccion varchar(90), @NoExt varchar(20), @Duplicador varchar(50), @Referencia varchar(200), @Telefono varchar(25), @Mail varchar(255), @Adherente varchar(200), @Colonia varchar(50), @CP varchar(10), @Ciudad varchar(50), @Estado varchar(35), @Pais varchar(50), @CvePais int, @CveSATEstado int, @CveMunicipio int, @CveLocalidad int, @CveColonia int, @AsociadoCanadevi bit, @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 NULLIF(LTRIM(RTRIM(@Nombre)), '') IS NULL OR NULLIF(LTRIM(RTRIM(@RFC)), '') IS NULL OR NULLIF(LTRIM(RTRIM(@Direccion)), '') IS NULL BEGIN SET @ErrorMostrar = 'Capture RFC, nombre y calle.'; SET @ErrorTipo = 2; RETURN; END; IF NOT EXISTS (SELECT 1 FROM dbo.Clientes WHERE CveCliente = @CveCliente) BEGIN SET @ErrorMostrar = 'El desarrollador ya no existe.'; SET @ErrorTipo = 2; RETURN; END; DECLARE @AsociadoAnterior bit; SELECT @AsociadoAnterior = AsociadoCanadevi FROM dbo.Clientes WITH (UPDLOCK) WHERE CveCliente = @CveCliente; -- Regla solicitada: únicamente los usuarios no clientes pueden cambiar CANADEVI. IF @AsociadoCanadevi <> ISNULL(@AsociadoAnterior, 0) AND NOT EXISTS ( SELECT 1 FROM dbo.Sis_Usuarios WHERE CveUsuario = @CveUsuarioEjecuta AND CveRol <> 3 AND Activo = 1 ) BEGIN SET @ErrorMostrar = 'Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.'; SET @ErrorTipo = 2; RETURN; END; IF EXISTS ( SELECT 1 FROM dbo.Clientes WHERE RFC = @RFC AND CveCliente <> @CveCliente ) BEGIN SET @ErrorMostrar = 'Ya existe otro desarrollador con ese RFC.'; SET @ErrorTipo = 2; RETURN; END; UPDATE dbo.Clientes SET RFC = @RFC, Nombre = @Nombre, Direccion = @Direccion, NoExt = @NoExt, Duplicador = @Duplicador, Referencia = @Referencia, Telefono = @Telefono, Mail = @Mail, Adherente = @Adherente, Colonia = @Colonia, CP = @CP, Ciudad = @Ciudad, Estado = @Estado, Pais = @Pais, CvePais = @CvePais, CveSATEstado = @CveSATEstado, CveMunicipio = @CveMunicipio, CveLocalidad = @CveLocalidad, CveColonia = @CveColonia, AsociadoCanadevi = @AsociadoCanadevi, CveEstado = @CveSATEstado, CveUsuarioModifico = @CveUsuarioEjecuta WHERE CveCliente = @CveCliente; SET @Return = 1; END TRY BEGIN CATCH SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; favor de contactar a Sistemas.'; SET @ErrorTipo = 1; SET @Return = 0; DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( 'Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Clientes_DesarrolladorUpdate'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE() ); RAISERROR(N'%s', 10, 1, @ErrorTecnico); END CATCH; END; GO -- Configuración de campos auditables; no incluye contraseñas ni hashes. DECLARE @Acciones TABLE ( CodigoAccion varchar(150) COLLATE Modern_Spanish_CI_AS, NombreAccion varchar(150) ); INSERT INTO @Acciones (CodigoAccion, NombreAccion) VALUES ('AgregarDesarrollador', 'Agregar desarrollador'), ('ActualizarDesarrollador', 'Actualizar desarrollador'); INSERT INTO dbo.Bit_DefinicionesAccion (CodigoAccion, NombreAccion, DescripcionAccion, CveTabla, CveTipoMovimiento, Activo) SELECT A.CodigoAccion, A.NombreAccion, A.NombreAccion, NULL, NULL, 1 FROM @Acciones AS A WHERE NOT EXISTS ( SELECT 1 FROM dbo.Bit_DefinicionesAccion AS D WHERE D.CodigoAccion = A.CodigoAccion ); UPDATE D SET Activo = 1 FROM dbo.Bit_DefinicionesAccion AS D INNER JOIN @Acciones AS A ON A.CodigoAccion = D.CodigoAccion; IF NOT EXISTS (SELECT 1 FROM dbo.Bit_Tablas WHERE NombreTablaSQL = 'Clientes') BEGIN INSERT INTO dbo.Bit_Tablas (NombreTablaSQL, NombreMostrar, NombreCampoLlaveSQL, Activo, FechaAlta) VALUES ('Clientes', 'Desarrolladores', 'CveCliente', 1, GETDATE()); END; UPDATE dbo.Bit_Tablas SET Activo = 1, NombreCampoLlaveSQL = 'CveCliente' WHERE NombreTablaSQL = 'Clientes'; DECLARE @Campos TABLE ( Campo varchar(128), Nombre varchar(150), Tipo varchar(128) ); INSERT INTO @Campos (Campo, Nombre, Tipo) VALUES ('CveCliente', 'CveCliente', 'int'), ('RFC', 'RFC', 'varchar'), ('Nombre', 'Nombre', 'varchar'), ('Direccion', 'Direccion', 'varchar'), ('NoExt', 'NoExt', 'varchar'), ('Duplicador', 'Duplicador', 'varchar'), ('Referencia', 'Referencia', 'varchar'), ('Telefono', 'Telefono', 'varchar'), ('Mail', 'Mail', 'varchar'), ('Adherente', 'Adherente', 'varchar'), ('Colonia', 'Colonia', 'varchar'), ('CP', 'CP', 'varchar'), ('Ciudad', 'Ciudad', 'varchar'), ('Estado', 'Estado', 'varchar'), ('Pais', 'Pais', 'varchar'), ('CvePais', 'CvePais', 'int'), ('CveSATEstado', 'CveSATEstado', 'int'), ('CveMunicipio', 'CveMunicipio', 'int'), ('CveLocalidad', 'CveLocalidad', 'int'), ('CveColonia', 'CveColonia', 'int'), ('AsociadoCanadevi', 'AsociadoCanadevi', 'bit'), ('Estatus', 'Estatus', 'bit'); INSERT INTO dbo.Bit_Campos (CveTabla, NombreCampoSQL, NombreMostrar, TipoDatoSQL, MostrarEnBitacora, Activo, FechaAlta) SELECT T.CveTabla, C.Campo, C.Nombre, C.Tipo, 1, 1, GETDATE() FROM @Campos AS C INNER JOIN dbo.Bit_Tablas AS T ON T.NombreTablaSQL = 'Clientes' WHERE NOT EXISTS ( SELECT 1 FROM dbo.Bit_Campos AS B WHERE B.CveTabla = T.CveTabla AND B.NombreCampoSQL = C.Campo ); UPDATE B SET Activo = 1, MostrarEnBitacora = 1 FROM dbo.Bit_Campos AS B INNER JOIN dbo.Bit_Tablas AS T ON T.CveTabla = B.CveTabla AND T.NombreTablaSQL = 'Clientes' INNER JOIN @Campos AS C ON C.Campo = B.NombreCampoSQL; GO -- Rutas del catálogo y detalle; el detalle hereda los permisos del catálogo. DECLARE @CvePlataforma int; DECLARE @CvePadre int; SELECT TOP (1) @CvePadre = CveModulo, @CvePlataforma = CvePlataforma FROM dbo.Sis_Modulos WHERE NombreModulo = 'Desarrolladores' AND CveModuloPadre IS NULL ORDER BY CveModulo; IF @CvePlataforma IS NULL BEGIN THROW 51001, 'No se encontró el módulo padre Desarrolladores.', 1; END; IF NOT EXISTS ( SELECT 1 FROM dbo.Sis_Modulos WHERE Url = '~/Pages/Desarrolladores/Desarrolladores.aspx' ) BEGIN INSERT INTO dbo.Sis_Modulos ( CveModuloPadre, CvePlataforma, NombreModulo, Url, ClaseCssIcono, OrdenVisualizacion, Visible, Activo, FechaCreacion ) VALUES ( @CvePadre, @CvePlataforma, 'Registro de desarrolladores', '~/Pages/Desarrolladores/Desarrolladores.aspx', 'fa fa-users', 5, 1, 1, GETDATE() ); END; DECLARE @CveCatalogo int; SELECT @CveCatalogo = CveModulo FROM dbo.Sis_Modulos WHERE Url = '~/Pages/Desarrolladores/Desarrolladores.aspx'; IF NOT EXISTS ( SELECT 1 FROM dbo.Sis_Modulos WHERE Url = '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx' ) BEGIN INSERT INTO dbo.Sis_Modulos ( CveModuloPadre, CvePlataforma, NombreModulo, Url, ClaseCssIcono, OrdenVisualizacion, Visible, Activo, FechaCreacion ) VALUES ( @CveCatalogo, @CvePlataforma, 'Detalle de desarrollador', '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx', 'fa fa-building', 1, 0, 1, GETDATE() ); END; -- Se conservan permisos ya existentes. Para el catálogo nuevo se reutilizan los del padre. INSERT INTO dbo.Sis_RolesModulos ( CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar, PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion ) SELECT R.CveRol, @CveCatalogo, R.PuedeVer, R.PuedeCrear, R.PuedeModificar, 0, 0, 0, GETDATE() FROM dbo.Sis_RolesModulos AS R WHERE R.CveModulo = @CvePadre AND NOT EXISTS ( SELECT 1 FROM dbo.Sis_RolesModulos AS E WHERE E.CveRol = R.CveRol AND E.CveModulo = @CveCatalogo ); INSERT INTO dbo.Sis_RolesModulos ( CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar, PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion ) SELECT R.CveRol, D.CveModulo, R.PuedeVer, R.PuedeCrear, R.PuedeModificar, 0, 0, 0, GETDATE() FROM dbo.Sis_RolesModulos AS R INNER JOIN dbo.Sis_Modulos AS D ON D.Url = '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx' WHERE R.CveModulo = @CveCatalogo AND NOT EXISTS ( SELECT 1 FROM dbo.Sis_RolesModulos AS E WHERE E.CveRol = R.CveRol AND E.CveModulo = D.CveModulo ); GO