Reto 5
Reto 5
Reto 5
import java.util.ArrayList;
/**
* Valor inicial del CDT.
*/
private double valorInvertido;
/**
* Interés mensual que del CDT
*/
private double interesMensual;
/**
* Mes de apertura del CDT.
*/
private int mesApertura;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa el CDT. <br>
* <b>post: </b> El valor invertido, el interés mensual y la fecha se
inicializaron en 0.
*/
public CDT( )
{
valorInvertido = 0;
interesMensual = 0;
mesApertura = 0;
}
/**
* Retorna el interés que paga el banco mensualmente por este CDT.
* @return Interés mensual del CDT.
*/
public double darInteresMensual( )
{
return interesMensual;
}
/**
* Inicia una inversión en un CDT .<br>
* <b>post: </b> Se cambian los valores del CDT, con los valores recibidos.
<br>
* @param pMontoInvertido Monto de dinero que se va a invertir en el CDT.
pMontoInvertido > 0.
* @param pInteresMensual Interés mensual que va a ganar el CDT.
pInteresMensual > 0.
* @param pMes Mes de apertura del CDT. pMes > 0.
* @throws Exception
*/
public void invertir( double pMontoInvertido, double pInteresMensual, int
pMes ) throws Exception
{
if(valorInvertido==0 && interesMensual==0 && mesApertura==0) {
valorInvertido = pMontoInvertido;
interesMensual = pInteresMensual;
mesApertura = pMes;
verificarInvariante();
}else {
throw new Exception("ERROR: SOLO SE PUEDE TENER UN CDT ACTIVO A LA
VEZ");
}
/**
* Calcula el valor presente de la inversión teniendo en cuenta el interés de
la cuenta. <br>
* @param pMesActual Mes actual del simulador. pMesActual > 0.
* @return Valor presente del dinero invertido en CDT.
*/
public double calcularValorPresente( int pMesActual )
{
int mesesTranscurridos = pMesActual - mesApertura;
return ( double ) ( valorInvertido + ( mesesTranscurridos * interesMensual
* valorInvertido ) );
}
/**
* Cierra el CDT y retorna el valor invertido más los intereses. <br>
* <b>post: </b> Se retornó el rendimiento del CDT, y se reinició sus atributos
a 0.
* @param pMesActual Mes de cierre para calcular el rendimiento del CDT.
* @return Valor de cierre del CDT.
*/
public double cerrar( int pMesActual )
{
double valorCierre = calcularValorPresente( pMesActual );
valorInvertido = 0;
interesMensual = 0;
mesApertura = 0;
return valorCierre;
}
/**
* Saldo actual de la cuenta de ahorro.
*/
private double saldo;
/**
* Interés mensual que paga la cuenta de ahorro.
*/
private double interesMensual;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa la cuenta de ahorro con el interés mensual que paga el banco.
<br>
* <b>post: </b> Se inicializó el saldo en 0 y el interés mensual en 0.006.
*/
public CuentaAhorros( )
{
saldo = 0;
interesMensual = 0.006;
//TODO: 3 Inicializar el interes generado en 0
interesGenerado = 0;
}
/**
* Retorna el saldo del cliente. <br>
* @return Saldo de la cuenta de ahorros.
*/
public double darSaldo( )
{
return saldo;
}
/**
* Retorna el interés mensual. <br>
* @return Interés mensual de la cuenta de ahorros.
*/
public double darInteresMensual( )
{
return interesMensual;
}
/**
* Consigna un monto de dinero en la cuenta del cliente. <br>
* <b>post: </b> El saldo se incrementó en el monto de dinero ingresado. <br>
* @param pMonto Monto de dinero a consignar en la cuenta. pMonto > 0.
*/
public void consignarMonto( double pMonto )
{
saldo = saldo + pMonto;
verificarInvariante();
}
/**
* Retira un monto de dinero de la cuenta de ahorros. <br>
* <b>post: </b> El saldo se redujo en el valor dado.
* @param pMonto Monto de dinero a retirar de la cuenta de ahorros. pMonto > 0.
*/
public void retirarMonto( double pMonto )
{
saldo = saldo - pMonto;
verificarInvariante();
}
/**
* Actualiza el saldo de la cuneta de ahorros sumándole los intereses (ha
pasado un mes). <br>
* <b>post: </b> El saldo actual se actualizó aplicando el porcentaje de
interés mensual respectivo.
*/
public void actualizarSaldoPorPasoMes( )
{
//TODO: 5 Calcular el ingreso mensual por interes y acumularlo (ahorros)
double ingreso = ( saldo * interesMensual );
saldo += ingreso;
interesGenerado += ingreso;
verificarInvariante();
}
}
}
/**
* Saldo actual de la cuenta corriente.
*/
private double saldo;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa la cuenta corriente. <br>
* <b>post: </b> Se inicializó el saldo en 0.
*/
public CuentaCorriente( )
{
saldo = 0;
}
/**
* Retorna el saldo de la cuenta del cliente. <br>
* @return Saldo de la cuenta corriente.
*/
public double darSaldo( )
{
return saldo;
}
/**
* Consigna un monto de dinero en la cuenta del cliente. <br>
* <b>post: </b> El saldo se incrementó en el monto de dinero dado. <br>
* @param pMonto Monto de dinero a consignar en la cuenta. pMonto > 0.
*/
public void consignarMonto( double pMonto )
{
saldo = saldo + pMonto;
verificarInvariante();
}
/**
* Retira un monto de dinero de la cuenta del cliente. <br>
* <b>post: </b> El saldo se redujo en el monto de dinero dado.
* @param pMonto Monto de dinero a retirar en la cuenta. pMonto > 0.
*/
public void retirarMonto( double pMonto )
{
saldo = saldo - pMonto;
verificarInvariante();
}
}
}
@SuppressWarnings("unchecked")
public class SimuladorBancario
{
public static final double INVERSION_MAXIMO = 100000000;
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Cédula del cliente.
*/
private String cedula;
/**
* Nombre del cliente.
*/
private String nombre;
/**
* Mes actual.
*/
private int mesActual;
/**
* Cuenta corriente del cliente.
*/
private CuentaCorriente corriente;
/**
* Cuenta de ahorros del cliente.
*/
private CuentaAhorros ahorros;
/**
* CDT del cliente.
*/
private CDT inversion;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa el simulador con la información del cliente. <br>
* <b>post: </b> El mes fue inicializado en 1, y las tres cuentas (CDT,
corriente y de ahorros) fueron inicializadas como vacías. <br>
* @param pCedula Cédula del nuevo cliente. pCedula != null && pCedula != "".
* @param pNombre Nombre del nuevo cliente. pNombre != null && pNombre != "".
*/
public SimuladorBancario( String pCedula, String pNombre )
{
// Inicializa los atributos personales del cliente
nombre = pNombre;
cedula = pCedula;
// Inicializa el mes en el 1
mesActual = 1;
// Inicializa las tres cuentas en vacío
corriente = new CuentaCorriente( );
ahorros = new CuentaAhorros( );
inversion = new CDT( );
consecutivo = 0;
transacciones = new ArrayList<Transaccion>( );
}
/**
* Retorna el nombre del cliente.
* @return Nombre del cliente.
*/
public String darNombre( )
{
return nombre;
}
/**
* Retorna la cédula del cliente.
* @return Cédula del cliente.
*/
public String darCedula( )
{
return cedula;
}
/**
* Retorna la cuenta corriente del cliente.
* @return Cuenta corriente del cliente.
*/
public CuentaCorriente darCuentaCorriente( )
{
return corriente;
}
/**
* Retorna el CDT del cliente.
* @return CDT del cliente.
*/
public CDT darCDT( )
{
return inversion;
}
/**
* Retorna la cuenta de ahorros del cliente.
* @return Cuenta de ahorros del cliente.
*/
public CuentaAhorros darCuentaAhorros( )
{
return ahorros;
}
/**
* Retorna el mes en el que se encuentra la simulación.
* @return Mes actual.
*/
public int darMesActual( )
{
return mesActual;
}
/**
* Calcula el saldo total de las cuentas del cliente.
* @return Saldo total de las cuentas del cliente.
*/
public double calcularSaldoTotal( )
{
return corriente.darSaldo( ) + ahorros.darSaldo( ) +
inversion.calcularValorPresente( mesActual );
}
/**
* Invierte un monto de dinero en un CDT. <br>
* <b>post: </b> Invirtió un monto de dinero en un CDT.
* @param pMonto Monto de dinero a invertir en un CDT. pMonto > 0.
* @param pInteresMensual Interés del CDT elegido por el cliente.
*/
public void invertirCDT( double pMonto, String pInteresMensual ) throws
Exception
{
double pInteres = Double.parseDouble(pInteresMensual) / 100.0;
inversion.invertir( pMonto, pInteres, mesActual );
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.CDT,
Transaccion.TipoTransaccion.ENTRADA, consecutivo, pMonto );
transacciones.add( nueva );
}
/**
* Consigna un monto de dinero en la cuenta corriente. <br>
* <b>post: </b> Consignó un monto de dinero en la cuenta corriente.
* @param pMonto Monto de dinero a consignar en la cuenta. pMonto > 0.
*/
public void consignarCuentaCorriente( double pMonto )
{
corriente.consignarMonto( pMonto );
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.CORRIENTE,
Transaccion.TipoTransaccion.ENTRADA, consecutivo, pMonto );
transacciones.add( nueva );
}
/**
* Consigna un monto de dinero en la cuenta de ahorros. <br>
* * <b>post: </b> Consignó un monto de dinero en la cuenta de ahorros.
* @param pMonto Monto de dinero a consignar en la cuenta. pMonto > 0.
*/
public void consignarCuentaAhorros( double pMonto )
{
ahorros.consignarMonto( pMonto );
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.AHORROS,
Transaccion.TipoTransaccion.ENTRADA, consecutivo, pMonto );
transacciones.add( nueva );
}
/**
* Retira un monto de dinero de la cuenta corriente. <br>
* <b>pre: </b> La cuenta corriente ha sido inicializada
* <b>post: </b> Si hay saldo suficiente, entonces este se redujo en el monto
especificado.
* @param pMonto Monto de dinero a retirar de la cuenta. pMonto > 0.
*/
public void retirarCuentaCorriente( double pMonto )
{
corriente.retirarMonto( pMonto );
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.CORRIENTE,
Transaccion.TipoTransaccion.SALIDA, consecutivo, pMonto );
transacciones.add( nueva );
}
/**
* Retira un monto de dinero de la cuenta de ahorros. <br>
* <b>post: </b> Se redujo el saldo de la cuenta en el monto especificado.
* @param pMonto Monto de dinero a retirar de la cuenta. pMonto > 0.
*/
public void retirarCuentaAhorros( double pMonto )
{
ahorros.retirarMonto( pMonto );
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.AHORROS,
Transaccion.TipoTransaccion.SALIDA, consecutivo, pMonto );
transacciones.add( nueva );
}
/**
* Avanza en un mes la simulación. <br>
* <b>post: </b> Se avanzó el mes de la simulación en 1. Se actualizó el saldo
de la cuenta de ahorros.
*/
public void avanzarMesSimulacion( )
{
mesActual += 1;
ahorros.actualizarSaldoPorPasoMes( );
if(ahorros.darSaldo()>0) {
consecutivo++;
Transaccion nueva = new Transaccion( Transaccion.TipoCuenta.AHORROS,
Transaccion.TipoTransaccion.ENTRADA, consecutivo,
ahorros.darIngresoMensualahorros() );
transacciones.add( nueva );
}
if(inversion.darValorInvertido()>0) {
consecutivo++;
Transaccion nueva2 = new Transaccion( Transaccion.TipoCuenta.CDT,
Transaccion.TipoTransaccion.ENTRADA, consecutivo,
inversion.darIngresoMensualCDT() );
transacciones.add( nueva2 );
}
/**
* Cierra el CDT, pasando el saldo a la cuenta corriente. <br>
* <b>pre: </b> La cuenta corriente y el CDT han sido inicializados. <br>
* <b>post: </b> El CDT quedó cerrado y con valores en 0, y la cuenta corriente
aumentó su saldo en el valor del cierre del CDT.
*/
public void cerrarCDT( )
{
//TODO: 8 agregar el interes generado por el cdt al total de la simulacion
interesGenerado += inversion.darInteresGenerado(mesActual);
double valorCierreCDT = inversion.cerrar( mesActual );
corriente.consignarMonto( valorCierreCDT );
consecutivo++;
Transaccion nueva1 = new Transaccion( Transaccion.TipoCuenta.CDT,
Transaccion.TipoTransaccion.SALIDA, consecutivo, valorCierreCDT );
transacciones.add( nueva1 );
consecutivo++;
Transaccion nueva2 = new Transaccion( Transaccion.TipoCuenta.CORRIENTE,
Transaccion.TipoTransaccion.ENTRADA, consecutivo, valorCierreCDT );
transacciones.add( nueva2 );
}
/**
* Retrira el saldo total la cuenta de ahorros, pasandolo a la cuenta
corriente. <br>
* <b>pre: </b> La cuenta corriente y el la cuenta de ahorros han sido
inicializados. <br>
* <b>post: </b> La cuenta de ahorros queda vacia ( con valores en 0 ), y la
cuenta corriente aumentó su saldo en el valor del saldo total que tenia la cuenta
de ahorros.
*/
public void pasarAhorrosToCorriente()
{
double cantidad = ahorros.darSaldo();
ahorros = new CuentaAhorros();
corriente.consignarMonto(cantidad);
verificarInvariante();
consecutivo++;
Transaccion nueva1 = new Transaccion( Transaccion.TipoCuenta.AHORROS,
Transaccion.TipoTransaccion.SALIDA, consecutivo, cantidad );
transacciones.add( nueva1 );
consecutivo++;
Transaccion nueva2 = new Transaccion( Transaccion.TipoCuenta.CORRIENTE,
Transaccion.TipoTransaccion.ENTRADA, consecutivo, cantidad );
transacciones.add( nueva2 );
/**
* Avanza la simulción un numero de meses dado por parámetro.
* @param pMeses numero de meses a avanzar
* <b>post: </b> Se avanzaron los meses de la simulación. Se actualizaron los
saldos.
*/
public void metodo1( int pMeses )
{
mesActual += pMeses;
ahorros.actualizarSaldoMeses(pMeses);
verificarInvariante();
for(int x = 0; x<pMeses;x++) {
if(ahorros.darSaldo()>0) {
consecutivo++;
Transaccion nueva1 = new
Transaccion( Transaccion.TipoCuenta.AHORROS, Transaccion.TipoTransaccion.ENTRADA,
consecutivo, ahorros.darIngresoMesesahorros(pMeses) );
transacciones.add( nueva1 );
}
if(inversion.darValorInvertido()>0) {
consecutivo++;
Transaccion nueva2 = new Transaccion( Transaccion.TipoCuenta.CDT,
Transaccion.TipoTransaccion.ENTRADA, consecutivo,
inversion.darIngresosMesescdt(pMeses) );
transacciones.add( nueva2 );
}
/**
* Reinicia la simulación.
* @return interes total generado por la simulación.
*/
public double metodo2( )
{
cerrarCDT();
corriente.cerrarCuenta();
double respuesta = interesGenerado + ahorros.darInteresGenerado();
ahorros.cerrarCuenta();
interesGenerado = 0;
mesActual = 1;
consecutivo = 0;
transacciones = new ArrayList<Transaccion>( );
return respuesta;
}
double maximo = 0;
int retornar = 0;
}
}
return retornar;
}
}
CDT
}