package ServiceLayer; import java.time.LocalDate; import DomainLayer.Medium; import DomainLayer.User; public class BorrowService { private LocalDate currentDate = LocalDate.now(); private LibraryService libraryService; public LocalDate getCurrentDate() { return currentDate; } public void setCurrentDate(LocalDate newDate) { this.currentDate = newDate; // Überprüfen, ob ausgeliehene Medien ein korrektes Ausleihdatum haben for (Medium medium : libraryService.getAllMedia()) { if (medium.isBorrowed() && medium.getBorrowDate() == null) { medium.setBorrowDate(newDate); // Setze das aktuelle Datum als Ausleihdatum System.out.println("Warnung: Ausleihdatum für Medium '" + medium.getTitle() + "' war null und wurde auf " + newDate + " gesetzt."); } } System.out.println("Datum erfolgreich geändert: " + this.currentDate); } public void renewMedium(User user, Medium medium, LocalDate newBorrowDate) { if (!medium.isBorrowed()) { System.out.println("Das Medium wurde nicht ausgeliehen und kann daher nicht verlängert werden."); return; } // Wenn das neue Ausleihdatum gesetzt ist, verwenden wir dieses Datum, ansonsten das aktuelle Datum if (newBorrowDate != null) { medium.setBorrowDate(newBorrowDate); // Ausleihdatum auf das neue Datum setzen } // Wenn das Medium keine Verlängerung erlaubt, breche ab if (!medium.isRenewable()) { System.out.println("Das Medium kann nicht verlängert werden."); return; } // Wenn die maximale Anzahl an Verlängerungen erreicht wurde if (medium.getRenewals() >= medium.getMaxRenewals()) { System.out.println("Maximale Anzahl an Verlängerungen erreicht."); return; } // Verlängerung durchführen medium.increaseRenewals(); medium.setDueDate(medium.getDueDate().plusDays(medium.getBorrowPeriod())); // Rückgabedatum basierend auf der Leihfrist anpassen System.out.println("Verlängerung erfolgreich. Neue Rückgabefrist: " + medium.getDueDate()); } public void borrowMedium(User user, Medium medium) { if (medium.isBorrowed()) { System.out.println("Das Medium ist bereits ausgeliehen."); return; } // Verwende das aktuelle Datum als Ausleihdatum LocalDate borrowDate = currentDate; medium.setBorrowed(true); medium.setBorrowDate(borrowDate); // Setze das aktuelle Datum als Ausleihdatum medium.setDueDate(borrowDate.plusDays(medium.getBorrowPeriod())); // Berechne Rückgabedatum user.borrowMedium(medium); System.out.println("Ausleihe erfolgreich. " + medium.getDueDate()); } public void returnMedium(User user, Medium medium) { if (!medium.isBorrowed()) { System.out.println("Das Medium wurde nicht ausgeliehen."); return; } // Berechnung der Gebühren LocalDate dueDate = medium.getDueDate(); if (dueDate != null && currentDate.isAfter(dueDate)) { long overdueDays = java.time.temporal.ChronoUnit.DAYS.between(dueDate, currentDate); double fee; if (overdueDays > 7) { fee = 7 * 1 + (overdueDays - 7) * 2; } else { fee = overdueDays * 1; } user.addFee(fee); System.out.println("Überfällige Gebühr: " + fee + "€."); } medium.setBorrowed(false); medium.resetRenewals(); medium.setDueDate(null); // Rückgabedatum zurücksetzen, Ausleihdatum bleibt unverändert user.returnMedium(medium); System.out.println("Rückgabe erfolgreich."); System.out.println("Noch ausgeliehene Medien:"); for (Medium m : user.getBorrowedMedia()) { System.out.println("- " + m.getTitle() + " (Fällig am: " + m.getDueDate() + ")"); } } public void showOutstandingFees(User user) { System.out.println("Ausstehende Gebühren für " + user.getName() + ": " + user.getOutstandingFees() + "€."); } public void handleAdminPayment(User user, double amount) { user.payFees(amount); } }