Sesion #14
Duración 4 horas 2:00pm - 6:00pm
Se crean dos funciones para calcular intereses tanto corrientes como moratorios, además se crea el SP para generar estados de cuenta con una fecha en concreto.
Adjunto scripts de lo realizado.
InteresesMoratorio
CREATE FUNCTION FN_CalcularInteresMoratorio
(
@tipo_tcm INT,
@saldo_pendiente DECIMAL(18,2)
)
RETURNS DECIMAL(18,2)
AS
BEGIN
DECLARE @interes_mora DECIMAL(5,2);
-- Determinar la tasa de interés moratoria según el tipo de cuenta
SET @interes_mora = CASE
WHEN @tipo_tcm = 1 THEN 5.0 -- Oro
WHEN @tipo_tcm = 2 THEN 5.0 -- Platino
WHEN @tipo_tcm = 3 THEN 6.0 -- Corporativo
ELSE 0
END;
-- Calcular el interés moratorio sobre el saldo pendiente
RETURN @saldo_pendiente * @interes_mora / 100;
END;
GO
InteresesCorriente
CREATE FUNCTION FN_CalcularInteresCorriente
(
@tipo_tcm INT,
@saldo_actual DECIMAL(18,2)
)
RETURNS DECIMAL(18,2)
AS
BEGIN
DECLARE @interes_mensual DECIMAL(5,2);
-- Determinar la tasa de interés según el tipo de cuenta
SET @interes_mensual = CASE
WHEN @tipo_tcm = 1 THEN 3.5 -- Oro
WHEN @tipo_tcm = 2 THEN 4.0 -- Platino
WHEN @tipo_tcm = 3 THEN 4.0 -- Corporativo
ELSE 0
END;
-- Calcular el interés sobre el saldo actual
RETURN @saldo_actual * @interes_mensual / 100;
END;
GO
SP Generar Estado de Cuenta
ALTER PROCEDURE [dbo].[SP_GenerarEstadoCuentaDiario]
@id_tcm INT,
@fecha_corte DATE,
@OutResultCode INT OUTPUT
AS
BEGIN
IF XACT_STATE() = 0
BEGIN
BEGIN TRANSACTION;
END
BEGIN TRY
-- Inicializar el código de salida
SET @OutResultCode = 0;
-- Variables para almacenar valores calculados
DECLARE @saldo_actual DECIMAL(18,2);
DECLARE @pago_minimo DECIMAL(18,2);
DECLARE @pago_contado DECIMAL(18,2);
DECLARE @intereses_corrientes DECIMAL(18,2) = 0;
DECLARE @intereses_moratorios DECIMAL(18,2) = 0;
-- Obtener saldo actual y tipo de cuenta de la Cuenta Maestra hasta la fecha de corte
DECLARE @tipo_tcm INT;
SELECT @saldo_actual = saldo_actual, @tipo_tcm = tipo_tcm
FROM CuentaTarjetaMaestra
WHERE id = @id_tcm;
-- Verificar si no se encontró saldo para la cuenta
IF @saldo_actual IS NULL
BEGIN
-- Insertar el error en la tabla DBErrors
INSERT INTO dbo.DBErrors
VALUES (
SYSTEM_USER,
50001, -- Código de error personalizado
1, -- Estado de error
16, -- Severidad
ERROR_LINE(),
'SP_GenerarEstadoCuentaDiario',
'Saldo no encontrado para la cuenta ' + CAST(@id_tcm AS VARCHAR(10)),
GETDATE()
);
-- Establecer código de error y terminar el procedimiento
SET @OutResultCode = 50001; -- Código de error personalizado
ROLLBACK TRANSACTION; -- Asegurarse de que la transacción se revierta en caso de error
RETURN;
END
-- Calcular el pago mínimo como un porcentaje del saldo actual (5%) solo si el saldo es positivo
SET @pago_minimo = CASE WHEN @saldo_actual > 0 THEN @saldo_actual * 0.05 ELSE 0 END;
-- El pago de contado es el saldo completo si es positivo
SET @pago_contado = CASE WHEN @saldo_actual > 0 THEN @saldo_actual ELSE 0 END;
-- Calcular los intereses solo si el saldo es positivo
IF @saldo_actual > 0
BEGIN
-- Calcular intereses corrientes
SET @intereses_corrientes = dbo.FN_CalcularInteresCorriente(@tipo_tcm, @saldo_actual);
-- Calcular intereses moratorios solo si el pago mínimo no fue cubierto
IF @saldo_actual > @pago_minimo
BEGIN
SET @intereses_moratorios = dbo.FN_CalcularInteresMoratorio(@tipo_tcm, @saldo_actual);
END
END
-- Insertar el estado de cuenta en la tabla EstadoCuenta
INSERT INTO EstadoCuenta (id_tcm, fecha_corte, saldo_actual, pago_minimo, pago_contado, intereses_corrientes, intereses_moratorios)
VALUES (@id_tcm, @fecha_corte, @saldo_actual, @pago_minimo, @pago_contado, @intereses_corrientes, @intereses_moratorios);
-- Realizar el COMMIT solo si todo ha ido bien
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- Si ocurre un error, hacer rollback de la transacción
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
-- Ajustar el tamaño del mensaje antes de insertarlo en DBErrors
DECLARE @ErrorMessage NVARCHAR(4000) = LEFT(ERROR_MESSAGE(), 4000);
INSERT INTO dbo.DBErrors
VALUES (
SYSTEM_USER,
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
@ErrorMessage,
GETDATE()
);
-- Código de error estándar
SET @OutResultCode = 50008;
END CATCH;
END;
GO
Comentarios
Publicar un comentario