306 lines
12 KiB
Java
306 lines
12 KiB
Java
import java.time.LocalDate;
|
|
import java.util.*;
|
|
import java.time.temporal.ChronoUnit;
|
|
|
|
public class Ui {
|
|
private final Scanner scanner = new Scanner(System.in);
|
|
private final Verwaltung verwaltung;
|
|
|
|
// Konstruktor, der eine Verwaltung-Instanz annimmt
|
|
public Ui(Verwaltung verwaltung) {
|
|
this.verwaltung = verwaltung;
|
|
}
|
|
|
|
void anmeldung() {
|
|
boolean running = true;
|
|
while (running) {
|
|
System.out.println("Willkommen! Bitte wählen Sie eine Option:");
|
|
System.out.println("1: Durchsuchen der Medien");
|
|
System.out.println("2: Ausleihen eines Gegenstandes");
|
|
System.out.println("3: Rückgabe eines Gegenstandes");
|
|
System.out.println("4: Ausgeliehene Gegenstände und Gebühren anzeigen");
|
|
System.out.println("5: Verlängern der Leihfrist");
|
|
System.out.println("6: Verbuchen von überfälligen Gebühren (Admin)");
|
|
System.out.println("7: Registrieren");
|
|
System.out.println("8: Anmelden");
|
|
System.out.println("0: Programm beenden");
|
|
|
|
int menue = scanner.nextInt();
|
|
scanner.nextLine(); // Leert den Puffer nach nextInt()
|
|
|
|
switch (menue) {
|
|
case 1 -> suchenNachMedien(); // Keine Anmeldung erforderlich
|
|
case 2 -> ausleihen();
|
|
case 3 -> rueckgabeDurchfuehren();
|
|
case 4 -> gebuehrenEinsehen();
|
|
case 5 -> verlaengern();
|
|
case 6 -> adminrechte();
|
|
case 7 -> registrieren(); // Registrieren
|
|
case 8 -> anmelden(); // Anmelden
|
|
case 0 -> {
|
|
System.out.println("Programm wird beendet. Auf Wiedersehen!");
|
|
running = false;
|
|
}
|
|
default -> System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut.");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void suchenNachMedien() {
|
|
System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:");
|
|
String suchbegriff = scanner.nextLine();
|
|
|
|
List<Medien> gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff);
|
|
|
|
if (gefundeneMedien.isEmpty()) {
|
|
System.out.println("Keine Medien gefunden.");
|
|
} else {
|
|
System.out.println("Gefundene Medien:");
|
|
for (Medien medien : gefundeneMedien) {
|
|
System.out.print(medien.getName());
|
|
|
|
if (medien.istAusgeliehen) {
|
|
// Wenn das Medium ausgeliehen ist, gibt es das Rückgabedatum an
|
|
Optional<Aausleihe> ausleiheOpt = verwaltung.ausliste.stream()
|
|
.filter(ausleihe -> ausleihe.getMedien().equals(medien))
|
|
.findFirst();
|
|
|
|
if (ausleiheOpt.isPresent()) {
|
|
Aausleihe ausleihe = ausleiheOpt.get();
|
|
LocalDate rueckgabedatum = ausleihe.getDate().plusWeeks(medien.frist); // Berechnet das Rückgabedatum
|
|
System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum);
|
|
}
|
|
} else {
|
|
System.out.println(" ist verfügbar.");
|
|
}
|
|
|
|
// Hier können noch weitere Details zum Medium ausgegeben werden, falls erforderlich
|
|
System.out.println("Typ: " + medien.getClass().getSimpleName()); // Zeigt den Typ des Mediums an
|
|
// Weitere Details wie Autor, Jahr, etc. je nach Medium-Typ könnten hier hinzugefügt werden
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Registrierungsmethode
|
|
private void registrieren() {
|
|
System.out.print("Geben Sie Ihren Vornamen ein: ");
|
|
String name = scanner.nextLine();
|
|
|
|
System.out.print("Geben Sie Ihren Nachnamen ein: ");
|
|
String nachname = scanner.nextLine();
|
|
|
|
System.out.print("Für Student geben Sie 's' und für Erwachsener 'e' ein: ");
|
|
String artInput = scanner.nextLine();
|
|
|
|
// Generiere eine neue, eindeutige Kundennummer
|
|
int genkundennummer = verwaltung.generiereEindeutigeKundennummer();
|
|
|
|
// Erstelle einen neuen Benutzer
|
|
Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase());
|
|
|
|
if (neuerBenutzer != null) {
|
|
verwaltung.benutzerListe.add(neuerBenutzer); // Benutzer zur Verwaltungsliste hinzufügen
|
|
System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer);
|
|
} else {
|
|
System.out.println("Ungültige Art. Versuchen Sie es erneut.");
|
|
}
|
|
}
|
|
|
|
// Anmeldemethode
|
|
private Benutzer anmelden() {
|
|
System.out.print("Geben Sie Ihre Kundennummer zur Anmeldung ein: ");
|
|
int eingabeKundennummer = scanner.nextInt();
|
|
scanner.nextLine(); // Puffer leeren
|
|
|
|
Optional<Benutzer> benutzerOpt = verwaltung.benutzerListe.stream()
|
|
.filter(benutzer -> benutzer.getKundennummer() == eingabeKundennummer)
|
|
.findFirst();
|
|
|
|
if (benutzerOpt.isPresent()) {
|
|
System.out.println("Willkommen zurück, " + benutzerOpt.get().getName());
|
|
return benutzerOpt.get();
|
|
} else {
|
|
System.out.println("Kundennummer nicht gefunden.");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Ausleihen eines Mediums
|
|
private void ausleihen() {
|
|
Benutzer benutzer = anmelden();
|
|
if (benutzer == null) {
|
|
System.out.println("Sie müssen sich zuerst anmelden.");
|
|
return;
|
|
}
|
|
|
|
System.out.print("Geben Sie die ID des gewünschten Mediums ein: ");
|
|
int id = scanner.nextInt();
|
|
scanner.nextLine(); // Puffer leeren
|
|
|
|
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
|
|
.filter(medien -> medien.getId() == id)
|
|
.findFirst();
|
|
|
|
if (optionalMedien.isPresent()) {
|
|
Medien medien = optionalMedien.get();
|
|
if (!medien.istAusgeliehen()) {
|
|
LocalDate heute = LocalDate.now();
|
|
verwaltung.addAL(medien, benutzer, heute, null);
|
|
System.out.println("Das Medium wurde erfolgreich ausgeliehen.");
|
|
} else {
|
|
System.out.println("Das Medium ist bereits ausgeliehen.");
|
|
}
|
|
} else {
|
|
System.out.println("Medium mit dieser ID nicht gefunden.");
|
|
}
|
|
}
|
|
|
|
// Rückgabe eines Mediums
|
|
private void rueckgabeDurchfuehren() {
|
|
Benutzer benutzer = anmelden();
|
|
if (benutzer == null) {
|
|
System.out.println("Sie müssen sich zuerst anmelden.");
|
|
return;
|
|
}
|
|
|
|
System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: ");
|
|
int id = scanner.nextInt();
|
|
scanner.nextLine(); // Puffer leeren
|
|
|
|
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
|
|
.filter(medien -> medien.getId() == id)
|
|
.findFirst();
|
|
|
|
if (optionalMedien.isPresent()) {
|
|
Medien medien = optionalMedien.get();
|
|
|
|
// Benutzer nach einem Rückgabedatum fragen
|
|
System.out.println("Aktuelles Rückgabedatum: " + LocalDate.now());
|
|
System.out.print("Möchten Sie das Rückgabedatum ändern? (ja/nein): ");
|
|
String antwort = scanner.nextLine();
|
|
|
|
LocalDate rueckgabedatum;
|
|
if (antwort.equalsIgnoreCase("ja")) {
|
|
// Benutzer nach einem neuen Rückgabedatum fragen
|
|
System.out.print("Geben Sie das Rückgabedatum im Format JJJJ-MM-TT ein: ");
|
|
String datumInput = scanner.nextLine();
|
|
|
|
// Versuch, das Datum zu parsen
|
|
try {
|
|
rueckgabedatum = LocalDate.parse(datumInput);
|
|
System.out.println("Das Rückgabedatum wurde auf " + rueckgabedatum + " gesetzt.");
|
|
} catch (Exception e) {
|
|
System.out.println("Ungültiges Datum. Rückgabe wird mit dem heutigen Datum durchgeführt.");
|
|
rueckgabedatum = LocalDate.now(); // Standard auf das heutige Datum
|
|
}
|
|
} else {
|
|
// Standardmäßig wird das heutige Datum verwendet
|
|
rueckgabedatum = LocalDate.now();
|
|
}
|
|
|
|
// Rückgabe durchführen
|
|
verwaltung.rueckgabe(id, benutzer, rueckgabedatum);
|
|
System.out.println("Das Medium wurde erfolgreich zurückgegeben.");
|
|
} else {
|
|
System.out.println("Medium mit dieser ID nicht gefunden.");
|
|
}
|
|
}
|
|
|
|
|
|
private void gebuehrenEinsehen() {
|
|
Benutzer benutzer = anmelden();
|
|
if (benutzer == null) {
|
|
System.out.println("Sie müssen sich zuerst anmelden.");
|
|
return;
|
|
}
|
|
|
|
System.out.println("Ihre ausstehenden Gebühren:");
|
|
|
|
// Liste der ausgeliehenen Medien des Benutzers
|
|
List<Aausleihe> ausleihen = verwaltung.getAusleihenByBenutzer(benutzer);
|
|
|
|
if (ausleihen.isEmpty()) {
|
|
System.out.println("Sie haben keine ausgeliehenen Medien.");
|
|
return;
|
|
}
|
|
|
|
// Aktuelles Datum
|
|
LocalDate heute = LocalDate.now();
|
|
|
|
// Durchlaufe alle ausgeliehenen Medien und berechne mögliche Gebühren
|
|
for (Aausleihe ausleihe : ausleihen) {
|
|
Medien medien = ausleihe.getMedien();
|
|
LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist); // Annahme: `frist` gibt die Leihfrist in Wochen an
|
|
|
|
double gebuehr = 0;
|
|
if (heute.isAfter(faelligkeitsdatum)) {
|
|
long ueberfaelligeWochen = ChronoUnit.WEEKS.between(faelligkeitsdatum, heute);
|
|
gebuehr = ueberfaelligeWochen * 2.0; // Beispiel: 2 EUR pro überfälliger Woche
|
|
}
|
|
|
|
// Gebühr und Fälligkeitsdatum ausgeben
|
|
System.out.println("Medium: " + medien.getName() +
|
|
", Fälligkeitsdatum: " + faelligkeitsdatum +
|
|
", Überfällige Wochen: " + (heute.isAfter(faelligkeitsdatum) ? ChronoUnit.WEEKS.between(faelligkeitsdatum, heute) : 0) +
|
|
", Gebühr: " + gebuehr + " EUR");
|
|
}
|
|
}
|
|
|
|
private void verlaengern() {
|
|
Benutzer benutzer = anmelden();
|
|
if (benutzer == null) {
|
|
System.out.println("Sie müssen sich zuerst anmelden.");
|
|
return;
|
|
}
|
|
|
|
System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: ");
|
|
int id = scanner.nextInt();
|
|
scanner.nextLine(); // Puffer leeren
|
|
|
|
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
|
|
.filter(medien -> medien.getId() == id)
|
|
.findFirst();
|
|
|
|
if (optionalMedien.isPresent()) {
|
|
verwaltung.verlängern(optionalMedien.get(), benutzer);
|
|
System.out.println("Das Medium wurde verlängert.");
|
|
} else {
|
|
System.out.println("Medium mit dieser ID nicht gefunden.");
|
|
}
|
|
}
|
|
|
|
private void adminrechte() {
|
|
System.out.print("Geben Sie den Admin-Benutzernamen ein: ");
|
|
String benutzername = scanner.nextLine();
|
|
System.out.print("Geben Sie das Admin-Passwort ein: ");
|
|
String passwort = scanner.nextLine();
|
|
|
|
if (benutzername.equals("admin") && passwort.equals("admin123")) {
|
|
System.out.println("Admin-Login erfolgreich.");
|
|
verbucheUeberfaelligeGebuehren();
|
|
} else {
|
|
System.out.println("Falsche Admin-Zugangsdaten.");
|
|
}
|
|
}
|
|
|
|
private void verbucheUeberfaelligeGebuehren() {
|
|
System.out.println("Verbuchen überfälliger Gebühren:");
|
|
|
|
LocalDate heute = LocalDate.now();
|
|
|
|
for (Aausleihe ausleihe : verwaltung.ausliste) {
|
|
Medien medien = ausleihe.getMedien();
|
|
Benutzer benutzer = ausleihe.getBenutzer();
|
|
LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist);
|
|
|
|
if (heute.isAfter(faelligkeitsdatum)) {
|
|
long ueberfaelligeWochen = ChronoUnit.WEEKS.between(faelligkeitsdatum, heute);
|
|
double gebuehr = ueberfaelligeWochen * 2.0; // Beispiel: 2 EUR pro Woche überfällig
|
|
System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() +
|
|
", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR");
|
|
}
|
|
}
|
|
}
|
|
}
|