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

Entradas más populares de este blog

Sesion #14