/** * Rappresenta un conto corrente in una banca * * @author Antonio Terreno * @created 14 maggio 2002 */ public class ContoCorrente implements Comparabile { /** * Data corrente espressa in giorni */ public static Data data; /** * Capitale sociale iniziale della Banca */ public final static int capitaleSocialeBanca = 1000; /** * Array dei conti correnti della banca */ public static ContoCorrente[] arrayOfContoCorrente; //array di tutti i conti correnti static { data = new Data(); arrayOfContoCorrente = new ContoCorrente[100]; } /** * Costruttore per l'oggetto ContoCorrente con un dato nome, con saldo * iniziale pari a saldoIniziale, con numero assegnato automaticamente in base * a numerazioneConti aggiornando totaleSoldiBanca e inserendo il conto in * arrayOfContoCorrente * * @param saldoIniziale Saldo iniziale del conto * @param nome Nome del correntista */ public ContoCorrente(String nome, int saldoIniziale) { nomeCorrentista = nome; saldo = saldoIniziale; numeroConto = numerazioneConti; arrayOfContoCorrente[numerazioneConti] = this; numerazioneConti += 1; totaleSoldiBanca += saldoIniziale; interesseMaturato = 0; giornoUltimoInteresse = new Data(); giornoUltimoInteresse.setData(data.getData()); } /** * Costruttore per l'oggetto ContoCorrente con un dato nome, con saldo * iniziale pari a zero e con numero assegnato automaticamente in base a * numerazioneConti * * @param nome Nome del correntista */ public ContoCorrente(String nome) { this(nome, 0); } /** * Restituisce il totale dei soldi della banca * * @return Il valore di totaleSoldiBanca */ public static int getTotaleSoldiBanca() { return totaleSoldiBanca; } /** * Restituisce il numero di conti aperti * * @return Il valore di numerazioneConti */ public static int getNumerazioneConti() { return numerazioneConti; } /** * Restituisce l'indice dell'ultimo conto aperto * * @return L'indice dell'ultimo conto aperto */ public static int getIndiceUltimoConto() { return numerazioneConti - 1; } /** * Restituisce il numero del conto * * @return Il valore di numeroConto */ public int getNumeroConto() { return numeroConto; } /** * Restituisce il nome del correntista * * @return Il valore di nomeCorrentista */ public String getNomeCorrentista() { return nomeCorrentista; } /** * Restituisce il nome del titolare di un conto corrente sapendo il numero di cc * * @param numConto Numero del Conto Corrente * @return Il titolare del conto corrente * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static String getNomeCorrentista(int numConto) throws MovimentoErrato { if (numConto < numerazioneConti) { return arrayOfContoCorrente[numConto].getNomeCorrentista(); } else { throw new MovimentoErrato(numConto + " non e' un numero di conto valido"); } } /** * Restituisce il numero di un conto corrente a partire dal suo nomeCorrentista * * @param nome Proprietario del conto corrente * @return Il numero del conto corrente * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static int getNumContoCorrente(String nome) throws MovimentoErrato { int i = 0; while ((i < numerazioneConti) && (arrayOfContoCorrente[i].nomeCorrentista != nome)) { i++; } if (i < numerazioneConti) { return i; } else { throw new MovimentoErrato(nome + " non e' non presente"); } } /** * Restituisce il saldo di un conto corrente * * @return Il valore di saldo */ public int getSaldo() { return saldo; } /** * Restituisce il saldo di un conto corrente * * @param numConto Numero del conto * @return Il valore di saldo * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static int getSaldo(int numConto) throws MovimentoErrato { if (numConto < numerazioneConti) { return arrayOfContoCorrente[numConto].getSaldo(); } else { throw new MovimentoErrato(numConto + " non e' un numero di conto valido"); } } /** * Restituisce l'attributo saldo di un conto corrente sapendo il nome * * @param nome Nome del correntista * @return Il valore di saldo * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static int getSaldo(String nome) throws MovimentoErrato { int i = 0; while ((i < numerazioneConti) && (arrayOfContoCorrente[i].nomeCorrentista != nome)) { i++; } if (i < numerazioneConti) { return arrayOfContoCorrente[i].getSaldo(); } else { throw new MovimentoErrato(nome + " non e' non presente"); } } /** * Restituisce l'interesse maturato ma non ancora accreditato o addebitato * * @return Il valore di interesseMaturato */ public int getInteresseMaturato() { return interesseMaturato; } /** * Restituisce un conto corrente a partire dal suo numero * * @param numConto Numero del conto corrente * @return Il valore di contoCorrente */ public ContoCorrente getContoCorrente(int numConto) { return arrayOfContoCorrente[numConto]; } /** * Restituisce un conto corrente a partire dal suo nomeCorrentista * * @param nome Proprietario del conto corrente * @return Il valore di contoCorrente * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static ContoCorrente getContoCorrente(String nome) throws MovimentoErrato { int i = 0; while ((i < numerazioneConti) && (arrayOfContoCorrente[i].nomeCorrentista != nome)) { i++; } if (i < numerazioneConti) { return arrayOfContoCorrente[i]; } else { throw new MovimentoErrato(nome + " non e' non presente"); } } /** * Stampa a video del conto corrente * * @return Stampa a video del conto corrente */ public String toString() { return "\n____________________________________________________" + "\n Data : " + data.getData() + "\n Nome del correntista: " + this.getNomeCorrentista() + "\n Numero del conto : " + this.getNumeroConto() + "\n Interessi maturati : " + this.getInteresseMaturato() + "\n Saldo : " + this.getSaldo() + "\n____________________________________________________"; } /** * Stampa tutti i conti presenti nell'arrayOfContoCorrente */ public static void stampaTuttiIConti() { int i; for (i = 0; i < numerazioneConti; i++) { System.out.println(arrayOfContoCorrente[i]); } } /** * Controlla che valore sia positivo, aggiorna interessseMaturato in base al * saldo precedente ed effettua il deposito se valore e' negativo non effettua * nessuna operazione ma viene sollevata un eccezione di tipo MovimentoErrato * * @param valore Somma di denaro da depositare * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public void deposita(int valore) throws MovimentoErrato { if (valore < 0) { throw new MovimentoErrato("il valore immesso e' negativo"); } calcoloInteresseMaturato(); saldo += valore; totaleSoldiBanca += valore; } /** * Depostito sul conto con nomeCorrentista = nome * * @param valore Somma di denaro da depositare * @param nome Nome del correntista * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static void deposita(int valore, String nome) throws MovimentoErrato { int i = 0; while ((i < numerazioneConti) && (arrayOfContoCorrente[i].nomeCorrentista != nome)) { i++; } if (i < numerazioneConti) { arrayOfContoCorrente[i].deposita(valore); } else { throw new MovimentoErrato(nome + " non e' non presente"); } } /** * Depostito sul conto con nomeCorrentista = nome * * @param valore Somma di denaro da depositare * @param numConto Numero del Conto * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static void deposita(int valore, int numConto) throws MovimentoErrato { if (numConto < numerazioneConti) { arrayOfContoCorrente[numConto].deposita(valore); } else { throw new MovimentoErrato(numConto + " non e' un numero di conto valido"); } } /** * Come deposita ma per il prelievo. Inoltre effettua il controllo se il saldo * diventa negativo, che il passivo non superi il massimo scoperto ammesso e * inoltre che la banca abbia abbastanza soldi in modo che la banca se il * valore e' negativo viene sollevata un'eccezione di tipo MovimentoErrato * * @param valore Somma di denaro da prelevare * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public void preleva(int valore) throws MovimentoErrato { int saldoTemp = saldo - valore; if (valore < 0) { throw new MovimentoErrato("il valore immesso e' negativo"); } if (saldoTemp < 0) { if ((-saldoTemp) < maxScopertoStandard) { if (valore < totaleSoldiBanca) { saldo -= valore; totaleSoldiBanca -= valore; } else { throw new MovimentoErrato("i soldi della banca sono finiti"); } } else { throw new MovimentoErrato("scoperto standard superato"); } } else { saldo -= valore; totaleSoldiBanca -= valore; } } /** * Esegue un prelievo sul conto di nome * * @param valore Somma da prelevare * @param nome Correntista * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static void preleva(int valore, String nome) throws MovimentoErrato { int i = 0; while ((i < numerazioneConti) && (arrayOfContoCorrente[i].nomeCorrentista != nome)) { i++; } if (i < numerazioneConti) { arrayOfContoCorrente[i].preleva(valore); } else { throw new MovimentoErrato(nome + " non e' non presente"); } } /** * Prelievo sul conto con nomeCorrentista = nome * * @param valore Somma di denaro da prelevare * @param numConto Numero del Conto * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public static void preleva(int valore, int numConto) throws MovimentoErrato { if (numConto < numerazioneConti) { arrayOfContoCorrente[numConto].preleva(valore); } else { throw new MovimentoErrato(numConto + " non e' un numero di conto valido"); } } /** * Permette di trasferire una somma di denaro da un conto ad un altro della * stessa banca * * @param valore Somma di denaro da trasferire * @param altroContoCorrente Conto corrente destinatario del trasferimento * @exception MovimentoErrato Eccezione di tipo MovimentoErrato */ public void trasferisci(int valore, ContoCorrente altroContoCorrente) throws MovimentoErrato { this.preleva(valore); altroContoCorrente.deposita(valore); } /** * Calcola le competenze spettanti ad un conto corrente, interesse maturato * meno spese di tenuta conto * * @return Interessi maturati meno il forfait spese */ public int calcoloCompetenze() { return interesseMaturato - forfaitSpese; } /** * Addebita o accredita sul conto le competenze relative ad un periodo * calcolate con calcoloCompetenze */ public void calcoloSaldoFinale() { saldo += calcoloCompetenze(); interesseMaturato = 0; } /** * Calcola gli interessi maturati in data data */ private void calcoloInteresseMaturato() { if (saldo > 0) { interesseMaturato += (saldo * tassoStandard * data.diffData(giornoUltimoInteresse) / 36000); } else { interesseMaturato += (saldo * tassoPassivoStandard * data.diffData(giornoUltimoInteresse) / 36000); } giornoUltimoInteresse.setData(data.getData()); } /** * Calcola il saldo finale su tutti i conti della banca */ public static void saldoFinaleTotale() { int i; for (i = 0; i < numerazioneConti; i++) { arrayOfContoCorrente[i].calcoloSaldoFinale(); } } /** * Calcola gli interessi su tutti i conti della banca */ public static void interesseFinaleTotale() { int i; for (i = 0; i < numerazioneConti; i++) { arrayOfContoCorrente[i].calcoloInteresseMaturato(); } } /** * Chiude tutti i conti memorizzati nell'arrayOfContoCorrente */ public static void chiudiTuttiIConti() { int i; for (i = 0; i < numerazioneConti; i++) { arrayOfContoCorrente[i] = null; } numerazioneConti = 0; totaleSoldiBanca = capitaleSocialeBanca; } /** * Confronta oggetti di tipo ContoCorrente in base al loro saldo. Nota: non ho considerato * il caso in cui il puntatore fosse nullo poiche' applico un selection sort da 0 a num conti: * magari meno elegante che tuttavia non chiama il metodo compara sugli n-numConti "null" * * @param ob Oggetto * @return 1,-1,0 a seconda che un'oggetto sia <, > o = ad ob * @exception ClassCastException Eccezione di tipo ClassCast */ public int compara(Comparabile ob) throws ClassCastException { ContoCorrente altroContoCorrente = (ContoCorrente) ob; if (this.getSaldo() < altroContoCorrente.getSaldo()) { return -1; } if (this.getSaldo() > altroContoCorrente.getSaldo()) { return 1; } return 0; } private static int numerazioneConti; //ultimo numero di conto attribuito private static int maxScopertoStandard = 100; //massimo saldo negativo standard (euro) private static int forfaitSpese = 1; //costo forfettario delle spese applicate ad un conto corrente private static int totaleSoldiBanca = capitaleSocialeBanca; //totale dei soldi in banca private static float tassoStandard = 5; //tasso annuale percentuale di interesse private static float tassoPassivoStandard = 10; //tasso annuale percentuale di interesse passivo private static String nomeBanca = "Banca Sella"; //nome della banca private int saldo; //saldo del conto corrente private int numeroConto; //numero conto corrente private int interesseMaturato; private String nomeCorrentista; //nome del proprietario del conto private Data giornoUltimoInteresse; //giorno in cui e' stato attribuito ad un conto l'ultimo interesse }