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