Erste Kommentare hinzugefügt als auch nach Tests erweiterung des Programms um Anforderungen zu erfüllen

development
Leon Maximilian Löhle 2024-11-19 10:37:32 +01:00
parent f29119eb09
commit 9a4e99d73c
13 changed files with 196 additions and 58 deletions

View File

@ -36,9 +36,4 @@ public class Admin extends User {
System.out.println("- " + medien.getTitel() + " (Rückgabedatum: " + medien.getRueckgabedat() + ")")
);
}
@Override
public void rolleAnzeigen() {
System.out.println("Admin: " + name);
}
}

View File

@ -1,5 +1,6 @@
package Bibliothek;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@ -9,6 +10,8 @@ public class Bibliotheksverwaltung {
private Map<String, Kunde> kundenListe;
private Map<String, Admin> adminListe;
private User eingeloggterBenutzer;
private LocalDate aktuellesDatum = LocalDate.now();
public Bibliotheksverwaltung() {
medienBestand = new HashMap<>();
@ -16,6 +19,9 @@ public class Bibliotheksverwaltung {
adminListe = new HashMap<>();
}
/**
* Getter Methoden
*/
public Map<String, Kunde> getKundenListe() {
return kundenListe;
}
@ -28,24 +34,63 @@ public class Bibliotheksverwaltung {
return eingeloggterBenutzer;
}
public List<Medien> sucheMedienNachTitel(String titel) {
public LocalDate getAktuellesDatum() {
return aktuellesDatum;
}
/**
* Setter für Datumsmanipulation
*
* @param datum
*/
public void setAktuellesDatum(LocalDate datum) {
this.aktuellesDatum = datum;
System.out.println("Systemdatum auf " + aktuellesDatum + " gesetzt.");
}
/**
* Methode mit der man nach Medien suchen kann und angezeigt bekommt ob die Medien geführt werden, ob sie
* verfügbar sind oder ob sie ausgeliehen sind sowohl als auch bis wann ausgeliehen
*
* @param titel
* @return
*/
public List<String> sucheMedienNachTitel(String titel) {
return medienBestand.values().stream()
.filter(medien -> medien.getTitel().toLowerCase().contains(titel.toLowerCase()))
.map(medien -> {
String status = medien.verfuegbar()
? "[Verfügbar]"
: "[Ausgeliehen bis: " + medien.getRueckgabedat() + "]";
return medien.getDetails() + " " + status;
})
.collect(Collectors.toList());
}
/**
* Zeigt alle Medien die in der Bib geführt werden, ebenfalls mit der Info verfügbar oder ausgeliehen
*/
public void alleMedienAnzeigen() {
if (medienBestand.isEmpty()) {
System.out.println("Keine Medien im Bestand.");
} else {
System.out.println("Medienbestand:");
medienBestand.values().forEach(m ->
System.out.println("- " + m.getDetails() +
(m.verfuegbar() ? " [Verfügbar]" : " [Ausgeliehen]"))
);
medienBestand.values().forEach(medien -> {
String status = medien.verfuegbar()
? "[Verfügbar]"
: "[Ausgeliehen bis: " + medien.getRueckgabedat() + "]";
System.out.println("- " + medien.getDetails() + " " + status);
});
}
}
/**
* Methode um ein Medium auszuleihen
* Kunde muss dafür eingeloggt sein, Medium kann nicht mehrfach ausgeliehen werden
*
* @param medienId
*/
public void medienAusleihen(String medienId) {
medienId = medienId.trim().toUpperCase(); // Normalisierung
Medien medien = medienBestand.get(medienId);
@ -68,12 +113,16 @@ public class Bibliotheksverwaltung {
System.out.println("Medium erfolgreich ausgeliehen: " + medien.getTitel());
}
/**
* Kunde gibt sein ausgeliehens Medium zurück, wenn er überzogen hat
* wird dem konto die Überziehungsgebühr addiert
*
* @param medienId
* @param kundenId
*/
public void medienZurueckgeben(String medienId, String kundenId) {
Medien medien = medienBestand.get(medienId);
Kunde kunde = kundenListe.get(kundenId);
if (medien == null) {
System.out.println("Medium nicht gefunden.");
return;
@ -83,14 +132,20 @@ public class Bibliotheksverwaltung {
return;
}
if (kunde.getAusgelieheneMedien().contains(medien)) {
double gebuehren = medien.berechneGebuehren(aktuellesDatum);
kunde.addGebuehren(gebuehren); // Gebühren hinzufügen
kunde.medienZurueckgeben(medien);
medien.setVerfuegbar(true);
System.out.println("Medium erfolgreich zurückgegeben: " + medien.getTitel());
if (gebuehren > 0) {
System.out.println("Überziehungsgebühren: " + gebuehren + " € wurden dem Konto hinzugefügt.");
}
} else {
System.out.println("Dieses Medium wurde nicht von diesem Kunden ausgeliehen.");
}
}
public void medienVerlaengern(String medienId, String kundenId, int aktuelleVerlaengerungen) {
Medien medien = medienBestand.get(medienId);
Kunde kunde = kundenListe.get(kundenId);
@ -157,6 +212,7 @@ public class Bibliotheksverwaltung {
System.out.println("Kein Benutzer ist eingeloggt.");
}
}
public Kunde registriereKunde(String name, boolean istStudent) {
String prefix = istStudent ? "S" : "K";
int maxId = kundenListe.keySet().stream()
@ -172,4 +228,32 @@ public class Bibliotheksverwaltung {
return neuerKunde;
}
public void zeigeAusgelieheneMedien() {
if (!(eingeloggterBenutzer instanceof Kunde)) {
System.out.println("Nur eingeloggte Kunden können ausgeliehene Medien anzeigen.");
return;
}
Kunde kunde = (Kunde) eingeloggterBenutzer;
List<Medien> ausgelieheneMedien = kunde.getAusgelieheneMedien();
if (ausgelieheneMedien.isEmpty()) {
System.out.println("Es wurden keine Medien ausgeliehen.");
} else {
System.out.println("Ausgeliehene Medien:");
ausgelieheneMedien.forEach(medien -> {
double gebuehren = medien.berechneGebuehren(aktuellesDatum);
String status = medien.verfuegbar()
? "[Verfügbar]"
: "[Ausgeliehen bis: " + medien.getRueckgabedat() + ", Gebühren: " + gebuehren + " €]";
System.out.println("- " + medien.getDetails() + " " + status);
});
}
}
public void pruefeUeberzogeneMedien() {
System.out.println("Überzogene Medien (Stand: " + aktuellesDatum + "):");
medienBestand.values().stream()
.filter(medien -> !medien.verfuegbar() && medien.istUeberzogen(aktuellesDatum))
.forEach(medien -> System.out.println("- " + medien.getDetails() + " (Rückgabedatum: " + medien.getRueckgabedat() + ")"));
}
}

View File

@ -5,7 +5,7 @@ public class Brettspiel extends Medien {
private int spieldauer;
public Brettspiel(String titel, String id, int erscheinungsjahr, int spieleranzahl, int spieldauer) {
super(id, titel, erscheinungsjahr);
super(titel, id, erscheinungsjahr);
this.spieleranzahl = spieleranzahl;
this.spieldauer = spieldauer;
}

View File

@ -5,7 +5,7 @@ public class Buch extends Medien {
private int seitenanzahl;
public Buch(String titel, String id, int erscheinungsjahr, String autor, int seitenanzahl) {
super(titel ,id, erscheinungsjahr);
super(titel, id, erscheinungsjahr);
this.autor = autor;
this.seitenanzahl = seitenanzahl;
}

View File

@ -1,10 +1,12 @@
package Bibliothek;
import java.time.LocalDate;
import java.util.function.Consumer;
public class Kunde extends User {
private boolean istStudent; // True, wenn Kunde ein Student ist
private double gebuehren; // Offene Gebühren
private double gebuehren;
; // Offene Gebühren
public Kunde(String id, String name, boolean istStudent) {
super(id, name);
@ -20,27 +22,23 @@ public class Kunde extends User {
return gebuehren;
}
public void addGebuehren(double betrag) {
if (betrag > 0) {
this.gebuehren += betrag;
}
}
public void gebuehrenErhoehen(double betrag) {
this.gebuehren += betrag;
}
public void berechneGebuehren() {
// Gebühren berechnen basierend auf verspäteter Rückgabe
ausgelieheneMedien.forEach(medien -> {
if (medien.getRueckgabedat().isBefore(java.time.LocalDate.now())) {
int ueberfaelligeTage = java.time.Period.between(
medien.getRueckgabedat(),
java.time.LocalDate.now()
).getDays();
double tagessatz = istStudent ? 0.5 : 1.0; // Studenten zahlen 50% weniger
gebuehren += ueberfaelligeTage <= 7
? ueberfaelligeTage * tagessatz
: (7 * tagessatz) + ((ueberfaelligeTage - 7) * 2);
}
});
public double berechneGesamtgebuehren(LocalDate aktuellesDatum) {
return ausgelieheneMedien.stream()
.mapToDouble(medien -> medien.berechneGebuehren(aktuellesDatum))
.sum();
}
public boolean medienVerlaengern(Medien medien, int aktuelleVerlaengerungen) {
Consumer<Medien> verlaengerung = m -> {
if (ausgelieheneMedien.contains(m) && m.verlaengern(aktuelleVerlaengerungen)) {
@ -52,9 +50,4 @@ public class Kunde extends User {
verlaengerung.accept(medien);
return false;
}
@Override
public void rolleAnzeigen() {
System.out.println("Kunde: " + name + (istStudent ? " (Student)" : " (Erwachsener)"));
}
}

View File

@ -3,25 +3,39 @@ package Bibliothek;
public class Main {
public static void main(String[] args) {
Bibliotheksverwaltung verwaltung = new Bibliotheksverwaltung();
Kunde kunde1 = new Kunde("S001", "Max Mustermann", true);
Kunde kunde2 = new Kunde("K001", "Lisa Müller", false);
/**
* Hart codierte Kunden und Admin
*/
Kunde kunde1 = new Kunde("S1", "Max Mustermann", true);
Kunde kunde2 = new Kunde("K1", "Lisa Müller", false);
verwaltung.getKundenListe().put(kunde1.getId(), kunde1);
verwaltung.getKundenListe().put(kunde2.getId(), kunde2);
Admin admin = new Admin("A001", "Anna Schmidt");
Admin admin = new Admin("A1", "Anna Schmidt");
verwaltung.getAdminListe().put(admin.getId(), admin);
Medien buch1 = new Buch("Der Herr der Ringe", "B001", 1954, "J.R.R. Tolkien", 1200);
Medien buch2 = new Buch("Game of Thrones 1: Der Winter naht", "B002", 1996, "George R.R. Martin", 576);
Medien buch3 = new Buch("Harry Potter and the Prisoner of Azkaban", "B003", 2014, "J.K. Rowling", 480);
Medien dvd1 = new DVD("Inception", "D001", 2010, "Christopher Nolan", 148);
Medien dvd2 = new DVD("Batman 'The Dark Knight'", "D002", 2008, "Christopher Nolan", 152);
Medien dvd3 = new DVD("Star Wars: Episode 3 'Die Rache der Sith'", "D003", 2005, "George Lucas", 140);
Medien cd1 = new CD("Black Ice", "CD001", 2001, "ACDC", 15);
Medien cd2 = new CD("From Zero", "CD002", 2024, "Linkin Park", 11);
Medien cd3 = new CD("The War to end all Wars", "CD003", 2022, "Sabaton", 10);
/**
* Hart codierte Medien
*/
Medien buch1 = new Buch("Der Herr der Ringe", "B1", 1954, "J.R.R. Tolkien", 1200);
Medien buch2 = new Buch("Game of Thrones 1: Der Winter naht", "B2", 1996, "George R.R. Martin", 576);
Medien buch3 = new Buch("Harry Potter and the Prisoner of Azkaban", "B3", 2014, "J.K. Rowling", 480);
Medien dvd1 = new DVD("Inception", "D1", 2010, "Christopher Nolan", 148);
Medien dvd2 = new DVD("Batman 'The Dark Knight'", "D2", 2008, "Christopher Nolan", 152);
Medien dvd3 = new DVD("Star Wars: Episode 3 'Die Rache der Sith'", "D3", 2005, "George Lucas", 140);
Medien cd1 = new CD("Black Ice", "CD1", 2001, "ACDC", 15);
Medien cd2 = new CD("From Zero", "CD2", 2024, "Linkin Park", 11);
Medien cd3 = new CD("The War to end all Wars", "CD3", 2022, "Sabaton", 10);
Medien br1 = new Brettspiel("Wizard", "BR1", 1984, 4, 50);
Medien br2 = new Brettspiel("Mensch Ärgere dich nicht", "BR2", 1910, 6, 50);
Medien br3 = new Brettspiel("Monopoly Star Wars Edition", "BR3", 2016, 4, 60);
Medien vd1 = new Videospiel("Cyberpunk2077", "VD1", 2022, "PC/PS5/XBOX", "CD Projekt Red");
Medien vd2 = new Videospiel("Landwirtschafts-Simulator 25", "VD2", 2024, "PC/PS5/XBOX", "Giants");
Medien vd3 = new Videospiel("CFB25", "VD3", 2024, "PC/PS5/XBOX", "EA-Sports");
/**
* Hinzufügen Methode der hart codierten Medien
*/
verwaltung.medienHinzufuegen(buch1);
verwaltung.medienHinzufuegen(buch2);
verwaltung.medienHinzufuegen(buch3);
@ -31,6 +45,12 @@ public class Main {
verwaltung.medienHinzufuegen(cd1);
verwaltung.medienHinzufuegen(cd2);
verwaltung.medienHinzufuegen(cd3);
verwaltung.medienHinzufuegen(br1);
verwaltung.medienHinzufuegen(br2);
verwaltung.medienHinzufuegen(br3);
verwaltung.medienHinzufuegen(vd1);
verwaltung.medienHinzufuegen(vd2);
verwaltung.medienHinzufuegen(vd3);
// Starte UI
UI tui = new UI(verwaltung);

View File

@ -15,15 +15,19 @@ public abstract class Medien {
this.id = id;
this.erscheinungsjahr = erscheinungsjahr;
}
public String getTitel() {
return titel;
}
public void setTitel(String titel) {
this.titel = titel;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@ -32,19 +36,24 @@ public abstract class Medien {
return rueckgabedat;
}
public boolean verfuegbar(){
public boolean verfuegbar() {
return verfuegbar;
}
public int getErscheinungsjahr() {
return erscheinungsjahr;
}
public void setErscheinungsjahr(int er) {
this.erscheinungsjahr = er;
}
public void setVerfuegbar(boolean verfuegbar) {
this.verfuegbar = verfuegbar;
}
public abstract int getAusleihdauer();
public abstract int getMaxVerlaengerungen();
public void ausleihen() {
@ -75,5 +84,19 @@ public abstract class Medien {
rueckgabedat = null;
}
public boolean istUeberzogen(LocalDate aktuellesDatum) {
return rueckgabedat != null && rueckgabedat.isBefore(aktuellesDatum);
}
public double berechneGebuehren(LocalDate aktuellesDatum) {
if (rueckgabedat == null || !istUeberzogen(aktuellesDatum)) {
return 0.0; // Keine Gebühren, wenn nicht überzogen
}
long ueberzogeneTage = java.time.temporal.ChronoUnit.DAYS.between(rueckgabedat, aktuellesDatum);
return ueberzogeneTage * 0.50; // Beispiel: 0.50 Euro pro überzogenem Tag
}
public abstract String getDetails();
}

View File

@ -1,5 +1,6 @@
package Bibliothek;
import java.time.LocalDate;
import java.util.Scanner;
public class UI {
@ -35,6 +36,8 @@ public class UI {
System.out.println("10. Gebühren anzeigen");
System.out.println("11. Gebühren verbuchen (Admin)");
System.out.println("12. Medien hinzufügen (Admin)");
System.out.println("13. Meine ausgeliehenen Medien anzeigen");
System.out.println("14. Datum einstellen");
System.out.println("0. Beenden");
System.out.print("Auswahl: ");
}
@ -53,11 +56,16 @@ public class UI {
case "10" -> gebuehrenAnzeigen();
case "11" -> gebuehrenVerbuchen();
case "12" -> medienHinzufuegen();
case "13" -> ausgeliehenenMedienAnzeigen();
case "14" -> datumEinstellen();
case "0" -> System.out.println("Beende das Programm...");
default -> System.out.println("Ungültige Auswahl. Bitte erneut versuchen.");
}
}
/**
* Wartet auf die Eingabe der Kunden-Id, wenn diese existiert wird der User eingeloggt
*/
private void loginKunde() {
System.out.print("Kunden-ID eingeben: ");
String kundenId = scanner.nextLine();
@ -92,7 +100,6 @@ public class UI {
Kunde neuerKunde = verwaltung.registriereKunde(name, istStudent);
}
private void medienDurchsuchen() {
System.out.print("Suchbegriff eingeben: ");
String suchbegriff = scanner.nextLine();
@ -102,7 +109,7 @@ public class UI {
System.out.println("Keine Medien gefunden.");
} else {
System.out.println("Suchergebnisse:");
ergebnisse.forEach(medien -> System.out.println("- " + medien.getDetails()));
ergebnisse.forEach(System.out::println);
}
}
@ -152,13 +159,15 @@ public class UI {
private void gebuehrenAnzeigen() {
if (!(verwaltung.getEingeloggterBenutzer() instanceof Kunde)) {
System.out.println("Bitte loggen Sie sich als Kunde ein, um Gebühren anzuzeigen.");
System.out.println("Nur eingeloggte Kunden können ihre Gebühren anzeigen.");
return;
}
Kunde kunde = (Kunde) verwaltung.getEingeloggterBenutzer();
System.out.println("Gebühren von " + kunde.getName() + ": " + kunde.getGebuehren() + "€");
double gesamtgebuehren = kunde.berechneGesamtgebuehren(verwaltung.getAktuellesDatum());
System.out.println("Gesamtgebühren: " + gesamtgebuehren + " €");
}
private void gebuehrenVerbuchen() {
if (!(verwaltung.getEingeloggterBenutzer() instanceof Admin)) {
System.out.println("Nur Admins können Gebühren verbuchen. Bitte als Admin einloggen.");
@ -171,7 +180,6 @@ public class UI {
System.out.println("Kunde nicht gefunden.");
return;
}
System.out.print("Betrag eingeben: ");
try {
double betrag = Double.parseDouble(scanner.nextLine());
@ -245,4 +253,21 @@ public class UI {
System.out.println("Ungültige Eingabe. Bitte eine Zahl eingeben.");
}
}
private void ausgeliehenenMedienAnzeigen() {
verwaltung.zeigeAusgelieheneMedien();
}
private void datumEinstellen() {
System.out.print("Neues Datum eingeben (YYYY-MM-DD): ");
String eingabe = scanner.nextLine();
try {
LocalDate neuesDatum = LocalDate.parse(eingabe);
verwaltung.setAktuellesDatum(neuesDatum);
} catch (Exception e) {
System.out.println("Ungültiges Datum. Bitte im Format YYYY-MM-DD eingeben.");
}
}
}

View File

@ -45,6 +45,4 @@ public abstract class User {
System.out.println("'" + medien.getTitel() + "' wurde nicht von " + name + " ausgeliehen.");
}
}
public abstract void rolleAnzeigen();
}

View File

@ -5,7 +5,7 @@ public class Videospiel extends Medien {
private String entwickler;
public Videospiel(String titel, String id, int erscheinungsjahr, String plattform, String entwickler) {
super(id, titel, erscheinungsjahr);
super(titel, id, erscheinungsjahr);
this.plattform = plattform;
this.entwickler = entwickler;
}