commit bbddb2db183ab0116388296ad45d3a55f2947844 Author: Christian Khazanovych <3028363@stud.th-mannheim.de> Date: Wed Jun 24 16:10:16 2026 +0200 Gruppe J: Kundenverwaltung hinzugefuegt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..98f2563 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.project.sourcePaths": ["src/main/java"], + "java.project.outputPath": "out" +} \ No newline at end of file diff --git a/out/kundenverwaltung/Kunde.class b/out/kundenverwaltung/Kunde.class new file mode 100644 index 0000000..7f86715 Binary files /dev/null and b/out/kundenverwaltung/Kunde.class differ diff --git a/out/kundenverwaltung/KundenIdGenerator.class b/out/kundenverwaltung/KundenIdGenerator.class new file mode 100644 index 0000000..2bfce1e Binary files /dev/null and b/out/kundenverwaltung/KundenIdGenerator.class differ diff --git a/out/kundenverwaltung/KundenRepository.class b/out/kundenverwaltung/KundenRepository.class new file mode 100644 index 0000000..cfb5421 Binary files /dev/null and b/out/kundenverwaltung/KundenRepository.class differ diff --git a/out/kundenverwaltung/KundenServiceImpl.class b/out/kundenverwaltung/KundenServiceImpl.class new file mode 100644 index 0000000..6292ee6 Binary files /dev/null and b/out/kundenverwaltung/KundenServiceImpl.class differ diff --git a/out/kundenverwaltung/KundenStatus.class b/out/kundenverwaltung/KundenStatus.class new file mode 100644 index 0000000..9a93c98 Binary files /dev/null and b/out/kundenverwaltung/KundenStatus.class differ diff --git a/out/kundenverwaltung/Main.class b/out/kundenverwaltung/Main.class new file mode 100644 index 0000000..ec54f1e Binary files /dev/null and b/out/kundenverwaltung/Main.class differ diff --git a/src/main/java/kundenverwaltung/Kunde.java b/src/main/java/kundenverwaltung/Kunde.java new file mode 100644 index 0000000..9769c5f --- /dev/null +++ b/src/main/java/kundenverwaltung/Kunde.java @@ -0,0 +1,74 @@ +package kundenverwaltung; + +import java.util.ArrayList; +import java.util.List; + +public class Kunde { + private String kundenId; + private String name; + private String strasse; + private String plz; + private String ort; + private String steuerNummer; + private String email; + private String telefon; + private List belegReferenzen; + private KundenStatus status; + + public Kunde(String kundenId, String name, String strasse, String plz, + String ort, String steuerNummer, String email, String telefon) { + this.kundenId = kundenId; + this.name = name; + this.strasse = strasse; + this.plz = plz; + this.ort = ort; + this.steuerNummer = steuerNummer; + this.email = email; + this.telefon = telefon; + this.belegReferenzen = new ArrayList<>(); + this.status = KundenStatus.AKTIV; + } + + // Validierung aller Pflichtfelder (F-03) + public boolean validiereFelder() { + return name != null && !name.isBlank() && + strasse != null && !strasse.isBlank() && + plz != null && !plz.isBlank() && + ort != null && !ort.isBlank() && + steuerNummer != null && !steuerNummer.isBlank() && + email != null && !email.isBlank() && + telefon != null && !telefon.isBlank(); + } + + // Getter + public String getKundenId() { return kundenId; } + public String getName() { return name; } + public String getStrasse() { return strasse; } + public String getPlz() { return plz; } + public String getOrt() { return ort; } + public String getSteuerNummer() { return steuerNummer; } + public String getEmail() { return email; } + public String getTelefon() { return telefon; } + public List getBelegReferenzen() { return belegReferenzen; } + public KundenStatus getStatus() { return status; } + + // Setter + public void setName(String name) { this.name = name; } + public void setStrasse(String strasse) { this.strasse = strasse; } + public void setPlz(String plz) { this.plz = plz; } + public void setOrt(String ort) { this.ort = ort; } + public void setSteuerNummer(String nr) { this.steuerNummer = nr; } + public void setEmail(String email) { this.email = email; } + public void setTelefon(String telefon) { this.telefon = telefon; } + public void setStatus(KundenStatus status) { this.status = status; } + + public void belegHinzufuegen(String belegnummer) { + belegReferenzen.add(belegnummer); + } + + @Override + public String toString() { + return String.format("[%s] %s, %s %s, %s | %s | %s", + kundenId, name, plz, ort, strasse, email, telefon); + } +} \ No newline at end of file diff --git a/src/main/java/kundenverwaltung/KundenIdGenerator.java b/src/main/java/kundenverwaltung/KundenIdGenerator.java new file mode 100644 index 0000000..9ed70b5 --- /dev/null +++ b/src/main/java/kundenverwaltung/KundenIdGenerator.java @@ -0,0 +1,43 @@ +package kundenverwaltung; + +import java.io.*; +import java.nio.file.*; + +public class KundenIdGenerator { + + private static final String COUNTER_FILE = "data/kunden_counter.txt"; + private int counter; + + public KundenIdGenerator() { + this.counter = ladeCounter(); + } + + // Gibt die nächste lückenlose Kundennummer zurück (F-02) + public String naechsteKundenId() { + counter++; + speichereCounter(); + return String.format("K-%06d", counter); + } + + private int ladeCounter() { + try { + Path path = Path.of(COUNTER_FILE); + if (Files.exists(path)) { + String inhalt = Files.readString(path).trim(); + return Integer.parseInt(inhalt); + } + } catch (IOException e) { + System.err.println("Counter konnte nicht geladen werden, starte bei 0."); + } + return 0; + } + + private void speichereCounter() { + try { + Files.createDirectories(Path.of("data")); + Files.writeString(Path.of(COUNTER_FILE), String.valueOf(counter)); + } catch (IOException e) { + System.err.println("Counter konnte nicht gespeichert werden: " + e.getMessage()); + } + } +} diff --git a/src/main/java/kundenverwaltung/KundenRepository.java b/src/main/java/kundenverwaltung/KundenRepository.java new file mode 100644 index 0000000..a3a97b9 --- /dev/null +++ b/src/main/java/kundenverwaltung/KundenRepository.java @@ -0,0 +1,109 @@ +package kundenverwaltung; + +import java.io.*; +import java.nio.file.*; +import java.util.*; + +public class KundenRepository { + + private static final String DATA_FILE = "data/kunden.csv"; + private List kunden; + + public KundenRepository() throws IOException { + this.kunden = new ArrayList<>(); + Files.createDirectories(Path.of("data")); + laden(); + } + + // Speichert einen neuen Kunden (F-04) + public void speichern(Kunde kunde) { + kunden.add(kunde); + speichereAlle(); + } + + // Aktualisiert einen bestehenden Kunden (F-07) + public void aktualisieren(Kunde kunde) { + speichereAlle(); + } + + // Löscht einen Kunden anhand der ID (F-11) + public void loeschen(String kundenId) { + kunden.removeIf(k -> k.getKundenId().equals(kundenId)); + speichereAlle(); + } + + // Gibt alle Kunden zurück (F-08) + public List alleKunden() { + return new ArrayList<>(kunden); + } + + // Sucht einen Kunden anhand der ID (F-10) + public Kunde findeNachId(String kundenId) { + return kunden.stream() + .filter(k -> k.getKundenId().equals(kundenId)) + .findFirst() + .orElse(null); + } + + // Sucht Kunden anhand des Namens (F-09) + public List sucheNachName(String suchbegriff) { + List ergebnis = new ArrayList<>(); + for (Kunde k : kunden) { + if (k.getName().toLowerCase().contains(suchbegriff.toLowerCase())) { + ergebnis.add(k); + } + } + return ergebnis; + } + + // Speichert alle Kunden als CSV-Datei (NF-SEC-01) + private void speichereAlle() { + try { + StringBuilder sb = new StringBuilder(); + for (Kunde k : kunden) { + sb.append(k.getKundenId()).append(";") + .append(k.getName()).append(";") + .append(k.getStrasse()).append(";") + .append(k.getPlz()).append(";") + .append(k.getOrt()).append(";") + .append(k.getSteuerNummer()).append(";") + .append(k.getEmail()).append(";") + .append(k.getTelefon()).append(";") + .append(String.join(",", k.getBelegReferenzen())).append(";") + .append(k.getStatus().name()).append("\n"); + } + Files.writeString(Path.of(DATA_FILE), sb.toString()); + } catch (IOException e) { + System.err.println("Fehler beim Speichern: " + e.getMessage()); + } + } + + // Lädt alle Kunden aus der CSV-Datei beim Start (NF-SEC-01) + private void laden() { + try { + Path path = Path.of(DATA_FILE); + if (!Files.exists(path)) return; + + List zeilen = Files.readAllLines(path); + for (String zeile : zeilen) { + if (zeile.isBlank()) continue; + String[] teile = zeile.split(";", -1); + if (teile.length < 10) continue; + + Kunde k = new Kunde( + teile[0], teile[1], teile[2], teile[3], + teile[4], teile[5], teile[6], teile[7] + ); + if (!teile[8].isBlank()) { + for (String beleg : teile[8].split(",")) { + k.belegHinzufuegen(beleg); + } + } + k.setStatus(KundenStatus.valueOf(teile[9])); + kunden.add(k); + } + } catch (IOException e) { + System.err.println("Fehler beim Laden: " + e.getMessage()); + } + } +} diff --git a/src/main/java/kundenverwaltung/KundenServiceImpl.java b/src/main/java/kundenverwaltung/KundenServiceImpl.java new file mode 100644 index 0000000..accefde --- /dev/null +++ b/src/main/java/kundenverwaltung/KundenServiceImpl.java @@ -0,0 +1,114 @@ +package kundenverwaltung; + +import java.io.IOException; +import java.util.List; + +public class KundenServiceImpl { + + private final KundenRepository repository; + private final KundenIdGenerator idGenerator; + + public KundenServiceImpl() throws IOException { + this.repository = new KundenRepository(); + this.idGenerator = new KundenIdGenerator(); + } + + // Legt einen neuen Kunden an (F-01, F-02, F-03, F-04) + public Kunde kundeAnlegen(String name, String strasse, String plz, String ort, + String steuerNummer, String email, String telefon) { + Kunde kunde = new Kunde("TEMP", name, strasse, plz, ort, steuerNummer, email, telefon); + + // Pflichtfeldprüfung (F-03) + if (!kunde.validiereFelder()) { + System.out.println("Fehler: Alle Pflichtfelder müssen ausgefüllt sein."); + return null; + } + + // ID vergeben (F-02) + String id = idGenerator.naechsteKundenId(); + Kunde neuerKunde = new Kunde(id, name, strasse, plz, ort, steuerNummer, email, telefon); + repository.speichern(neuerKunde); + System.out.println("Kunde erfolgreich angelegt: " + neuerKunde); + return neuerKunde; + } + + // Bearbeitet einen bestehenden Kunden (F-05, F-06, F-07) + public boolean kundeBearbeiten(String kundenId, String name, String strasse, String plz, + String ort, String steuerNummer, String email, String telefon) { + Kunde kunde = repository.findeNachId(kundenId); + if (kunde == null) { + System.out.println("Fehler: Kunde mit ID " + kundenId + " nicht gefunden."); + return false; + } + + kunde.setName(name); + kunde.setStrasse(strasse); + kunde.setPlz(plz); + kunde.setOrt(ort); + kunde.setSteuerNummer(steuerNummer); + kunde.setEmail(email); + kunde.setTelefon(telefon); + + // Pflichtfeldprüfung nach Änderung (F-06) + if (!kunde.validiereFelder()) { + System.out.println("Fehler: Alle Pflichtfelder müssen ausgefüllt sein."); + return false; + } + + repository.aktualisieren(kunde); + System.out.println("Kunde erfolgreich aktualisiert: " + kunde); + return true; + } + + // Löscht einen Kunden mit Integritätsprüfung (F-11, F-12, GR-04) + public boolean kundeLoschen(String kundenId) { + Kunde kunde = repository.findeNachId(kundenId); + if (kunde == null) { + System.out.println("Fehler: Kunde mit ID " + kundenId + " nicht gefunden."); + return false; + } + + // Referenzielle Integrität prüfen (GR-04) + if (!kunde.getBelegReferenzen().isEmpty()) { + System.out.println("Fehler: Kunde kann nicht gelöscht werden, da er in " + + kunde.getBelegReferenzen().size() + " Beleg(en) referenziert wird."); + return false; + } + + repository.loeschen(kundenId); + System.out.println("Kunde " + kundenId + " erfolgreich gelöscht."); + return true; + } + + // Gibt alle Kunden zurück (F-08) + public List alleKunden() { + return repository.alleKunden(); + } + + // Sucht Kunden nach Name (F-09) + public List sucheNachName(String suchbegriff) { + return repository.sucheNachName(suchbegriff); + } + + // Gibt einen Kunden anhand der ID zurück (F-10) + public Kunde findeKunde(String kundenId) { + return repository.findeNachId(kundenId); + } + + // Zeigt die Transaktionshistorie eines Kunden (F-13) + public void zeigeTransaktionshistorie(String kundenId) { + Kunde kunde = repository.findeNachId(kundenId); + if (kunde == null) { + System.out.println("Kunde nicht gefunden."); + return; + } + System.out.println("Transaktionshistorie für " + kunde.getName() + ":"); + if (kunde.getBelegReferenzen().isEmpty()) { + System.out.println(" Keine Belege vorhanden."); + } else { + for (String beleg : kunde.getBelegReferenzen()) { + System.out.println(" - " + beleg); + } + } + } +} diff --git a/src/main/java/kundenverwaltung/KundenStatus.java b/src/main/java/kundenverwaltung/KundenStatus.java new file mode 100644 index 0000000..ea37869 --- /dev/null +++ b/src/main/java/kundenverwaltung/KundenStatus.java @@ -0,0 +1,6 @@ +package kundenverwaltung; + +public enum KundenStatus { + AKTIV, + ARCHIVIERT +} diff --git a/src/main/java/kundenverwaltung/Main.java b/src/main/java/kundenverwaltung/Main.java new file mode 100644 index 0000000..f12d93b --- /dev/null +++ b/src/main/java/kundenverwaltung/Main.java @@ -0,0 +1,157 @@ +package kundenverwaltung; + +import java.io.IOException; +import java.util.List; +import java.util.Scanner; + +public class Main { + + private static KundenServiceImpl service; + private static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + try { + service = new KundenServiceImpl(); + System.out.println("==========================================="); + System.out.println(" Kundenverwaltung - Gruppe J - Team 3"); + System.out.println("==========================================="); + menueSchleife(); + } catch (IOException e) { + System.err.println("Fehler beim Starten: " + e.getMessage()); + } + } + + private static void menueSchleife() { + while (true) { + System.out.println("\n--- HAUPTMENUE ---"); + System.out.println("1. Kunde anlegen"); + System.out.println("2. Alle Kunden anzeigen"); + System.out.println("3. Kunde suchen (nach Name)"); + System.out.println("4. Kunde bearbeiten"); + System.out.println("5. Kunde loeschen"); + System.out.println("6. Transaktionshistorie anzeigen"); + System.out.println("0. Beenden"); + System.out.print("Auswahl: "); + + String eingabe = scanner.nextLine().trim(); + + switch (eingabe) { + case "1" -> kundeAnlegen(); + case "2" -> alleKundenAnzeigen(); + case "3" -> kundenSuchen(); + case "4" -> kundeBearbeiten(); + case "5" -> kundeLoschen(); + case "6" -> transaktionshistorie(); + case "0" -> { + System.out.println("Programm beendet."); + return; + } + default -> System.out.println("Ungueltige Eingabe, bitte erneut versuchen."); + } + } + } + + private static void kundeAnlegen() { + System.out.println("\n--- KUNDE ANLEGEN ---"); + System.out.print("Name / Firmenname: "); + String name = scanner.nextLine(); + System.out.print("Strasse und Hausnummer: "); + String strasse = scanner.nextLine(); + System.out.print("PLZ: "); + String plz = scanner.nextLine(); + System.out.print("Ort: "); + String ort = scanner.nextLine(); + System.out.print("Steuernummer / USt-IdNr.: "); + String steuerNummer = scanner.nextLine(); + System.out.print("E-Mail: "); + String email = scanner.nextLine(); + System.out.print("Telefon: "); + String telefon = scanner.nextLine(); + + service.kundeAnlegen(name, strasse, plz, ort, steuerNummer, email, telefon); + } + + private static void alleKundenAnzeigen() { + System.out.println("\n--- ALLE KUNDEN ---"); + List kunden = service.alleKunden(); + if (kunden.isEmpty()) { + System.out.println("Keine Kunden vorhanden."); + return; + } + for (Kunde k : kunden) { + System.out.println(k); + } + System.out.println("Gesamt: " + kunden.size() + " Kunde(n)."); + } + + private static void kundenSuchen() { + System.out.println("\n--- KUNDE SUCHEN ---"); + System.out.print("Suchbegriff (Name): "); + String suchbegriff = scanner.nextLine(); + List ergebnis = service.sucheNachName(suchbegriff); + if (ergebnis.isEmpty()) { + System.out.println("Keine Kunden gefunden."); + return; + } + for (Kunde k : ergebnis) { + System.out.println(k); + } + } + + private static void kundeBearbeiten() { + System.out.println("\n--- KUNDE BEARBEITEN ---"); + System.out.print("Kunden-ID eingeben: "); + String id = scanner.nextLine(); + Kunde kunde = service.findeKunde(id); + if (kunde == null) { + System.out.println("Kunde nicht gefunden."); + return; + } + System.out.println("Aktuell: " + kunde); + System.out.println("Neue Werte eingeben (Enter = Feld uebernehmen):"); + + System.out.print("Name [" + kunde.getName() + "]: "); + String name = scanner.nextLine(); + if (name.isBlank()) name = kunde.getName(); + + System.out.print("Strasse [" + kunde.getStrasse() + "]: "); + String strasse = scanner.nextLine(); + if (strasse.isBlank()) strasse = kunde.getStrasse(); + + System.out.print("PLZ [" + kunde.getPlz() + "]: "); + String plz = scanner.nextLine(); + if (plz.isBlank()) plz = kunde.getPlz(); + + System.out.print("Ort [" + kunde.getOrt() + "]: "); + String ort = scanner.nextLine(); + if (ort.isBlank()) ort = kunde.getOrt(); + + System.out.print("Steuernummer [" + kunde.getSteuerNummer() + "]: "); + String steuerNummer = scanner.nextLine(); + if (steuerNummer.isBlank()) steuerNummer = kunde.getSteuerNummer(); + + System.out.print("E-Mail [" + kunde.getEmail() + "]: "); + String email = scanner.nextLine(); + if (email.isBlank()) email = kunde.getEmail(); + + System.out.print("Telefon [" + kunde.getTelefon() + "]: "); + String telefon = scanner.nextLine(); + if (telefon.isBlank()) telefon = kunde.getTelefon(); + + service.kundeBearbeiten(id, name, strasse, plz, ort, steuerNummer, email, telefon); + } + + private static void kundeLoschen() { + System.out.println("\n--- KUNDE LOESCHEN ---"); + System.out.print("Kunden-ID eingeben: "); + String id = scanner.nextLine(); + service.kundeLoschen(id); + } + + private static void transaktionshistorie() { + System.out.println("\n--- TRANSAKTIONSHISTORIE ---"); + System.out.print("Kunden-ID eingeben: "); + String id = scanner.nextLine(); + service.zeigeTransaktionshistorie(id); + } +} \ No newline at end of file