Compare commits

...

7 Commits

21 changed files with 584 additions and 532 deletions

2
.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
.idea/
*.iml

View File

@ -1,5 +1,5 @@
Wie kann ich die Vererbung für Medienarten am besten strukturieren, um die unterschiedlichen Ausleihregeln und Fälligkeitsdaten zu unterstützen? Sollten die spezifischen Regeln (z. B. Ausleihfrist, Anzahl der Verlängerungen) direkt in den Medientypklassen definiert sein, oder wäre eine zentrale Verwaltung sinnvoller?
Wie kann ich die Vererbung für Medienarten am besten strukturieren, um die unterschiedlichen Ausleihregeln und Fälligkeitsdaten zu unterstützen? Sollten die spezifischen Regeln (z. B. Ausleihfrist, Anzahl der Verlängerungen) direkt in den Medientypklassen definiert sein, oder wäre eine zentrale fassade.Verwaltung sinnvoller?
Wie detailliert sollte die Benutzerverwaltung aufgebaut sein? Wäre es beispielsweise besser, getrennte Klassen für „Erwachsene“ und „Schüler/Studenten“ zu erstellen, oder würde eine allgemeine Benutzerklasse mit einem Attribut für den Benutzertyp ausreichen? Und wie lässt sich der Admin-Status am besten einbinden?
Wie detailliert sollte die Benutzerverwaltung aufgebaut sein? Wäre es beispielsweise besser, getrennte Klassen für „Erwachsene“ und „Schüler/Studenten“ zu erstellen, oder würde eine allgemeine Benutzerklasse mit einem Attribut für den Benutzertyp ausreichen? Und wie lässt sich der backend.benutzer.Admin-Status am besten einbinden?
Wie detailliert muss die Gebührenverwaltung implementiert sein, insbesondere für überfällige Medien? Soll die Logik für Gebührenberechnung und -verwaltung direkt in die Medien- oder Benutzerklassen integriert werden, oder wäre es besser, diese in eine separate Klasse oder ein Interface für mehr Flexibilität auszulagern?
Wie detailliert muss die Gebührenverwaltung implementiert sein, insbesondere für überfällige backend.medium.Medien? Soll die Logik für Gebührenberechnung und -verwaltung direkt in die backend.medium.Medien- oder Benutzerklassen integriert werden, oder wäre es besser, diese in eine separate Klasse oder ein Interface für mehr Flexibilität auszulagern?

View File

@ -1,29 +0,0 @@
class Creator {
static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) {
if (art.equals("e")) {
return new Benutzer.Erwachsener(name, nachname, kundennummer);
} else if (art.equals("s")) {
return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art);
} else {
return null;
}
}
public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) {
switch (art.toLowerCase()) {
case "buch":
return new Medien.Book(name, regisseur, id, erscheinungsjahr);
case "dvd":
return new Medien.Dvds(name, regisseur, id);
case "cd":
return new Medien.Cds(name, id);
case "sb":
return new Medien.Brettspiel(name, id);
case "videospiel":
return new Medien.Videospiel(name, regisseur, id);
default:
throw new IllegalArgumentException("Unbekannter Medientyp: " + art);
}
}
}

View File

@ -1,162 +0,0 @@
// Interface für Medien, die ausgeliehen werden können
interface Ausleihbar {
int getMaxVerlängerungen(); // Gibt die maximale Anzahl an Verlängerungen zurück
boolean kannVerlängern(); // Prüft, ob das Medium verlängerbar ist
boolean verlängern(); // Verlängert das Medium, wenn möglich
}
// Abstrakte Basisklasse für alle Medien
public abstract class Medien implements Ausleihbar {
protected String name;
protected int id;
protected int frist; // Standard-Ausleihfrist in Wochen
protected int maxVerlängerungen; // Maximale Anzahl an möglichen Verlängerungen
protected int aktuelleVerlängerungen=1; // Aktuelle Anzahl an durchgeführten Verlängerungen
protected boolean istAusgeliehen; // Status, ob das Medium ausgeliehen ist
// Konstruktor
public Medien(String name, int id, int frist, int maxVerlängerungen) {
this.name = name;
this.id = id;
this.frist = frist;
this.maxVerlängerungen = maxVerlängerungen;
this.aktuelleVerlängerungen = 0; // Initialisierung ohne Verlängerungen
// Initialer Status: nicht ausgeliehen
}
// Getter-Methoden
public String getName() {
return name;
}
public int getId() {
return id;
}
// Implementierung der Ausleihbar-Methoden
@Override
public int getMaxVerlängerungen() {
return maxVerlängerungen;
}
@Override
public boolean kannVerlängern() {
return aktuelleVerlängerungen < maxVerlängerungen;
}
@Override
public boolean verlängern() {
if (kannVerlängern()) {
aktuelleVerlängerungen++;
return true; // Verlängerung erfolgreich
}
return false; // Keine Verlängerung mehr möglich
}
public boolean istAusgeliehen() {
return istAusgeliehen;
}
public void ausleihen() {
if (!istAusgeliehen) {
istAusgeliehen = true;
} else {
System.out.println("Das Medium ist bereits ausgeliehen.");
}
}
public void zurückgeben() {
istAusgeliehen = false;
}
// Unterklasse für Bücher
public static class Book extends Medien
{
private String autor;
private int erscheinungsjahr;
public Book(String name, String autor, int id, int erscheinungsjahr) {
super(name, id, 4, 3); // Frist für Bücher ist 4 Wochen, bis zu 3 Mal verlängerbar
this.autor = autor;
this.erscheinungsjahr = erscheinungsjahr;
}
// Getter-Methoden für spezifische Eigenschaften von Büchern
public String getAutor() {
return autor;
}
public int getErscheinungsjahr() {
return erscheinungsjahr;
}
@Override
public String toString() {
return "Buch: " + name + " von " + autor + " (ID: " + id + ", Jahr: " + erscheinungsjahr + ")";
}
}
// Unterklasse für DVDs
public static class Dvds extends Medien {
private String regisseur;
public Dvds(String name, String regisseur, int id) {
super(name, id, 7, 0); // Frist für DVDs ist 1 Woche, keine Verlängerung möglich
this.regisseur = regisseur;
}
// Getter-Methoden für spezifische Eigenschaften von DVDs
public String getRegisseur() {
return regisseur;
}
@Override
public String toString() {
return "DVD: " + name + " von " + regisseur + " (ID: " + id + ")";
}
}
// Unterklasse für CDs
public static class Cds extends Medien {
public Cds(String name, int id) {
super(name, id, 14, 0); // Frist für CDs ist 2 Wochen, keine Verlängerung möglich
}
@Override
public String toString() {
return "CD: " + name + " (ID: " + id + ")";
}
}
// Unterklasse für Brettspiele
public static class Brettspiel extends Medien {
public Brettspiel(String name, int id) {
super(name, id, 14, 0); // Frist für Brettspiele ist 2 Wochen, keine Verlängerung möglich
}
@Override
public String toString() {
return "Brettspiel: " + name + " (ID: " + id + ")";
}
}
// Unterklasse für Videospiele
public static class Videospiel extends Medien {
private String entwickler;
public Videospiel(String name, String entwickler, int id) {
super(name, id, 28 , 1); // Frist für Videospiele ist 4 Wochen, einmal verlängerbar
this.entwickler = entwickler;
}
// Getter-Methoden für spezifische Eigenschaften von Videospielen
public String getEntwickler() {
return entwickler;
}
@Override
public String toString() {
return "Videospiel: " + name + " von " + entwickler + " (ID: " + id + ")";
}
}
}

View File

@ -1,9 +1,16 @@
package UI;
import backend.creator.*; // Importiert alle Klassen aus dem benutzer-Paket
import fassade.*;
// Creator gehört zum benutzer-Paket
public class Main {
public static void main(String[] args) {
// Erstelle die Instanzen
Creator creator = new Creator();
Verwaltung verwaltung = new Verwaltung();
// Medienobjekte hinzufügen
verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020));
verwaltung.mediensListe.add(creator.factoryMedien("Datenstrukturen", "Julia Schmidt", 2, "buch", 2018));
@ -16,8 +23,13 @@ public class Main {
verwaltung.mediensListe.add(creator.factoryMedien("Minecraft", "Mojang", 9, "videospiel", 0));
verwaltung.mediensListe.add(creator.factoryMedien("The Witcher 3", "CD Projekt", 10, "videospiel", 0));
// Ui mit der Verwaltung-Instanz initialisieren7
Ui ui = new Ui(verwaltung);
ui.anmeldung();
// Erstelle die fassade mit der fassade
Fassade fassade = new Fassade(verwaltung);
// UI mit der fassade.Fassade initialisieren
Ui ui = new Ui(fassade);
// Anmeldung starten
ui.starten();
}
}
}

189
UI/Ui.java 100644
View File

@ -0,0 +1,189 @@
package UI;
import backend.benutzer.*;
import fassade.*;
import backend.creator.Creator;
import java.time.LocalDate;
import java.util.Scanner;
public class Ui {
private final Fassade fassade;
private final Scanner scanner;
public Ui(Fassade fassade) {
this.fassade = fassade;
this.scanner = new Scanner(System.in);
}
public void starten() {
boolean weiter = true;
while (weiter) {
System.out.println("Bitte wählen Sie eine Option:");
System.out.println("1. Medien durchsuchen");
System.out.println("2. Benutzer registrieren");
System.out.println("3. Benutzer anmelden");
System.out.println("4. Medien ausleihen");
System.out.println("5. Medien zurückgeben");
System.out.println("6. Medien verlängern");
System.out.println("7. Gebühren einsehen");
System.out.println("8. Zeit verschieben");
System.out.println("9. Admin-Login zur Gebührenverwaltung");
System.out.println("10. Beenden");
int auswahl = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
switch (auswahl) {
case 1: durchsuchenMedien(); break;
case 2: registrierenBenutzer(); break;
case 3: anmeldenBenutzer(); break;
case 4: ausleihen(); break;
case 5: rueckgabe(); break;
case 6: verlaengern(); break;
case 7: gebuehrenEinsehen(); break;
case 8: zeitVerschieben(); break;
case 9: adminLogin(); break;
case 10: weiter = false; break;
default: System.out.println("Ungültige Auswahl."); break;
}
}
}
// Medien durchsuchen
private void durchsuchenMedien() {
System.out.print("Suchbegriff (oder 'all' für alle Medien): ");
String suchbegriff = scanner.nextLine();
var ergebnisse = fassade.durchsuchenMedien(suchbegriff);
if (ergebnisse.isEmpty()) {
System.out.println("Keine Medien gefunden.");
} else {
ergebnisse.forEach(m -> System.out.println(m));
}
}
// Benutzer registrieren
private void registrierenBenutzer() {
System.out.print("Vorname: ");
String vorname = scanner.nextLine();
System.out.print("Nachname: ");
String nachname = scanner.nextLine();
System.out.print("Benutzertyp (e für Erwachsener, s für Schüler/Student): ");
String art = scanner.nextLine();
// Benutzer über die Fassade registrieren
Benutzer benutzer = Creator.factoryBenutzer(vorname, nachname, 0, art); // Kundennummer könnte hier 0 sein, wenn sie noch nicht vergeben wurde.
if (benutzer != null) {
fassade.registriereBenutzer(benutzer);
System.out.println("Benutzer erfolgreich registriert.");
} else {
System.out.println("Fehler: Ungültiger Benutzertyp.");
}
}
// Benutzer anmelden
private void anmeldenBenutzer() {
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.println("Benutzer angemeldet: " + benutzer.getName() + " " + benutzer.getNachname());
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
// Medien ausleihen
private void ausleihen() {
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
fassade.ausleihen(medienId, benutzer, LocalDate.now(), rueckgabeDatum);
System.out.println("Ausleihe erfolgreich.");
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
// Medien zurückgeben
private void rueckgabe() {
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
fassade.rueckgabe(medienId, benutzer, rueckgabeDatum);
System.out.println("Rückgabe erfolgreich.");
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
// Medien verlängern
private void verlaengern() {
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
fassade.verlaengern(medienId, benutzer);
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
// Gebühren einsehen
private void gebuehrenEinsehen() {
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.println("Ausstehende Gebühren: " + benutzer.getGebuehren() + "€");
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
// Zeit verschieben
private void zeitVerschieben() {
System.out.print("Neue Zeit (yyyy-MM-dd): ");
String datum = scanner.nextLine();
fassade.zeitVerschieben(LocalDate.parse(datum));
System.out.println("Aktuelles Datum wurde auf " + datum + " geändert.");
}
// Admin-Login zur Gebührenverwaltung
private void adminLogin() {
System.out.print("Admin-Benutzername: ");
String benutzername = scanner.nextLine();
System.out.print("Admin-Passwort: ");
String passwort = scanner.nextLine();
if (fassade.adminLogin(benutzername, passwort)) {
System.out.println("Admin-Login erfolgreich.");
fassade.verbucheUeberfaelligeGebuehren(); // Verbucht überfällige Gebühren
} else {
System.out.println("Falsche Admin-Zugangsdaten.");
}
}
}

291
Ui.java
View File

@ -1,291 +0,0 @@
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
public class Ui {
private final Scanner scanner = new Scanner(System.in);
private final Verwaltung verwaltung;
// Zeitversatz für Tests
private LocalDate aktuelleZeit = LocalDate.now();
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("9: Zeit verschieben (Testoption)");
System.out.println("0: Programm beenden");
int menue = scanner.nextInt();
scanner.nextLine(); // Leert den Puffer nach nextInt()
switch (menue) {
case 1 -> suchenNachMedien();
case 2 -> ausleihen();
case 3 -> rueckgabeDurchfuehren();
case 4 -> gebuehrenEinsehen();
case 5 -> verlaengern();
case 6 -> adminrechte();
case 7 -> registrieren();
case 8 -> anmelden();
case 9 -> zeitVerschieben();
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) {
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);
System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum);
}
} else {
System.out.println(" ist verfügbar.");
}
}
}
}
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();
int genkundennummer = verwaltung.generiereEindeutigeKundennummer();
Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase());
if (neuerBenutzer != null) {
verwaltung.benutzerListe.add(neuerBenutzer);
System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer);
} else {
System.out.println("Ungültige Art. Versuchen Sie es erneut.");
}
}
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;
}
}
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()) {
verwaltung.addAL(medien, benutzer, aktuelleZeit, 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.");
}
}
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()) {
verwaltung.rueckgabe(id, benutzer, aktuelleZeit);
System.out.println("Das Medium wurde erfolgreich zurückgegeben.");
} else {
System.out.println("Medium mit dieser ID nicht gefunden.");
}
}
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.");
}
System.out.println("möchten sie zahlungen löschem geben sie benutzer id ein");
int id=scanner.nextInt();
}
private void verbucheUeberfaelligeGebuehren() {
System.out.println("Verbuchen überfälliger Gebühren:");
for (Aausleihe ausleihe : verwaltung.ausliste) {
Medien medien = ausleihe.getMedien();
Benutzer benutzer = ausleihe.getBenutzer();
LocalDate faelligkeitsdatum = ausleihe.getDate().plusDays(medien.frist);
if (aktuelleZeit.isAfter(faelligkeitsdatum)) {
long ueberfaelligeWochen = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit);
double gebuehr = ueberfaelligeWochen;
System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() +
", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR");
}
}
}
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:");
List<Aausleihe> ausleihen = verwaltung.getAusleihenByBenutzer(benutzer);
if (ausleihen.isEmpty()) {
System.out.println("Sie haben keine ausgeliehenen Medien.");
return;
}
boolean hatAusgelieheneMedien = false;
for (Aausleihe ausleihe : ausleihen) {
Medien medien = ausleihe.getMedien();
// Prüfen, ob das Medium ausgeliehen ist
if (!medien.istAusgeliehen()) {
continue; // Überspringt Medien, die nicht ausgeliehen sind
}
hatAusgelieheneMedien = true; // Mindestens ein Medium ist ausgeliehen
LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist);
double gebuehr = 0;
// Gebühren berechnen, wenn das Medium überfällig ist
if (aktuelleZeit.isAfter(faelligkeitsdatum)) {
long ueberfaelligeTage = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit);
gebuehr = ueberfaelligeTage * 2.0; // 2 EUR pro überfälligem Tag
}
// Details zum Medium ausgeben
System.out.println("Medium: " + medien.getName() +
", Fälligkeitsdatum: " + faelligkeitsdatum +
", Gebühr: " + gebuehr + " EUR");
}
if (!hatAusgelieheneMedien) {
System.out.println("Sie haben keine ausgeliehenen Medien.");
}
}
private void zeitVerschieben() {
System.out.println("Aktuelles Datum: " + aktuelleZeit);
System.out.print("Geben Sie das neue Datum im Format JJJJ-MM-TT ein: ");
String neuesDatum = scanner.nextLine();
try {
aktuelleZeit = LocalDate.parse(neuesDatum);
System.out.println("Die Zeit wurde erfolgreich auf " + aktuelleZeit + " geändert.");
} catch (Exception e) {
System.out.println("Ungültiges Datum. Bitte versuchen Sie es erneut.");
}
}
}

View File

@ -1,13 +1,15 @@
package backend.benutzer;
class Admin {
private final String name = "zabih";
private final String nachname = "Mansuri";
private final int passwort = 1234;
private final String art = "Admin";
private final String art = "backend.benutzer.Admin";
// Getter-Methoden
public String getName() {
return name;
return name;//return
}
public String getNachname() {
@ -24,7 +26,7 @@ class Admin {
@Override
public String toString() {
return "Admin{" +
return "backend.benutzer.Admin{" +
"Name='" + name + '\'' +
", Nachname='" + nachname + '\'' +
", Passwort=" + passwort +

View File

@ -1,4 +1,7 @@
abstract class Benutzer {
// Datei: Benutzer.java
package backend.benutzer;
public abstract class Benutzer {
private String name;
private String nachname;
private int kundennummer;
@ -8,7 +11,7 @@ abstract class Benutzer {
private double gebuehren; // Aktuelle ausstehende Gebühren des Benutzers
// Konstruktor
public Benutzer(String name, String nachname, int kundennummer, String art) {
public Benutzer(String name, String nachname, int kundennummer, String art) {
this.name = name;
this.nachname = nachname;
this.kundennummer = kundennummer;
@ -24,6 +27,10 @@ abstract class Benutzer {
}
this.gebuehren = 0.0; // Anfangs keine Gebühren
}
public void addGebuehr(double betrag) {
this.gebuehren += betrag; // Beispiel: Der Betrag wird zur bestehenden Gebühr des Benutzers hinzugefügt
}
// Getter- und Setter-Methoden
public String getName() {
@ -66,21 +73,4 @@ abstract class Benutzer {
", Ausstehende Gebühren=" + gebuehren +
'}';
}
// Spezifische Benutzertypen als Unterklassen
public static class Erwachsener extends Benutzer {
public Erwachsener(String name, String nachname, int kundennummer) {
super(name, nachname, kundennummer, "Erwachsener");
}
}
public static class SchuelerStudent extends Benutzer {
public SchuelerStudent(String name, String nachname, int kundennummer,String art) {
super(name, nachname, kundennummer,art);
}
}
}

View File

@ -0,0 +1,8 @@
// Datei: Erwachsener.java
package backend.benutzer;
public class Erwachsener extends Benutzer {
public Erwachsener(String name, String nachname, int kundennummer) {
super(name, nachname, kundennummer, "Erwachsener");
}
}

View File

@ -0,0 +1,8 @@
// Datei: SchuelerStudent.java
package backend.benutzer;
public class SchuelerStudent extends Benutzer {
public SchuelerStudent(String name, String nachname, int kundennummer, String art) {
super(name, nachname, kundennummer, art);
}
}

View File

@ -0,0 +1,34 @@
package backend.creator; // Creator gehört zum benutzer-Paket
import backend.medium.*; // Importiert alle Klassen aus dem medium-Paket
import backend.benutzer.*;// Optional, falls du auf die anderen Benutzer-Klassen zugreifen möchtest
public class Creator {
// Factory-Methode für Benutzer
public static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) {
if (art.equalsIgnoreCase("e")) {
return new Erwachsener(name, nachname, kundennummer); // Erstelle einen Erwachsenen
} else if (art.equalsIgnoreCase("s")) {
return new SchuelerStudent(name, nachname, kundennummer, art); // Erstelle einen Schüler/Studenten
} else {
return null; // Unbekannte Benutzerart
}
}
// Factory-Methode für backend.medium.Medien
public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) {
switch (art.toLowerCase()) {
case "buch":
return new Book(name, regisseur, id, erscheinungsjahr);
case "dvd":
return new Dvds(name, regisseur, id);
case "cd":
return new Cds(name, id);
case "sb":
return new Brettspiel(name, id);
case "videospiel":
return new Videospiel(name, regisseur, id);
default:
throw new IllegalArgumentException("Unbekannter Medientyp: " + art);
}
}
}

View File

@ -0,0 +1,26 @@
package backend.medium;
public class Book extends Medien {
private String autor;
private int erscheinungsjahr;
public Book(String name, String autor, int id, int erscheinungsjahr) {
super(name, id, 4, 3); // Frist für Bücher ist 4 Wochen, bis zu 3 Mal verlängerbar
this.autor = autor;
this.erscheinungsjahr = erscheinungsjahr;
}
// Getter-Methoden für spezifische Eigenschaften von Büchern
public String getAutor() {
return autor;
}
public int getErscheinungsjahr() {
return erscheinungsjahr;
}
@Override
public String toString() {
return "Buch: " + name + " von " + autor + " (ID: " + id + ", Jahr: " + erscheinungsjahr + ")";
}
}

View File

@ -0,0 +1,12 @@
package backend.medium;
public class Brettspiel extends Medien {
public Brettspiel(String name, int id) {
super(name, id, 14, 0); // Frist für Brettspiele ist 2 Wochen, keine Verlängerung möglich
}
@Override
public String toString() {
return "backend.medium.Brettspiel: " + name + " (ID: " + id + ")";
}
}

View File

@ -0,0 +1,12 @@
package backend.medium;
public class Cds extends Medien {
public Cds(String name, int id) {
super(name, id, 14, 0); // Frist für CDs ist 2 Wochen, keine Verlängerung möglich
}
@Override
public String toString() {
return "CD: " + name + " (ID: " + id + ")";
}
}

View File

@ -0,0 +1,20 @@
package backend.medium;
public class Dvds extends Medien {
private String regisseur;
public Dvds(String name, String regisseur, int id) {
super(name, id, 7, 0); // Frist für DVDs ist 1 Woche, keine Verlängerung möglich
this.regisseur = regisseur;
}
// Getter-Methoden für spezifische Eigenschaften von DVDs
public String getRegisseur() {
return regisseur;
}
@Override
public String toString() {
return "DVD: " + name + " von " + regisseur + " (ID: " + id + ")";
}
}

View File

@ -0,0 +1,76 @@
package backend.medium;
// Interface für backend.medium.Medien, die ausgeliehen werden können
interface Ausleihbar {
int getMaxVerlängerungen(); // Gibt die maximale Anzahl an Verlängerungen zurück
boolean kannVerlängern(); // Prüft, ob das Medium verlängerbar ist
boolean verlängern(); // Verlängert das Medium, wenn möglich
}
// Abstrakte Basisklasse für alle backend.medium.Medien
public abstract class Medien implements Ausleihbar {
protected String name;
protected int id;
protected int frist; // Standard-Ausleihfrist in Wochen
protected int maxVerlängerungen; // Maximale Anzahl an möglichen Verlängerungen
protected int aktuelleVerlängerungen = 0; // Aktuelle Anzahl an durchgeführten Verlängerungen
public boolean istAusgeliehen; // Status, ob das Medium ausgeliehen ist
// Konstruktor
public Medien(String name, int id, int frist, int maxVerlängerungen) {
this.name = name;
this.id = id;
this.frist = frist;
this.maxVerlängerungen = maxVerlängerungen;
}
// Getter-Methoden
public String getName() {
return name;
}
public int getId() {
return id;
}
// Implementierung der backend.medium.Ausleihbar-Methoden
@Override
public int getMaxVerlängerungen() {
return maxVerlängerungen;
}
@Override
public boolean kannVerlängern() {
return aktuelleVerlängerungen < maxVerlängerungen;
}
@Override
public boolean verlängern() {
if (kannVerlängern()) {
aktuelleVerlängerungen++;
return true; // Verlängerung erfolgreich
}
return false; // Keine Verlängerung mehr möglich
}
public boolean istAusgeliehen() {
return istAusgeliehen;
}
public void ausleihen() {
if (!istAusgeliehen) {
istAusgeliehen = true;
} else {
System.out.println("Das Medium ist bereits ausgeliehen.");
}
}
public int getAktuelleVerlängerungen() {
return aktuelleVerlängerungen;
}
public void zurückgeben() {
istAusgeliehen = false;
}
}

View File

@ -0,0 +1,20 @@
package backend.medium;
public class Videospiel extends Medien {
private String entwickler;
public Videospiel(String name, String entwickler, int id) {
super(name, id, 28, 1); // Frist für Videospiele ist 4 Wochen, einmal verlängerbar
this.entwickler = entwickler;
}
// Getter-Methoden für spezifische Eigenschaften von Videospielen
public String getEntwickler() {
return entwickler;
}
@Override
public String toString() {
return "backend.medium.Videospiel: " + name + " von " + entwickler + " (ID: " + id + ")";
}
}

View File

@ -1,3 +1,8 @@
package fassade;
import backend.medium.Medien;
import backend.benutzer.*;
import java.time.LocalDate;
public class Aausleihe {
@ -6,7 +11,7 @@ public class Aausleihe {
private LocalDate date; // Ausleihdatum
private LocalDate rueckgabeDatum; // Rückgabedatum
// Konstruktor für die Aausleihe
// Konstruktor für die fassade.Aausleihe
Aausleihe(Medien medien, Benutzer benutzer, LocalDate date, LocalDate rueckgabeDatum) {
this.medien = medien;
this.benutzer = benutzer;
@ -41,7 +46,7 @@ public class Aausleihe {
@Override
public String toString() {
return "Aausleihe{" +
return "fassade.Aausleihe{" +
"medien=" + medien +
", benutzer=" + benutzer +
", ausleihdatum=" + date +

View File

@ -0,0 +1,110 @@
package fassade;
import backend.medium.Medien;
import backend.benutzer.*;
import fassade.Aausleihe;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import java.time.temporal.ChronoUnit;
public class Fassade {
private final Verwaltung verwaltung;
private LocalDate aktuellesDatum;
// Dummy Admin-Zugangsdaten
private static final String ADMIN_USERNAME = "admin";
private static final String ADMIN_PASSWORD = "admin123";
// Konstruktor
public Fassade(Verwaltung verwaltung) {
this.verwaltung = verwaltung;
this.aktuellesDatum = LocalDate.now(); // Initiales Datum ist das heutige Datum
}
// Benutzer registrieren
public void registriereBenutzer(Benutzer benutzer) {
verwaltung.addBenutzer(benutzer); // Benutzer zur fassade.Verwaltung hinzufügen
}
// Benutzer anmelden
public Benutzer anmeldenBenutzer(int kundennummer) {
return verwaltung.benutzerListe.stream()
.filter(b -> b.getKundennummer() == kundennummer)
.findFirst()
.orElse(null); // Gibt null zurück, wenn Benutzer nicht gefunden wurde
}
// backend.medium.Medien durchsuchen
public List<Medien> durchsuchenMedien(String suchbegriff) {
return verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff);
}
// backend.medium.Medien ausleihen
public void ausleihen(int medienId, Benutzer benutzer, LocalDate ausleihDatum, LocalDate rueckgabeDatum) {
Medien medien = verwaltung.mediensListe.stream()
.filter(m -> m.getId() == medienId)
.findFirst()
.orElse(null);
if (medien != null) {
verwaltung.addAL(medien, benutzer, ausleihDatum, rueckgabeDatum); // Leihe das Medium aus
} else {
System.out.println("backend.medium.Medien nicht gefunden.");
}
}
// backend.medium.Medien zurückgeben
public void rueckgabe(int medienId, Benutzer benutzer, LocalDate rueckgabeDatum) {
verwaltung.rueckgabe(medienId, benutzer, rueckgabeDatum); // Rückgabe des Mediums
}
// backend.medium.Medien verlängern
public void verlaengern(int medienId, Benutzer benutzer) {
Medien medien = verwaltung.mediensListe.stream()
.filter(m -> m.getId() == medienId)
.findFirst()
.orElse(null);
if (medien != null) {
verwaltung.verlängern(medien, benutzer); // Verlängere die Leihfrist
} else {
System.out.println("backend.medium.Medien nicht gefunden.");
}
}
// Zeit verschieben
public void zeitVerschieben(LocalDate neuesDatum) {
this.aktuellesDatum = neuesDatum; // Aktuelles Datum auf das neue Datum setzen
}
// Aktuelles Datum abrufen
public LocalDate getAktuellesDatum() {
return aktuellesDatum; // Gibt das aktuelle Datum zurück
}
// Admin-Login-Methode
public boolean adminLogin(String benutzername, String passwort) {
return ADMIN_USERNAME.equals(benutzername) && ADMIN_PASSWORD.equals(passwort);
}
// Methode zum Verbuchen überfälliger Gebühren
public void verbucheUeberfaelligeGebuehren() {
// Hole alle überfälligen Ausleihen
List<Aausleihe> ueberfaelligAusleihen = verwaltung.getAlleAusleihen().stream()
.filter(ausleihe -> LocalDate.now().isAfter(ausleihe.getRueckgabeDatum()) && !ausleihe.getMedien().istAusgeliehen())
.collect(Collectors.toList());
// Gebühr für jede überfällige Ausleihe berechnen und dem Benutzer hinzufügen
for (Aausleihe ausleihe : ueberfaelligAusleihen) {
Benutzer benutzer = ausleihe.getBenutzer();
long ueberfaelligeTage = ChronoUnit.DAYS.between(ausleihe.getRueckgabeDatum(), LocalDate.now());
double gebuehr = ueberfaelligeTage * 2.0; // Beispiel: 2 EUR pro überfälligem Tag
benutzer.addGebuehr(gebuehr); // Gebühr dem Benutzer hinzufügen
System.out.println("Gebühr für " + benutzer.getName() + ": " + gebuehr + " EUR");
}
}
}

View File

@ -1,4 +1,8 @@
import javax.crypto.spec.PSource;
package fassade;
import backend.benutzer.*;
import backend.medium.*;
import backend.creator.Creator;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
@ -8,8 +12,8 @@ import java.util.stream.Collectors;
public class Verwaltung {
LinkedList<Medien> mediensListe = new LinkedList<>();
LinkedList<Benutzer> benutzerListe = new LinkedList<>();
public LinkedList<Medien> mediensListe = new LinkedList<>();
public LinkedList<Benutzer> benutzerListe = new LinkedList<>();
static LinkedList<Aausleihe> ausliste = new LinkedList<>();
Long wochenDauer;
@ -28,6 +32,10 @@ public class Verwaltung {
return new Random().ints(7, 0, 10)
.reduce(0, (acc, digit) -> acc * 10 + digit);
}
public List<Aausleihe> getAlleAusleihen() {
return new ArrayList<>(ausliste); // gibt alle Ausleihen zurück
}
public int generiereEindeutigeKundennummer() {
@ -53,15 +61,15 @@ public class Verwaltung {
boolean gefunden = false;
// Überprüfe, ob die Art des Mediums im Suchbegriff enthalten ist
if (medien instanceof Medien.Book) {
if (medien instanceof Book) {
gefunden |= "buch".contains(suchbegriffKlein);
} else if (medien instanceof Medien.Dvds) {
} else if (medien instanceof Dvds) {
gefunden |= "dvd".contains(suchbegriffKlein);
} else if (medien instanceof Medien.Cds) {
} else if (medien instanceof Cds) {
gefunden |= "cd".contains(suchbegriffKlein);
} else if (medien instanceof Medien.Brettspiel) {
gefunden |= "sb".contains(suchbegriffKlein); // "sb" für Brettspiel
} else if (medien instanceof Medien.Videospiel) {
} else if (medien instanceof Brettspiel) {
gefunden |= "sb".contains(suchbegriffKlein); // "sb" für backend.medium.Brettspiel
} else if (medien instanceof Videospiel) {
gefunden |= "videospiel".contains(suchbegriffKlein);
}
@ -80,10 +88,10 @@ public class Verwaltung {
System.out.println("Das Medium ist bereits ausgeliehen.");
} else {
Aausleihe aausleihe = new Aausleihe(medien, benutzer, ausleihDatum,reuckgabeDatum); // Neues Aausleihe-Objekt erstellen
Aausleihe aausleihe = new Aausleihe(medien, benutzer, ausleihDatum,reuckgabeDatum); // Neues fassade.Aausleihe-Objekt erstellen
ausliste.add(aausleihe);
medien.istAusgeliehen = true;
medien.maxVerlängerungen--;
}
}
@ -132,9 +140,9 @@ public class Verwaltung {
void rueckgabe(int medienId, Benutzer benutzer, LocalDate rueckgabeDatum) {
// Durchsuche die Ausleihen (ausliste) nach einer Übereinstimmung mit Medien-ID und Benutzer-ID
// Durchsuche die Ausleihen (ausliste) nach einer Übereinstimmung mit backend.medium.Medien-ID und Benutzer-ID
for (Aausleihe ausleihe : ausliste) {
// Vergleiche Medien-ID und Benutzer-ID
// Vergleiche backend.medium.Medien-ID und Benutzer-ID
if (ausleihe.getMedien().getId() == medienId && ausleihe.getBenutzer().equals(benutzer)) {
// Wenn das Medium und der Benutzer übereinstimmen
ausleihe.setRueckgabeDatum(rueckgabeDatum); // Setze das Rückgabedatum
@ -153,7 +161,7 @@ public class Verwaltung {
public void verbuchenGebuehren(Benutzer benutzer) {
// Admin prüft, ob Gebühren vorhanden sind
// backend.benutzer.Admin prüft, ob Gebühren vorhanden sind
double gebuehren = benutzer.getGebuehren();
if (gebuehren > 0) {
System.out.println("Gebühren von " + gebuehren + "€ wurden erfolgreich verbucht.");
@ -164,14 +172,13 @@ public class Verwaltung {
}
public void verlängern(Medien medien, Benutzer benutzer) {
public void verlängern(Medien medien, Benutzer benutzer) {
for (Aausleihe aausleihe : ausliste) {
// Überprüfen, ob das richtige Medium und der richtige Benutzer vorliegen
if (aausleihe.getMedien().equals(medien) && aausleihe.getBenutzer().equals(benutzer)) {
if (medien.verlängern()&& medien.kannVerlängern()) { // Medien.verlängern() prüft, ob noch Verlängerungen möglich sind
if (medien.kannVerlängern()) { // backend.medium.Medien.verlängern() prüft, ob noch Verlängerungen möglich sind
System.out.println("Das Medium wurde erfolgreich verlängert. Aktuelle Verlängerungen: " + medien.getMaxVerlängerungen());
medien.maxVerlängerungen--;
medien.aktuelleVerlängerungen++;
medien.verlängern();
} else {
System.out.println("Keine weitere Verlängerung möglich. Maximale Anzahl erreicht.");
}
@ -187,6 +194,7 @@ public class Verwaltung {
public double berechneGebuehren(Aausleihe aausleihe, LocalDate aktuellesDatum) {
long tageÜberfällig = ChronoUnit.DAYS.between(aausleihe.getRueckgabeDatum(), aktuellesDatum);
if (tageÜberfällig <= 0) {