PR2-Testate/LibrarySystem/domain/benutzern/Benutzer.java

143 lines
4.3 KiB
Java

package LibrarySystem.domain.benutzern;
import LibrarySystem.domain.ausleihe.*;
import LibrarySystem.domain.medien.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public abstract class Benutzer {
private String kartennummer;
private String vorname;
private String nachname;
private int alter;
private List<Ausleihe> ausleihen;
private double offeneGebuehren;
private boolean gebuehrenBezahlt;
Benutzer(String vorname, String nachname, int alter, String prefix) {
this.kartennummer = generiereKartennummer(prefix);
this.vorname = vorname;
this.nachname = nachname;
this.alter = alter;
this.ausleihen = new ArrayList<>();
this.offeneGebuehren = 0.0;
this.gebuehrenBezahlt = true; // Zu Beginn keine Gebühren offen
}
public void aktualisiereGebuehren(LocalDate aktuellesDatum) {
if (gebuehrenBezahlt) return; // Keine Aktualisierung erforderlich, wenn bezahlt
offeneGebuehren = 0.0;
for (Ausleihe ausleihe : ausleihen) {
offeneGebuehren += ausleihe.berechneGebuehren(aktuellesDatum);
}
}
public void bezahleGebuehren() {
offeneGebuehren = 0.0;
gebuehrenBezahlt = true;
}
public void ausleihen(Medium medium, LocalDate datum) {
Ausleihe neueAusleihe = new Ausleihe(medium, datum);
ausleihen.add(neueAusleihe);
System.out.println(vorname + " " + nachname + " hat \"" + medium.getTitel() + "\" ausgeliehen. Rückgabefrist: " + neueAusleihe.getRueckgabeFrist());
gebuehrenBezahlt = false; // Neue Ausleihe bedeutet potenziell offene Gebühren
}
public void rueckgabe(int mediumId, LocalDate aktuellesDatum) {
Ausleihe zuRueckgeben = null;
for (Ausleihe ausleihe : ausleihen) {
if (ausleihe.getMedium().getID() == mediumId) {
zuRueckgeben = ausleihe;
break;
}
}
if (zuRueckgeben != null) {
ausleihen.remove(zuRueckgeben);
System.out.println("Das Medium \"" + zuRueckgeben.getMedium().getTitel() + "\" wurde zurückgegeben.");
if (aktuellesDatum.isAfter(zuRueckgeben.getRueckgabeFrist())) {
long ueberfaelligeTage = aktuellesDatum.toEpochDay() - zuRueckgeben.getRueckgabeFrist().toEpochDay();
System.out.println("Achtung: Rückgabe verspätet! Überfällig um " + ueberfaelligeTage + " Tage.");
}
} else {
System.out.println("Kein Medium mit der ID \"" + mediumId + "\" gefunden.");
}
// Noch ausgeliehene Medien anzeigen
System.out.println("Aktuell ausgeliehene Medien:");
for (Ausleihe ausleihe : ausleihen) {
System.out.println(ausleihe);
}
}
public void anzeigenAusleihen() {
System.out.println("Aktuell ausgeliehene Medien:");
for (Ausleihe ausleihe : ausleihen) {
System.out.println(ausleihe);
}
}
// Generiert eine eindeutige Kartennummer mit Präfix
private String generiereKartennummer(String prefix) {
return prefix + UUID.randomUUID().toString().substring(0, 8);
}
// Abstrakte Methode für die Jahresgebühr
public abstract double getJahresgebuehr();
public String getKartennummer() {
return kartennummer;
}
public void setkartennummer(String kartennummer) {
this.kartennummer = kartennummer;
}
public String getVorname() {
return vorname;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public String getNachname() {
return nachname;
}
public void setNachname(String nachname) {
this.nachname = nachname;
}
public int getAlter() {
return alter;
}
public void setAlter(int alter) {
this.alter = alter;
}
public List<Ausleihe> getAusleihen() {
return ausleihen;
}
public double getOffeneGebuehren() {
return offeneGebuehren;
}
public boolean sindGebuehrenBezahlt() {
return gebuehrenBezahlt;
}
@Override
public String toString() {
return "Vorame: " + vorname + ", Nachname: " + nachname + ", Alter: " + alter + ", Kartennummer: " + kartennummer;
}
}