From 5f61cdc46f2bf8a783983ef17f35ac6b32525651 Mon Sep 17 00:00:00 2001 From: Zabih Mansuri <3010192@stud.hs-mannheim.de> Date: Sun, 1 Dec 2024 18:16:28 +0100 Subject: [PATCH] ich habe versucht die fassade wieder einzu bauen damit die ui weniger code und meher trennung bekommt. --- Benutzer.java | 2 +- Creator.java | 15 ++- Fassade.java | 77 +++++++++++ Main.java | 15 ++- Ui.java | 332 +++++++++++++++--------------------------------- Verwaltung.java | 5 +- 6 files changed, 199 insertions(+), 247 deletions(-) create mode 100644 Fassade.java diff --git a/Benutzer.java b/Benutzer.java index a04172b..8080e29 100644 --- a/Benutzer.java +++ b/Benutzer.java @@ -8,7 +8,7 @@ abstract class Benutzer { private double gebuehren; // Aktuelle ausstehende Gebühren des Benutzers // Konstruktor - public Benutzer(String name, String nachname, int kundennummer, String art) { + public Benutzer(String name, String nachname, int kundennummer, String art) { this.name = name; this.nachname = nachname; this.kundennummer = kundennummer; diff --git a/Creator.java b/Creator.java index e5cdeb0..b20908d 100644 --- a/Creator.java +++ b/Creator.java @@ -1,15 +1,16 @@ class Creator { + // Factory-Methode für Benutzer static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) { - if (art.equals("e")) { - return new Benutzer.Erwachsener(name, nachname, kundennummer); - } else if (art.equals("s")) { - return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art); + if (art.equalsIgnoreCase("e")) { + return new Benutzer.Erwachsener(name, nachname, kundennummer); // Erstelle einen Erwachsenen + } else if (art.equalsIgnoreCase("s")) { + return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art); // Erstelle einen Schüler/Studenten } else { - return null; + return null; // Unbekannte Benutzerart } - } + // Factory-Methode für Medien public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) { switch (art.toLowerCase()) { case "buch": @@ -26,4 +27,4 @@ class Creator { throw new IllegalArgumentException("Unbekannter Medientyp: " + art); } } -} \ No newline at end of file +} diff --git a/Fassade.java b/Fassade.java new file mode 100644 index 0000000..6ab965b --- /dev/null +++ b/Fassade.java @@ -0,0 +1,77 @@ +import java.time.LocalDate; +import java.util.List; + +public class Fassade { + + private final Verwaltung verwaltung; + private LocalDate aktuellesDatum; + + // Konstruktor + public Fassade(Verwaltung verwaltung) { + this.verwaltung = verwaltung; + this.aktuellesDatum = LocalDate.now(); // Initiales Datum ist das heutige Datum + } + + // Benutzer registrieren + public void registriereBenutzer(Benutzer benutzer) { + verwaltung.addBenutzer(benutzer); // Benutzer zur Verwaltung hinzufügen + } + + // Benutzer anmelden + public Benutzer anmeldenBenutzer(int kundennummer) { + return verwaltung.benutzerListe.stream() + .filter(b -> b.getKundennummer() == kundennummer) + .findFirst() + .orElse(null); // Gibt null zurück, wenn Benutzer nicht gefunden wurde + } + + // Medien durchsuchen + public List durchsuchenMedien(String suchbegriff) { + // Rufe die Methode in der Verwaltung auf und übergebe die medienListe + return verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff); + } + + + // Medien ausleihen + public void ausleihen(int medienId, Benutzer benutzer, LocalDate ausleihDatum, LocalDate rueckgabeDatum) { + Medien medien = verwaltung.mediensListe.stream() + .filter(m -> m.getId() == medienId) + .findFirst() + .orElse(null); + + if (medien != null) { + verwaltung.addAL(medien, benutzer, ausleihDatum, rueckgabeDatum); // Leihe das Medium aus + } else { + System.out.println("Medien nicht gefunden."); + } + } + + // Medien zurückgeben + public void rueckgabe(int medienId, Benutzer benutzer, LocalDate rueckgabeDatum) { + verwaltung.rueckgabe(medienId, benutzer, rueckgabeDatum); // Rückgabe des Mediums + } + + // Medien verlängern + public void verlaengern(int medienId, Benutzer benutzer) { + Medien medien = verwaltung.mediensListe.stream() + .filter(m -> m.getId() == medienId) + .findFirst() + .orElse(null); + + if (medien != null) { + verwaltung.verlängern(medien, benutzer); // Verlängere die Leihfrist + } else { + System.out.println("Medien nicht gefunden."); + } + } + + // Zeit verschieben + public void zeitVerschieben(LocalDate neuesDatum) { + this.aktuellesDatum = neuesDatum; // Aktuelles Datum auf das neue Datum setzen + } + + // Aktuelles Datum abrufen + public LocalDate getAktuellesDatum() { + return aktuellesDatum; // Gibt das aktuelle Datum zurück + } +} diff --git a/Main.java b/Main.java index 83a834b..0e3f118 100644 --- a/Main.java +++ b/Main.java @@ -1,9 +1,9 @@ public class Main { public static void main(String[] args) { + // Erstelle die Instanzen Creator creator = new Creator(); Verwaltung verwaltung = new Verwaltung(); - // Medienobjekte hinzufügen verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020)); verwaltung.mediensListe.add(creator.factoryMedien("Datenstrukturen", "Julia Schmidt", 2, "buch", 2018)); @@ -16,8 +16,13 @@ public class Main { verwaltung.mediensListe.add(creator.factoryMedien("Minecraft", "Mojang", 9, "videospiel", 0)); verwaltung.mediensListe.add(creator.factoryMedien("The Witcher 3", "CD Projekt", 10, "videospiel", 0)); - // Ui mit der Verwaltung-Instanz initialisieren7 - Ui ui = new Ui(verwaltung); - ui.anmeldung(); + // Erstelle die Fassade mit der Verwaltung + Fassade fassade = new Fassade(verwaltung); + + // UI mit der Fassade initialisieren + Ui ui = new Ui(fassade); + + // Anmeldung starten + ui.starten(); } -} \ No newline at end of file +} diff --git a/Ui.java b/Ui.java index ca8b12d..2b0c78a 100644 --- a/Ui.java +++ b/Ui.java @@ -1,291 +1,159 @@ import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.*; +import java.util.Scanner; public class Ui { - private final Scanner scanner = new Scanner(System.in); - private final Verwaltung verwaltung; - // Zeitversatz für Tests - private LocalDate aktuelleZeit = LocalDate.now(); + private final Fassade fassade; + private final Scanner scanner; - public Ui(Verwaltung verwaltung) { - this.verwaltung = verwaltung; + public Ui(Fassade fassade) { + this.fassade = fassade; + this.scanner = new Scanner(System.in); } - void anmeldung() { - boolean running = true; - while (running) { - System.out.println("Willkommen! Bitte wählen Sie eine Option:"); - System.out.println("1: Durchsuchen der Medien"); - System.out.println("2: Ausleihen eines Gegenstandes"); - System.out.println("3: Rückgabe eines Gegenstandes"); - System.out.println("4: Ausgeliehene Gegenstände und Gebühren anzeigen"); - System.out.println("5: Verlängern der Leihfrist"); - System.out.println("6: Verbuchen von überfälligen Gebühren (Admin)"); - System.out.println("7: Registrieren"); - System.out.println("8: Anmelden"); - System.out.println("9: Zeit verschieben (Testoption)"); - System.out.println("0: Programm beenden"); + public void starten() { + boolean weiter = true; + while (weiter) { + System.out.println("Bitte wählen Sie eine Option:"); + System.out.println("1. Medien durchsuchen"); + System.out.println("2. Benutzer registrieren"); + System.out.println("3. Benutzer anmelden"); + System.out.println("4. Medien ausleihen"); + System.out.println("5. Medien zurückgeben"); + System.out.println("6. Medien verlängern"); + System.out.println("7. Gebühren einsehen"); + System.out.println("8. Zeit verschieben"); + System.out.println("9. Beenden"); - int menue = scanner.nextInt(); - scanner.nextLine(); // Leert den Puffer nach nextInt() + int auswahl = scanner.nextInt(); + scanner.nextLine(); // Puffer leeren - switch (menue) { - case 1 -> suchenNachMedien(); - case 2 -> ausleihen(); - case 3 -> rueckgabeDurchfuehren(); - case 4 -> gebuehrenEinsehen(); - case 5 -> verlaengern(); - case 6 -> adminrechte(); - case 7 -> registrieren(); - case 8 -> anmelden(); - case 9 -> zeitVerschieben(); - case 0 -> { - System.out.println("Programm wird beendet. Auf Wiedersehen!"); - running = false; - } - default -> System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut."); + switch (auswahl) { + case 1: durchsuchenMedien(); break; + case 2: registrierenBenutzer(); break; + case 3: anmeldenBenutzer(); break; + case 4: ausleihen(); break; + case 5: rueckgabe(); break; + case 6: verlaengern(); break; + case 7: gebuehrenEinsehen(); break; + case 8: zeitVerschieben(); break; + case 9: weiter = false; break; + default: System.out.println("Ungültige Auswahl."); break; } } } - private void suchenNachMedien() { - System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:"); + private void durchsuchenMedien() { + System.out.print("Suchbegriff (oder 'all' für alle Medien): "); String suchbegriff = scanner.nextLine(); - - List gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff); - - if (gefundeneMedien.isEmpty()) { + var ergebnisse = fassade.durchsuchenMedien(suchbegriff); + if (ergebnisse.isEmpty()) { System.out.println("Keine Medien gefunden."); } else { - System.out.println("Gefundene Medien:"); - for (Medien medien : gefundeneMedien) { - System.out.print(medien.getName()); - - if (medien.istAusgeliehen) { - Optional ausleiheOpt = verwaltung.ausliste.stream() - .filter(ausleihe -> ausleihe.getMedien().equals(medien)) - .findFirst(); - - if (ausleiheOpt.isPresent()) { - Aausleihe ausleihe = ausleiheOpt.get(); - LocalDate rueckgabedatum = ausleihe.getDate().plusWeeks(medien.frist); - System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum); - } - } else { - System.out.println(" ist verfügbar."); - } - } + ergebnisse.forEach(m -> System.out.println(m)); } } - private void registrieren() { - System.out.print("Geben Sie Ihren Vornamen ein: "); - String name = scanner.nextLine(); - - System.out.print("Geben Sie Ihren Nachnamen ein: "); + private void registrierenBenutzer() { + System.out.print("Vorname: "); + String vorname = scanner.nextLine(); + System.out.print("Nachname: "); String nachname = scanner.nextLine(); + System.out.print("Benutzertyp (e für Erwachsener, s für Schüler/Student): "); + String art = scanner.nextLine(); - System.out.print("Für Student geben Sie 's' und für Erwachsener 'e' ein: "); - String artInput = scanner.nextLine(); + // Erstelle den Benutzer über die Creator-Fabrikmethode + Benutzer benutzer = Creator.factoryBenutzer(vorname, nachname, 0, art); // Kundennummer könnte hier 0 sein, wenn sie noch nicht vergeben wurde. - int genkundennummer = verwaltung.generiereEindeutigeKundennummer(); - Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase()); - - if (neuerBenutzer != null) { - verwaltung.benutzerListe.add(neuerBenutzer); - System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer); + if (benutzer != null) { + fassade.registriereBenutzer(benutzer); + System.out.println("Benutzer erfolgreich registriert."); } else { - System.out.println("Ungültige Art. Versuchen Sie es erneut."); + System.out.println("Fehler: Ungültiger Benutzertyp."); } } - private Benutzer anmelden() { - System.out.print("Geben Sie Ihre Kundennummer zur Anmeldung ein: "); - int eingabeKundennummer = scanner.nextInt(); - scanner.nextLine(); // Puffer leeren - Optional benutzerOpt = verwaltung.benutzerListe.stream() - .filter(benutzer -> benutzer.getKundennummer() == eingabeKundennummer) - .findFirst(); - - if (benutzerOpt.isPresent()) { - System.out.println("Willkommen zurück, " + benutzerOpt.get().getName()); - return benutzerOpt.get(); + private void anmeldenBenutzer() { + System.out.print("Kundennummer: "); + int kundennummer = scanner.nextInt(); + scanner.nextLine(); // Puffer leeren + Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer); + if (benutzer != null) { + System.out.println("Benutzer angemeldet: " + benutzer.getName() + " " + benutzer.getNachname()); } else { - System.out.println("Kundennummer nicht gefunden."); - return null; + System.out.println("Benutzer nicht gefunden."); } } private void ausleihen() { - Benutzer benutzer = anmelden(); - if (benutzer == null) { - System.out.println("Sie müssen sich zuerst anmelden."); - return; - } - - System.out.print("Geben Sie die ID des gewünschten Mediums ein: "); - int id = scanner.nextInt(); + System.out.print("Medien ID: "); + int medienId = scanner.nextInt(); + System.out.print("Kundennummer: "); + int kundennummer = scanner.nextInt(); scanner.nextLine(); // Puffer leeren - Optional optionalMedien = verwaltung.mediensListe.stream() - .filter(medien -> medien.getId() == id) - .findFirst(); - - if (optionalMedien.isPresent()) { - Medien medien = optionalMedien.get(); - if (!medien.istAusgeliehen()) { - verwaltung.addAL(medien, benutzer, aktuelleZeit, null); - System.out.println("Das Medium wurde erfolgreich ausgeliehen."); - } else { - System.out.println("Das Medium ist bereits ausgeliehen."); - } + Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer); + if (benutzer != null) { + System.out.print("Rückgabedatum (yyyy-MM-dd): "); + LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine()); + fassade.ausleihen(medienId, benutzer, LocalDate.now(), rueckgabeDatum); + System.out.println("Ausleihe erfolgreich."); } else { - System.out.println("Medium mit dieser ID nicht gefunden."); + System.out.println("Benutzer nicht gefunden."); } } - private void rueckgabeDurchfuehren() { - Benutzer benutzer = anmelden(); - if (benutzer == null) { - System.out.println("Sie müssen sich zuerst anmelden."); - return; - } - - System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: "); - int id = scanner.nextInt(); + private void rueckgabe() { + System.out.print("Medien ID: "); + int medienId = scanner.nextInt(); + System.out.print("Kundennummer: "); + int kundennummer = scanner.nextInt(); scanner.nextLine(); // Puffer leeren - Optional optionalMedien = verwaltung.mediensListe.stream() - .filter(medien -> medien.getId() == id) - .findFirst(); - - if (optionalMedien.isPresent()) { - verwaltung.rueckgabe(id, benutzer, aktuelleZeit); - System.out.println("Das Medium wurde erfolgreich zurückgegeben."); + Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer); + if (benutzer != null) { + System.out.print("Rückgabedatum (yyyy-MM-dd): "); + LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine()); + fassade.rueckgabe(medienId, benutzer, rueckgabeDatum); + System.out.println("Rückgabe erfolgreich."); } else { - System.out.println("Medium mit dieser ID nicht gefunden."); + System.out.println("Benutzer nicht gefunden."); } } - private void verlaengern() { - Benutzer benutzer = anmelden(); - if (benutzer == null) { - System.out.println("Sie müssen sich zuerst anmelden."); - return; - } - - System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: "); - int id = scanner.nextInt(); + System.out.print("Medien ID: "); + int medienId = scanner.nextInt(); + System.out.print("Kundennummer: "); + int kundennummer = scanner.nextInt(); scanner.nextLine(); // Puffer leeren - Optional optionalMedien = verwaltung.mediensListe.stream() - .filter(medien -> medien.getId() == id) - .findFirst(); - - if (optionalMedien.isPresent()) { - verwaltung.verlängern(optionalMedien.get(), benutzer); - System.out.println("Das Medium wurde verlängert."); + Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer); + if (benutzer != null) { + fassade.verlaengern(medienId, benutzer); } else { - System.out.println("Medium mit dieser ID nicht gefunden."); + System.out.println("Benutzer nicht gefunden."); } } - private void adminrechte() { - System.out.print("Geben Sie den Admin-Benutzernamen ein: "); - String benutzername = scanner.nextLine(); - System.out.print("Geben Sie das Admin-Passwort ein: "); - String passwort = scanner.nextLine(); - - if (benutzername.equals("admin") && passwort.equals("admin123")) { - System.out.println("Admin-Login erfolgreich."); - verbucheUeberfaelligeGebuehren(); - } else { - System.out.println("Falsche Admin-Zugangsdaten."); - } - System.out.println("möchten sie zahlungen löschem geben sie benutzer id ein"); - int id=scanner.nextInt(); - - - } - - - private void verbucheUeberfaelligeGebuehren() { - System.out.println("Verbuchen überfälliger Gebühren:"); - - for (Aausleihe ausleihe : verwaltung.ausliste) { - Medien medien = ausleihe.getMedien(); - Benutzer benutzer = ausleihe.getBenutzer(); - LocalDate faelligkeitsdatum = ausleihe.getDate().plusDays(medien.frist); - - if (aktuelleZeit.isAfter(faelligkeitsdatum)) { - long ueberfaelligeWochen = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit); - double gebuehr = ueberfaelligeWochen; - System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() + - ", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR"); - } - } - } private void gebuehrenEinsehen() { - Benutzer benutzer = anmelden(); - if (benutzer == null) { - System.out.println("Sie müssen sich zuerst anmelden."); - return; - } + System.out.print("Kundennummer: "); + int kundennummer = scanner.nextInt(); + scanner.nextLine(); // Puffer leeren - System.out.println("Ihre ausstehenden Gebühren:"); - List ausleihen = verwaltung.getAusleihenByBenutzer(benutzer); - - if (ausleihen.isEmpty()) { - System.out.println("Sie haben keine ausgeliehenen Medien."); - return; - } - - boolean hatAusgelieheneMedien = false; - - for (Aausleihe ausleihe : ausleihen) { - Medien medien = ausleihe.getMedien(); - - // Prüfen, ob das Medium ausgeliehen ist - if (!medien.istAusgeliehen()) { - continue; // Überspringt Medien, die nicht ausgeliehen sind - } - - hatAusgelieheneMedien = true; // Mindestens ein Medium ist ausgeliehen - - LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist); - double gebuehr = 0; - - // Gebühren berechnen, wenn das Medium überfällig ist - if (aktuelleZeit.isAfter(faelligkeitsdatum)) { - long ueberfaelligeTage = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit); - gebuehr = ueberfaelligeTage * 2.0; // 2 EUR pro überfälligem Tag - } - - // Details zum Medium ausgeben - System.out.println("Medium: " + medien.getName() + - ", Fälligkeitsdatum: " + faelligkeitsdatum + - ", Gebühr: " + gebuehr + " EUR"); - } - - if (!hatAusgelieheneMedien) { - System.out.println("Sie haben keine ausgeliehenen Medien."); + Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer); + if (benutzer != null) { + System.out.println("Ausstehende Gebühren: " + benutzer.getGebuehren() + "€"); + } else { + System.out.println("Benutzer nicht gefunden."); } } private void zeitVerschieben() { - System.out.println("Aktuelles Datum: " + aktuelleZeit); - System.out.print("Geben Sie das neue Datum im Format JJJJ-MM-TT ein: "); - String neuesDatum = scanner.nextLine(); - - try { - aktuelleZeit = LocalDate.parse(neuesDatum); - System.out.println("Die Zeit wurde erfolgreich auf " + aktuelleZeit + " geändert."); - } catch (Exception e) { - System.out.println("Ungültiges Datum. Bitte versuchen Sie es erneut."); - } + System.out.print("Neue Zeit (yyyy-MM-dd): "); + String datum = scanner.nextLine(); + fassade.zeitVerschieben(LocalDate.parse(datum)); + System.out.println("Aktuelles Datum wurde auf " + datum + " geändert."); } } diff --git a/Verwaltung.java b/Verwaltung.java index 0e89ff7..f10d98d 100644 --- a/Verwaltung.java +++ b/Verwaltung.java @@ -164,11 +164,11 @@ public class Verwaltung { } - public void verlängern(Medien medien, Benutzer benutzer) { + public void verlängern(Medien medien, Benutzer benutzer) { for (Aausleihe aausleihe : ausliste) { // Überprüfen, ob das richtige Medium und der richtige Benutzer vorliegen if (aausleihe.getMedien().equals(medien) && aausleihe.getBenutzer().equals(benutzer)) { - if (medien.verlängern()&& medien.kannVerlängern()) { // Medien.verlängern() prüft, ob noch Verlängerungen möglich sind + if (medien.verlängern() && medien.kannVerlängern()) { // Medien.verlängern() prüft, ob noch Verlängerungen möglich sind System.out.println("Das Medium wurde erfolgreich verlängert. Aktuelle Verlängerungen: " + medien.getMaxVerlängerungen()); medien.maxVerlängerungen--; medien.aktuelleVerlängerungen++; @@ -187,6 +187,7 @@ public class Verwaltung { + public double berechneGebuehren(Aausleihe aausleihe, LocalDate aktuellesDatum) { long tageÜberfällig = ChronoUnit.DAYS.between(aausleihe.getRueckgabeDatum(), aktuellesDatum); if (tageÜberfällig <= 0) {