diff --git a/Bibliotheksverwaltung/src/ServiceLayer/BorrowService.java b/Bibliotheksverwaltung/src/ServiceLayer/BorrowService.java new file mode 100644 index 0000000..c7a10dd --- /dev/null +++ b/Bibliotheksverwaltung/src/ServiceLayer/BorrowService.java @@ -0,0 +1,118 @@ +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); + } +}