Compare commits

...

3 Commits

16 changed files with 685 additions and 156 deletions

View File

@ -1,58 +0,0 @@
/*package LibrarySystem.UI;
import LibrarySystem.domain.benutzern.*;
import LibrarySystem.domain.medien.*;
import LibrarySystem.facade.*;
import java.time.LocalDate;
// Testklasse zum Erstellen und Verwalten von Benutzern
public class BibTest {
public static void main(String[] args) {
// Bibliothekssystem initialisieren
BibliothekSystem system = new BibliothekSystem();
// Benutzer erstellen
Benutzer erwachsener = new Erwachsener("Max", 35);
Benutzer student = new Student("Anna", 21);
Admin admin = new Admin("Lisa Admin", 40);
system.benutzerRegistrieren(erwachsener);
system.benutzerRegistrieren(student);
// Medien erstellen
Medium buch = new Buch("123", "Java Programmieren", "BP", 2020,"Buch");
Medium dvd = new DVD("456", "Der große Film", "JP",2018, "DVD");
// Datum setzen und Ausleihe simulieren
system.datumAendern(LocalDate.of(2024, 11, 10));
erwachsener.ausleihen(buch, system.getAktuellesDatum());
student.ausleihen(dvd, system.getAktuellesDatum());
system.zeigeGebuehren(erwachsener);
// Rückgabe simulieren
system.datumAendern(LocalDate.of(2024, 12, 15)); // Datum ändern
student.rueckgabe("456", system.getAktuellesDatum());
//Bezahlung der Gebühren simulieren
system.zeigeGebuehren(erwachsener);
admin.bestaetigeGebuehrenzahlung(erwachsener);
system.zeigeGebuehren(erwachsener);
// Medien eines Benutzers anzeigen
erwachsener.anzeigenAusleihen();
// Benutzerinformationen anzeigen
System.out.println(erwachsener);
System.out.println("Jahresgebühr: " + erwachsener.getJahresgebuehr() + " EUR");
System.out.println(student);
System.out.println("Jahresgebühr: " + student.getJahresgebuehr() + " EUR");
System.out.println(admin);
System.out.println("Jahresgebühr: " + admin.getJahresgebuehr() + " EUR");
}
}*/

View File

@ -3,6 +3,9 @@ package LibrarySystem.UI;
import LibrarySystem.domain.benutzern.*;
import LibrarySystem.facade.BibliothekSystem;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class UI {
@ -24,6 +27,7 @@ public class UI {
System.out.println("5. Zeige ausgeliehene Medien und Gebühren");
System.out.println("6. Verlängern der Leihfrist");
System.out.println("7. Admin-Login (Überfällige Gebühren verbuchen)");
System.out.println("8. Systemdatum manuell ändern.");
System.out.println("0. Beenden\n");
System.out.print("Bitte wählen Sie eine Option: ");
int auswahl = scanner.nextInt();
@ -37,6 +41,7 @@ public class UI {
case 5 -> zeigeAusgelieheneMedienUndGebuehren();
case 6 -> verlaengernLeihfrist();
case 7 -> adminLogin();
case 8 -> aendernDatumManuell();
case 0 -> {
System.out.println("Auf Wiedersehen!");
return;
@ -122,6 +127,20 @@ public class UI {
}
}
//Methode zur manuellen Änderung des Datums für Testen
//Von AI generiert
private void aendernDatumManuell(){
System.out.println("Neues Datum eingeben (Format: yyyy-MM-dd)");
String datum = scanner.nextLine();
try{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date neuesDatum = formatter.parse(datum);
system.setAktuellesDatum(neuesDatum);
} catch (ParseException e) {
System.out.println("Üngultiges Datum.");
}
}
}

View File

@ -0,0 +1,13 @@
ich: Erstelle mir eine Methode findeMedium, die in einer Liste mit Medien ein bestimmtes, vom Benutzer eingegebenen Medium
findet. Benutze dabei Lambda-Ausdrücke
AI: hier ist die Methode findeMedium, in einer Liste von Medien nach einem bestimmten, vom Benutzer eingegebenen Medium
findet:
//Methode zum Finden eines Mediums
public Medium findeMedium(String ID) {
return medienListe.stream()
.filter(m -> m.getID().equals(ID))
.findFirst()
.orElse(null);
}

View File

@ -0,0 +1,220 @@
prompt 2:
ich: erstelle eine Methode overdueGebuehren, die die überfälligen Gebühren berechnet. hier ist die Einsatzklasse
(Klasse BibliothekSystem):
AI: Methode: calculateOverdueFee
Diese Methode berechnet die überfälligen Gebühren basierend auf den Anzahl der überfälligen Tage.
Die Berechnung erfolgt nach einer einfachen Regel: 0,50 EUR pro überfälligem Tag.
Code
java
// Berechnung der Gebühren für überfällige Medien
private double calculateOverdueFee(long overdueDays) {
return overdueDays * 0.50; // Beispiel: 0,50 EUR pro Tag
}
Einsatzort
Die Methode wird innerhalb von returnMedium aufgerufen, um die Gebühren zu berechnen:
java
if (currentDate.after(medium.getDueDate())) {
long overdueDays = (currentDate.getTime() - medium.getDueDate().getTime()) / (1000 * 60 * 60 * 24);
double fee = calculateOverdueFee(overdueDays);
System.out.println("Überfällige Gebühren für " + borrower.getName() + ": " + fee + " EUR.");
}
Einbindung in die LibrarySystem-Klasse
Die Methode ist eine private Hilfsmethode der LibrarySystem-Klasse, da sie nur für interne Berechnungen verwendet wird.
Sie ist bewusst einfach gehalten, kann aber bei Bedarf erweitert werden,
z. B. um unterschiedliche Gebühren für verschiedene Medientypen oder Benutzerkategorien zu berücksichtigen.
-----------------------------------------------------------
prompt 3:
ich: Das System soll überfällige Artikel verfolgen und Säumnisgebühren berechnen: • Für jeden Tag, an dem ein Gegenstand
überfällig ist, wird eine Gebühr von 1€ erhoben. • Nach 7 Tagen Überfälligkeit erhöht sich die Gebühr auf 2€ pro Tag.
Das System sollte den Benutzern die Gesamtgebühren jedes Mal anzeigen, wenn sie sich anmelden, einen Artikel ausleihen
oder zurückgeben.
AI: Um diese Anforderungen umzusetzen, wird das Bibliotheksverwaltungssystem wie folgt erweitert:
1. Überarbeitung von calculateOverdueFee
Die Methode calculateOverdueFee wird angepasst, um die gestaffelten Gebühren zu berücksichtigen:
java
Copy code
private double calculateOverdueFee(long overdueDays) {
if (overdueDays <= 0) {
return 0; // Keine Gebühren, wenn nicht überfällig
}
if (overdueDays <= 7) {
return overdueDays * 1.0; // 1€ pro Tag für die ersten 7 Tage
}
return (7 * 1.0) + ((overdueDays - 7) * 2.0); // 2€ pro Tag ab dem 8. Tag
}
2. Verfolgung von Gebühren pro Benutzer
Die Klasse User wird erweitert, um aufgelaufene Gebühren zu speichern und zu verwalten:
Anpassung der User-Klasse
java
Copy code
public class User {
private String id;
private String name;
private List<Medium> borrowedItems;
private double outstandingFees; // Aufgelaufene Gebühren
public User(String id, String name) {
this.id = id;
this.name = name;
this.borrowedItems = new ArrayList<>();
this.outstandingFees = 0.0;
}
public double getOutstandingFees() {
return outstandingFees;
}
public void addFee(double fee) {
this.outstandingFees += fee;
}
public void clearFees() {
this.outstandingFees = 0.0;
}
public void listBorrowedItems() {
if (borrowedItems.isEmpty()) {
System.out.println("Keine ausgeliehenen Medien.");
} else {
System.out.println("Ausgeliehene Medien:");
for (Medium medium : borrowedItems) {
System.out.println("- " + medium.getTitle() + " (Rückgabedatum: " + medium.getDueDate() + ")");
}
}
}
// Weitere Methoden für Ausleihen und Rückgabe wie bereits implementiert
}
3. Gebührenberechnung bei Rückgabe
Die Methode returnMedium wird angepasst, um aufgelaufene Gebühren direkt in der Benutzerinstanz zu speichern:
java
Copy code
public void returnMedium(String mediumId) {
Medium medium = findMedium(mediumId);
if (medium == null) {
System.out.println("Medium mit der ID '" + mediumId + "' wurde nicht gefunden.");
return;
}
if (!medium.isLoaned()) {
System.out.println("Medium '" + medium.getTitle() + "' ist nicht ausgeliehen.");
return;
}
User borrower = null;
for (User user : userManager.getUsers()) {
if (user.getBorrowedItems().contains(medium)) {
borrower = user;
break;
}
}
if (borrower == null) {
System.out.println("Kein Benutzer gefunden, der dieses Medium ausgeliehen hat.");
return;
}
borrower.returnItem(medium);
// Überfällige Gebühren berechnen
if (currentDate.after(medium.getDueDate())) {
long overdueDays = (currentDate.getTime() - medium.getDueDate().getTime()) / (1000 * 60 * 60 * 24);
double fee = calculateOverdueFee(overdueDays);
borrower.addFee(fee);
System.out.println("Medium '" + medium.getTitle() + "' wurde erfolgreich zurückgegeben.");
System.out.println("Überfällige Gebühren für " + borrower.getName() + ": " + fee + " EUR.");
} else {
System.out.println("Medium '" + medium.getTitle() + "' wurde rechtzeitig zurückgegeben.");
}
// Verbleibende ausgeliehene Medien anzeigen
System.out.println("Verbleibende ausgeliehene Medien von " + borrower.getName() + ":");
borrower.listBorrowedItems();
}
4. Gebührenanzeige bei Anmeldung
Eine Methode wird hinzugefügt, um die Gebühren eines Benutzers bei der Anmeldung anzuzeigen:
java
Copy code
public void showOutstandingFees(String userId) {
User user = userManager.getUser(userId);
if (user == null) {
System.out.println("Benutzer nicht gefunden.");
return;
}
double fees = user.getOutstandingFees();
if (fees > 0) {
System.out.println("Offene Gebühren für " + user.getName() + ": " + fees + " EUR.");
} else {
System.out.println("Keine offenen Gebühren für " + user.getName() + ".");
}
}
5. Gebührenzahlung durch Admin
Ein Admin-Benutzer wird hinzugefügt, der Zahlungen bearbeiten kann:
Admin-Klasse
java
Copy code
public class Admin extends User {
public Admin(String id, String name) {
super(id, name);
}
public void processPayment(User user, double amount) {
if (amount <= 0) {
System.out.println("Ungültiger Zahlungsbetrag.");
return;
}
if (amount > user.getOutstandingFees()) {
System.out.println("Betrag übersteigt offene Gebühren.");
return;
}
user.addFee(-amount); // Reduziert die Gebühren
System.out.println("Zahlung von " + amount + " EUR für " + user.getName() + " erfolgreich bearbeitet.");
System.out.println("Verbleibende Gebühren: " + user.getOutstandingFees() + " EUR.");
}
}
Gebührenzahlung
Die Benutzeroberfläche wird um eine Option für Admins ergänzt:
java
Copy code
case 6 -> {
System.out.print("Admin-ID: ");
String adminId = scanner.next();
User admin = userManager.getUser(adminId);
if (admin instanceof Admin) {
System.out.print("Benutzer-ID: ");
String userId = scanner.next();
User user = userManager.getUser(userId);
if (user == null) {
System.out.println("Benutzer nicht gefunden.");
break;
}
System.out.print("Zahlungsbetrag: ");
double amount = scanner.nextDouble();
((Admin) admin).processPayment(user, amount);
} else {
System.out.println("Keine Admin-Rechte.");
}
}

View File

@ -0,0 +1,173 @@
prompt 4:
ich: implementiere einen weiteren punkt in die ui, der eine manuelle systemdatumänderung erlaubt,
um die rückgabe mit gebührenkonto ausprobieren zu können. Hier ist die UI Klasse (Eingabe von UI Klasse)
AI:Um eine manuelle Änderung des Systemdatums in der Benutzeroberfläche zu ermöglichen, müssen folgende Schritte durchgeführt werden:
1. Hinzufügen eines Systemdatums
Ein globales Systemdatum wird hinzugefügt, das in der gesamten Anwendung verwendet wird. Dies ermöglicht es, das Datum manuell zu ändern.
Hinzufügen zur LibrarySystem-Klasse
java
Copy code
import java.util.Calendar;
import java.util.Date;
public class LibrarySystem {
private Date currentDate;
public LibrarySystem() {
this.currentDate = new Date(); // Standardmäßig aktuelles Datum
}
public Date getCurrentDate() {
return currentDate;
}
public void setCurrentDate(Date date) {
this.currentDate = date;
System.out.println("Systemdatum erfolgreich auf " + date + " geändert.");
}
public void resetCurrentDate() {
this.currentDate = new Date();
System.out.println("Systemdatum auf aktuelles Datum zurückgesetzt: " + currentDate);
}
}
2. Anpassung der Berechnungen
Die Methoden, die auf das aktuelle Datum angewiesen sind (z. B. Rückgabefristen und Gebührenberechnung), nutzen nun das globale currentDate.
Beispiel: returnMedium
java
Copy code
if (currentDate.after(medium.getDueDate())) {
long overdueDays = (currentDate.getTime() - medium.getDueDate().getTime()) / (1000 * 60 * 60 * 24);
double fee = calculateOverdueFee(overdueDays);
borrower.addFee(fee);
System.out.println("Medium '" + medium.getTitle() + "' wurde erfolgreich zurückgegeben.");
System.out.println("Überfällige Gebühren für " + borrower.getName() + ": " + fee + " EUR.");
}
3. Erweiterung der Benutzeroberfläche
Eine neue Option wird hinzugefügt, um das Datum manuell zu ändern oder zurückzusetzen.
Code für die UI:
java
Copy code
case 7 -> {
System.out.println("Systemdatum ändern:");
System.out.println("1. Manuelles Datum setzen");
System.out.println("2. Datum auf aktuelles zurücksetzen");
int option = scanner.nextInt();
switch (option) {
case 1 -> {
System.out.print("Neues Datum eingeben (Format: yyyy-MM-dd): ");
String dateInput = scanner.next();
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date newDate = dateFormat.parse(dateInput);
librarySystem.setCurrentDate(newDate);
} catch (ParseException e) {
System.out.println("Ungültiges Datum. Bitte im Format yyyy-MM-dd eingeben.");
}
}
case 2 -> librarySystem.resetCurrentDate();
default -> System.out.println("Ungültige Option.");
}
}
---------------------------------------------------------------------
prompt 5:
ich: das rückgabeDatum wird bei mir so berechnet, sodass immer das systemdatum verwendet wird. kannst du das so verbessern,
so dass es auch mit dem manuellen Datum funktioniert? public Date rechneRueckgabedatum(){
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer());
this.rueckgabedatum = calendar.getTime();
return rueckgabedatum;
}
AI:
Um sicherzustellen, dass die Methode rechneRueckgabedatum mit dem manuellen Systemdatum arbeitet, anstatt immer
das aktuelle Datum zu verwenden, können wir das globale Systemdatum aus der LibrarySystem-Klasse einbinden.
Dazu müssen wir das Systemdatum explizit in die Berechnung einfließen lassen.
Verbesserte Implementierung der Methode
java
Copy code
public Date rechneRueckgabedatum(Date systemDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(systemDate); // Verwende das übergebene Systemdatum
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer()); // Füge die Ausleihdauer hinzu
this.rueckgabedatum = calendar.getTime();
return rueckgabedatum;
}
Anpassung der Aufrufe
Damit die Methode korrekt funktioniert, muss das Systemdatum beim Aufruf übergeben werden. Beispielsweise:
Ausleihe eines Mediums
Wenn ein Medium ausgeliehen wird, rufst du rechneRueckgabedatum mit dem aktuellen Systemdatum auf:
java
Copy code
public void leiheMediumAus(Medium medium) {
if (medium.isLoaned()) {
System.out.println("Das Medium '" + medium.getTitle() + "' ist bereits ausgeliehen.");
return;
}
Date rueckgabeDatum = medium.rechneRueckgabedatum(librarySystem.getCurrentDate());
medium.setLoaned(true);
medium.setDueDate(rueckgabeDatum);
System.out.println("Medium '" + medium.getTitle() + "' erfolgreich ausgeliehen.");
System.out.println("Rückgabedatum: " + rueckgabeDatum);
}
Alternative: Systemdatum global bereitstellen
Falls viele Klassen das Systemdatum verwenden, kannst du es direkt über eine Singleton-Instanz der LibrarySystem-Klasse bereitstellen:
Singleton-Pattern für LibrarySystem
java
Copy code
public class LibrarySystem {
private static LibrarySystem instance;
private Date currentDate;
private LibrarySystem() {
this.currentDate = new Date();
}
public static LibrarySystem getInstance() {
if (instance == null) {
instance = new LibrarySystem();
}
return instance;
}
public Date getCurrentDate() {
return currentDate;
}
public void setCurrentDate(Date date) {
this.currentDate = date;
}
public void resetCurrentDate() {
this.currentDate = new Date();
}
}
Aufruf ohne Übergabe des Datums
Wenn die Methode auf das Singleton zugreifen kann, wird die Übergabe des Datums überflüssig:
java
Copy code
public Date rechneRueckgabedatum() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(LibrarySystem.getInstance().getCurrentDate());
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer());
this.rueckgabedatum = calendar.getTime();
return rueckgabedatum;
}
Zusammenfassung der Änderungen
Neue Methode: Die Methode rechneRueckgabedatum akzeptiert jetzt ein systemDate als Parameter.
Systemweite Änderungen: Das Systemdatum wird durch die LibrarySystem-Klasse verwaltet.
Globale Verfügbarkeit: Entweder durch explizite Übergabe oder über ein Singleton-Pattern.
Mit diesen Änderungen passt sich das Rückgabedatum automatisch an das manuelle Systemdatum an.

View File

@ -0,0 +1,123 @@
ich: wie kann ich die jährliche Gebühren, die jeweils in den klassen Erwachsener und Student als final JAHRESGEBUEHREN,
mit in das gebührenkonto mitrechnen
AI: Um die jährlichen Gebühren (JAHRESGEBUEHREN) aus den Klassen Erwachsener und Student in das Gebührenkonto eines
Benutzers einzurechnen, kannst du folgende Schritte unternehmen:
1. Änderungen in den Klassen Erwachsener und Student
Die Klassen sollten eine Methode bereitstellen, um die jährlichen Gebühren abzurufen. Wenn sie final sind, kann dies einfach ein Getter sein.
Beispiel: Klasse Erwachsener
java
Copy code
public class Erwachsener extends Benutzer {
public static final double JAHRESGEBUEHREN = 50.0; // Beispielwert
@Override
public double getJahresgebuehren() {
return JAHRESGEBUEHREN;
}
}
Beispiel: Klasse Student
java
Copy code
public class Student extends Benutzer {
public static final double JAHRESGEBUEHREN = 25.0; // Beispielwert
@Override
public double getJahresgebuehren() {
return JAHRESGEBUEHREN;
}
}
2. Anpassung der Basisklasse Benutzer
In der Basisklasse Benutzer solltest du eine Methode getJahresgebuehren() deklarieren, die von den Unterklassen überschrieben wird.
Klasse Benutzer
java
Copy code
public abstract class Benutzer {
private double gebuehrenkonto; // Das Konto, das alle Gebühren summiert
public Benutzer() {
this.gebuehrenkonto = 0.0; // Initialisierung
}
// Abstrakte Methode, die von Unterklassen implementiert wird
public abstract double getJahresgebuehren();
// Methode, um Gebühren hinzuzufügen
public void addGebuehren(double betrag) {
this.gebuehrenkonto += betrag;
}
// Methode, um das Gebührenkonto abzurufen
public double getGebuehrenkonto() {
return gebuehrenkonto;
}
// Methode, um die Jahresgebühr hinzuzufügen
public void berechneJahresgebuehren() {
addGebuehren(getJahresgebuehren());
}
}
3. Automatische Einrechnung der Jahresgebühren
Du kannst sicherstellen, dass die jährlichen Gebühren beim Erstellen eines Benutzers automatisch eingerechnet werden,
oder sie beim Jahreswechsel explizit einberechnen.
Beispiel: Automatische Berechnung bei Benutzererstellung
Passe die Konstruktoren der Unterklassen an, um die Jahresgebühren direkt hinzuzufügen:
java
Copy code
public class Erwachsener extends Benutzer {
public static final double JAHRESGEBUEHREN = 50.0;
public Erwachsener() {
super(); // Ruft den Konstruktor von Benutzer auf
berechneJahresgebuehren(); // Hinzufügen der Jahresgebühr
}
@Override
public double getJahresgebuehren() {
return JAHRESGEBUEHREN;
}
}
4. Beispiel für manuelle Einrechnung bei Jahreswechsel
Wenn die Jahresgebühren zu einem bestimmten Zeitpunkt eingerechnet werden sollen, kannst du eine Methode
in der Klasse BibliothekSystem hinzufügen:
Methode in BibliothekSystem
java
Copy code
public void berechneJahresgebuehrenFuerAlleBenutzer(List<Benutzer> benutzerListe) {
for (Benutzer benutzer : benutzerListe) {
benutzer.berechneJahresgebuehren();
}
}
Aufruf der Methode
java
Copy code
BibliothekSystem bibliothekSystem = BibliothekSystem.getInstance();
bibliothekSystem.berechneJahresgebuehrenFuerAlleBenutzer(benutzerListe);
5. Aktualisierung des Gebührenkontos bei Aktionen
Das System kann die Jahresgebühren im Gebührenkonto automatisch berücksichtigen, wenn der Benutzer sein Konto abruft:
Aktualisierung bei Kontoabfrage
java
Copy code
public double getGesamtgebuehren() {
return getGebuehrenkonto(); // Gebührensaldo inklusive Jahresgebühren
}
6. Ausgabe für den Benutzer
Die Gebühren können bei jeder Benutzerinteraktion angezeigt werden, z. B. bei der Anmeldung:
java
Copy code
System.out.println("Ihre Gesamtgebühren betragen: " + benutzer.getGesamtgebuehren() + "€");
Zusammenfassung
Die jährlichen Gebühren werden über die Methode getJahresgebuehren() aus den Unterklassen abgerufen.
Die Methode berechneJahresgebuehren() fügt die Gebühren zum Konto des Benutzers hinzu.
Entweder bei der Erstellung eines Benutzers oder zu einem bestimmten Zeitpunkt (z. B. Jahreswechsel) werden die Gebühren berechnet.
Das Gebührenkonto wird automatisch aktualisiert und bei Benutzeraktionen angezeigt.
Mit dieser Struktur bleibt das System flexibel und wartbar.

View File

@ -0,0 +1,41 @@
ich: ändere die Klasse UI so, so dass du so viel wie möglich Lambda-Ausdrücke verwendest (Eingabe von Klasse UI)
AI: hier ist die überarbeite Klasse UI, die Lambda-Ausdrücke enthält:
public void starten() {
while (true) {
System.out.println("Willkommen in der Bibliothek!\n");
System.out.println("1. Anmelden");
System.out.println("2. Medien durchsuchen");
System.out.println("3. Ausleihen eines Mediums");
System.out.println("4. Rückgabe eines Mediums");
System.out.println("5. Zeige ausgeliehene Medien und Gebühren");
System.out.println("6. Verlängern der Leihfrist");
System.out.println("7. Admin-Login (Überfällige Gebühren verbuchen)");
System.out.println("8. Systemdatum manuell ändern.");
System.out.println("0. Beenden\n");
System.out.print("Bitte wählen Sie eine Option: ");
int auswahl = scanner.nextInt();
scanner.nextLine();
switch (auswahl) {
case 1 -> anmelden();
case 2 -> durchsuchenMedien();
case 3 -> ausleihenMedium();
case 4 -> rueckgabeMedium();
case 5 -> zeigeAusgelieheneMedienUndGebuehren();
case 6 -> verlaengernLeihfrist();
case 7 -> adminLogin();
case 8 -> aendernDatumManuell();
case 0 -> {
System.out.println("Auf Wiedersehen!");
return;
}
default -> System.out.println("Ungültige Auswahl, bitte erneut versuchen.");
}
}
}
.
.
.
Die Methoden anmelden(), durchsuchenMedien(), usw. bleiben unverändert.

View File

@ -0,0 +1,14 @@
ich: erstelle eine Methode, die das Medienkatalog nach Titel, medienart und ob es ausgeliehen ist durchsucht
AI: Hier ist die Methode durchsuchenMedien(String titelTeil, String medienart, Boolean istAusgeliehen),
die das Medienkatalog nach Titel, medienart und ob es ausgeliehen ist durchsucht
Java Code:
// Durchsuchen der Medien nach einem Titel (Teilstring) und Filterung nach Eigenschaften
public List<Medium> durchsuchenMedien(String titelTeil, String medienart, Boolean istAusgeliehen) {
return medien.stream()
.filter(m -> m.getTitel().toLowerCase().contains(titelTeil.toLowerCase())) // Titel-Filter
.filter(m -> medienart == null || m.getMedienart().equalsIgnoreCase(medienart)) // Medienart-Filter
.filter(m -> istAusgeliehen == null || m.istAusgeliehen() == istAusgeliehen) // Ausleihstatus-Filter
.collect(Collectors.toList());
}

View File

@ -21,7 +21,7 @@ public abstract class Benutzer {
//Getter und Setter
public String getKartennummer() {return kartennummer;}
public void setkartennummer(String kartennummer) {this.kartennummer = kartennummer;}
public void setKartennummer(String kartennummer) {this.kartennummer = kartennummer;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAlter() {return alter;}
@ -42,7 +42,6 @@ public abstract class Benutzer {
} else{
System.out.println("Das Medium ist bereits ausgeliehen.");
}
//gebuehrenBezahlt = false; // Neue Ausleihe bedeutet potenziell offene Gebühren
}
//Methode für die Rückgabe
@ -69,12 +68,19 @@ public abstract class Benutzer {
}
}
public double addiereZuOffeneGebuehren(double gebuehren){
return this.offeneGebuehren+= gebuehren;
//Methode zum Addieren der Gebühren zu den offenen Gebühren
public void addiereZuOffeneGebuehren(double gebuehren){
this.offeneGebuehren+= gebuehren;
}
//Methode für den Admin, um nach eine erfolgreiche Bezahlung das Konto auf 0 zu setzen
public void bezahleGebuehren() {
offeneGebuehren = 0.0;
}
/*public void aktualisiereGebuehren(Date aktuellesDatum) {
/*public void aktualisiereGebuehren(Date aktuellesDatum) {
if (gebuehrenBezahlt) return; // Keine Aktualisierung erforderlich, wenn bezahlt
offeneGebuehren = 0.0;
for (Medium ausleihe : ausleihen) {
@ -82,13 +88,6 @@ public abstract class Benutzer {
}
}*/
public void bezahleGebuehren() {
offeneGebuehren = 0.0;
}
@Override
public String toString() {
return "Name: " + name + ", Alter: " + alter + ", Kartennummer: " + kartennummer;

View File

@ -19,10 +19,4 @@ public class Brettspiel extends Medium {
return false; //Keine Verlängerung
}
@Override
public int verlaengern() {
System.out.println("Brettspiele können nicht verlängert werden.");
return 0;
}
}

View File

@ -1,7 +1,6 @@
package LibrarySystem.domain.medien;
public class Buch extends Medium {
private static final int AUSLEIHDAUER = 28; //4 Wochen in Tagen
//private int verlaengerungenBuch = 3;
@ -21,16 +20,4 @@ public class Buch extends Medium {
return verlaengerungen >0;
}
@Override
public int verlaengern() {
if (istVerlaengerbar()) {
verlaengerungen--;
rechneRueckgabedatum(); //Verlängerung
} else{
System.out.println("Keine Verlängerung mehr möglich.");
}
return verlaengerungen;
}
}

View File

@ -18,10 +18,4 @@ public class CD extends Medium {
return false;
}
@Override
public int verlaengern() {
System.out.println("CDs können nicht verlängert werden.");
return 0;
}
}

View File

@ -18,11 +18,11 @@ public class DVD extends Medium {
return false; //Keine Verlängerung
}
@Override
/*@Override
public int verlaengern() {
System.out.println("DVDs können nicht verlängert werden.");
return 0;
}
}*/
}

View File

@ -62,8 +62,9 @@ public abstract class Medium implements Ausleihbar{
public void setVerlaengerungen(int verlaengerungen) {}
//Andere nützliche Methoden
public Date rechneRueckgabedatum(){
public Date rechneRueckgabedatum(Date systemDatum){
Calendar calendar = Calendar.getInstance();
calendar.setTime(systemDatum);
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer());
this.rueckgabedatum = calendar.getTime();
return rueckgabedatum;
@ -72,13 +73,11 @@ public abstract class Medium implements Ausleihbar{
//Abstrakte Methoden
public abstract int getAusleihdauer();
public abstract boolean istVerlaengerbar();
public abstract int verlaengern();
@Override
public void ausleihen() {
if(!istAusgeliehen()){
setAusgeliehen();
rechneRueckgabedatum();
} else{
System.out.println("Medium ist bereits ausgeliehen.");
}

View File

@ -18,15 +18,15 @@ public class Videospiel extends Medium {
return verlaengerungen>0;
}
@Override
/*@Override
public int verlaengern() {
if (istVerlaengerbar()){
verlaengerungen--;
rechneRueckgabedatum(); //Verlängerung
//rechneRueckgabedatum(); //Verlängerung
} else {
System.out.println("Keine Verlängerung mehr möglich");
}
return verlaengerungen;
}
}*/
}

View File

@ -11,7 +11,7 @@ import java.util.stream.Collectors;
public class BibliothekSystem {
private List<Benutzer> benutzerListe;
private Date aktuellesDatum;
private Date aktuellesDatum; //Standardmäßig aktuelles Datum
private List<Medium> medienListe;
public BibliothekSystem() {
@ -78,7 +78,8 @@ public class BibliothekSystem {
}
// Durchsuchen der Medien nach einem Titel (Teilstring) und Filterung nach Eigenschaften
public List<Medium> durchsuchenMedien(String titelTeil, String medienart) {
//Von AI generiert
public void durchsuchenMedien(String titelTeil, String medienart) {
List medienliste = medienListe.stream()
.filter(m -> m.getTitel().toLowerCase().contains(titelTeil.toLowerCase())) // Titel-Filter
.filter(m -> medienart == null || m.getMedienart().equalsIgnoreCase(medienart)) // Medienart-Filter
@ -87,9 +88,8 @@ public class BibliothekSystem {
if(medienliste.isEmpty()) {
System.out.println("Keine passende Medien gefunden.");
return null;
} else {
return medienliste;
System.out.println(medienliste);
}
}
@ -100,7 +100,7 @@ public class BibliothekSystem {
Medium medium = findeMedium(mediumID);
if (benutzer != null && medium != null && !medium.istAusgeliehen()) {
benutzer.ausleihen(medium);
medium.setRueckgabedatum(medium.rechneRueckgabedatum());
medium.setRueckgabedatum(medium.rechneRueckgabedatum(aktuellesDatum));
System.out.println(benutzer.getName() + " hat " + medium.getTitel() + " ausgeliehen.");
System.out.println("Rückgabedatum: " + medium.getRueckgabedatum());
System.out.println("Verlängerungen möglich insgesamt: " + medium.getVerlaengerungen());
@ -134,26 +134,27 @@ public class BibliothekSystem {
System.out.println("Kein Benutzer gefunden, der dieses Medium ausgeliehen hat.");
return;
}
//Medium zurückgeben
try {
ausleiher.rueckgabe(medium);
System.out.println("Medium '"+medium.getTitel()+"' wurde erfolgreich am " + getAktuellesDatum() + " zurückgegeben.");
ausleiher.rueckgabe(medium);
System.out.println("Medium '"+medium.getTitel()+"' wurde erfolgreich am " + getAktuellesDatum() + " zurückgegeben.");
//Für die Angabe des Gebührenkontos
//Von AI teilweise generiert
if(aktuellesDatum.after(medium.getRueckgabedatum())){
long overdueTage = (aktuellesDatum.getTime() - medium.getRueckgabedatum().getTime()) / (1000 * 60 * 60 * 24);
System.out.println("überfällige Tagen: " + overdueTage);
double gebuehr = rechneOverdueGebuehren(overdueTage);
ausleiher.addiereZuOffeneGebuehren(gebuehr);
System.out.println("Überfällige Gebühren für " + ausleiher.getName() + gebuehr + " Eur.");
System.out.println("Medium '" + medium.getTitel() + "' wurde erfolgreich zurückgegeben.");
System.out.println("Überfällige Gebühren für " + ausleiher.getName() + ": " + gebuehr + " Eur.");
}else {
System.out.println("Keine überfällige Gebühren.");
System.out.println("Medium '" + medium.getTitel()+ "' wurde rechtzeitig zurückgegeben");
}
System.out.println("Verbleibende ausgeliehene Medien von " + ausleiher.getName() + ":");
ausleiher.anzeigenAusleihen();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
//Methode zum Anzeigen des Gebührenkontos
@ -179,7 +180,13 @@ public class BibliothekSystem {
Medium medium = findeMedium(mediumID);
if (benutzer != null && medium != null && medium.istAusgeliehen()) {
if (medium.istVerlaengerbar()) {
medium.verlaengern();
if (medium.istVerlaengerbar()) {
medium.verlaengerungen--;
setzeAktuellesDatumZurueck();
medium.setRueckgabedatum(medium.rechneRueckgabedatum(aktuellesDatum));
} else{
System.out.println("Keine Verlängerung mehr möglich.");
}
System.out.println("Leihfrist für '" + medium.getTitel() + "' verlängert.");
System.out.println("Neues Rückgabedatum: " + medium.getRueckgabedatum());
System.out.println("Weitere Verlängerungen möglich: " + medium.getVerlaengerungen());
@ -192,45 +199,9 @@ public class BibliothekSystem {
}
}
//Methode zum Finden eines Benutzers
public Benutzer findeBenutzer(String kartennummer) {
return benutzerListe.get(Integer.parseInt(kartennummer));
}
//Methode zum Finden eines Mediums
public Medium findeMedium(String ID) {
return medienListe.stream()
.filter(m -> m.getID().equals(ID))
.findFirst()
.orElse(null);
}
//Methode, um das Systemdatum zu setzen
public void setAktuellesDatum(Date neuesDatum) {
this.aktuellesDatum = neuesDatum;
System.out.println("Systemdatum geändert auf: " + aktuellesDatum);
}
public Date getAktuellesDatum() {
return aktuellesDatum;
}
public void benutzerRegistrieren(Benutzer benutzer) {
benutzerListe.add(benutzer);
System.out.println("Benutzer registriert: " + benutzer);
}
/*public void zeigeGebuehren(Benutzer benutzer) {
benutzer.aktualisiereGebuehren(aktuellesDatum);
if (benutzer.sindGebuehrenBezahlt()) {
System.out.println("Alle Gebühren von " + benutzer.getName() + " sind bezahlt.");
} else {
System.out.println("Aktuelle Gebühren für " + benutzer.getName() + ": " + benutzer.getOffeneGebuehren() + "€");
}
}*/
//Methode zum Berechnen der overdue-Gebühren
//Von AI generiert
public double rechneOverdueGebuehren(long overdueTagen) {
if (overdueTagen <= 0){
return 0;
@ -241,4 +212,44 @@ public class BibliothekSystem {
return (7*1.0) + ((overdueTagen - 7) * 2.0); // 2 euro pro Tag ab dem 8. Tag
}
//------------Hilfsmethoden-----------------------
//Methode zum Finden eines Benutzers
public Benutzer findeBenutzer(String kartennummer) {
return benutzerListe.get(Integer.parseInt(kartennummer));
}
//Methode zum Finden eines Mediums
//Von AI generiert
public Medium findeMedium(String ID) {
return medienListe.stream()
.filter(m -> m.getID().equals(ID))
.findFirst()
.orElse(null);
}
//Methode, um das Systemdatum zu setzen
public void setAktuellesDatum(Date manuellesDatum) {
this.aktuellesDatum = manuellesDatum;
System.out.println("Systemdatum geändert auf: " + aktuellesDatum);
}
public Date getAktuellesDatum() {
return aktuellesDatum;
}
public void setzeAktuellesDatumZurueck(){
this.aktuellesDatum = new Date();
}
public void benutzerRegistrieren(Benutzer benutzer) {
benutzerListe.add(benutzer);
double jahresgebuehr = benutzer.getJahresgebuehr();
System.out.println("Benutzer registriert: " + benutzer + ", Jahresgebühr: " + jahresgebuehr);
}
}