sábado, 2 de noviembre de 2019

Corrección de los intereses desde la segunda tarea programada

Se recordó que desde la 2da tarea programada había que corregir un error en el cálculo de los intereses y también que se necesitaba agregar los movimientos de multa por incumplimiento del saldo mínimo y multa por exceso de retiros en cajero humano a la tabla de movimientos.

El código resultante fue el siguiente:

Modificación el cálculo de los intereses.

Viejo:

DECLARE @MontoIntereses int
SELECT @MontoIntereses = TCA.Tasa_Interes * @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar/@Cargos_Servicio_Cuenta_Cerrar

Nuevo:

@MontoIntereses = (TCA.Tasa_Interes_Mensual * 0.01 * @saldoMinimoEC_Cerrar)/12

Se tomaron todas las declaraciones de variables y se colocaron al inicio de la simulación (fuera del while) para evitar una "redeclaración" de la variables


Ejemplo de código viejo

-- Se selecciona el id de la cuenta que debe ser procesada
DECLARE @idCuentaCerrarEC int
SELECT @idCuentaCerrarEC = C.idCuenta
FROM @CuentasCerrarEC C
WHERE C.sec = @lo 

-- Se obtiene el id del ultimo estado de cuenta de la cuenta que esta siendo procesada
DECLARE @idUltimoEC_CuentaCerrar int
SELECT @idUltimoEC_CuentaCerrar = max(EC.id)
FROM EstadoCuenta EC
WHERE EC.idCuenta = @idCuentaCerrarEC and EC.Fecha_Final = @fechaIteracion

-- Se obtiene el saldo minimo mantenido durante la vigencia del ultimo estado de cuenta
DECLARE @saldoMinimoEC_Cerrar money
SELECT @saldoMinimoEC_Cerrar = EC.Saldo_Minimo
FROM EstadoCuenta EC
WHERE EC.id = @idCuentaCerrarEC

-- Se obtiene la cantidad de retiros en cajero humano hechos durante la vigencia del ultimo estado de cuenta
DECLARE @QRCH_EC_Cerrar int
SELECT @QRCH_EC_Cerrar = EC.QRCH
FROM EstadoCuenta EC
WHERE EC.id = @idCuentaCerrarEC

-- Se obtiene el id del tipo de cuenta de la cuenta en iteracion
DECLARE @idTCA_Cuenta_Cerrar int
SELECT @idTCA_Cuenta_Cerrar = CA.idTipoCuentaAhorro
FROM Cuenta_Ahorro CA
WHERE CA.id = @idCuentaCerrarEC

-- Se obtiene el maximo de retiros en cajero humano para el tipo de cuenta de la cuenta en iteracion
DECLARE @MaxRCH_Cuenta_Cerrar int
SELECT @MaxRCH_Cuenta_Cerrar = TCA.Maximo_Retiros_Cajero_Humano
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se obtiene el saldo minimo para el tipo de cuenta de la cuenta en iteracion
DECLARE @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar money
SELECT @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar = TCA.Saldo_Minimo
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se obtiene la multa por exceder el maximo de retiros en cajero humano, segun el tipo de cuenta de la cuenta en iteracion
DECLARE @Multa_MaxRCH_Cuenta_Cerrar money
SELECT @Multa_MaxRCH_Cuenta_Cerrar = TCA.Multa_Exceso_Retiro_Cajero
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se obtiene la multa por incumplir el saldo minimo, segun el tipo de cuenta de la cuenta en iteracion
DECLARE @Multa_Saldo_Minimo_Cuenta_Cerrar money
SELECT @Multa_Saldo_Minimo_Cuenta_Cerrar = TCA.Multa_Saldo_Minimo
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se obtiene los cargos de servicio segun el tipo de cuenta de la cuenta en iteracion
DECLARE @Cargos_Servicio_Cuenta_Cerrar money
SELECT @Cargos_Servicio_Cuenta_Cerrar = TCA.Monto_Mensual_Cargos_Servicio
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se calculan intereses
DECLARE @MontoIntereses int
SELECT @MontoIntereses = TCA.Tasa_Interes * @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar/@Cargos_Servicio_Cuenta_Cerrar
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

-- Se obtiene el saldo actual de la cuenta en iteracion
DECLARE @SaldoActual_CuentaCerrar money
SELECT @SaldoActual_CuentaCerrar = CA.Saldo
FROM Cuenta_Ahorro CA
WHERE CA.id = @idCuentaCerrarEC

Ejemplo de código nuevo


-- Se selecciona el id de la cuenta que debe ser procesada
SELECT @idCuentaCerrarEC = C.idCuenta
FROM @CuentasCerrarEC C
WHERE C.sec = @lo 

-- Se obtiene el id del ultimo estado de cuenta de la cuenta que esta siendo procesada
SELECT @idUltimoEC_CuentaCerrar = max(EC.id)
FROM EstadoCuenta EC
WHERE EC.idCuenta = @idCuentaCerrarEC and EC.Fecha_Final = @fechaIteracion

-- Se obtiene el saldo minimo mantenido durante la vigencia del ultimo estado de cuenta
-- Se obtiene la cantidad de retiros en cajero humano hechos durante la vigencia del ultimo estado de cuenta
SELECT @saldoMinimoEC_Cerrar = EC.Saldo_Minimo, 
  @QRCH_EC_Cerrar = EC.QRCH
FROM EstadoCuenta EC
WHERE EC.idCuenta = @idCuentaCerrarEC and EC.Fecha_Final = @fechaIteracion

-- Se obtiene el id del tipo de cuenta de la cuenta en iteracion
-- Se obtiene el saldo actual de la cuenta en iteracion
SELECT @idTCA_Cuenta_Cerrar = CA.idTipoCuentaAhorro,
  @SaldoActual_CuentaCerrar = CA.Saldo
FROM Cuenta_Ahorro CA
WHERE CA.id = @idCuentaCerrarEC

-- Se obtiene el maximo de retiros en cajero humano para el tipo de cuenta de la cuenta en iteracion
-- Se obtiene el saldo minimo para el tipo de cuenta de la cuenta en iteracion
-- Se obtiene la multa por exceder el maximo de retiros en cajero humano, segun el tipo de cuenta de la cuenta en iteracion
-- Se obtiene la multa por incumplir el saldo minimo, segun el tipo de cuenta de la cuenta en iteracion
-- Se obtiene los cargos de servicio segun el tipo de cuenta de la cuenta en iteracion
-- Se calculan los intereses
SELECT @MaxRCH_Cuenta_Cerrar = TCA.Maximo_Retiros_Cajero_Humano, 
  @Multa_MaxRCH_Cuenta_Cerrar = TCA.Multa_Exceso_Retiros_Cajero,
  @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar = TCA.Saldo_Minimo,
  @Multa_Saldo_Minimo_Cuenta_Cerrar = TCA.Multa_Saldo_Minimo,
  @Cargos_Servicio_Cuenta_Cerrar = TCA.Monto_Mensual_Cargos_Servicio,
  @MontoIntereses = (TCA.Tasa_Interes_Mensual * 0.01 * @saldoMinimoEC_Cerrar)/12
FROM TipoCuentaAhorro TCA
WHERE TCA.id = @idTCA_Cuenta_Cerrar

Inserción de los movimientos por multa e intereses

Multa por saldo mínimo


-- Si se incumplio con el saldo minimo se aplica la multa correspondiente
IF (@saldoMinimoEC_Cerrar < @SaldoMinimo_Segun_Tipo_Cuenta_Cerrar)
BEGIN
SET @SaldoActual_CuentaCerrar = @SaldoActual_CuentaCerrar - @Multa_Saldo_Minimo_Cuenta_Cerrar

-- Si el saldo despues de aplicar los intereses y multas queda negativo, se deja en cero
IF (@SaldoActual_CuentaCerrar < 0)
BEGIN 
SET @SaldoActual_CuentaCerrar = 0
END
-- Se inserta el movimiento de multa a la tabla de movimientos
INSERT dbo.Movimiento
SELECT @idCuentaCerrarEC, TM.id, 'multSaldMin',
  @fechaIteracion, @Multa_Saldo_Minimo_Cuenta_Cerrar, 
  @SaldoActual_CuentaCerrar, 'Aplicacion de multa por incumplir el saldo minimo'
FROM TipoMovimiento TM 
WHERE TM.Nombre = 'multSaldMin'
END

Multa por saldo exceso de retiros en cajero humano


-- Si se excedio el maximo de retiros en cajero humano se aplica la multa correspondiente
IF (@QRCH_EC_Cerrar > @MaxRCH_Cuenta_Cerrar)
BEGIN
SET @SaldoActual_CuentaCerrar = @SaldoActual_CuentaCerrar - @Multa_MaxRCH_Cuenta_Cerrar

-- Se inserta el movimiento de multa a la tabla de movimientos
INSERT dbo.Movimiento
SELECT @idCuentaCerrarEC, TM.id, 'multExcCH',
  @fechaIteracion, @Multa_MaxRCH_Cuenta_Cerrar, 
  @SaldoActual_CuentaCerrar, 'Aplicacion de multa por exceder el maximo de retiros permitidos en cajero humano'
FROM TipoMovimiento TM 
WHERE TM.Nombre = 'multExcCH'
END

Horas trabajadas: 1.5 h

No hay comentarios:

Publicar un comentario