From 9a4e99d73cedcd80e96fe49b00db67261370d8a7 Mon Sep 17 00:00:00 2001 From: Leon <3010261@stud.hs-mannheim.de> Date: Tue, 19 Nov 2024 10:37:32 +0100 Subject: [PATCH] =?UTF-8?q?Erste=20Kommentare=20hinzugef=C3=BCgt=20als=20a?= =?UTF-8?q?uch=20nach=20Tests=20erweiterung=20des=20Programms=20um=20Anfor?= =?UTF-8?q?derungen=20zu=20erf=C3=BCllen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Biblio/src/Bibliothek/Admin.java | 5 - .../src/Bibliothek/Bibliotheksverwaltung.java | 100 ++++++++++++++++-- Biblio/src/Bibliothek/Brettspiel.java | 2 +- Biblio/src/Bibliothek/Buch.java | 2 +- Biblio/src/Bibliothek/Kunde.java | 35 +++--- Biblio/src/Bibliothek/Main.java | 46 +++++--- Biblio/src/Bibliothek/Medien.java | 25 ++++- Biblio/src/Bibliothek/UI.java | 35 +++++- Biblio/src/Bibliothek/User.java | 2 - Biblio/src/Bibliothek/Videospiel.java | 2 +- .../Bibliothek/Bibliotheksverwaltung.class | Bin 8744 -> 11414 bytes out/production/Biblio/Bibliothek/Main.class | Bin 2473 -> 3202 bytes out/production/Biblio/Bibliothek/UI.class | Bin 10452 -> 11320 bytes 13 files changed, 196 insertions(+), 58 deletions(-) diff --git a/Biblio/src/Bibliothek/Admin.java b/Biblio/src/Bibliothek/Admin.java index 1cad231..d655f47 100644 --- a/Biblio/src/Bibliothek/Admin.java +++ b/Biblio/src/Bibliothek/Admin.java @@ -36,9 +36,4 @@ public class Admin extends User { System.out.println("- " + medien.getTitel() + " (Rückgabedatum: " + medien.getRueckgabedat() + ")") ); } - - @Override - public void rolleAnzeigen() { - System.out.println("Admin: " + name); - } } diff --git a/Biblio/src/Bibliothek/Bibliotheksverwaltung.java b/Biblio/src/Bibliothek/Bibliotheksverwaltung.java index 6e2c515..14a83ef 100644 --- a/Biblio/src/Bibliothek/Bibliotheksverwaltung.java +++ b/Biblio/src/Bibliothek/Bibliotheksverwaltung.java @@ -1,5 +1,6 @@ package Bibliothek; +import java.time.LocalDate; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -9,6 +10,8 @@ public class Bibliotheksverwaltung { private Map kundenListe; private Map adminListe; private User eingeloggterBenutzer; + private LocalDate aktuellesDatum = LocalDate.now(); + public Bibliotheksverwaltung() { medienBestand = new HashMap<>(); @@ -16,6 +19,9 @@ public class Bibliotheksverwaltung { adminListe = new HashMap<>(); } + /** + * Getter Methoden + */ public Map getKundenListe() { return kundenListe; } @@ -28,24 +34,63 @@ public class Bibliotheksverwaltung { return eingeloggterBenutzer; } - public List sucheMedienNachTitel(String titel) { + public LocalDate getAktuellesDatum() { + return aktuellesDatum; + } + + /** + * Setter für Datumsmanipulation + * + * @param datum + */ + public void setAktuellesDatum(LocalDate datum) { + this.aktuellesDatum = datum; + System.out.println("Systemdatum auf " + aktuellesDatum + " gesetzt."); + } + + + /** + * Methode mit der man nach Medien suchen kann und angezeigt bekommt ob die Medien geführt werden, ob sie + * verfügbar sind oder ob sie ausgeliehen sind sowohl als auch bis wann ausgeliehen + * + * @param titel + * @return + */ + public List sucheMedienNachTitel(String titel) { return medienBestand.values().stream() .filter(medien -> medien.getTitel().toLowerCase().contains(titel.toLowerCase())) + .map(medien -> { + String status = medien.verfuegbar() + ? "[Verfügbar]" + : "[Ausgeliehen bis: " + medien.getRueckgabedat() + "]"; + return medien.getDetails() + " " + status; + }) .collect(Collectors.toList()); } + /** + * Zeigt alle Medien die in der Bib geführt werden, ebenfalls mit der Info verfügbar oder ausgeliehen + */ public void alleMedienAnzeigen() { if (medienBestand.isEmpty()) { System.out.println("Keine Medien im Bestand."); } else { System.out.println("Medienbestand:"); - medienBestand.values().forEach(m -> - System.out.println("- " + m.getDetails() + - (m.verfuegbar() ? " [Verfügbar]" : " [Ausgeliehen]")) - ); + medienBestand.values().forEach(medien -> { + String status = medien.verfuegbar() + ? "[Verfügbar]" + : "[Ausgeliehen bis: " + medien.getRueckgabedat() + "]"; + System.out.println("- " + medien.getDetails() + " " + status); + }); } } + /** + * Methode um ein Medium auszuleihen + * Kunde muss dafür eingeloggt sein, Medium kann nicht mehrfach ausgeliehen werden + * + * @param medienId + */ public void medienAusleihen(String medienId) { medienId = medienId.trim().toUpperCase(); // Normalisierung Medien medien = medienBestand.get(medienId); @@ -68,12 +113,16 @@ public class Bibliotheksverwaltung { System.out.println("Medium erfolgreich ausgeliehen: " + medien.getTitel()); } - - + /** + * Kunde gibt sein ausgeliehens Medium zurück, wenn er überzogen hat + * wird dem konto die Überziehungsgebühr addiert + * + * @param medienId + * @param kundenId + */ public void medienZurueckgeben(String medienId, String kundenId) { Medien medien = medienBestand.get(medienId); Kunde kunde = kundenListe.get(kundenId); - if (medien == null) { System.out.println("Medium nicht gefunden."); return; @@ -83,14 +132,20 @@ public class Bibliotheksverwaltung { return; } if (kunde.getAusgelieheneMedien().contains(medien)) { + double gebuehren = medien.berechneGebuehren(aktuellesDatum); + kunde.addGebuehren(gebuehren); // Gebühren hinzufügen kunde.medienZurueckgeben(medien); medien.setVerfuegbar(true); System.out.println("Medium erfolgreich zurückgegeben: " + medien.getTitel()); + if (gebuehren > 0) { + System.out.println("Überziehungsgebühren: " + gebuehren + " € wurden dem Konto hinzugefügt."); + } } else { System.out.println("Dieses Medium wurde nicht von diesem Kunden ausgeliehen."); } } + public void medienVerlaengern(String medienId, String kundenId, int aktuelleVerlaengerungen) { Medien medien = medienBestand.get(medienId); Kunde kunde = kundenListe.get(kundenId); @@ -157,6 +212,7 @@ public class Bibliotheksverwaltung { System.out.println("Kein Benutzer ist eingeloggt."); } } + public Kunde registriereKunde(String name, boolean istStudent) { String prefix = istStudent ? "S" : "K"; int maxId = kundenListe.keySet().stream() @@ -172,4 +228,32 @@ public class Bibliotheksverwaltung { return neuerKunde; } + public void zeigeAusgelieheneMedien() { + if (!(eingeloggterBenutzer instanceof Kunde)) { + System.out.println("Nur eingeloggte Kunden können ausgeliehene Medien anzeigen."); + return; + } + Kunde kunde = (Kunde) eingeloggterBenutzer; + List ausgelieheneMedien = kunde.getAusgelieheneMedien(); + if (ausgelieheneMedien.isEmpty()) { + System.out.println("Es wurden keine Medien ausgeliehen."); + } else { + System.out.println("Ausgeliehene Medien:"); + ausgelieheneMedien.forEach(medien -> { + double gebuehren = medien.berechneGebuehren(aktuellesDatum); + String status = medien.verfuegbar() + ? "[Verfügbar]" + : "[Ausgeliehen bis: " + medien.getRueckgabedat() + ", Gebühren: " + gebuehren + " €]"; + System.out.println("- " + medien.getDetails() + " " + status); + }); + } + } + + public void pruefeUeberzogeneMedien() { + System.out.println("Überzogene Medien (Stand: " + aktuellesDatum + "):"); + medienBestand.values().stream() + .filter(medien -> !medien.verfuegbar() && medien.istUeberzogen(aktuellesDatum)) + .forEach(medien -> System.out.println("- " + medien.getDetails() + " (Rückgabedatum: " + medien.getRueckgabedat() + ")")); + } + } diff --git a/Biblio/src/Bibliothek/Brettspiel.java b/Biblio/src/Bibliothek/Brettspiel.java index 9934ddb..54aaea1 100644 --- a/Biblio/src/Bibliothek/Brettspiel.java +++ b/Biblio/src/Bibliothek/Brettspiel.java @@ -5,7 +5,7 @@ public class Brettspiel extends Medien { private int spieldauer; public Brettspiel(String titel, String id, int erscheinungsjahr, int spieleranzahl, int spieldauer) { - super(id, titel, erscheinungsjahr); + super(titel, id, erscheinungsjahr); this.spieleranzahl = spieleranzahl; this.spieldauer = spieldauer; } diff --git a/Biblio/src/Bibliothek/Buch.java b/Biblio/src/Bibliothek/Buch.java index 32c58bd..3a2acfa 100644 --- a/Biblio/src/Bibliothek/Buch.java +++ b/Biblio/src/Bibliothek/Buch.java @@ -5,7 +5,7 @@ public class Buch extends Medien { private int seitenanzahl; public Buch(String titel, String id, int erscheinungsjahr, String autor, int seitenanzahl) { - super(titel ,id, erscheinungsjahr); + super(titel, id, erscheinungsjahr); this.autor = autor; this.seitenanzahl = seitenanzahl; } diff --git a/Biblio/src/Bibliothek/Kunde.java b/Biblio/src/Bibliothek/Kunde.java index 5c48b9f..2a89be2 100644 --- a/Biblio/src/Bibliothek/Kunde.java +++ b/Biblio/src/Bibliothek/Kunde.java @@ -1,10 +1,12 @@ package Bibliothek; +import java.time.LocalDate; import java.util.function.Consumer; public class Kunde extends User { private boolean istStudent; // True, wenn Kunde ein Student ist - private double gebuehren; // Offene Gebühren + private double gebuehren; + ; // Offene Gebühren public Kunde(String id, String name, boolean istStudent) { super(id, name); @@ -20,27 +22,23 @@ public class Kunde extends User { return gebuehren; } + public void addGebuehren(double betrag) { + if (betrag > 0) { + this.gebuehren += betrag; + } + } + public void gebuehrenErhoehen(double betrag) { this.gebuehren += betrag; } - public void berechneGebuehren() { - // Gebühren berechnen basierend auf verspäteter Rückgabe - ausgelieheneMedien.forEach(medien -> { - if (medien.getRueckgabedat().isBefore(java.time.LocalDate.now())) { - int ueberfaelligeTage = java.time.Period.between( - medien.getRueckgabedat(), - java.time.LocalDate.now() - ).getDays(); - - double tagessatz = istStudent ? 0.5 : 1.0; // Studenten zahlen 50% weniger - gebuehren += ueberfaelligeTage <= 7 - ? ueberfaelligeTage * tagessatz - : (7 * tagessatz) + ((ueberfaelligeTage - 7) * 2); - } - }); + public double berechneGesamtgebuehren(LocalDate aktuellesDatum) { + return ausgelieheneMedien.stream() + .mapToDouble(medien -> medien.berechneGebuehren(aktuellesDatum)) + .sum(); } + public boolean medienVerlaengern(Medien medien, int aktuelleVerlaengerungen) { Consumer verlaengerung = m -> { if (ausgelieheneMedien.contains(m) && m.verlaengern(aktuelleVerlaengerungen)) { @@ -52,9 +50,4 @@ public class Kunde extends User { verlaengerung.accept(medien); return false; } - - @Override - public void rolleAnzeigen() { - System.out.println("Kunde: " + name + (istStudent ? " (Student)" : " (Erwachsener)")); - } } diff --git a/Biblio/src/Bibliothek/Main.java b/Biblio/src/Bibliothek/Main.java index 8275e90..2cce016 100644 --- a/Biblio/src/Bibliothek/Main.java +++ b/Biblio/src/Bibliothek/Main.java @@ -3,25 +3,39 @@ package Bibliothek; public class Main { public static void main(String[] args) { Bibliotheksverwaltung verwaltung = new Bibliotheksverwaltung(); - - Kunde kunde1 = new Kunde("S001", "Max Mustermann", true); - Kunde kunde2 = new Kunde("K001", "Lisa Müller", false); +/** + * Hart codierte Kunden und Admin + */ + Kunde kunde1 = new Kunde("S1", "Max Mustermann", true); + Kunde kunde2 = new Kunde("K1", "Lisa Müller", false); verwaltung.getKundenListe().put(kunde1.getId(), kunde1); verwaltung.getKundenListe().put(kunde2.getId(), kunde2); - Admin admin = new Admin("A001", "Anna Schmidt"); + Admin admin = new Admin("A1", "Anna Schmidt"); verwaltung.getAdminListe().put(admin.getId(), admin); - Medien buch1 = new Buch("Der Herr der Ringe", "B001", 1954, "J.R.R. Tolkien", 1200); - Medien buch2 = new Buch("Game of Thrones 1: Der Winter naht", "B002", 1996, "George R.R. Martin", 576); - Medien buch3 = new Buch("Harry Potter and the Prisoner of Azkaban", "B003", 2014, "J.K. Rowling", 480); - Medien dvd1 = new DVD("Inception", "D001", 2010, "Christopher Nolan", 148); - Medien dvd2 = new DVD("Batman 'The Dark Knight'", "D002", 2008, "Christopher Nolan", 152); - Medien dvd3 = new DVD("Star Wars: Episode 3 'Die Rache der Sith'", "D003", 2005, "George Lucas", 140); - Medien cd1 = new CD("Black Ice", "CD001", 2001, "ACDC", 15); - Medien cd2 = new CD("From Zero", "CD002", 2024, "Linkin Park", 11); - Medien cd3 = new CD("The War to end all Wars", "CD003", 2022, "Sabaton", 10); + /** + * Hart codierte Medien + */ + Medien buch1 = new Buch("Der Herr der Ringe", "B1", 1954, "J.R.R. Tolkien", 1200); + Medien buch2 = new Buch("Game of Thrones 1: Der Winter naht", "B2", 1996, "George R.R. Martin", 576); + Medien buch3 = new Buch("Harry Potter and the Prisoner of Azkaban", "B3", 2014, "J.K. Rowling", 480); + Medien dvd1 = new DVD("Inception", "D1", 2010, "Christopher Nolan", 148); + Medien dvd2 = new DVD("Batman 'The Dark Knight'", "D2", 2008, "Christopher Nolan", 152); + Medien dvd3 = new DVD("Star Wars: Episode 3 'Die Rache der Sith'", "D3", 2005, "George Lucas", 140); + Medien cd1 = new CD("Black Ice", "CD1", 2001, "ACDC", 15); + Medien cd2 = new CD("From Zero", "CD2", 2024, "Linkin Park", 11); + Medien cd3 = new CD("The War to end all Wars", "CD3", 2022, "Sabaton", 10); + Medien br1 = new Brettspiel("Wizard", "BR1", 1984, 4, 50); + Medien br2 = new Brettspiel("Mensch Ärgere dich nicht", "BR2", 1910, 6, 50); + Medien br3 = new Brettspiel("Monopoly Star Wars Edition", "BR3", 2016, 4, 60); + Medien vd1 = new Videospiel("Cyberpunk2077", "VD1", 2022, "PC/PS5/XBOX", "CD Projekt Red"); + Medien vd2 = new Videospiel("Landwirtschafts-Simulator 25", "VD2", 2024, "PC/PS5/XBOX", "Giants"); + Medien vd3 = new Videospiel("CFB25", "VD3", 2024, "PC/PS5/XBOX", "EA-Sports"); +/** + * Hinzufügen Methode der hart codierten Medien + */ verwaltung.medienHinzufuegen(buch1); verwaltung.medienHinzufuegen(buch2); verwaltung.medienHinzufuegen(buch3); @@ -31,6 +45,12 @@ public class Main { verwaltung.medienHinzufuegen(cd1); verwaltung.medienHinzufuegen(cd2); verwaltung.medienHinzufuegen(cd3); + verwaltung.medienHinzufuegen(br1); + verwaltung.medienHinzufuegen(br2); + verwaltung.medienHinzufuegen(br3); + verwaltung.medienHinzufuegen(vd1); + verwaltung.medienHinzufuegen(vd2); + verwaltung.medienHinzufuegen(vd3); // Starte UI UI tui = new UI(verwaltung); diff --git a/Biblio/src/Bibliothek/Medien.java b/Biblio/src/Bibliothek/Medien.java index 454ef2f..9f32732 100644 --- a/Biblio/src/Bibliothek/Medien.java +++ b/Biblio/src/Bibliothek/Medien.java @@ -15,15 +15,19 @@ public abstract class Medien { this.id = id; this.erscheinungsjahr = erscheinungsjahr; } + public String getTitel() { return titel; } + public void setTitel(String titel) { this.titel = titel; } + public String getId() { return id; } + public void setId(String id) { this.id = id; } @@ -32,19 +36,24 @@ public abstract class Medien { return rueckgabedat; } - public boolean verfuegbar(){ + public boolean verfuegbar() { return verfuegbar; } + public int getErscheinungsjahr() { return erscheinungsjahr; } + public void setErscheinungsjahr(int er) { this.erscheinungsjahr = er; } + public void setVerfuegbar(boolean verfuegbar) { this.verfuegbar = verfuegbar; } + public abstract int getAusleihdauer(); + public abstract int getMaxVerlaengerungen(); public void ausleihen() { @@ -75,5 +84,19 @@ public abstract class Medien { rueckgabedat = null; } + public boolean istUeberzogen(LocalDate aktuellesDatum) { + return rueckgabedat != null && rueckgabedat.isBefore(aktuellesDatum); + } + + public double berechneGebuehren(LocalDate aktuellesDatum) { + if (rueckgabedat == null || !istUeberzogen(aktuellesDatum)) { + return 0.0; // Keine Gebühren, wenn nicht überzogen + } + + long ueberzogeneTage = java.time.temporal.ChronoUnit.DAYS.between(rueckgabedat, aktuellesDatum); + return ueberzogeneTage * 0.50; // Beispiel: 0.50 Euro pro überzogenem Tag + } + + public abstract String getDetails(); } diff --git a/Biblio/src/Bibliothek/UI.java b/Biblio/src/Bibliothek/UI.java index d63b237..7959f0a 100644 --- a/Biblio/src/Bibliothek/UI.java +++ b/Biblio/src/Bibliothek/UI.java @@ -1,5 +1,6 @@ package Bibliothek; +import java.time.LocalDate; import java.util.Scanner; public class UI { @@ -35,6 +36,8 @@ public class UI { System.out.println("10. Gebühren anzeigen"); System.out.println("11. Gebühren verbuchen (Admin)"); System.out.println("12. Medien hinzufügen (Admin)"); + System.out.println("13. Meine ausgeliehenen Medien anzeigen"); + System.out.println("14. Datum einstellen"); System.out.println("0. Beenden"); System.out.print("Auswahl: "); } @@ -53,11 +56,16 @@ public class UI { case "10" -> gebuehrenAnzeigen(); case "11" -> gebuehrenVerbuchen(); case "12" -> medienHinzufuegen(); + case "13" -> ausgeliehenenMedienAnzeigen(); + case "14" -> datumEinstellen(); case "0" -> System.out.println("Beende das Programm..."); default -> System.out.println("Ungültige Auswahl. Bitte erneut versuchen."); } } + /** + * Wartet auf die Eingabe der Kunden-Id, wenn diese existiert wird der User eingeloggt + */ private void loginKunde() { System.out.print("Kunden-ID eingeben: "); String kundenId = scanner.nextLine(); @@ -92,7 +100,6 @@ public class UI { Kunde neuerKunde = verwaltung.registriereKunde(name, istStudent); } - private void medienDurchsuchen() { System.out.print("Suchbegriff eingeben: "); String suchbegriff = scanner.nextLine(); @@ -102,7 +109,7 @@ public class UI { System.out.println("Keine Medien gefunden."); } else { System.out.println("Suchergebnisse:"); - ergebnisse.forEach(medien -> System.out.println("- " + medien.getDetails())); + ergebnisse.forEach(System.out::println); } } @@ -152,13 +159,15 @@ public class UI { private void gebuehrenAnzeigen() { if (!(verwaltung.getEingeloggterBenutzer() instanceof Kunde)) { - System.out.println("Bitte loggen Sie sich als Kunde ein, um Gebühren anzuzeigen."); + System.out.println("Nur eingeloggte Kunden können ihre Gebühren anzeigen."); return; } Kunde kunde = (Kunde) verwaltung.getEingeloggterBenutzer(); - System.out.println("Gebühren von " + kunde.getName() + ": " + kunde.getGebuehren() + "€"); + double gesamtgebuehren = kunde.berechneGesamtgebuehren(verwaltung.getAktuellesDatum()); + System.out.println("Gesamtgebühren: " + gesamtgebuehren + " €"); } + private void gebuehrenVerbuchen() { if (!(verwaltung.getEingeloggterBenutzer() instanceof Admin)) { System.out.println("Nur Admins können Gebühren verbuchen. Bitte als Admin einloggen."); @@ -171,7 +180,6 @@ public class UI { System.out.println("Kunde nicht gefunden."); return; } - System.out.print("Betrag eingeben: "); try { double betrag = Double.parseDouble(scanner.nextLine()); @@ -245,4 +253,21 @@ public class UI { System.out.println("Ungültige Eingabe. Bitte eine Zahl eingeben."); } } + + private void ausgeliehenenMedienAnzeigen() { + verwaltung.zeigeAusgelieheneMedien(); + } + + private void datumEinstellen() { + System.out.print("Neues Datum eingeben (YYYY-MM-DD): "); + String eingabe = scanner.nextLine(); + try { + LocalDate neuesDatum = LocalDate.parse(eingabe); + verwaltung.setAktuellesDatum(neuesDatum); + } catch (Exception e) { + System.out.println("Ungültiges Datum. Bitte im Format YYYY-MM-DD eingeben."); + } + } + + } diff --git a/Biblio/src/Bibliothek/User.java b/Biblio/src/Bibliothek/User.java index 075b4c4..972a271 100644 --- a/Biblio/src/Bibliothek/User.java +++ b/Biblio/src/Bibliothek/User.java @@ -45,6 +45,4 @@ public abstract class User { System.out.println("'" + medien.getTitel() + "' wurde nicht von " + name + " ausgeliehen."); } } - - public abstract void rolleAnzeigen(); } diff --git a/Biblio/src/Bibliothek/Videospiel.java b/Biblio/src/Bibliothek/Videospiel.java index 416778b..57cdaf1 100644 --- a/Biblio/src/Bibliothek/Videospiel.java +++ b/Biblio/src/Bibliothek/Videospiel.java @@ -5,7 +5,7 @@ public class Videospiel extends Medien { private String entwickler; public Videospiel(String titel, String id, int erscheinungsjahr, String plattform, String entwickler) { - super(id, titel, erscheinungsjahr); + super(titel, id, erscheinungsjahr); this.plattform = plattform; this.entwickler = entwickler; } diff --git a/out/production/Biblio/Bibliothek/Bibliotheksverwaltung.class b/out/production/Biblio/Bibliothek/Bibliotheksverwaltung.class index 4b658787ad26da3d4bc86fbce17d48b393aae34e..84c6e474e3d079bf9096a1d95318144f9d5ebfd5 100644 GIT binary patch literal 11414 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 SQJ8udA4Ps4zm#92;eP=W^hzQC literal 8744 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 N9E#Y$4`LWU{saD7JkkIF delta 667 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 literal 10452 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