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 name; private int alter; private List ausleihen; private double offeneGebuehren; private boolean gebuehrenBezahlt; Benutzer(String name, int alter, String prefix) { this.kartennummer = generiereKartennummer(prefix); this.name = name; 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(name + " 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 getName() { return name; } public void setName(String name) { this.name = name; } 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 "Name: " + name + ", Alter: " + alter + ", Kartennummer: " + kartennummer; } }