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 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 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; } }