Files
Plataforma-de-desarrolladores/Usuarios_Clientes_Registro.sql
Jorge Luis caudillo esparza 45ce71c7da BITACORA FEA
2026-08-14 05:43:41 -07:00

952 lines
37 KiB
Transact-SQL

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
/* ==================== COLUMNAS DE VERIFICACIÓN ==================== */
IF COL_LENGTH(N'dbo.Sis_Usuarios', N'CorreoVerificado') IS NULL
ALTER TABLE [dbo].[Sis_Usuarios]
ADD [CorreoVerificado] bit NOT NULL
CONSTRAINT [DF_Sis_Usuarios_CorreoVerificado] DEFAULT ((1)) WITH VALUES;
GO
IF COL_LENGTH(N'dbo.Sis_Usuarios', N'FechaVerificacionCorreo') IS NULL
ALTER TABLE [dbo].[Sis_Usuarios] ADD [FechaVerificacionCorreo] datetime2(0) NULL;
GO
/* ==================== RELACIÓN USUARIO - CLIENTE ==================== */
IF OBJECT_ID(N'dbo.Sis_UsuariosClientes', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Sis_UsuariosClientes]
(
[CveUsuarioCliente] int IDENTITY(1,1) NOT NULL,
[CveUsuario] int NOT NULL,
[CveCliente] int NOT NULL,
[Orden] int NOT NULL,
[EsPrincipal] bit NOT NULL CONSTRAINT [DF_Sis_UsuariosClientes_EsPrincipal] DEFAULT ((0)),
[Activo] bit NOT NULL CONSTRAINT [DF_Sis_UsuariosClientes_Activo] DEFAULT ((1)),
[FechaCreacion] datetime2(0) NOT NULL CONSTRAINT [DF_Sis_UsuariosClientes_FechaCreacion] DEFAULT (SYSDATETIME()),
[FechaActualizacion] datetime2(0) NULL,
[CveUsuarioRegistro] int NOT NULL,
[Borrado] bit NOT NULL CONSTRAINT [DF_Sis_UsuariosClientes_Borrado] DEFAULT ((0)),
[FechaBorrado] datetime2(0) NULL,
CONSTRAINT [PK_Sis_UsuariosClientes] PRIMARY KEY CLUSTERED ([CveUsuarioCliente]),
CONSTRAINT [CK_Sis_UsuariosClientes_Orden] CHECK ([Orden] > (0)),
CONSTRAINT [CK_Sis_UsuariosClientes_Borrado] CHECK
(([Borrado] = (0) AND [FechaBorrado] IS NULL) OR ([Borrado] = (1) AND [FechaBorrado] IS NOT NULL)),
CONSTRAINT [FK_Sis_UsuariosClientes_Usuario] FOREIGN KEY ([CveUsuario]) REFERENCES [dbo].[Sis_Usuarios] ([CveUsuario]),
CONSTRAINT [FK_Sis_UsuariosClientes_Cliente] FOREIGN KEY ([CveCliente]) REFERENCES [dbo].[Clientes] ([CveCliente]),
CONSTRAINT [FK_Sis_UsuariosClientes_UsuarioRegistro] FOREIGN KEY ([CveUsuarioRegistro]) REFERENCES [dbo].[Sis_Usuarios] ([CveUsuario])
);
CREATE UNIQUE NONCLUSTERED INDEX [UX_Sis_UsuariosClientes_Usuario_Cliente]
ON [dbo].[Sis_UsuariosClientes] ([CveUsuario], [CveCliente])
WHERE [Borrado] = (0);
CREATE UNIQUE NONCLUSTERED INDEX [UX_Sis_UsuariosClientes_Usuario_Orden]
ON [dbo].[Sis_UsuariosClientes] ([CveUsuario], [Orden])
WHERE [Borrado] = (0) AND [Activo] = (1);
END;
GO
/* ==================== VERIFICACIÓN DE CORREO ==================== */
IF OBJECT_ID(N'dbo.Sis_UsuariosVerificacionesCorreo', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Sis_UsuariosVerificacionesCorreo]
(
[CveUsuarioVerificacionCorreo] int IDENTITY(1,1) NOT NULL,
[CveUsuario] int NOT NULL,
[CveClienteRegistro] int NULL,
[HashToken] char(64) COLLATE Modern_Spanish_CS_AS NOT NULL,
[FechaExpiracion] datetime2(0) NOT NULL,
[FechaVerificacion] datetime2(0) NULL,
[Utilizado] bit NOT NULL CONSTRAINT [DF_Sis_UsuariosVerificacionesCorreo_Utilizado] DEFAULT ((0)),
[FechaCreacion] datetime2(0) NOT NULL CONSTRAINT [DF_Sis_UsuariosVerificacionesCorreo_FechaCreacion] DEFAULT (SYSDATETIME()),
[Borrado] bit NOT NULL CONSTRAINT [DF_Sis_UsuariosVerificacionesCorreo_Borrado] DEFAULT ((0)),
[FechaBorrado] datetime2(0) NULL,
CONSTRAINT [PK_Sis_UsuariosVerificacionesCorreo] PRIMARY KEY CLUSTERED ([CveUsuarioVerificacionCorreo]),
CONSTRAINT [UQ_Sis_UsuariosVerificacionesCorreo_HashToken] UNIQUE NONCLUSTERED ([HashToken]),
CONSTRAINT [CK_Sis_UsuariosVerificacionesCorreo_Borrado] CHECK
(([Borrado] = (0) AND [FechaBorrado] IS NULL) OR ([Borrado] = (1) AND [FechaBorrado] IS NOT NULL)),
CONSTRAINT [FK_Sis_UsuariosVerificacionesCorreo_Usuario] FOREIGN KEY ([CveUsuario]) REFERENCES [dbo].[Sis_Usuarios] ([CveUsuario]),
CONSTRAINT [FK_Sis_UsuariosVerificacionesCorreo_Cliente] FOREIGN KEY ([CveClienteRegistro]) REFERENCES [dbo].[Clientes] ([CveCliente])
);
CREATE NONCLUSTERED INDEX [IX_Sis_UsuariosVerificacionesCorreo_Pendiente]
ON [dbo].[Sis_UsuariosVerificacionesCorreo] ([CveUsuario], [Utilizado], [FechaExpiracion])
WHERE [Borrado] = (0);
END;
GO
/* ==================== AUTENTICACIÓN CON CORREO VERIFICADO ==================== */
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioGetByName]
@NombreUsuario varchar(100),
@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 TOP (1)
U.[CveUsuario], U.[NombreUsuario], U.[HashContrasena], U.[CorreoElectronico],
U.[CveRol], R.[NombreRol], U.[Activo], U.[DebeCambiarContrasena],
U.[IntentosFallidosInicioSesion], U.[BloqueadoHasta],
U.[FechaUltimoInicioSesion], U.[FechaUltimaConexion], U.[CorreoVerificado]
FROM [dbo].[Sis_Usuarios] AS U
INNER JOIN [dbo].[Sis_Roles] AS R ON R.[CveRol] = U.[CveRol]
WHERE U.[NombreUsuario] = @NombreUsuario
AND U.[Borrado] = (0)
AND R.[Borrado] = (0);
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
/* ==================== CATÁLOGOS ==================== */
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RolList]
@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 [CveRol], [NombreRol], [Descripcion]
FROM [dbo].[Sis_Roles]
WHERE [Activo] = (1) AND [Borrado] = (0)
ORDER BY [NombreRol];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar los roles; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Gral_EstadoList]
@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 [CveEstado], [NombreEstado], [ClaveSATEstado]
FROM [dbo].[Gral_SAT_Estado]
WHERE [Borrado] = (0)
ORDER BY [NombreEstado];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar los estados; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
/* ==================== AUTORREGISTRO ==================== */
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteValidate]
@NombreUsuario varchar(100),
@CorreoElectronico varchar(255),
@RFC varchar(15),
@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
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
SET @CorreoElectronico = LOWER(LTRIM(RTRIM(@CorreoElectronico)));
SET @RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', ''));
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE [NombreUsuario] = @NombreUsuario)
BEGIN
SET @ErrorMostrar = 'El nombre de usuario ya se encuentra registrado.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE LOWER([CorreoElectronico]) = @CorreoElectronico)
BEGIN
SET @ErrorMostrar = 'El correo electrónico ya se encuentra registrado. Contacta a Soporte Técnico antes de continuar.';
SET @ErrorTipo = 2;
RETURN;
END;
/* Incluye clientes activos, inactivos y borrados para impedir autorreactivación. */
IF EXISTS (SELECT 1 FROM [dbo].[Clientes] WHERE UPPER(REPLACE(LTRIM(RTRIM([RFC])), ' ', '')) = @RFC)
BEGIN
SET @ErrorMostrar = 'El RFC ya se encuentra registrado. Contacta a Soporte Técnico para solicitar acceso.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el registro; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteUsuarioValidate]
@NombreUsuario varchar(100),
@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
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
IF NULLIF(@NombreUsuario, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el nombre de usuario para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Sis_Usuarios]
WHERE [NombreUsuario] = @NombreUsuario
)
BEGIN
SET @ErrorMostrar = 'El nombre de usuario ya se encuentra registrado. Elige uno diferente.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el nombre de usuario; 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_Sis_RegistroClienteUsuarioValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteCorreoValidate]
@CorreoElectronico varchar(255),
@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
SET @CorreoElectronico = LOWER(LTRIM(RTRIM(@CorreoElectronico)));
IF NULLIF(@CorreoElectronico, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el correo electrónico para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Sis_Usuarios]
WHERE LOWER([CorreoElectronico]) = @CorreoElectronico
)
BEGIN
SET @ErrorMostrar = 'El correo electrónico ya se encuentra registrado. Contacta a Soporte Técnico antes de continuar.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el correo; 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_Sis_RegistroClienteCorreoValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteRFCValidate]
@RFC varchar(15),
@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
SET @RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', ''));
IF NULLIF(@RFC, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el RFC para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Clientes]
WHERE UPPER(REPLACE(LTRIM(RTRIM([RFC])), ' ', '')) = @RFC
)
BEGIN
SET @ErrorMostrar = 'El RFC ya se encuentra registrado. Contacta a Soporte Técnico para solicitar acceso.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el RFC; 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_Sis_RegistroClienteRFCValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
/* Claves normalizadas utilizadas por el registro. */
IF OBJECT_ID(N'dbo.Clientes', N'U') IS NULL
THROW 51026, N'Falta la tabla dbo.Clientes.', 1;
IF COL_LENGTH(N'dbo.Clientes', N'CveLocalidad') IS NULL
ALTER TABLE [dbo].[Clientes] ADD [CveLocalidad] int NULL;
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Pais', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Pais] P ON P.[CvePais]=C.[CvePais] WHERE C.[CvePais] IS NOT NULL AND P.[CvePais] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Pais] FOREIGN KEY ([CvePais]) REFERENCES [dbo].[Gral_SAT_Pais] ([CvePais]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Estado_Normalizado', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Estado] E ON E.[CveEstado]=C.[CveEstado] WHERE C.[CveEstado] IS NOT NULL AND E.[CveEstado] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Estado_Normalizado] FOREIGN KEY ([CveEstado]) REFERENCES [dbo].[Gral_SAT_Estado] ([CveEstado]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Municipio', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Municipio] M ON M.[CveMunicipio]=C.[CveMunicipio] WHERE C.[CveMunicipio] IS NOT NULL AND M.[CveMunicipio] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Municipio] FOREIGN KEY ([CveMunicipio]) REFERENCES [dbo].[Gral_SAT_Municipio] ([CveMunicipio]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Localidad', N'F') IS NULL
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Localidad] FOREIGN KEY ([CveLocalidad]) REFERENCES [dbo].[Gral_SAT_Localidad] ([CveLocalidad]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Colonia', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Colonia] CO ON CO.[CveColonia]=C.[CveColonia] WHERE C.[CveColonia] IS NOT NULL AND CO.[CveColonia] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Colonia] FOREIGN KEY ([CveColonia]) REFERENCES [dbo].[Gral_SAT_Colonia] ([CveColonia]);
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteAdd]
@NombreUsuario varchar(100),
@HashContrasena varchar(500),
@CorreoElectronico varchar(255),
@RFC varchar(15),
@RazonSocial varchar(200),
@NombreComercial varchar(200) = NULL,
@Direccion varchar(90),
@NoExt varchar(20) = NULL,
@NoInt varchar(50) = NULL,
@Colonia varchar(100),
@Ciudad varchar(100),
@CveSATEstado int,
@Pais varchar(100) = 'México',
@CP varchar(5),
@Telefono varchar(25) = NULL,
@CvePais int,
@CveMunicipio int,
@CveLocalidad int = NULL,
@CveColonia int,
@HashToken char(64),
@HorasExpiracion int = 24,
@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
DECLARE @CveRolEmpresa int, @CveUsuario int, @CveCliente int;
DECLARE @NombreEstado varchar(50), @PaisCatalogo varchar(100);
DECLARE @CiudadCatalogo varchar(100), @ColoniaCatalogo varchar(100);
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
SET @CorreoElectronico = LOWER(LTRIM(RTRIM(@CorreoElectronico)));
SET @RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', ''));
SET @CP = LTRIM(RTRIM(@CP));
SELECT @CveRolEmpresa = [CveRol]
FROM [dbo].[Sis_Roles]
WHERE [NombreRol] = 'Empresa' AND [Activo] = (1) AND [Borrado] = (0);
SELECT TOP (1)
@NombreEstado = LEFT(E.[NombreEstado], 35),
@PaisCatalogo = LEFT(P.[Descripcion], 50),
@CiudadCatalogo = LEFT(COALESCE(NULLIF(L.[NombreLocalidad], ''), M.[Descripcion]), 50),
@ColoniaCatalogo = LEFT(C.[NombreAsentamiento], 50)
FROM [dbo].[Gral_SAT_CP] AS CP
INNER JOIN [dbo].[Gral_SAT_Estado] AS E
ON E.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND E.[CveEstado] = @CveSATEstado AND E.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Pais] AS P
ON P.[ClaveSATPais] = E.[ClaveSATPais]
AND P.[CvePais] = @CvePais AND P.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Municipio] AS M
ON M.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND M.[ClaveSATMunicipio] = CP.[ClaveSATMunicipio]
AND M.[CveMunicipio] = @CveMunicipio AND M.[Borrado] = (0)
LEFT JOIN [dbo].[Gral_SAT_Localidad] AS L
ON L.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND L.[ClaveSATLocalidad] = CP.[ClaveSATLocalidad] AND L.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Colonia] AS C
ON C.[CP] = CP.[CP] AND C.[CveColonia] = @CveColonia AND C.[Borrado] = (0)
WHERE CP.[CP] = @CP AND CP.[Borrado] = (0)
AND (@CveLocalidad IS NULL OR L.[CveLocalidad] = @CveLocalidad);
IF @CveRolEmpresa IS NULL
BEGIN
SELECT @ErrorMostrar = 'No fue posible determinar el rol Empresa.', @ErrorTipo = 1;
RETURN;
END;
IF @NombreEstado IS NULL OR @PaisCatalogo IS NULL OR @CiudadCatalogo IS NULL OR @ColoniaCatalogo IS NULL
BEGIN
SELECT @ErrorMostrar = 'Los datos del código postal no coinciden con los catálogos vigentes. Actualiza el código postal.', @ErrorTipo = 2;
RETURN;
END;
SELECT @Pais = @PaisCatalogo, @Ciudad = @CiudadCatalogo, @Colonia = @ColoniaCatalogo;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE [NombreUsuario] = @NombreUsuario)
OR EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE LOWER([CorreoElectronico]) = @CorreoElectronico)
OR EXISTS (SELECT 1 FROM [dbo].[Clientes] WHERE UPPER(REPLACE(LTRIM(RTRIM([RFC])), ' ', '')) = @RFC)
BEGIN
SELECT @ErrorMostrar = 'Los datos ya fueron registrados por otra solicitud. Actualiza la página e inténtalo nuevamente.', @ErrorTipo = 2;
RETURN;
END;
INSERT INTO [dbo].[Sis_Usuarios]
([NombreUsuario], [HashContrasena], [CorreoElectronico], [CveRol], [Activo], [DebeCambiarContrasena], [CorreoVerificado])
VALUES (@NombreUsuario, @HashContrasena, @CorreoElectronico, @CveRolEmpresa, (0), (0), (0));
SET @CveUsuario = CONVERT(int, SCOPE_IDENTITY());
INSERT INTO [dbo].[Clientes]
([Nombre], [NombreComercial], [Direccion], [NoExt], [NoInt], [Colonia],
[Ciudad], [Estado], [CveSATEstado], [Pais], [RFC], [CP], [Telefono],
[Mail], [Estatus], [Fecha], [CveUsuario], [FechaIng],
[CvePais], [CveEstado], [CveMunicipio], [CveLocalidad], [CveColonia])
VALUES
(@RazonSocial, NULLIF(@NombreComercial, ''), @Direccion, NULLIF(@NoExt, ''),
NULLIF(@NoInt, ''), @Colonia, @Ciudad, @NombreEstado, @CveSATEstado,
@Pais, @RFC, @CP, NULLIF(@Telefono, ''), @CorreoElectronico, (0),
CONVERT(date, GETDATE()), @CveUsuario, GETDATE(),
@CvePais, @CveSATEstado, @CveMunicipio, @CveLocalidad, @CveColonia);
SET @CveCliente = CONVERT(int, SCOPE_IDENTITY());
INSERT INTO [dbo].[Sis_UsuariosClientes]
([CveUsuario], [CveCliente], [Orden], [EsPrincipal], [Activo], [CveUsuarioRegistro])
VALUES (@CveUsuario, @CveCliente, (1), (1), (1), @CveUsuario);
INSERT INTO [dbo].[Sis_UsuariosVerificacionesCorreo]
([CveUsuario], [CveClienteRegistro], [HashToken], [FechaExpiracion])
VALUES (@CveUsuario, @CveCliente, @HashToken, DATEADD(HOUR, @HorasExpiracion, SYSDATETIME()));
SELECT @CveUsuario AS [CveUsuario], @CveCliente AS [CveCliente];
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al crear el registro; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_CorreoVerify]
@HashToken char(64),
@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
DECLARE @CveVerificacion int;
DECLARE @CveUsuario int;
DECLARE @CveCliente int;
SELECT TOP (1)
@CveVerificacion = [CveUsuarioVerificacionCorreo],
@CveUsuario = [CveUsuario],
@CveCliente = [CveClienteRegistro]
FROM [dbo].[Sis_UsuariosVerificacionesCorreo]
WHERE [HashToken] = @HashToken
AND [Utilizado] = (0)
AND [Borrado] = (0)
AND [FechaExpiracion] >= SYSDATETIME();
IF @CveVerificacion IS NULL
BEGIN
SET @ErrorMostrar = 'La liga de verificación no es válida o ya expiró.';
SET @ErrorTipo = 2;
RETURN;
END;
UPDATE [dbo].[Sis_UsuariosVerificacionesCorreo]
SET [Utilizado] = (1), [FechaVerificacion] = SYSDATETIME()
WHERE [CveUsuarioVerificacionCorreo] = @CveVerificacion AND [Utilizado] = (0);
IF @@ROWCOUNT = (0)
BEGIN
SET @ErrorMostrar = 'La liga de verificación ya fue utilizada.';
SET @ErrorTipo = 2;
RETURN;
END;
UPDATE [dbo].[Sis_Usuarios]
SET [CorreoVerificado] = (1), [FechaVerificacionCorreo] = SYSDATETIME(),
[Activo] = (1), [FechaActualizacion] = GETDATE()
WHERE [CveUsuario] = @CveUsuario AND [Borrado] = (0);
/* Activación inicial del cliente creado por este mismo token. */
UPDATE [dbo].[Clientes]
SET [Estatus] = (1), [CveUsuarioModifico] = @CveUsuario
WHERE [CveCliente] = @CveCliente AND [CveUsuario] = @CveUsuario AND [Borrado] = (0);
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al verificar el correo; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
/* ==================== ADMINISTRACIÓN DE USUARIOS ==================== */
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioList]
@Texto varchar(150) = 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 NOT EXISTS
(
SELECT 1 FROM [dbo].[Sis_Usuarios] U
INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[CveUsuario] = @CveUsuarioEjecuta
AND R.[NombreRol] IN ('SuperUsuario', 'Administrador')
AND U.[Activo] = (1) AND U.[Borrado] = (0)
)
BEGIN
SET @ErrorMostrar = 'No tienes permiso para consultar usuarios.';
SET @ErrorTipo = 1;
RETURN;
END;
SELECT U.[CveUsuario], U.[NombreUsuario], U.[CorreoElectronico], U.[CveRol],
R.[NombreRol], U.[Activo], U.[CorreoVerificado], U.[FechaCreacion]
FROM [dbo].[Sis_Usuarios] U
INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[Borrado] = (0)
AND (@Texto IS NULL OR U.[NombreUsuario] LIKE '%' + @Texto + '%'
OR U.[CorreoElectronico] LIKE '%' + @Texto + '%')
ORDER BY U.[NombreUsuario];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar usuarios; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioGet]
@CveUsuario 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 U.[CveUsuario], U.[NombreUsuario], U.[CorreoElectronico], U.[CveRol],
R.[NombreRol], U.[Activo], U.[DebeCambiarContrasena], U.[CorreoVerificado]
FROM [dbo].[Sis_Usuarios] U
INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[CveUsuario] = @CveUsuario AND U.[Borrado] = (0);
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioSave]
@CveUsuario int = NULL,
@NombreUsuario varchar(100),
@CorreoElectronico varchar(255),
@CveRol int,
@HashContrasena varchar(500) = NULL,
@Activo bit,
@DebeCambiarContrasena 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 NOT EXISTS
(
SELECT 1 FROM [dbo].[Sis_Usuarios] U
INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[CveUsuario] = @CveUsuarioEjecuta AND R.[NombreRol] = 'SuperUsuario'
AND U.[Activo] = (1) AND U.[Borrado] = (0)
)
BEGIN
SET @ErrorMostrar = 'Sólo un SuperUsuario puede crear o modificar usuarios.';
SET @ErrorTipo = 1;
RETURN;
END;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE [NombreUsuario] = @NombreUsuario AND [CveUsuario] <> ISNULL(@CveUsuario, (0)))
OR EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE LOWER([CorreoElectronico]) = LOWER(@CorreoElectronico) AND [CveUsuario] <> ISNULL(@CveUsuario, (0)))
BEGIN
SET @ErrorMostrar = 'El usuario o correo electrónico ya está registrado.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveUsuario IS NULL OR @CveUsuario <= (0)
BEGIN
IF NULLIF(@HashContrasena, '') IS NULL
BEGIN
SET @ErrorMostrar = 'La contraseña es obligatoria para un usuario nuevo.';
SET @ErrorTipo = 2;
RETURN;
END;
INSERT INTO [dbo].[Sis_Usuarios]
([NombreUsuario], [HashContrasena], [CorreoElectronico], [CveRol], [Activo],
[DebeCambiarContrasena], [CorreoVerificado], [FechaVerificacionCorreo])
VALUES
(@NombreUsuario, @HashContrasena, @CorreoElectronico, @CveRol, @Activo,
@DebeCambiarContrasena, (1), SYSDATETIME());
SET @CveUsuario = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE [dbo].[Sis_Usuarios]
SET [NombreUsuario] = @NombreUsuario, [CorreoElectronico] = @CorreoElectronico,
[CveRol] = @CveRol, [Activo] = @Activo,
[DebeCambiarContrasena] = @DebeCambiarContrasena,
[HashContrasena] = COALESCE(NULLIF(@HashContrasena, ''), [HashContrasena]),
[FechaActualizacion] = GETDATE()
WHERE [CveUsuario] = @CveUsuario AND [Borrado] = (0);
END;
SELECT @CveUsuario AS [CveUsuario];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al guardar el usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioDelete]
@CveUsuario 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
IF @CveUsuario = @CveUsuarioEjecuta
BEGIN
SET @ErrorMostrar = 'No puedes borrar tu propio usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
UPDATE [dbo].[Sis_Usuarios]
SET [Activo] = (0), [Borrado] = (1), [FechaBorrado] = SYSDATETIME(), [FechaActualizacion] = GETDATE()
WHERE [CveUsuario] = @CveUsuario AND [Borrado] = (0)
AND EXISTS
(
SELECT 1 FROM [dbo].[Sis_Usuarios] E
INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = E.[CveRol]
WHERE E.[CveUsuario] = @CveUsuarioEjecuta AND R.[NombreRol] = 'SuperUsuario'
AND E.[Activo] = (1) AND E.[Borrado] = (0)
);
IF @@ROWCOUNT = (0)
BEGIN
SET @ErrorMostrar = 'No fue posible borrar el usuario o no tienes autorización.';
SET @ErrorTipo = 1;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al borrar el usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioClienteList]
@CveUsuario 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 UC.[CveUsuarioCliente], UC.[CveUsuario], UC.[CveCliente], C.[Nombre], C.[RFC],
UC.[Orden], UC.[EsPrincipal], UC.[Activo], C.[Estatus] AS [ClienteActivo]
FROM [dbo].[Sis_UsuariosClientes] UC
INNER JOIN [dbo].[Clientes] C ON C.[CveCliente] = UC.[CveCliente]
WHERE UC.[CveUsuario] = @CveUsuario AND UC.[Borrado] = (0)
ORDER BY UC.[Orden];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar los clientes del usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioClienteSave]
@CveUsuario int,
@CveCliente int,
@Orden int,
@EsPrincipal 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 NOT EXISTS
(
SELECT 1 FROM [dbo].[Sis_Usuarios] U INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[CveUsuario] = @CveUsuarioEjecuta AND R.[NombreRol] IN ('SuperUsuario', 'Administrador')
AND U.[Activo] = (1) AND U.[Borrado] = (0)
)
BEGIN
SET @ErrorMostrar = 'No tienes permiso para asignar clientes.';
SET @ErrorTipo = 1;
RETURN;
END;
IF @Orden <= (0) OR NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] WHERE [CveCliente] = @CveCliente AND [Borrado] = (0))
BEGIN
SET @ErrorMostrar = 'El cliente o el orden indicado no es válido.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1 FROM [dbo].[Sis_UsuariosClientes]
WHERE [CveUsuario] = @CveUsuario AND [Orden] = @Orden AND [Activo] = (1)
AND [Borrado] = (0) AND [CveCliente] <> @CveCliente
)
BEGIN
SET @ErrorMostrar = 'Ya existe otro cliente con el mismo orden para este usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @EsPrincipal = (1)
UPDATE [dbo].[Sis_UsuariosClientes]
SET [EsPrincipal] = (0), [FechaActualizacion] = SYSDATETIME()
WHERE [CveUsuario] = @CveUsuario AND [Borrado] = (0);
UPDATE [dbo].[Sis_UsuariosClientes]
SET [Orden] = @Orden, [EsPrincipal] = @EsPrincipal, [Activo] = (1),
[FechaActualizacion] = SYSDATETIME(), [Borrado] = (0), [FechaBorrado] = NULL
WHERE [CveUsuario] = @CveUsuario AND [CveCliente] = @CveCliente;
IF @@ROWCOUNT = (0)
INSERT INTO [dbo].[Sis_UsuariosClientes]
([CveUsuario], [CveCliente], [Orden], [EsPrincipal], [Activo], [CveUsuarioRegistro])
VALUES
(@CveUsuario, @CveCliente, @Orden, @EsPrincipal, (1), @CveUsuarioEjecuta);
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al asignar el cliente; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Clientes_EstatusUpdate]
@CveCliente int,
@Activo 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
UPDATE C
SET C.[Estatus] = @Activo, C.[CveUsuarioModifico] = @CveUsuarioEjecuta
FROM [dbo].[Clientes] C
WHERE C.[CveCliente] = @CveCliente AND C.[Borrado] = (0)
AND EXISTS
(
SELECT 1 FROM [dbo].[Sis_Usuarios] U INNER JOIN [dbo].[Sis_Roles] R ON R.[CveRol] = U.[CveRol]
WHERE U.[CveUsuario] = @CveUsuarioEjecuta
AND R.[NombreRol] IN ('SuperUsuario', 'Administrador')
AND U.[Activo] = (1) AND U.[Borrado] = (0)
);
IF @@ROWCOUNT = (0)
BEGIN
SET @ErrorMostrar = 'Sólo un Administrador o SuperUsuario puede cambiar el estado del cliente.';
SET @ErrorTipo = 1;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al cambiar el estado del cliente; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO