Merge pull request 'Feature-Admin' (#2) from Feature-Admin into main

Reviewed-on: #2
main
Arthur Kovis 2024-11-19 10:15:50 +01:00
commit bcf8d62e42
14 changed files with 563 additions and 435 deletions

View File

@ -2,7 +2,7 @@ package DomainLayer;
public class Admin extends User { public class Admin extends User {
public Admin(String id, String name) { public Admin(String id, String name) {
super(id, name, 0); // Admin hat keine Jahresgebühr super(id, name, 0.0, "admin"); // Admin hat keine jährliche Gebühr, wird aber als "admin" gesetzt
} }
// Admin-spezifische Funktionen // Admin-spezifische Funktionen

View File

@ -1,9 +1,9 @@
package DomainLayer; package DomainLayer;
public class Adult extends User { public class Adult extends User {
private static final double REGULAR_FEE = 50.0; // Jahresgebühr für Erwachsene private static final double REGULAR_FEE = 50.0; // Jahresgebühr für Erwachsene
public Adult(String id, String name) { public Adult(String id, String name) {
super(id, name, REGULAR_FEE); super(id, name, REGULAR_FEE, "user");
} }
} }

View File

@ -1,6 +1,5 @@
package DomainLayer; package DomainLayer;
import java.time.LocalDate;
public class BoardGame extends Medium { public class BoardGame extends Medium {
public BoardGame(String id, String title, String releaseYear) { public BoardGame(String id, String title, String releaseYear) {
@ -9,12 +8,12 @@ public class BoardGame extends Medium {
@Override @Override
public int getBorrowPeriod() { public int getBorrowPeriod() {
return 14; // 2 Wochen return 14; // 1 Woche für DVDs
} }
@Override @Override
public boolean isRenewable() { public boolean isRenewable() {
return false; // Keine Verlängerung möglich return false; // Keine Verlängerung für DVDs
} }
@Override @Override
@ -24,13 +23,6 @@ public class BoardGame extends Medium {
@Override @Override
public String getAuthor() { public String getAuthor() {
// TODO Auto-generated method stub return null; // DVDs haben keinen Autor
return null;
}
@Override
public void setBorrowDate(LocalDate currentDate) {
// TODO Auto-generated method stub
} }
} }

View File

@ -1,16 +1,14 @@
package DomainLayer; package DomainLayer;
import java.time.LocalDate;
public class Book extends Medium { public class Book extends Medium {
private String author; // Nur Bücher haben einen Autor private String author; // Nur Bücher haben einen Autor
// Konstruktor
public Book(String id, String title, String releaseYear, String author) { public Book(String id, String title, String releaseYear, String author) {
super(id, title, releaseYear); // Aufruf des Konstruktors der Oberklasse Medium super(id, title, releaseYear); // Aufruf des Konstruktors der Oberklasse Medium
this.author = author; this.author = author;
} }
// Implementierung von getAuthor() für Bücher
@Override @Override
public String getAuthor() { public String getAuthor() {
return this.author; // Gibt den Autor des Buches zurück return this.author; // Gibt den Autor des Buches zurück
@ -18,22 +16,16 @@ public class Book extends Medium {
@Override @Override
public int getBorrowPeriod() { public int getBorrowPeriod() {
return 28; // 4 Wochen return 28; // 4 Wochen für Bücher
} }
@Override @Override
public boolean isRenewable() { public boolean isRenewable() {
return true; // Verlängerung möglich return true; // Bücher können verlängert werden
} }
@Override @Override
public int getMaxRenewals() { public int getMaxRenewals() {
return 3; // Bis zu 3 Mal verlängerbar return 3; // Maximale 3 Verlängerungen für Bücher
}
@Override
public void setBorrowDate(LocalDate currentDate) {
// TODO Auto-generated method stub
} }
} }

View File

@ -1,36 +1,27 @@
package DomainLayer; package DomainLayer;
import java.time.LocalDate;
public class CD extends Medium { public class CD extends Medium {
public CD(String id, String title, String releaseYear) { public CD(String id, String title, String releaseYear) {
super(id, title, releaseYear); super(id, title, releaseYear);
} }
@Override @Override
public int getBorrowPeriod() { public int getBorrowPeriod() {
return 14; // 2 Wochen return 14; // 1 Woche für DVDs
} }
@Override @Override
public boolean isRenewable() { public boolean isRenewable() {
return false; // Keine Verlängerung möglich return false; // Keine Verlängerung für DVDs
} }
@Override @Override
public int getMaxRenewals() { public int getMaxRenewals() {
return 0; // Keine Verlängerung return 0; // Keine Verlängerung
} }
@Override @Override
public String getAuthor() { public String getAuthor() {
// TODO Auto-generated method stub return null; // DVDs haben keinen Autor
return null;
}
@Override
public void setBorrowDate(LocalDate currentDate) {
// TODO Auto-generated method stub
} }
} }

View File

@ -1,36 +1,27 @@
package DomainLayer; package DomainLayer;
import java.time.LocalDate;
public class DVD extends Medium { public class DVD extends Medium {
public DVD(String id, String title, String releaseYear) { public DVD(String id, String title, String releaseYear) {
super(id, title, releaseYear); super(id, title, releaseYear);
} }
@Override @Override
public int getBorrowPeriod() { public int getBorrowPeriod() {
return 7; // 1 Woche return 7; // 1 Woche für DVDs
} }
@Override @Override
public boolean isRenewable() { public boolean isRenewable() {
return false; // Keine Verlängerung möglich return false; // Keine Verlängerung für DVDs
} }
@Override @Override
public int getMaxRenewals() { public int getMaxRenewals() {
return 0; // Keine Verlängerung return 0; // Keine Verlängerung
} }
@Override @Override
public String getAuthor() { public String getAuthor() {
// TODO Auto-generated method stub return null; // DVDs haben keinen Autor
return null;
}
@Override
public void setBorrowDate(LocalDate currentDate) {
// TODO Auto-generated method stub
} }
} }

View File

@ -0,0 +1,11 @@
package DomainLayer;
import java.time.LocalDate;
public interface Loanable {
int getBorrowPeriod(); // Gibt die Ausleihfrist in Tagen zurück
boolean isRenewable(); // Gibt an, ob das Medium verlängert werden kann
int getMaxRenewals(); // Gibt die maximale Anzahl an Verlängerungen zurück
void setBorrowDate(LocalDate borrowDate); // Setzt das Ausleihdatum
LocalDate getDueDate(); // Gibt das Fälligkeitsdatum zurück
}

View File

@ -2,77 +2,79 @@ package DomainLayer;
import java.time.LocalDate; import java.time.LocalDate;
public abstract class Medium { public abstract class Medium implements Loanable {
private String id; private String id;
private String title; private String title;
private String releaseYear; private String releaseYear;
private boolean isBorrowed; private boolean isBorrowed;
private LocalDate borrowDate; private LocalDate borrowDate;
private LocalDate dueDate; private LocalDate dueDate;
private int renewals;
public Medium(String id, String title, String releaseYear) { // Konstruktor
this.id = id; public Medium(String id, String title, String releaseYear) {
this.title = title; this.id = id;
this.releaseYear = releaseYear; this.title = title;
this.isBorrowed = false; this.releaseYear = releaseYear;
this.renewals = 0; }
}
public String getId() { private int renewals = 0; // Anzahl der bisherigen Verlängerungen
return id;
}
public String getTitle() { // Getter und Setter für Verlängerungen
return title; public int getRenewals() {
} return renewals;
}
public String getReleaseYear() { public void increaseRenewals() {
return releaseYear; renewals++;
} }
public boolean isBorrowed() { public void resetRenewals() {
return isBorrowed; renewals = 0;
} }
public void setBorrowed(boolean borrowed) {
this.isBorrowed = borrowed;
}
public LocalDate getDueDate() { @Override
return dueDate; public void setBorrowDate(LocalDate borrowDate) {
} this.borrowDate = borrowDate;
this.dueDate = borrowDate != null ? borrowDate.plusDays(getBorrowPeriod()) : null; // Fälligkeitsdatum berechnen
}
public void setDueDate(LocalDate dueDate) {
this.dueDate = dueDate;
}
public int getRenewals() { @Override
return renewals; public LocalDate getDueDate() {
} return dueDate;
}
public void increaseRenewals() { public void setDueDate(LocalDate dueDate) {
this.renewals++; this.dueDate = dueDate; // Erlaubt sowohl ein Datum als auch null
} }
public void resetRenewals() {
this.renewals = 0;
}
// Abstrakte Methoden public boolean isBorrowed() {
public abstract int getBorrowPeriod(); return isBorrowed;
public abstract boolean isRenewable(); }
public abstract int getMaxRenewals();
// Neue Methode für den Autor public void setBorrowed(boolean borrowed) {
public abstract String getAuthor(); isBorrowed = borrowed;
}
public LocalDate getBorrowDate() { public String getId() {
return borrowDate; return id;
} }
public void setBorrowDate(LocalDate borrowDate) { public String getTitle() {
this.borrowDate = borrowDate; return title;
} }
public String getReleaseYear() {
return releaseYear;
}
// Neue Methode für den Autor
public abstract String getAuthor();
public LocalDate getBorrowDate() {
return borrowDate;
}
} }

View File

@ -1,9 +1,9 @@
package DomainLayer; package DomainLayer;
public class Student extends User { public class Student extends User {
private static final double DISCOUNTED_FEE = 25.0; // Jahresgebühr für Schüler/Studenten private static final double DISCOUNTED_FEE = 25.0; // Jahresgebühr für Schüler/Studenten
public Student(String id, String name) { public Student(String id, String name) {
super(id, name, DISCOUNTED_FEE); super(id, name, DISCOUNTED_FEE, "user"); // Rolle als "user" setzen
} }
} }

View File

@ -4,61 +4,69 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class User { public abstract class User {
private String id; private String id;
private String name; private String name;
private double outstandingFees; // Ausstehende Gebühren private double annualFee; // Jahresgebühr
private List<Medium> borrowedMedia; private double outstandingFees; // Ausstehende Gebühren
private List<Medium> borrowedMedia;
private String role; // "admin", "user", "student", "scholar"
public User(String id, String name, double annualFee) { public User(String id, String name, double annualFee, String role) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.outstandingFees = 0.0; this.annualFee = annualFee;
this.borrowedMedia = new ArrayList<>(); this.outstandingFees = 0.0;
} this.borrowedMedia = new ArrayList<>();
this.role = role; // Setzt die Rolle des Benutzers
}
public String getId() { public String getId() {
return id; return id;
} }
public String getName() { public String getName() {
return name; return name;
} }
public double getOutstandingFees() { public double getAnnualFee() {
return annualFee;
}
public void addFee(double fee) {
this.outstandingFees += fee;
}
public void payFees(double amount) {
if (amount > outstandingFees) {
System.out.println("Der Betrag übersteigt die ausstehenden Gebühren.");
return;
}
outstandingFees -= amount;
System.out.println("Zahlung von " + amount + "€ erfolgreich. Verbleibende Gebühren: " + outstandingFees + "€.");
}
public List<Medium> getBorrowedMedia() {
return borrowedMedia;
}
public void borrowMedium(Medium medium) {
borrowedMedia.add(medium);
}
public void returnMedium(Medium medium) {
borrowedMedia.remove(medium);
}
public String getRole() {
return role;
}
@Override
public String toString() {
return "Benutzer{" + "ID='" + id + '\'' + ", Name='" + name + '\'' + ", Jahresgebühr=" + annualFee
+ ", Ausstehende Gebühren=" + outstandingFees + '}';
}
public double getOutstandingFees() {
return outstandingFees; return outstandingFees;
} }
public void addFee(double fee) {
this.outstandingFees += fee;
}
public void payFees(double amount) {
if (amount > outstandingFees) {
System.out.println("Der Betrag übersteigt die ausstehenden Gebühren.");
return;
}
outstandingFees -= amount;
System.out.println("Zahlung von " + amount + "€ erfolgreich. Verbleibende Gebühren: " + outstandingFees + "€.");
}
public List<Medium> getBorrowedMedia() {
return borrowedMedia;
}
public void borrowMedium(Medium medium) {
borrowedMedia.add(medium);
}
public void returnMedium(Medium medium) {
borrowedMedia.remove(medium);
}
@Override
public String toString() {
return "Benutzer{" +
"ID='" + id + '\'' +
", Name='" + name + '\'' +
", Ausstehende Gebühren=" + outstandingFees +
'}';
}
} }

View File

@ -1,36 +1,28 @@
package DomainLayer; package DomainLayer;
import java.time.LocalDate;
public class VideoGame extends Medium { public class VideoGame extends Medium {
public VideoGame(String id, String title, String releaseYear) { public VideoGame(String id, String title, String releaseYear) {
super(id, title, releaseYear); super(id, title, releaseYear);
} }
@Override @Override
public int getBorrowPeriod() { public int getBorrowPeriod() {
return 28; // 4 Wochen return 28; // 1 Woche für DVDs
} }
@Override @Override
public boolean isRenewable() { public boolean isRenewable() {
return true; // Verlängerung möglich return true; // Keine Verlängerung für DVDs
} }
@Override @Override
public int getMaxRenewals() { public int getMaxRenewals() {
return 1; // Bis zu 1 Mal verlängerbar return 1; // Keine Verlängerung
} }
@Override @Override
public String getAuthor() { public String getAuthor() {
// TODO Auto-generated method stub return null; // DVDs haben keinen Autor
return null;
}
@Override
public void setBorrowDate(LocalDate currentDate) {
// TODO Auto-generated method stub
} }
} }

View File

@ -9,110 +9,141 @@ public class BorrowService {
private LocalDate currentDate = LocalDate.now(); private LocalDate currentDate = LocalDate.now();
private LibraryService libraryService; private LibraryService libraryService;
// Getter für das aktuelle Datum
public LocalDate getCurrentDate() { public LocalDate getCurrentDate() {
return currentDate; return currentDate;
} }
public String showOutstandingFees(User user) {
// Stelle sicher, dass der Benutzer ausstehende Gebühren hat
if (user != null) {
return "Ausstehende Gebühren für " + user.getName() + ": " + user.getOutstandingFees() + "€.";
} else {
return "Benutzer nicht gefunden.";
}
}
// Beispielmethode, die jetzt mit einer initialisierten LibraryService-Instanz
// arbeitet
public void setCurrentDate(LocalDate newDate) { public void setCurrentDate(LocalDate newDate) {
this.currentDate = newDate; this.currentDate = newDate;
// Überprüfen, ob ausgeliehene Medien ein korrektes Ausleihdatum haben // Stelle sicher, dass libraryService nicht null ist, bevor du darauf zugreifst
for (Medium medium : libraryService.getAllMedia()) { if (libraryService != null) {
if (medium.isBorrowed() && medium.getBorrowDate() == null) { for (Medium medium : libraryService.getAllMedia()) {
medium.setBorrowDate(newDate); // Setze das aktuelle Datum als Ausleihdatum if (medium.isBorrowed() && medium.getBorrowDate() == null) {
System.out.println("Warnung: Ausleihdatum für Medium '" + medium.getTitle() medium.setBorrowDate(newDate); // Setze das Ausleihdatum
+ "' 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) { // Verlängern eines Mediums
public String renewMedium(User user, Medium medium, LocalDate newBorrowDate) {
// Überprüfen, ob das Medium ausgeliehen ist
if (!medium.isBorrowed()) { if (!medium.isBorrowed()) {
System.out.println("Das Medium wurde nicht ausgeliehen und kann daher nicht verlängert werden."); return "Das Medium wurde nicht ausgeliehen.";
return;
} }
// Wenn das neue Ausleihdatum gesetzt ist, verwenden wir dieses Datum, ansonsten das aktuelle Datum // Überprüfen, ob der Benutzer das Medium ausgeliehen hat
if (newBorrowDate != null) { if (!user.getBorrowedMedia().contains(medium)) {
medium.setBorrowDate(newBorrowDate); // Ausleihdatum auf das neue Datum setzen return "Dieses Medium wurde nicht von Ihnen ausgeliehen und kann daher nicht verlängert werden.";
} }
// Wenn das Medium keine Verlängerung erlaubt, breche ab // Überprüfen, ob das Medium verlängerbar ist
if (!medium.isRenewable()) { if (!medium.isRenewable()) {
System.out.println("Das Medium kann nicht verlängert werden."); return "Das Medium kann nicht verlängert werden.";
return;
} }
// Wenn die maximale Anzahl an Verlängerungen erreicht wurde // Überprüfen, ob die maximale Anzahl an Verlängerungen erreicht wurde
if (medium.getRenewals() >= medium.getMaxRenewals()) { if (medium.getRenewals() >= medium.getMaxRenewals()) {
System.out.println("Maximale Anzahl an Verlängerungen erreicht."); return "Die maximale Anzahl an Verlängerungen wurde bereits erreicht.";
return; }
// Optional: Ausleihdatum aktualisieren
if (newBorrowDate != null) {
medium.setBorrowDate(newBorrowDate); // Setze das neue Ausleihdatum
} }
// Verlängerung durchführen // Verlängerung durchführen
medium.increaseRenewals(); medium.increaseRenewals();
medium.setDueDate(medium.getDueDate().plusDays(medium.getBorrowPeriod())); // Rückgabedatum basierend auf der Leihfrist anpassen medium.setDueDate(medium.getDueDate().plusDays(medium.getBorrowPeriod())); // Rückgabedatum basierend auf der Leihfrist verlängern
System.out.println("Verlängerung erfolgreich. Neue Rückgabefrist: " + medium.getDueDate());
return "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); // Ausleihen eines Mediums
medium.setBorrowDate(borrowDate); // Setze das aktuelle Datum als Ausleihdatum public String borrowMedium(User user, Medium medium) {
medium.setDueDate(borrowDate.plusDays(medium.getBorrowPeriod())); // Berechne Rückgabedatum if (medium.isBorrowed()) {
user.borrowMedium(medium); return "Das Medium ist bereits ausgeliehen.";
}
System.out.println("Ausleihe erfolgreich. " LocalDate borrowDate = LocalDate.now(); // Setze das aktuelle Datum als Ausleihdatum
+ medium.getDueDate()); medium.setBorrowDate(borrowDate); // Setze das Ausleihdatum und berechne das Fälligkeitsdatum
user.borrowMedium(medium); // Füge das Medium zur Liste der ausgeliehenen Medien des Benutzers hinzu
medium.setBorrowed(true); // Markiere das Medium als ausgeliehen
return "Ausleihe erfolgreich. Fällig am: " + 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); // Rückgabe eines Mediums
medium.resetRenewals(); public String returnMedium(User user, Medium medium) {
medium.setDueDate(null); // Rückgabedatum zurücksetzen, Ausleihdatum bleibt unverändert // Überprüfen, ob das Medium ausgeliehen ist
user.returnMedium(medium); if (!medium.isBorrowed()) {
return "Das Medium wurde nicht ausgeliehen.";
}
System.out.println("Rückgabe erfolgreich."); // Überprüfen, ob der Benutzer das Medium ausgeliehen hat
System.out.println("Noch ausgeliehene Medien:"); if (!user.getBorrowedMedia().contains(medium)) {
for (Medium m : user.getBorrowedMedia()) { return "Dieses Medium wurde nicht von Ihnen ausgeliehen und kann daher nicht zurückgegeben werden.";
System.out.println("- " + m.getTitle() + " (Fällig am: " + m.getDueDate() + ")"); }
}
StringBuilder result = new StringBuilder(); // StringBuilder für die Rückgabewerte
result.append("Zurückgegebenes Medium: ").append(medium.getTitle()).append("\n");
// 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);
result.append("Überfällige Gebühr: ").append(fee).append("€.\n");
} else {
result.append("Keine Gebühren angefallen.\n");
}
// Aktualisierung des Mediums und des Benutzers
medium.setBorrowed(false); // Medium ist nicht mehr ausgeliehen
medium.resetRenewals(); // Anzahl der Verlängerungen zurücksetzen
medium.setDueDate(null); // Fälligkeitsdatum entfernen
user.returnMedium(medium); // Entferne das Medium aus der Liste des Benutzers
// Anzeigen der verbleibenden ausgeliehenen Medien
if (user.getBorrowedMedia().isEmpty()) {
result.append("Keine weiteren Medien ausgeliehen.");
} else {
result.append("Noch ausgeliehene Medien:\n");
for (Medium m : user.getBorrowedMedia()) {
result.append("- ").append(m.getTitle()).append(" (Fällig am: ").append(m.getDueDate()).append(")\n");
}
}
return result.toString();
} }
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);
}
} }

View File

@ -24,31 +24,20 @@ public class LibraryService {
return admin; return admin;
} }
public String displayCatalog() { public List<String> displayCatalog() {
StringBuilder catalog = new StringBuilder(); // StringBuilder zum Sammeln der Katalogeinträge List<String> catalog = new ArrayList<>();
catalog.append("Medienkatalog:\n");
// Iteriere durch alle Medien im Katalog
for (Medium medium : mediaList) { for (Medium medium : mediaList) {
// Holen des Autors und Erscheinungsjahres
String author = medium.getAuthor();
String releaseYear = medium.getReleaseYear();
String status = medium.isBorrowed() ? "Ausgeliehen bis: " + medium.getDueDate() : "Verfügbar"; String status = medium.isBorrowed() ? "Ausgeliehen bis: " + medium.getDueDate() : "Verfügbar";
String author = medium.getAuthor() != null ? medium.getAuthor() : "-";
// Wenn das Medium ein Buch ist, zeigen wir den Autor an, andernfalls "-" catalog.add("ID: " + medium.getId() +
String authorDisplay = (author != null) ? author : "-"; // Wenn author null ist, setze "-" als Platzhalter ", Titel: " + medium.getTitle() +
", Autor: " + author +
// Katalogeintrag als String zusammenbauen ", Status: " + status);
catalog.append("Titel: ").append(medium.getTitle())
.append(", Autor: ").append(authorDisplay)
.append(", Erscheinungsjahr: ").append(releaseYear)
.append(", Status: ").append(status)
.append("\n");
} }
return catalog;
return catalog.toString(); // Gib den gesamten Katalog als String zurück
} }
public List<Medium> searchMedia(String query, boolean filterBorrowed, String mediaType) { public List<Medium> searchMedia(String query, boolean filterBorrowed, String mediaType) {
return mediaList.stream().filter(medium -> medium.getTitle().toLowerCase().startsWith(query.toLowerCase())) // Filter return mediaList.stream().filter(medium -> medium.getTitle().toLowerCase().startsWith(query.toLowerCase())) // Filter
// nach // nach

View File

@ -18,151 +18,246 @@ public class LibraryUI {
Scanner scanner = new Scanner(System.in); Scanner scanner = new Scanner(System.in);
while (true) { while (true) {
System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate()); // Wenn der Benutzer nicht eingeloggt ist, zeige Anmeldeoptionen
System.out.println("1. Registrieren"); if (currentUser == null) {
System.out.println("2. Anmelden"); System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate());
System.out.println("3. Datum ändern"); System.out.println("1. Registrieren");
System.out.println("4. Katalog anzeigen"); System.out.println("2. Anmelden");
System.out.println("5. Medium ausleihen"); System.out.println("3. Katalog anzeigen");
System.out.println("6. Medium zurückgeben"); System.out.println("4. Beenden");
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");
int choice = scanner.nextInt(); int choice = scanner.nextInt();
switch (choice) { scanner.nextLine(); // Puffer leeren
case 1 -> registerUser(scanner);
case 2 -> login(scanner); switch (choice) {
case 3 -> changeDate(scanner); case 1 -> registerUser(scanner); // Benutzerregistrierung
case 4 -> showCatalog(); case 2 -> login(scanner); // Benutzeranmeldung
case 5 -> borrowMedia(scanner); case 3 -> showCatalog();
case 6 -> returnMedia(scanner); case 4 -> {
case 7 -> renewMedia(scanner); System.out.println("Programm beendet.");
case 8 -> showFees(); return;
case 9 -> processAdminPayment(scanner); }
case 10 -> searchMedia(scanner); default -> System.out.println("Ungültige Auswahl.");
case 11 -> { }
System.out.println("Programm beendet."); } else {
return; // Wenn der Benutzer eingeloggt ist, zeige die entsprechenden Optionen
} System.out.println("\nAktuelles Datum: " + borrowService.getCurrentDate());
default -> System.out.println("Ungültige Auswahl.");
// 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) { private void registerUser(Scanner scanner) {
System.out.print("Geben Sie den Benutzertyp ein (1 = Erwachsener, 2 = Schüler/Student): "); System.out.print("Geben Sie eine Benutzer-ID ein: ");
int userType = scanner.nextInt(); String userId = scanner.nextLine();
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();
User newUser; // Admin-ID '001' darf nicht für normale Benutzer verwendet werden
if (userType == 1) { if (userId.equals("001")) {
newUser = new Adult(id, name); System.out.println("Die ID '001' ist für den Admin reserviert und kann nicht verwendet werden.");
} else if (userType == 2) { return;
newUser = new Student(id, name); }
} else {
System.out.println("Ungültiger Benutzertyp.");
return;
}
libraryService.addUser(newUser); System.out.print("Geben Sie Ihren Namen ein: ");
System.out.println("Benutzer erfolgreich registriert: " + newUser); 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) { private void login(Scanner scanner) {
System.out.print("Geben Sie Ihre Benutzer-ID ein: "); 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); currentUser = libraryService.findUserById(userId);
if (currentUser != null) { if (currentUser != null) {
System.out.println("Willkommen, " + currentUser.getName() + "!"); 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 { } else {
System.out.println("Benutzer nicht gefunden. Bitte zuerst registrieren."); System.out.println("Benutzer nicht gefunden.");
} }
} }
private void changeDate(Scanner scanner) { private void changeDate(Scanner scanner) {
System.out.print("Geben Sie das neue Datum (YYYY-MM-DD) ein: "); 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 { 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 borrowService.setCurrentDate(newDate); // Datum ändern und ggf. fehlende borrowDates setzen
} catch (Exception e) { } 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) { private void borrowMedia(Scanner scanner) {
if (currentUser == null) { if (currentUser == null) {
System.out.println("Bitte melden Sie sich zuerst an."); System.out.println("Bitte melden Sie sich zuerst an.");
return; return;
} }
System.out.print("Geben Sie die ID des Mediums ein, das Sie ausleihen möchten: "); System.out.print("Geben Sie die ID des Mediums ein, das Sie ausleihen möchten: ");
String mediumId = scanner.next(); String mediumId = scanner.next();
Medium medium = libraryService.findMediumById(mediumId); Medium medium = libraryService.findMediumById(mediumId);
if (medium != null) { if (medium != null) {
borrowService.borrowMedium(currentUser, medium); // Heutiges Datum wird automatisch gesetzt String result = borrowService.borrowMedium(currentUser, medium);
} else { System.out.println(result); // Zeigt die Rückgabe der Service-Methode an
System.out.println("Medium nicht gefunden."); } else {
} System.out.println("Medium nicht gefunden.");
}
} }
private void returnMedia(Scanner scanner) { private void returnMedia(Scanner scanner) {
if (currentUser == null) { if (currentUser == null) {
System.out.println("Bitte melden Sie sich zuerst an."); System.out.println("Bitte melden Sie sich zuerst an.");
return; return;
} }
System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: "); System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: ");
String mediumId = scanner.next(); String mediumId = scanner.nextLine();
Medium medium = libraryService.findMediumById(mediumId);
if (medium != null) { Medium medium = libraryService.findMediumById(mediumId);
borrowService.returnMedium(currentUser, medium); if (medium != null) {
} else { String result = borrowService.returnMedium(currentUser, medium);
System.out.println("Medium nicht gefunden."); 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) { private void processAdminPayment(Scanner scanner) {
// Überprüfen, ob der aktuelle Benutzer der Admin ist if (currentUser == null || !currentUser.getRole().equals("admin")) {
if (!(currentUser instanceof Admin)) { System.out.println("Nur ein Admin kann Zahlungen bearbeiten.");
System.out.println("Nur der Admin kann Zahlungen bearbeiten."); return;
return; }
}
// Admin-Prozess: Zahlung bearbeiten System.out.print("Geben Sie die Benutzer-ID für die Zahlung ein: ");
Admin admin = (Admin) currentUser; // Casten des aktuellen Benutzers zu Admin String userId = scanner.nextLine();
System.out.print("Geben Sie die Benutzer-ID ein, für den Sie die Zahlung bearbeiten möchten: "); // Suchen des Benutzers
String userId = scanner.next(); User user = libraryService.findUserById(userId);
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) { // Zahlung bearbeiten
System.out.println("Benutzer nicht gefunden."); if (paymentAmount <= user.getOutstandingFees()) {
return; user.payFees(paymentAmount);
} System.out.println("Zahlung erfolgreich verarbeitet.");
} else {
System.out.print("Geben Sie den Zahlungsbetrag ein: "); System.out.println("Der Betrag übersteigt die ausstehenden Gebühren.");
double amount = scanner.nextDouble(); }
admin.processPayment(user, amount); // Admin kann die Zahlung bearbeiten } else {
System.out.println("Benutzer nicht gefunden.");
}
} }
private void searchMedia(Scanner scanner) { private void searchMedia(Scanner scanner) {
@ -190,40 +285,74 @@ public class LibraryUI {
} }
private void renewMedia(Scanner scanner) { private void renewMedia(Scanner scanner) {
if (currentUser == null) { if (currentUser == null) {
System.out.println("Bitte melden Sie sich zuerst an."); System.out.println("Bitte melden Sie sich zuerst an.");
return; return;
} }
System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: "); System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: ");
String mediumId = scanner.next(); String mediumId = scanner.next();
Medium medium = libraryService.findMediumById(mediumId); Medium medium = libraryService.findMediumById(mediumId);
if (medium != null) { if (medium != null) {
System.out.print( // Überprüfen, ob der Benutzer das Medium ausgeliehen hat
"Möchten Sie das Ausleihdatum ändern? (YYYY-MM-DD oder leer lassen, um es unverändert zu lassen): "); if (!currentUser.getBorrowedMedia().contains(medium)) {
scanner.nextLine(); // Puffer leeren System.out.println("Dieses Medium wurde nicht von Ihnen ausgeliehen und kann daher nicht verlängert werden.");
String inputDate = scanner.nextLine(); return;
}
LocalDate newBorrowDate = null; // Optional: Ausleihdatum ändern
if (!inputDate.isBlank()) { System.out.print(
try { "Möchten Sie das Ausleihdatum ändern? (YYYY-MM-DD oder leer lassen, um es unverändert zu lassen): ");
newBorrowDate = LocalDate.parse(inputDate); // Neues Ausleihdatum parsen scanner.nextLine(); // Puffer leeren
} catch (Exception e) { String inputDate = scanner.nextLine();
System.out.println("Ungültiges Datum. Das ursprüngliche Ausleihdatum bleibt bestehen.");
}
}
// Aufruf der renewMedium-Methode im BorrowService mit den Parametern LocalDate newBorrowDate = null;
borrowService.renewMedium(currentUser, medium, newBorrowDate); // Hier übergeben wir currentUser, medium und if (!inputDate.isBlank()) {
// newBorrowDate try {
} else { newBorrowDate = LocalDate.parse(inputDate);
System.out.println("Medium nicht gefunden."); } 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() { private void showCatalog() {
libraryService.displayCatalog(); // Zeigt den gesamten Katalog mit Ausleihstatus an List<String> 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.");
}
}
} }