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 4b65878..84c6e47 100644 Binary files a/out/production/Biblio/Bibliothek/Bibliotheksverwaltung.class and b/out/production/Biblio/Bibliothek/Bibliotheksverwaltung.class differ diff --git a/out/production/Biblio/Bibliothek/Main.class b/out/production/Biblio/Bibliothek/Main.class index ebca90a..c60d323 100644 Binary files a/out/production/Biblio/Bibliothek/Main.class and b/out/production/Biblio/Bibliothek/Main.class differ diff --git a/out/production/Biblio/Bibliothek/UI.class b/out/production/Biblio/Bibliothek/UI.class index 33dc2ae..1dd5dc9 100644 Binary files a/out/production/Biblio/Bibliothek/UI.class and b/out/production/Biblio/Bibliothek/UI.class differ