Files
Plataforma-de-desarrolladores/Migracion_Transacciones_Aplicacion_20260722.sql
Jorge Luis caudillo esparza 8f33c860ec Ajustes
2026-08-13 19:46:33 -07:00

1441 lines
49 KiB
Transact-SQL

/*
Las transacciones de negocio pertenecen a la capa de servicios C#.
Los procedimientos conservan validaciones y TRY/CATCH, pero no administran
la transacción ambiental recibida desde TransactionLogic.
*/
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 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)
);
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
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaDelete]
@CveFraccionamientoEtapa 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
DECLARE @EsSuperUsuario bit = 0;
SELECT @EsSuperUsuario = CASE WHEN R.NombreRol = 'SuperUsuario' THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta AND U.Activo = 1;
IF NOT EXISTS
(
SELECT 1
FROM dbo.FraccionamientosEtapas AS E
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = E.CveFraccionamiento
WHERE E.CveFraccionamientoEtapa = @CveFraccionamientoEtapa
AND (@EsSuperUsuario = 1 OR EXISTS
(SELECT 1 FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta AND UC.CveCliente = F.CveCliente
AND UC.Activo = 1))
)
BEGIN
SET @ErrorMostrar = 'La etapa no existe o no está asignada al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
)
BEGIN
SET @ErrorMostrar = 'La etapa tiene trámites relacionados y no puede eliminarse.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE FROM dbo.FraccionamientosLotes
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
DELETE FROM dbo.FraccionamientosEtapas
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar la etapa; 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_Fraccionamientos_EtapaDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaSave]
@CveFraccionamientoEtapa int = NULL,
@CveFraccionamiento int,
@Etapa varchar(150),
@Hectareas decimal(18,4) = NULL,
@Orden int = 0,
@EsActivo bit = 1,
@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 @EsSuperUsuario bit = 0;
SELECT @EsSuperUsuario = CASE WHEN R.NombreRol = 'SuperUsuario' THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta AND U.Activo = 1;
IF NULLIF(LTRIM(RTRIM(@Etapa)), '') IS NULL
BEGIN
SET @ErrorMostrar = 'Capture el nombre de la etapa.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @Hectareas IS NOT NULL AND @Hectareas < 0
BEGIN
SET @ErrorMostrar = 'Las hectáreas de la etapa no pueden ser negativas.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1 FROM dbo.Fraccionamientos AS F
WHERE F.CveFraccionamiento = @CveFraccionamiento
AND (@EsSuperUsuario = 1 OR EXISTS
(SELECT 1 FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta AND UC.CveCliente = F.CveCliente
AND UC.Activo = 1))
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamientoEtapa IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.FraccionamientosEtapas WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa AND CveFraccionamiento = @CveFraccionamiento)
BEGIN
SET @ErrorMostrar = 'La etapa no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1 FROM dbo.FraccionamientosEtapas
WHERE CveFraccionamiento = @CveFraccionamiento
AND Etapa = LTRIM(RTRIM(@Etapa))
AND (@CveFraccionamientoEtapa IS NULL OR CveFraccionamientoEtapa <> @CveFraccionamientoEtapa)
)
BEGIN
SET @ErrorMostrar = 'Ya existe una etapa con ese nombre en el fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamientoEtapa IS NULL
BEGIN
INSERT INTO dbo.FraccionamientosEtapas
(CveFraccionamiento, Etapa, Hectareas, Orden, EsActivo, CveUsuario)
VALUES
(@CveFraccionamiento, LTRIM(RTRIM(@Etapa)), @Hectareas, @Orden, @EsActivo, @CveUsuarioEjecuta);
SET @CveFraccionamientoEtapa = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.FraccionamientosEtapas
SET Etapa = LTRIM(RTRIM(@Etapa)), Hectareas = @Hectareas,
Orden = @Orden, EsActivo = @EsActivo,
FechaModificacion = GETDATE(), CveUsuario = @CveUsuarioEjecuta
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
END;
SELECT @CveFraccionamientoEtapa AS CveFraccionamientoEtapa;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al guardar la etapa; 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_Fraccionamientos_EtapaSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_FraccionamientoDelete]
@CveFraccionamiento 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
DECLARE @EsSuperUsuario bit = 0;
SELECT @EsSuperUsuario = CASE WHEN R.NombreRol = 'SuperUsuario' THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta AND U.Activo = 1;
IF NOT EXISTS
(
SELECT 1 FROM dbo.Fraccionamientos AS F
WHERE F.CveFraccionamiento = @CveFraccionamiento
AND (@EsSuperUsuario = 1 OR EXISTS
(SELECT 1 FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta AND UC.CveCliente = F.CveCliente
AND UC.Activo = 1))
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
WHERE S.CveFraccionamiento = @CveFraccionamiento
OR EXISTS
(
SELECT 1
FROM dbo.FraccionamientosEtapas AS E
WHERE E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
AND E.CveFraccionamiento = @CveFraccionamiento
)
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento tiene trámites relacionados y no puede eliminarse.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE L
FROM dbo.FraccionamientosLotes AS L
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = L.CveFraccionamientoEtapa
WHERE E.CveFraccionamiento = @CveFraccionamiento;
DELETE FROM dbo.FraccionamientosEtapas
WHERE CveFraccionamiento = @CveFraccionamiento;
DELETE FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar el fraccionamiento; 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_Fraccionamientos_FraccionamientoDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_FraccionamientoSave]
@CveFraccionamiento int = NULL,
@CveCliente int,
@Fraccionamiento varchar(200),
@Hectareas decimal(18,4) = NULL,
@Ubicacion varchar(500) = NULL,
@CveEstatus int,
@EsActivo bit = 1,
@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 @EsSuperUsuario bit = 0;
SELECT @EsSuperUsuario = CASE WHEN R.NombreRol = 'SuperUsuario' THEN 1 ELSE 0 END
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta AND U.Activo = 1;
IF NULLIF(LTRIM(RTRIM(@Fraccionamiento)), '') IS NULL
BEGIN
SET @ErrorMostrar = 'Capture el nombre del fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @Hectareas IS NOT NULL AND @Hectareas < 0
BEGIN
SET @ErrorMostrar = 'Las hectáreas no pueden ser negativas.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos_Estatus AS E
WHERE E.CveEstatus = @CveEstatus
)
BEGIN
SET @ErrorMostrar = 'Seleccione un estatus válido para el fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1 FROM dbo.Clientes AS C
WHERE C.CveCliente = @CveCliente AND C.Estatus = 1
AND
(
@EsSuperUsuario = 1
OR EXISTS
(
SELECT 1 FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta
AND UC.CveCliente = C.CveCliente
AND UC.Activo = 1
)
)
)
BEGIN
SET @ErrorMostrar = 'El cliente no existe o no está asignado al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamiento IS NOT NULL
AND NOT EXISTS
(
SELECT 1 FROM dbo.Fraccionamientos AS F
WHERE F.CveFraccionamiento = @CveFraccionamiento
AND (@EsSuperUsuario = 1 OR EXISTS
(SELECT 1 FROM dbo.Sis_UsuariosClientes AS UC
WHERE UC.CveUsuario = @CveUsuarioEjecuta
AND UC.CveCliente = F.CveCliente
AND UC.Activo = 1))
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1 FROM dbo.Fraccionamientos AS F
WHERE F.CveCliente = @CveCliente
AND F.Fraccionamiento = LTRIM(RTRIM(@Fraccionamiento))
AND (@CveFraccionamiento IS NULL OR F.CveFraccionamiento <> @CveFraccionamiento)
)
BEGIN
SET @ErrorMostrar = 'Ya existe un fraccionamiento con ese nombre para el cliente seleccionado.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamiento IS NULL
BEGIN
INSERT INTO dbo.Fraccionamientos
(CveCliente, Fraccionamiento, Hectareas, Ubicacion, CveEstatus, EsActivo, CveUsuario)
VALUES
(@CveCliente, LTRIM(RTRIM(@Fraccionamiento)), @Hectareas,
NULLIF(LTRIM(RTRIM(@Ubicacion)), ''), @CveEstatus,
@EsActivo, @CveUsuarioEjecuta);
SET @CveFraccionamiento = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Fraccionamientos
SET CveCliente = @CveCliente,
Fraccionamiento = LTRIM(RTRIM(@Fraccionamiento)),
Hectareas = @Hectareas,
Ubicacion = NULLIF(LTRIM(RTRIM(@Ubicacion)), ''),
CveEstatus = @CveEstatus,
EsActivo = @EsActivo,
FechaModificacion = GETDATE(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveFraccionamiento = @CveFraccionamiento;
END;
SELECT @CveFraccionamiento AS CveFraccionamiento;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al guardar el fraccionamiento; 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_Fraccionamientos_FraccionamientoSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteBatchSave]
@CveFraccionamiento int,
@CveFraccionamientoEtapa int,
@LotesXml xml,
@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].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
AND [EsActivo] = (1)
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no existe, está inactiva o no pertenece al fraccionamiento.';
SET @ErrorTipo = 1;
RETURN;
END;
DECLARE @Lotes TABLE
(
[Nombre] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[Tipo] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[Calle] varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
[Catastro] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[MetrosCuadrados] decimal(18,4) NULL,
[Duplicador] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[EsActivo] bit NOT NULL
);
INSERT INTO @Lotes
(
[Nombre],
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Duplicador],
[EsActivo]
)
SELECT
NULLIF(LTRIM(RTRIM(N.value('@Nombre', 'varchar(50)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Tipo', 'varchar(100)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Calle', 'varchar(200)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Catastro', 'varchar(100)'))), ''),
TRY_CONVERT(
decimal(18,4),
NULLIF(N.value('@MetrosCuadrados', 'varchar(50)'), '')
),
NULLIF(LTRIM(RTRIM(N.value('@Duplicador', 'varchar(50)'))), ''),
N.value('@EsActivo', 'bit')
FROM @LotesXml.nodes('/Lotes/Lote') AS X(N);
DECLARE @Cantidad int = (SELECT COUNT(1) FROM @Lotes);
IF @Cantidad = (0)
BEGIN
SET @ErrorMostrar = 'No se recibieron lotes para guardar.';
SET @ErrorTipo = 1;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Lotes
WHERE [Nombre] IS NULL
)
BEGIN
SET @ErrorMostrar = 'Todos los lotes deben tener un nombre.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT [Nombre]
FROM @Lotes
GROUP BY [Nombre]
HAVING COUNT(1) > (1)
)
BEGIN
SET @ErrorMostrar = 'La captura contiene nombres de lote repetidos.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Lotes AS N
INNER JOIN [dbo].[FraccionamientosLotes] AS L
ON L.[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND L.[Numero] = N.[Nombre]
)
BEGIN
SET @ErrorMostrar = 'Uno o más nombres de lote ya existen en la etapa seleccionada.';
SET @ErrorTipo = 2;
RETURN;
END;
INSERT INTO [dbo].[FraccionamientosLotes]
(
[CveFraccionamientoEtapa],
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Numero],
[Duplicador],
[EsActivo],
[CveUsuario]
)
SELECT
@CveFraccionamientoEtapa,
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Nombre],
[Duplicador],
[EsActivo],
@CveUsuarioEjecuta FROM @Lotes;
SELECT @Cantidad AS [LotesGuardados];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al guardar los lotes; 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_Fraccionamientos_LoteBatchSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteDelete]
@CveFraccionamiento int,
@CveFraccionamientoLote 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 NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El lote seleccionado no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE FROM [dbo].[FraccionamientosLotes]
WHERE [CveFraccionamientoLote] = @CveFraccionamientoLote;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar el lote; 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_Fraccionamientos_LoteDelete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteStageClear]
@CveFraccionamiento int,
@CveFraccionamientoEtapa 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 NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE FROM [dbo].[FraccionamientosLotes]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa;
DECLARE @Cantidad int = @@ROWCOUNT;
IF @Cantidad = (0)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no tiene lotes para eliminar.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT @Cantidad AS [LotesEliminados];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar los lotes de la etapa; 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_Fraccionamientos_LoteStageClear'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteUpdate]
@CveFraccionamiento int,
@CveFraccionamientoLote int,
@CveFraccionamientoEtapa int,
@Nombre varchar(50),
@Tipo varchar(100) = NULL,
@Calle varchar(200) = NULL,
@Catastro varchar(100) = NULL,
@MetrosCuadrados decimal(18,4) = NULL,
@Duplicador varchar(50) = NULL,
@EsActivo 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
SET @Nombre = NULLIF(LTRIM(RTRIM(@Nombre)), '');
SET @Tipo = NULLIF(LTRIM(RTRIM(@Tipo)), '');
SET @Calle = NULLIF(LTRIM(RTRIM(@Calle)), '');
SET @Catastro = NULLIF(LTRIM(RTRIM(@Catastro)), '');
SET @Duplicador = NULLIF(LTRIM(RTRIM(@Duplicador)), '');
IF @Nombre IS NULL
BEGIN
SET @ErrorMostrar = 'Capture el nombre del lote.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @MetrosCuadrados IS NOT NULL
AND @MetrosCuadrados < (0)
BEGIN
SET @ErrorMostrar = 'Los metros cuadrados no pueden ser negativos.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'La etapa del lote no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El lote seleccionado no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
WHERE L.[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND L.[CveFraccionamientoLote] <> @CveFraccionamientoLote
AND L.[Numero] = @Nombre COLLATE Modern_Spanish_CS_AS
)
BEGIN
SET @ErrorMostrar = 'Ya existe otro lote con ese nombre en la etapa.';
SET @ErrorTipo = 2;
RETURN;
END;
UPDATE [dbo].[FraccionamientosLotes]
SET
[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa,
[Numero] = @Nombre,
[Tipo] = @Tipo,
[Calle] = @Calle,
[Catastro] = @Catastro,
[MetrosCuadrados] = @MetrosCuadrados,
[Duplicador] = @Duplicador,
[EsActivo] = @EsActivo,
[FechaModificacion] = SYSDATETIME(),
[CveUsuario] = @CveUsuarioEjecuta
WHERE [CveFraccionamientoLote] = @CveFraccionamientoLote
;
SELECT @CveFraccionamientoLote AS [CveFraccionamientoLote];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al actualizar el lote; 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_Fraccionamientos_LoteUpdate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
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 [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;
/* Activación inicial del cliente creado por este mismo token. */
UPDATE [dbo].[Clientes]
SET [Estatus] = (1), [CveUsuarioModifico] = @CveUsuario
WHERE [CveCliente] = @CveCliente AND [CveUsuario] = @CveUsuario;
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
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_IntentoInicioSesionAdd]
@CveUsuario int = NULL,
@NombreUsuario varchar(100),
@Exitoso bit,
@MotivoFallo varchar(200) = NULL,
@DireccionIP varchar(50) = NULL,
@AgenteUsuario varchar(1000) = NULL,
@NombreDominio varchar(255) = 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
INSERT INTO [dbo].[Sis_IntentosInicioSesion]
([CveUsuario], [NombreUsuario], [Exitoso], [MotivoFallo],
[DireccionIP], [AgenteUsuario], [NombreDominio])
VALUES
(@CveUsuario, @NombreUsuario, @Exitoso, @MotivoFallo,
@DireccionIP, @AgenteUsuario, @NombreDominio);
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al registrar el intento de acceso; 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_IntentoInicioSesionAdd'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
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);
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
INNER JOIN [dbo].[Gral_SAT_Pais] AS P
ON P.[ClaveSATPais] = E.[ClaveSATPais]
AND P.[CvePais] = @CvePais
INNER JOIN [dbo].[Gral_SAT_Municipio] AS M
ON M.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND M.[ClaveSATMunicipio] = CP.[ClaveSATMunicipio]
AND M.[CveMunicipio] = @CveMunicipio
LEFT JOIN [dbo].[Gral_SAT_Localidad] AS L
ON L.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND L.[ClaveSATLocalidad] = CP.[ClaveSATLocalidad]
INNER JOIN [dbo].[Gral_SAT_Colonia] AS C
ON C.[CP] = CP.[CP] AND C.[CveColonia] = @CveColonia
WHERE CP.[CP] = @CP
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_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)
)
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)
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 [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;
UPDATE [dbo].[Sis_UsuariosClientes]
SET [Orden] = @Orden, [EsPrincipal] = @EsPrincipal, [Activo] = (1),
[FechaActualizacion] = SYSDATETIME()
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_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;
DELETE U
FROM [dbo].[Sis_Usuarios] AS U
WHERE U.[CveUsuario] = @CveUsuario
AND EXISTS
(
SELECT 1
FROM [dbo].[Sis_Usuarios] AS E
INNER JOIN [dbo].[Sis_Roles] AS R
ON R.[CveRol] = E.[CveRol]
WHERE E.[CveUsuario] = @CveUsuarioEjecuta
AND R.[NombreRol] = 'SuperUsuario'
AND E.[Activo] = (1)
);
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
IF ERROR_NUMBER() = 547
BEGIN
SET @ErrorMostrar = 'El usuario tiene información relacionada y no puede eliminarse.';
SET @ErrorTipo = 2;
SET @Return = 0;
RETURN;
END;
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_UsuarioLoginFailedUpdate]
@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
UPDATE [dbo].[Sis_Usuarios]
SET [IntentosFallidosInicioSesion] = [IntentosFallidosInicioSesion] + (1),
[BloqueadoHasta] = CASE
WHEN [IntentosFallidosInicioSesion] + (1) >= (5)
THEN DATEADD(MINUTE, (15), GETDATE())
ELSE [BloqueadoHasta]
END,
[FechaActualizacion] = GETDATE()
WHERE [CveUsuario] = @CveUsuario
;
IF @@ROWCOUNT = (0)
BEGIN
SET @ErrorMostrar = 'El usuario ya no está disponible.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al registrar el intento de acceso; 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_UsuarioLoginFailedUpdate'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioLoginSuccessUpdate]
@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
UPDATE [dbo].[Sis_Usuarios]
SET [FechaUltimoInicioSesion] = GETDATE(),
[FechaUltimaConexion] = GETDATE(),
[IntentosFallidosInicioSesion] = (0),
[BloqueadoHasta] = NULL,
[FechaActualizacion] = GETDATE()
WHERE [CveUsuario] = @CveUsuario
;
IF @@ROWCOUNT = (0)
BEGIN
SET @ErrorMostrar = 'El usuario ya no está disponible.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al actualizar el inicio de sesión; 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_UsuarioLoginSuccessUpdate'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
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)
)
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;
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_UsuarioSesionAdd]
@CveUsuario int,
@TokenSesion varchar(200),
@DireccionIP varchar(50) = NULL,
@AgenteUsuario varchar(1000) = NULL,
@NombreDominio varchar(255) = 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]
WHERE [CveUsuario] = @CveUsuario AND [Activo] = (1)
)
BEGIN
SET @ErrorMostrar = 'El usuario no está disponible para iniciar sesión.';
SET @ErrorTipo = 2;
RETURN;
END;
INSERT INTO [dbo].[Sis_UsuariosSesiones]
([CveUsuario], [TokenSesion], [DireccionIP], [AgenteUsuario],
[NombreDominio], [FechaUltimaActividad])
VALUES
(@CveUsuario, @TokenSesion, @DireccionIP, @AgenteUsuario,
@NombreDominio, GETDATE());
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al crear la sesión; 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_UsuarioSesionAdd'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioSesionEnd]
@TokenSesion varchar(200),
@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 [dbo].[Sis_UsuariosSesiones]
SET [FechaFin] = GETDATE(), [Activo] = (0)
WHERE [TokenSesion] = @TokenSesion
;
/* Cerrar una sesión inexistente o ya cerrada es una operación idempotente. */
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al cerrar la sesión; 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_UsuarioSesionEnd'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO