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 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."); } }