diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Bank.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Bank.java index 8e3836a..05a4e9b 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Bank.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Bank.java @@ -19,14 +19,12 @@ public class Bank implements Serializable { if (auswahl == 1) k = new Konto(name, ++kontozähler); - else if (auswahl == 2) - k = new Girokonto(name, ++kontozähler); else - k = null; + k = new Girokonto(name, ++kontozähler); - konten.put(k.getKontonummer(), k); + konten.put(k.getNummer(), k); - return k.getKontonummer(); + return k.getNummer(); } public String getName() { diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Geldanlage.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Geldanlage.java new file mode 100644 index 0000000..dc40e1e --- /dev/null +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Geldanlage.java @@ -0,0 +1,28 @@ +package de.hs_mannheim.informatik.bank.domain; + +import java.io.Serializable; + +public abstract class Geldanlage implements Serializable{ + private String inhaber; + private int nummer; + + public Geldanlage(String inhaber, int zähler) { + this.inhaber = inhaber; + nummer = 1000 + zähler; + + } + + public int getNummer() { + return nummer; + } + + public String getInhaber() { + return inhaber; + } + + + public String toString() { + return " [nummer=" + nummer + ", inhaber=" + inhaber; + } + +} diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Girokonto.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Girokonto.java index f1061b8..a9665e9 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Girokonto.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Girokonto.java @@ -8,21 +8,21 @@ public class Girokonto extends Konto implements Serializable { public Girokonto(String inhaber, int kontozähler) { super(inhaber, kontozähler); } - + public boolean überweise(Girokonto ziel, long betrag, String zweck) { - if (super.getKontostand() - betrag >= -dispo) { + if (super.getKontostand() - betrag >= dispo * (-1)) { this.auszahlen(betrag, zweck, "Überweisungsausgang", super.getInhaber()); ziel.einzahlen(betrag, zweck, "Überweisungseingang", super.getInhaber()); - + return true; } - + return false; } - + @Override public boolean auszahlen(long betrag, String zweck, String art, String auftraggeber) { - if (stand - betrag >= -dispo) { + if (stand - betrag >= dispo * (-1)) { stand -= betrag; kontobewegungen.add(new Kontobewegung(betrag * -1, zweck, art, auftraggeber)); @@ -30,9 +30,9 @@ public class Girokonto extends Konto implements Serializable { } return false; - + } - + @Override public String toString() { return "Giro-" + super.toString(); diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java index e05159b..cb41b4d 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java @@ -3,36 +3,27 @@ package de.hs_mannheim.informatik.bank.domain; import java.io.Serializable; import java.util.ArrayList; -public class Konto implements Serializable { - private int nummer; +public class Konto extends Geldanlage implements Serializable { protected long stand = 0; - private String inhaber; - protected ArrayList kontobewegungen; - public Konto(String inhaber, int kontozähler) { - nummer = 1000 + kontozähler; - this.inhaber = inhaber; - + public Konto(String inhaber, int zähler) { + super(inhaber, zähler); this.kontobewegungen = new ArrayList<>(); } - public int getKontonummer() { - return nummer; - } - @Override public String toString() { - return "Konto [nummer=" + nummer + ", inhaber=" + inhaber + ", stand=" + stand + "]"; - } - - public String getInhaber() { - return inhaber; + return "Konto" + super.toString() + ", stand=" + stand + "]"; } public long getKontostand() { return stand; } + + public int getNummer() { + return super.getNummer(); + } public void einzahlen(long betrag, String zweck, String art, String auftraggeber) { stand += betrag; @@ -73,5 +64,12 @@ public class Konto implements Serializable { return saldo; } - + + public void rollback() { + Kontobewegung kbw = kontobewegungen.get(kontobewegungen.size()-1); + stand += kbw.getBetrag() *-1; + kontobewegungen.remove(kontobewegungen.size()-1); + } + + } diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/KontoTest.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/KontoTest.java index 09ee102..c1f9404 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/KontoTest.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/KontoTest.java @@ -11,7 +11,7 @@ class KontoTest { void testKontoBasics() { Konto k = new Konto("Müller", 0); assertEquals("Müller", k.getInhaber()); - assertEquals(1000, k.getKontonummer()); + assertEquals(1000, k.getNummer()); assertEquals(0, k.getKontostand()); } @@ -21,7 +21,7 @@ class KontoTest { Konto k2 = new Konto("Mayer", 1); assertEquals("Mayer", k2.getInhaber()); - assertNotEquals(k.getKontonummer(), k2.getKontonummer()); + assertNotEquals(k.getNummer(), k2.getNummer()); k2.einzahlen(100, "Test", "Einzahlung", "JUnit"); assertEquals(100, k2.getKontostand()); @@ -47,6 +47,17 @@ class KontoTest { } + @Test + void testÜberweisung() { + Girokonto gk = new Girokonto("Müller", 0); + Girokonto zk = new Girokonto("Walter", 0); + assertTrue(gk.überweise(zk, 300, null)); + assertEquals(-300, gk.getKontostand()); + assertEquals(300, zk.getKontostand()); + assertFalse(gk.überweise(zk, 99999, null)); + + } + @Test void testSaldo() { Konto k = new Konto("Müller", 0); diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java index e37627b..2831444 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java @@ -1,5 +1,6 @@ package de.hs_mannheim.informatik.bank.facade; +import java.io.IOException; import java.util.Collection; import de.hs_mannheim.informatik.bank.domain.Bank; @@ -10,16 +11,23 @@ import de.hs_mannheim.informatik.bank.infrastructure.Persistenz; public class Banksystem { private Bank bank; - public Banksystem(String bankname) throws Exception { - if (Persistenz.sindDatenGespeichert(bankname)) + public Banksystem(String bankname) { + try { this.bank = (Bank) Persistenz.ladeBankDaten(bankname); - else - this.bank = new Bank(bankname); + + return; + + } catch (ClassNotFoundException | IOException e) { + // Hier loggen wir die Exception und starten einfach mit einem leeren System. + System.err.println("Persistierte Daten konnten nicht geladen werden."); + } + + this.bank = new Bank(bankname); } - public int kontoAnlegen(String name, int auswahl) throws Exception { + public int kontoAnlegen(String name, int auswahl) throws IOException { int kontonummer = bank.addKonto(name, auswahl); - + Persistenz.speichereBankDaten(this.bank, bank.getName()); return kontonummer; @@ -31,7 +39,7 @@ public class Banksystem { int i = 0; for (Konto k : konten) { - liste[i++] = k.toString(); + liste[i++] = k.toString(); } return liste; @@ -41,25 +49,31 @@ public class Banksystem { return bank.getName(); } - public long geldEinzahlen(int kontonummer, long betrag) throws Exception { + public long geldEinzahlen(int kontonummer, long betrag) throws IOException { Konto konto = bank.findeKonto(kontonummer); konto.einzahlen(betrag, "Einzahlung am Schalter", "Einzahlung", konto.getInhaber()); + try { + + Persistenz.speichereBankDaten(this.bank, bank.getName()); + } catch (IOException ioe) { + konto.rollback(); + throw ioe; + + } - Persistenz.speichereBankDaten(this.bank, bank.getName()); - return konto.getKontostand(); } - public boolean geldAuszahlen(int kontonummer, long betrag) throws Exception { + public boolean geldAuszahlen(int kontonummer, long betrag) throws IOException { Konto konto = bank.findeKonto(kontonummer); - + Persistenz.speichereBankDaten(this.bank, bank.getName()); - + if (konto instanceof Konto) { return konto.auszahlen(betrag, "Auszahlung am Schalter", "Auszahlung", konto.getInhaber()); } - - return false; + + return false; } @@ -69,12 +83,16 @@ public class Banksystem { return konto.getKontobewegungen(); } - public boolean überweisungBeauftragen(int startkonto, int zielkonto, long betrag, String verwendungszweck) { + public boolean überweisungBeauftragen(int startkonto, int zielkonto, long betrag, String verwendungszweck) + throws Exception { Konto start = bank.findeKonto(startkonto); Konto ziel = bank.findeKonto(zielkonto); if (start instanceof Girokonto && ziel instanceof Girokonto) { - return ((Girokonto)start).überweise((Girokonto)ziel, betrag, verwendungszweck); + boolean erfolg = ((Girokonto) start).überweise((Girokonto) ziel, betrag, verwendungszweck); + Persistenz.speichereBankDaten(this.bank, bank.getName()); + + return erfolg; } return false; @@ -85,11 +103,11 @@ public class Banksystem { return konto.getKontostand(); } - + public long ermittleSaldo(int kontonummer, int anzahl) { Konto konto = bank.findeKonto(kontonummer); return konto.saldoBerechnen(anzahl); - + } } diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/SystemTest.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/SystemTest.java index 9b1859e..5d95d57 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/SystemTest.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/SystemTest.java @@ -2,6 +2,7 @@ package de.hs_mannheim.informatik.bank.facade; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -56,10 +57,14 @@ class SystemTest { @Order(4) void persistieren() throws Exception { Banksystem bs = new Banksystem("Testsystem"); - int knr = bs.kontoAnlegen("T", 1); - bs.geldEinzahlen(knr, 1000); + int knr = bs.kontoAnlegen("Test2", 2); + int knr2 = bs.kontoAnlegen("Test3", 2); + bs.geldEinzahlen(knr, 1000); bs.geldAuszahlen(knr, 500); + assertTrue(bs.überweisungBeauftragen(knr, knr2, 100, "Überweisungstest.")); + + assertEquals(400, bs.getKontostand(knr)); bs = null; diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java index 5d08e48..aed427e 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java @@ -3,6 +3,7 @@ package de.hs_mannheim.informatik.bank.infrastructure; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -13,13 +14,13 @@ public class Persistenz { return new File(name + BANK_DATEI).exists(); } - public static void speichereBankDaten(Object bank, String name) throws Exception { + public static void speichereBankDaten(Object bank, String name) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(name + BANK_DATEI)); oos.writeObject(bank); oos.close(); } - public static Object ladeBankDaten(String name) throws Exception { + public static Object ladeBankDaten(String name) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(name + BANK_DATEI)); Object bank = ois.readObject(); ois.close(); diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java index 5529b45..5593354 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java @@ -1,5 +1,6 @@ package de.hs_mannheim.informatik.bank.ui; +import java.io.IOException; import java.util.Scanner; import de.hs_mannheim.informatik.bank.facade.Banksystem; @@ -32,8 +33,13 @@ public class UI { System.out.println(); System.out.print("> "); - int input = Integer.parseInt(sc.nextLine()); - System.out.println(); + int input = 0; + try { + input = Integer.parseInt(sc.nextLine()); + System.out.println(); + } catch (Exception e) { + System.err.println("Ungültige Eingabe, bitte eine Zahl von 1-9 eingeben"); + } try { switch (input) { @@ -84,39 +90,85 @@ public class UI { } } - private void kontoAnlegen() throws Exception { + private void kontoAnlegen() throws IOException { + int auswahl = 0; + boolean ok = false; System.out.println("Bitte den Namen des Kontoinhabers angeben: "); String name = sc.nextLine(); - System.out.println("Möchten Sie ein Sparkonto (1) oder ein Girokonto (2) anlegen?"); - int auswahl = Integer.parseInt(sc.nextLine()); + do { + System.out.println("Möchten Sie ein Sparkonto (1) oder ein Girokonto (2) anlegen?"); + try { + auswahl = Integer.parseInt(sc.nextLine()); + } catch (NumberFormatException npe) { + System.err.println("Eingabe muss eine Zahl (1-2) sein"); + continue; + } + ok = true; + + } while (!ok); int kontonummer = bs.kontoAnlegen(name, auswahl); System.out.println("Konto mit der Nummer " + kontonummer + " neu angelegt."); } - private void geldEinzahlen() throws Exception { + private void geldEinzahlen() throws IOException { + int kontonummer = 0; + double betrag = 0; + boolean ok = false; + System.out.println("Geld einzahlen"); - System.out.print("Bitte die gewünschte Kontonummer eingeben: "); - int kontonummer = Integer.parseInt(sc.nextLine()); + do { + System.out.print("Bitte die gewünschte Kontonummer eingeben: "); + try { + kontonummer = Integer.parseInt(sc.nextLine()); + } catch (NumberFormatException | NullPointerException ne) { + System.err.println("Ungültige Kontonummer, bitte nochmal eingeben!"); + continue; + } + // optional prüfen, ob Konto existiert - // optional prüfen, ob Konto existiert + System.out.print("Bitte den gewünschten Betrag eingeben: "); + try { + betrag = Double.parseDouble(sc.nextLine()); + } catch (NumberFormatException nfe) { + System.err.println("Betrag muss eine Kommazahl sein, bitte Eingabe wiederholen!"); + continue; + } - System.out.print("Bitte den gewünschten Betrag eingeben: "); - double betrag = Double.parseDouble(sc.nextLine()); + ok = true; + } while (!ok); long neuerKontostand = bs.geldEinzahlen(kontonummer, (long) betrag * 100); System.out.printf("Einzahlung erfolgreich, neuer Kontostand = %.2f Euro", (neuerKontostand / 100.0)); + } - private void geldAuszahlen() throws Exception { - System.out.println("Geld auszahlen"); - System.out.print("Bitte die gewünschte Kontonummer eingeben: "); - int kontonummer = Integer.parseInt(sc.nextLine()); + private void geldAuszahlen() throws IOException { + int kontonummer = 0; + double betrag = 0; + boolean ok = false; - System.out.print("Bitte den gewünschten Betrag eingeben: "); - double betrag = Double.parseDouble(sc.nextLine()); + System.out.println("Geld auszahlen"); + do { + System.out.print("Bitte die gewünschte Kontonummer eingeben: "); + try { + kontonummer = Integer.parseInt(sc.nextLine()); + } catch (NumberFormatException | NullPointerException ne) { + System.err.println("Ungültige Kontonummer, bitte nochmal eingeben!"); + continue; + } + + System.out.print("Bitte den gewünschten Betrag eingeben: "); + try { + betrag = Double.parseDouble(sc.nextLine()); + } catch (NumberFormatException nfe) { + System.err.println("Betrag muss eine Kommazahl sein, bitte Eingabe wiederholen!"); + continue; + } + ok = true; + } while (!ok); boolean erfolgreich = bs.geldAuszahlen(kontonummer, (long) betrag * 100); @@ -142,7 +194,7 @@ public class UI { System.out.println("Noch keine Kontobewegungen."); } - private void überweisungBeauftragen() { + private void überweisungBeauftragen() throws Exception { System.out.print("Bitte die Kontonummer des Ausgangskontos der Überweisung eingeben: "); int startkonto = Integer.parseInt(sc.nextLine()); @@ -163,10 +215,11 @@ public class UI { private void saldoAusgeben() { System.out.println("Bitte Kontonummer angeben: "); int kontonummer = Integer.parseInt(sc.nextLine()); - System.out.println("Bitte die Anzahl an Kontobewegungen auswählen; "); + System.out.println("Bitte die Anzahl an Kontobewegungen auswählen: "); int anzahl = Integer.parseInt(sc.nextLine()); - double saldo = bs.ermittleSaldo(kontonummer, anzahl); - System.out.printf("Der Saldo beträgt %.2f Euro", saldo / 100.0); + long saldo = bs.ermittleSaldo(kontonummer, anzahl); + System.out.printf("Der Saldo nach %d Kontobewegungen beträgt %.2f Euro.%n", anzahl, (saldo / 100d)); + } }