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

658 lines
19 KiB
Transact-SQL

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