Sesion #4
Duración 3 horas 10:00am - 1:00pm
Cabe aclarar que a todos los SPs se les esta agregando un manejo de Errores en la tabla de DBErrors.
Se realizaron 3 Stored Proccedures:
Inactivar TF
CREATE PROCEDURE [dbo].[SP_InactivarTarjetaFisica]
@id_tf INT, -- ID de la tarjeta física
@motivo_invalidacion INT, -- Motivo de invalidación (e.g., robo, pérdida)
@OutResulTCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
SET @OutResulTCode = 0;
-- Validación: Verificar que la tarjeta física exista y esté activa
IF NOT EXISTS (SELECT 1 FROM dbo.TarjetaFisica WHERE id = @id_tf AND estado = 'Activa')
BEGIN
SET @OutResulTCode = 50017; -- Código de error para tarjeta inexistente o ya inactiva
RETURN;
END
-- Validación: Verificar que el motivo de invalidación exista
IF NOT EXISTS (SELECT 1 FROM dbo.MotivoInvalidacionTarjeta WHERE id = @motivo_invalidacion)
BEGIN
SET @OutResulTCode = 50018; -- Código de error para motivo de invalidación no encontrado
RETURN;
END
-- Comienza la transacción
BEGIN TRANSACTION;
-- Actualizar el estado de la tarjeta a "Inactiva"
UPDATE dbo.TarjetaFisica
SET estado = 'Inactiva'
WHERE id = @id_tf;
-- Registrar el motivo de la inactivación (opcional si se tiene una tabla para esto)
-- INSERT INTO dbo.TarjetaInactivada (id_tf, motivo_invalidacion, fecha)
-- VALUES (@id_tf, @motivo_invalidacion, GETDATE());
-- Confirmar la transacción
COMMIT TRANSACTION;
-- Código de salida en caso de éxito
SET @OutResulTCode = 0;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END
INSERT INTO dbo.DBErrors VALUES (
SUSER_SNAME(),
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE()
);
SET @OutResulTCode = 50008;
END CATCH;
SET NOCOUNT OFF;
END;
GO
Actualizar limite credito:
CREATE PROCEDURE [dbo].[SP_ActualizarLimiteCredito]
@id_tcm INT,
@nuevo_limite DECIMAL(18,2),
@OutResulTCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
SET @OutResulTCode = 0;
-- Validación: Verificar que la cuenta maestra exista
IF NOT EXISTS (SELECT 1 FROM CuentaTarjetaMaestra WHERE id = @id_tcm)
BEGIN
SET @OutResulTCode = 50013; -- Código de error para cuenta no encontrada
RETURN;
END
-- Comienza la transacción
BEGIN TRANSACTION;
-- Actualización del límite de crédito
UPDATE CuentaTarjetaMaestra
SET limite_credito = @nuevo_limite
WHERE id = @id_tcm;
-- Confirmar la transacción
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- Manejo de errores
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END
INSERT INTO DBErrors VALUES (
SUSER_SNAME(),
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE());
SET @OutResulTCode = 50008;
END CATCH;
END;
GO
Asignar Nueva TF:
CREATE PROCEDURE [dbo].[SP_AsignarNuevaTarjetaFisica]
@id_cuenta INT, -- ID de la cuenta (puede ser TCA o TCM)
@tipo_cuenta CHAR(3), -- 'TCM' o 'TCA'
@numero_tarjeta VARCHAR(16),
@cvv VARCHAR(4),
@fecha_vencimiento DATE,
@OutResulTCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @id_tcm INT = NULL;
DECLARE @id_tca INT = NULL;
BEGIN TRY
SET @OutResulTCode = 0;
-- Validación: Determinar el tipo de cuenta (TCM o TCA)
IF @tipo_cuenta = 'TCM'
SET @id_tcm = @id_cuenta;
ELSE IF @tipo_cuenta = 'TCA'
SET @id_tca = @id_cuenta;
ELSE
BEGIN
SET @OutResulTCode = 50021; -- Error: Tipo de cuenta inválido
RETURN;
END
-- Comienza la transacción
BEGIN TRANSACTION;
-- Inactivar la tarjeta física anterior de la cuenta
UPDATE dbo.TarjetaFisica
SET estado = 'Inactiva'
WHERE (id_tcm = @id_tcm OR id_tca = @id_tca) AND estado = 'Activa';
-- Asignar nueva tarjeta física
INSERT INTO dbo.TarjetaFisica (
numero_tarjeta,
cvv,
fecha_vencimiento,
id_tcm,
id_tca,
estado
) VALUES (
@numero_tarjeta,
@cvv,
@fecha_vencimiento,
@id_tcm,
@id_tca,
'Activa'
);
-- Confirmar la transacción
COMMIT TRANSACTION;
SET @OutResulTCode = 0;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END
INSERT INTO dbo.DBErrors VALUES (
SUSER_SNAME(),
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE()
);
SET @OutResulTCode = 50008;
END CATCH;
SET NOCOUNT OFF;
END;
GO
Comentarios
Publicar un comentario