diff --git a/Bibliotheksverwaltung/src/UILayer/LibraryUI.java b/Bibliotheksverwaltung/src/UILayer/LibraryUI.java index e16a95d..1e35782 100644 --- a/Bibliotheksverwaltung/src/UILayer/LibraryUI.java +++ b/Bibliotheksverwaltung/src/UILayer/LibraryUI.java @@ -18,151 +18,246 @@ public class LibraryUI { Scanner scanner = new Scanner(System.in); while (true) { - System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate()); - System.out.println("1. Registrieren"); - System.out.println("2. Anmelden"); - System.out.println("3. Datum ändern"); - System.out.println("4. Katalog anzeigen"); - System.out.println("5. Medium ausleihen"); - System.out.println("6. Medium zurückgeben"); - System.out.println("7. Medium verlängern"); - System.out.println("8. Gebühren anzeigen"); - System.out.println("9. Admin-Zahlung bearbeiten"); - System.out.println("10. Medien durchsuchen"); - System.out.println("11. Beenden"); + // Wenn der Benutzer nicht eingeloggt ist, zeige Anmeldeoptionen + if (currentUser == null) { + System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate()); + System.out.println("1. Registrieren"); + System.out.println("2. Anmelden"); + System.out.println("3. Katalog anzeigen"); + System.out.println("4. Beenden"); - int choice = scanner.nextInt(); - switch (choice) { - case 1 -> registerUser(scanner); - case 2 -> login(scanner); - case 3 -> changeDate(scanner); - case 4 -> showCatalog(); - case 5 -> borrowMedia(scanner); - case 6 -> returnMedia(scanner); - case 7 -> renewMedia(scanner); - case 8 -> showFees(); - case 9 -> processAdminPayment(scanner); - case 10 -> searchMedia(scanner); - case 11 -> { - System.out.println("Programm beendet."); - return; - } - default -> System.out.println("Ungültige Auswahl."); + int choice = scanner.nextInt(); + scanner.nextLine(); // Puffer leeren + + switch (choice) { + case 1 -> registerUser(scanner); // Benutzerregistrierung + case 2 -> login(scanner); // Benutzeranmeldung + case 3 -> showCatalog(); + case 4 -> { + System.out.println("Programm beendet."); + return; + } + default -> System.out.println("Ungültige Auswahl."); + } + } else { + // Wenn der Benutzer eingeloggt ist, zeige die entsprechenden Optionen + System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate()); + + // Menü für alle Benutzer (Admin und normaler Benutzer) + System.out.println("3. Datum ändern"); + System.out.println("4. Katalog anzeigen"); + System.out.println("5. Medium ausleihen"); + System.out.println("6. Medium zurückgeben"); + System.out.println("7. Medium verlängern"); + System.out.println("8. Gebühren anzeigen"); + System.out.println("9. Admin-Zahlung bearbeiten"); + System.out.println("10. Medien durchsuchen"); + System.out.println("11. Abmelden"); + System.out.println("12. Beenden"); + + // Wenn der Benutzer ein Admin ist, gib nur die Admin-Optionen an + if (currentUser.getRole().equals("admin")) { + // Admin kann nur die Zahlungen bearbeiten + System.out.println("Admin hat nur Zugriff auf 'Admin-Zahlung bearbeiten'."); + } + + int choice = scanner.nextInt(); + scanner.nextLine(); // Puffer leeren + + switch (choice) { + + case 3 -> changeDate(scanner); // Datum ändern + + case 4 -> { + if (currentUser.getRole().equals("admin")) { + System.out.println("Admins kann sich nicht den Katalog anzeigen lassen."); + } else { + showCatalog();// Medien ausleihen (nur für Benutzer) + } + + } + + case 5 -> { + if (currentUser.getRole().equals("admin")) { + System.out.println("Admins können keine Medien ausleihen."); + } else { + borrowMedia(scanner); // Medien ausleihen (nur für Benutzer) + } + } + case 6 -> { + if (currentUser.getRole().equals("admin")) { + System.out.println("Admins können keine Medien zurückgeben."); + } else { + returnMedia(scanner); // Medien zurückgeben (nur für Benutzer) + } + } + case 7 -> { + if (currentUser.getRole().equals("admin")) { + System.out.println("Admins können die Leihfrist nicht verlängern."); + } else { + renewMedia(scanner); // Medien verlängern (nur für Benutzer) + } + } + case 8 -> { + if (currentUser.getRole().equals("admin")) { + System.out.println("Admins können keine Gebühren anzeigen."); + } else { + showOutstandingFees(scanner); // Gebühren anzeigen (nur für Benutzer) + } + } + case 9 -> { + if (currentUser.getRole().equals("admin")) { + processAdminPayment(scanner); // Admin-Zahlung bearbeiten + } else { + System.out.println("Zahlungen können nur von einem Admin bearbeitet werden."); + } + } + case 10 -> searchMedia(scanner); // Medien durchsuchen (auch für Benutzer) + case 11 -> logout(); // Abmelden + case 12 -> { + System.out.println("Programm beendet."); + return; + } + default -> System.out.println("Ungültige Auswahl."); + } } } } + private void logout() { + System.out.println("Sie haben sich erfolgreich abgemeldet."); + currentUser = null; // Setze den aktuellen Benutzer auf null + } + private void registerUser(Scanner scanner) { - System.out.print("Geben Sie den Benutzertyp ein (1 = Erwachsener, 2 = Schüler/Student): "); - int userType = scanner.nextInt(); - scanner.nextLine(); // Puffer leeren - System.out.print("Geben Sie den Namen des Benutzers ein: "); - String name = scanner.nextLine(); - System.out.print("Geben Sie eine eindeutige Kartennummer ein: "); - String id = scanner.nextLine(); + System.out.print("Geben Sie eine Benutzer-ID ein: "); + String userId = scanner.nextLine(); - User newUser; - if (userType == 1) { - newUser = new Adult(id, name); - } else if (userType == 2) { - newUser = new Student(id, name); - } else { - System.out.println("Ungültiger Benutzertyp."); - return; - } + // Admin-ID '001' darf nicht für normale Benutzer verwendet werden + if (userId.equals("001")) { + System.out.println("Die ID '001' ist für den Admin reserviert und kann nicht verwendet werden."); + return; + } - libraryService.addUser(newUser); - System.out.println("Benutzer erfolgreich registriert: " + newUser); + System.out.print("Geben Sie Ihren Namen ein: "); + String userName = scanner.nextLine(); + + System.out.println("Sind Sie ein Student/Schüler? (Ja/Nein): "); + String userType = scanner.nextLine().trim().toLowerCase(); + + User newUser; + if (userType.equals("ja")) { + newUser = new Student(userId, userName); // Student-Instanz erstellen + } else { + newUser = new Adult(userId, userName); // Erwachsene-Instanz erstellen + } + + libraryService.addUser(newUser); // Benutzer zur Bibliothek hinzufügen + System.out.println("Benutzer erfolgreich registriert."); } private void login(Scanner scanner) { System.out.print("Geben Sie Ihre Benutzer-ID ein: "); - String userId = scanner.next(); + String userId = scanner.nextLine(); + + // Suche nach dem Benutzer in der Bibliothek currentUser = libraryService.findUserById(userId); + if (currentUser != null) { System.out.println("Willkommen, " + currentUser.getName() + "!"); - borrowService.showOutstandingFees(currentUser); + // Zeige die aktuellen ausstehenden Gebühren nach der Anmeldung an + System.out.println("Ihre ausstehenden Gebühren: " + currentUser.getOutstandingFees() + "€."); } else { - System.out.println("Benutzer nicht gefunden. Bitte zuerst registrieren."); + System.out.println("Benutzer nicht gefunden."); } } private void changeDate(Scanner scanner) { System.out.print("Geben Sie das neue Datum (YYYY-MM-DD) ein: "); - String newDateInput = scanner.next(); + String newDateInput = scanner.nextLine(); // Verwenden von nextLine() um die Eingabe zu lesen + + if (newDateInput.isEmpty()) { + System.out.println("Kein Datum eingegeben, es wird das heutige Datum verwendet."); + return; // Wenn keine Eingabe erfolgt, wird das heutige Datum verwendet + } try { - LocalDate newDate = LocalDate.parse(newDateInput); + LocalDate newDate = LocalDate.parse(newDateInput); // Versucht, das Datum zu parsen borrowService.setCurrentDate(newDate); // Datum ändern und ggf. fehlende borrowDates setzen } catch (Exception e) { - System.out.println("Ungültiges Datumformat. Bitte erneut versuchen."); + System.out.println( + "Ungültiges Datumformat. Bitte stellen Sie sicher, dass das Datum im Format YYYY-MM-DD eingegeben wird."); } } private void borrowMedia(Scanner scanner) { - if (currentUser == null) { - System.out.println("Bitte melden Sie sich zuerst an."); - return; - } + if (currentUser == null) { + System.out.println("Bitte melden Sie sich zuerst an."); + return; + } - System.out.print("Geben Sie die ID des Mediums ein, das Sie ausleihen möchten: "); - String mediumId = scanner.next(); - Medium medium = libraryService.findMediumById(mediumId); + System.out.print("Geben Sie die ID des Mediums ein, das Sie ausleihen möchten: "); + String mediumId = scanner.next(); + Medium medium = libraryService.findMediumById(mediumId); - if (medium != null) { - borrowService.borrowMedium(currentUser, medium); // Heutiges Datum wird automatisch gesetzt - } else { - System.out.println("Medium nicht gefunden."); - } + if (medium != null) { + String result = borrowService.borrowMedium(currentUser, medium); + System.out.println(result); // Zeigt die Rückgabe der Service-Methode an + } else { + System.out.println("Medium nicht gefunden."); + } } + + + private void returnMedia(Scanner scanner) { - if (currentUser == null) { - System.out.println("Bitte melden Sie sich zuerst an."); - return; - } + if (currentUser == null) { + System.out.println("Bitte melden Sie sich zuerst an."); + return; + } - System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: "); - String mediumId = scanner.next(); - Medium medium = libraryService.findMediumById(mediumId); + System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: "); + String mediumId = scanner.nextLine(); - if (medium != null) { - borrowService.returnMedium(currentUser, medium); - } else { - System.out.println("Medium nicht gefunden."); - } + Medium medium = libraryService.findMediumById(mediumId); + if (medium != null) { + String result = borrowService.returnMedium(currentUser, medium); + System.out.println(result); // Zeigt die Rückgabeinformationen an + } else { + System.out.println("Medium nicht gefunden."); + } } - private void showFees() { - if (currentUser == null) { - System.out.println("Bitte melden Sie sich zuerst an."); - return; - } - borrowService.showOutstandingFees(currentUser); - } + private void processAdminPayment(Scanner scanner) { - // Überprüfen, ob der aktuelle Benutzer der Admin ist - if (!(currentUser instanceof Admin)) { - System.out.println("Nur der Admin kann Zahlungen bearbeiten."); - return; - } + if (currentUser == null || !currentUser.getRole().equals("admin")) { + System.out.println("Nur ein Admin kann Zahlungen bearbeiten."); + return; + } - // Admin-Prozess: Zahlung bearbeiten - Admin admin = (Admin) currentUser; // Casten des aktuellen Benutzers zu Admin + System.out.print("Geben Sie die Benutzer-ID für die Zahlung ein: "); + String userId = scanner.nextLine(); - System.out.print("Geben Sie die Benutzer-ID ein, für den Sie die Zahlung bearbeiten möchten: "); - String userId = scanner.next(); - User user = libraryService.findUserById(userId); + // Suchen des Benutzers + User user = libraryService.findUserById(userId); + if (user != null) { + System.out.println("Ausstehende Gebühren für " + user.getName() + ": " + user.getOutstandingFees() + "€."); + System.out.print("Geben Sie den zu zahlenden Betrag ein: "); + double paymentAmount = scanner.nextDouble(); + scanner.nextLine(); // Puffer leeren - if (user == null) { - System.out.println("Benutzer nicht gefunden."); - return; - } - - System.out.print("Geben Sie den Zahlungsbetrag ein: "); - double amount = scanner.nextDouble(); - admin.processPayment(user, amount); // Admin kann die Zahlung bearbeiten + // Zahlung bearbeiten + if (paymentAmount <= user.getOutstandingFees()) { + user.payFees(paymentAmount); + System.out.println("Zahlung erfolgreich verarbeitet."); + } else { + System.out.println("Der Betrag übersteigt die ausstehenden Gebühren."); + } + } else { + System.out.println("Benutzer nicht gefunden."); + } } private void searchMedia(Scanner scanner) { @@ -190,40 +285,74 @@ public class LibraryUI { } private void renewMedia(Scanner scanner) { - if (currentUser == null) { - System.out.println("Bitte melden Sie sich zuerst an."); - return; - } + if (currentUser == null) { + System.out.println("Bitte melden Sie sich zuerst an."); + return; + } - System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: "); - String mediumId = scanner.next(); - Medium medium = libraryService.findMediumById(mediumId); + System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: "); + String mediumId = scanner.next(); + Medium medium = libraryService.findMediumById(mediumId); - if (medium != null) { - System.out.print( - "Möchten Sie das Ausleihdatum ändern? (YYYY-MM-DD oder leer lassen, um es unverändert zu lassen): "); - scanner.nextLine(); // Puffer leeren - String inputDate = scanner.nextLine(); + if (medium != null) { + // Überprüfen, ob der Benutzer das Medium ausgeliehen hat + if (!currentUser.getBorrowedMedia().contains(medium)) { + System.out.println("Dieses Medium wurde nicht von Ihnen ausgeliehen und kann daher nicht verlängert werden."); + return; + } - LocalDate newBorrowDate = null; - if (!inputDate.isBlank()) { - try { - newBorrowDate = LocalDate.parse(inputDate); // Neues Ausleihdatum parsen - } catch (Exception e) { - System.out.println("Ungültiges Datum. Das ursprüngliche Ausleihdatum bleibt bestehen."); - } - } + // Optional: Ausleihdatum ändern + System.out.print( + "Möchten Sie das Ausleihdatum ändern? (YYYY-MM-DD oder leer lassen, um es unverändert zu lassen): "); + scanner.nextLine(); // Puffer leeren + String inputDate = scanner.nextLine(); - // Aufruf der renewMedium-Methode im BorrowService mit den Parametern - borrowService.renewMedium(currentUser, medium, newBorrowDate); // Hier übergeben wir currentUser, medium und - // newBorrowDate - } else { - System.out.println("Medium nicht gefunden."); - } + LocalDate newBorrowDate = null; + if (!inputDate.isBlank()) { + try { + newBorrowDate = LocalDate.parse(inputDate); + } catch (Exception e) { + System.out.println("Ungültiges Datum. Das ursprüngliche Ausleihdatum bleibt bestehen."); + } + } + + // Verlängerung durchführen und Ergebnis anzeigen + String result = borrowService.renewMedium(currentUser, medium, newBorrowDate); + System.out.println(result); + } else { + System.out.println("Medium nicht gefunden."); + } } - + + private void showCatalog() { - libraryService.displayCatalog(); // Zeigt den gesamten Katalog mit Ausleihstatus an + List catalog = libraryService.displayCatalog(); + System.out.println("Katalog der Medien:"); + for (String entry : catalog) { + System.out.println(entry); // Anzeige jedes Mediums + } } + + private void showOutstandingFees(Scanner scanner) { + if (currentUser == null) { + System.out.println("Bitte melden Sie sich zuerst an."); + return; + } + + // Zeige die ausstehenden Gebühren des Benutzers an + System.out.println("Ausstehende Gebühren für " + currentUser.getName() + ": " + currentUser.getOutstandingFees() + "€."); + + // Zeige die ausgeliehenen Medien und deren Fälligkeitsdaten an + if (!currentUser.getBorrowedMedia().isEmpty()) { + System.out.println("Ausgeliehene Medien:"); + for (Medium medium : currentUser.getBorrowedMedia()) { + System.out.println("- Titel: " + medium.getTitle() + ", Fällig am: " + medium.getDueDate()); + } + } else { + System.out.println("Keine ausgeliehenen Medien."); + } + } + + }